using System.Net; using collAnon.Client.Services; using decePubClient.Extensions; using decePubClient.Models; using PrivaPub.ClientModels.Group; namespace decePubClient.Services { /// The communities and circles a persona belongs to (/clientapi/group/list). public class GroupService(IHttpService httpService, ILoggingService logger, CoalescingStringLocalizer localizer) { /// The persona's groups, communities first; empty on failure. public async Task> List(string personaId, CancellationToken cancellationToken = default) { if (personaId is null) return []; using var response = await httpService.Get(APIs.ClientApi.GET_Groups, [$"avatarId={Uri.EscapeDataString(personaId)}"], cancellationToken: cancellationToken); if (!response.IsSuccessStatusCode) { var result = await response.Content.ReadWebResult(response.StatusCode, localizer, cancellationToken); if (result.StatusCode is not (int)HttpStatusCode.Gone) await logger.ProcessWarning(result.ToString(localizer), $"{nameof(GroupService)}.{nameof(List)}", cancellationToken); return []; } var groups = await response.DefaultReadFromJsonAsync>(cancellationToken) ?? []; return [.. groups.OrderByDescending(g => g.IsCommunity).ThenBy(g => g.Name ?? g.UserName)]; } } }