using System.Net; using collAnon.Client.Services; using decePubClient.Extensions; using decePubClient.Models; using decePubClient.Models.Mastodon; using PrivaPub.ClientModels; namespace decePubClient.Services { /// /// The current persona's filters (PrivaPub's /api/v2/filters): made, changed with their keywords, given posts, and /// deleted. What they match comes on each status (Status.Filtered); the card applies it. Lists come back empty on /// failure; nothing throws. /// public class FilterService(IHttpService httpService, ILoggingService logger, CoalescingStringLocalizer localizer) { public async Task> All(CancellationToken cancellationToken = default) { using var response = await httpService.Get(APIs.Mastodon.GET_Filters, cancellationToken: cancellationToken); if (response.IsSuccessStatusCode) return await response.MastodonReadFromJsonAsync>(cancellationToken) ?? []; var result = await response.Content.ReadWebResult(response.StatusCode, localizer, cancellationToken); if (result.StatusCode is not ((int)HttpStatusCode.Gone or (int)HttpStatusCode.NotFound)) await logger.ProcessWarning(result.ToString(localizer), $"{nameof(FilterService)}.{nameof(All)}", cancellationToken); return []; } /// Makes the filter when filterId is null, or changes it; Data is the filter as PrivaPub keeps it. public async Task Save(string filterId, FilterForm form, CancellationToken cancellationToken = default) { using var response = filterId is null ? await httpService.Post(APIs.Mastodon.POST_Filter, form, cancellationToken: cancellationToken) : await httpService.Put(APIs.Mastodon.PUT_M_Filter(filterId), form, cancellationToken: cancellationToken); if (!response.IsSuccessStatusCode) return await response.Content.ReadWebResult(response.StatusCode, localizer, cancellationToken); return new WebResult { Data = await response.MastodonReadFromJsonAsync(cancellationToken) }; } public async Task Delete(string filterId, CancellationToken cancellationToken = default) { using var response = await httpService.Delete(APIs.Mastodon.DELETE_M_Filter(filterId), cancellationToken: cancellationToken); if (!response.IsSuccessStatusCode) return await response.Content.ReadWebResult(response.StatusCode, localizer, cancellationToken); return new WebResult(); } /// Adds a post to the filter; Data is the FilterStatus. public async Task AddStatus(string filterId, string statusId, CancellationToken cancellationToken = default) { using var response = await httpService.Post(APIs.Mastodon.POST_M_FilterStatus(filterId), new[] { new KeyValuePair("status_id", statusId) }, cancellationToken: cancellationToken); if (!response.IsSuccessStatusCode) return await response.Content.ReadWebResult(response.StatusCode, localizer, cancellationToken); return new WebResult { Data = await response.MastodonReadFromJsonAsync(cancellationToken) }; } public async Task RemoveStatus(string filterStatusId, CancellationToken cancellationToken = default) { using var response = await httpService.Delete(APIs.Mastodon.DELETE_M_FilterStatus(filterStatusId), cancellationToken: cancellationToken); if (!response.IsSuccessStatusCode) return await response.Content.ReadWebResult(response.StatusCode, localizer, cancellationToken); return new WebResult(); } } }