using System; using System.Collections.Generic; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using Yavsc.Abstract.Models.Messaging; namespace Yavsc.Api.Client; /// /// Thin HTTP client for the notifications exposed to PostIt on the home page, /// and for their dismissal by the current user. /// public sealed class NotificationsApiClient { private const string PathPrefix = Constants.NotificationsPath; private readonly IYavscApiClient _api; private readonly Func _businessBaseAddress; public NotificationsApiClient(IYavscApiClient api, string businessBaseAddress) : this(api, () => businessBaseAddress) { } public NotificationsApiClient(IYavscApiClient api, Func businessBaseAddress) { _api = api ?? throw new ArgumentNullException(nameof(api)); _businessBaseAddress = businessBaseAddress ?? throw new ArgumentNullException(nameof(businessBaseAddress)); _ = ResolveBusinessBaseAddress(); } public Task> GetCurrentAsync(CancellationToken ct = default) { return _api.CallAsync>( HttpMethod.Get, Absolute($"{PathPrefix}/{Constants.NotificationsCurrentUserRoute}"), ct: ct); } public Task> GetAllAsync(CancellationToken ct = default) { return _api.CallAsync>( HttpMethod.Get, Absolute(PathPrefix), ct: ct); } public Task> GetPublicAsync(CancellationToken ct = default) => _api.GetAnonymousAsync>(Absolute(PathPrefix), ct); public Task> GetDismissedAsync(CancellationToken ct = default) { return _api.CallAsync>( HttpMethod.Get, Absolute(Constants.NotificationsDismissPath), ct: ct); } public Task DismissAsync(long notificationId, CancellationToken ct = default) { return _api.CallAsync( HttpMethod.Post, Absolute(DismissClickPath(notificationId)), ct: ct); } public Task RestoreAsync(long notificationId, CancellationToken ct = default) { return _api.CallAsync( HttpMethod.Delete, Absolute(DismissClickPath(notificationId)), ct: ct); } private static string DismissClickPath(long notificationId) => $"{Constants.NotificationsDismissPath}/{Constants.NotificationsDismissClickRoute}/{notificationId}"; private string Absolute(string relativePath) => new Uri(ResolveBusinessBaseAddress(), relativePath).ToString(); private Uri ResolveBusinessBaseAddress() { var raw = _businessBaseAddress(); if (string.IsNullOrWhiteSpace(raw)) throw new InvalidOperationException("Business base address is required."); return new Uri(raw, UriKind.Absolute); } }