using System.Net; using collAnon.Client.Services; using decePubClient.Extensions; using decePubClient.Models; using PrivaPub.ClientModels; using PrivaPub.ClientModels.User; namespace decePubClient.Services { /// /// A persona's whole archive on PrivaPub (/clientapi/persona/{id}/archive): made in a job and downloaded through a /// link, or another archive (its own, or Mastodon's) uploaded in pieces by js/transfer.js and imported into it, the /// parts chosen, until it is done or asked to stop. As the root. Values null on failure; nothing throws. /// public class ArchiveService(IHttpService httpService, ILoggingService logger, CoalescingStringLocalizer localizer) { public async Task State(string personaId, CancellationToken cancellationToken = default) { using var response = await httpService.Get(APIs.ClientApi.GET_M_PersonaArchive(personaId), cancellationToken: cancellationToken); if (response.IsSuccessStatusCode) return await response.DefaultReadFromJsonAsync(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(ArchiveService)}.{nameof(State)}", cancellationToken); return null; } /// Asks for the archive to be made; Data is the state. public async Task Export(string personaId, CancellationToken cancellationToken = default) { using var response = await httpService.Post(APIs.ClientApi.POST_M_PersonaArchive(personaId), cancellationToken: cancellationToken); if (!response.IsSuccessStatusCode) return await response.Content.ReadWebResult(response.StatusCode, localizer, cancellationToken); return new WebResult { Data = await response.DefaultReadFromJsonAsync(cancellationToken) }; } /// A link to download the archive made; Data is the ViewArchiveTicket. public async Task Ticket(string personaId, CancellationToken cancellationToken = default) { using var response = await httpService.Post(APIs.ClientApi.POST_M_PersonaArchiveTicket(personaId), cancellationToken: cancellationToken); if (!response.IsSuccessStatusCode) return await response.Content.ReadWebResult(response.StatusCode, localizer, cancellationToken); return new WebResult { Data = await response.DefaultReadFromJsonAsync(cancellationToken) }; } /// An upload for an archive's pieces; Data is the ViewArchiveUpload. public async Task StartUpload(CancellationToken cancellationToken = default) { using var response = await httpService.Post(APIs.ClientApi.POST_PersonaArchiveUpload, cancellationToken: cancellationToken); if (!response.IsSuccessStatusCode) return await response.Content.ReadWebResult(response.StatusCode, localizer, cancellationToken); return new WebResult { Data = await response.DefaultReadFromJsonAsync(cancellationToken) }; } public async Task CancelUpload(string uploadId, CancellationToken cancellationToken = default) { using var response = await httpService.Delete(APIs.ClientApi.DELETE_M_PersonaArchiveUpload(uploadId), cancellationToken: cancellationToken); return response.IsSuccessStatusCode ? new WebResult() : await response.Content.ReadWebResult(response.StatusCode, localizer, cancellationToken); } /// The uploaded archive imported into the persona; Data is the state. public async Task Import(string personaId, ImportPersonaArchiveForm form, CancellationToken cancellationToken = default) { using var response = await httpService.Post(APIs.ClientApi.POST_M_PersonaArchiveImport(personaId), form, cancellationToken: cancellationToken); if (!response.IsSuccessStatusCode) return await response.Content.ReadWebResult(response.StatusCode, localizer, cancellationToken); return new WebResult { Data = await response.DefaultReadFromJsonAsync(cancellationToken) }; } public async Task Stop(string personaId, CancellationToken cancellationToken = default) { using var response = await httpService.Post(APIs.ClientApi.POST_M_PersonaArchiveImportStop(personaId), cancellationToken: cancellationToken); return response.IsSuccessStatusCode ? new WebResult() : await response.Content.ReadWebResult(response.StatusCode, localizer, cancellationToken); } } }