< Summary

Information
Class: Chronicis.Client.Services.WorldApiService
Assembly: Chronicis.Client
File(s): /home/runner/work/chronicis/chronicis/src/Chronicis.Client/Services/WorldApiService.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 138
Coverable lines: 138
Total lines: 241
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 2
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/chronicis/chronicis/src/Chronicis.Client/Services/WorldApiService.cs

#LineLine coverage
 1using Chronicis.Shared.DTOs;
 2
 3namespace Chronicis.Client.Services;
 4
 5/// <summary>
 6/// Service for World API operations.
 7/// Uses HttpClientExtensions for consistent error handling and logging.
 8/// </summary>
 9public class WorldApiService : IWorldApiService
 10{
 11    private readonly HttpClient _http;
 12    private readonly ILogger<WorldApiService> _logger;
 13
 014    public WorldApiService(HttpClient http, ILogger<WorldApiService> logger)
 15    {
 016        _http = http;
 017        _logger = logger;
 018    }
 19
 20    public async Task<List<WorldDto>> GetWorldsAsync()
 21    {
 022        return await _http.GetListAsync<WorldDto>(
 023            "worlds",
 024            _logger,
 025            "worlds");
 026    }
 27
 28    public async Task<WorldDetailDto?> GetWorldAsync(Guid worldId)
 29    {
 030        return await _http.GetEntityAsync<WorldDetailDto>(
 031            $"worlds/{worldId}",
 032            _logger,
 033            $"world {worldId}");
 034    }
 35
 36    public async Task<WorldDto?> CreateWorldAsync(WorldCreateDto dto)
 37    {
 038        return await _http.PostEntityAsync<WorldDto>(
 039            "worlds",
 040            dto,
 041            _logger,
 042            "world");
 043    }
 44
 45    public async Task<WorldDto?> UpdateWorldAsync(Guid worldId, WorldUpdateDto dto)
 46    {
 047        return await _http.PutEntityAsync<WorldDto>(
 048            $"worlds/{worldId}",
 049            dto,
 050            _logger,
 051            $"world {worldId}");
 052    }
 53
 54    // ===== World Links =====
 55
 56    public async Task<List<WorldLinkDto>> GetWorldLinksAsync(Guid worldId)
 57    {
 058        return await _http.GetListAsync<WorldLinkDto>(
 059            $"worlds/{worldId}/links",
 060            _logger,
 061            $"links for world {worldId}");
 062    }
 63
 64    public async Task<WorldLinkDto?> CreateWorldLinkAsync(Guid worldId, WorldLinkCreateDto dto)
 65    {
 066        return await _http.PostEntityAsync<WorldLinkDto>(
 067            $"worlds/{worldId}/links",
 068            dto,
 069            _logger,
 070            $"link for world {worldId}");
 071    }
 72
 73    public async Task<WorldLinkDto?> UpdateWorldLinkAsync(Guid worldId, Guid linkId, WorldLinkUpdateDto dto)
 74    {
 075        return await _http.PutEntityAsync<WorldLinkDto>(
 076            $"worlds/{worldId}/links/{linkId}",
 077            dto,
 078            _logger,
 079            $"link {linkId} for world {worldId}");
 080    }
 81
 82    public async Task<bool> DeleteWorldLinkAsync(Guid worldId, Guid linkId)
 83    {
 084        return await _http.DeleteEntityAsync(
 085            $"worlds/{worldId}/links/{linkId}",
 086            _logger,
 087            $"link {linkId} from world {worldId}");
 088    }
 89
 90    // ===== Public Sharing =====
 91
 92    public async Task<PublicSlugCheckResultDto?> CheckPublicSlugAsync(Guid worldId, string slug)
 93    {
 094        var dto = new PublicSlugCheckDto { Slug = slug };
 095        return await _http.PostEntityAsync<PublicSlugCheckResultDto>(
 096            $"worlds/{worldId}/check-public-slug",
 097            dto,
 098            _logger,
 099            $"public slug check for world {worldId}");
 0100    }
 101
 102    // ===== Member Management =====
 103
 104    public async Task<List<WorldMemberDto>> GetMembersAsync(Guid worldId)
 105    {
 0106        return await _http.GetListAsync<WorldMemberDto>(
 0107            $"worlds/{worldId}/members",
 0108            _logger,
 0109            $"members for world {worldId}");
 0110    }
 111
 112    public async Task<WorldMemberDto?> UpdateMemberRoleAsync(Guid worldId, Guid memberId, WorldMemberUpdateDto dto)
 113    {
 0114        return await _http.PutEntityAsync<WorldMemberDto>(
 0115            $"worlds/{worldId}/members/{memberId}",
 0116            dto,
 0117            _logger,
 0118            $"member {memberId} in world {worldId}");
 0119    }
 120
 121    public async Task<bool> RemoveMemberAsync(Guid worldId, Guid memberId)
 122    {
 0123        return await _http.DeleteEntityAsync(
 0124            $"worlds/{worldId}/members/{memberId}",
 0125            _logger,
 0126            $"member {memberId} from world {worldId}");
 0127    }
 128
 129    // ===== Invitation Management =====
 130
 131    public async Task<List<WorldInvitationDto>> GetInvitationsAsync(Guid worldId)
 132    {
 0133        return await _http.GetListAsync<WorldInvitationDto>(
 0134            $"worlds/{worldId}/invitations",
 0135            _logger,
 0136            $"invitations for world {worldId}");
 0137    }
 138
 139    public async Task<WorldInvitationDto?> CreateInvitationAsync(Guid worldId, WorldInvitationCreateDto dto)
 140    {
 0141        return await _http.PostEntityAsync<WorldInvitationDto>(
 0142            $"worlds/{worldId}/invitations",
 0143            dto,
 0144            _logger,
 0145            $"invitation for world {worldId}");
 0146    }
 147
 148    public async Task<bool> RevokeInvitationAsync(Guid worldId, Guid invitationId)
 149    {
 0150        return await _http.DeleteEntityAsync(
 0151            $"worlds/{worldId}/invitations/{invitationId}",
 0152            _logger,
 0153            $"invitation {invitationId} from world {worldId}");
 0154    }
 155
 156    public async Task<WorldJoinResultDto?> JoinWorldAsync(string code)
 157    {
 0158        var dto = new WorldJoinDto { Code = code };
 0159        return await _http.PostEntityAsync<WorldJoinResultDto>(
 0160            "worlds/join",
 0161            dto,
 0162            _logger,
 0163            "join world");
 0164    }
 165
 166    // ===== World Documents =====
 167
 168    public async Task<WorldDocumentUploadResponseDto?> RequestDocumentUploadAsync(
 169        Guid worldId,
 170        WorldDocumentUploadRequestDto dto)
 171    {
 0172        return await _http.PostEntityAsync<WorldDocumentUploadResponseDto>(
 0173            $"worlds/{worldId}/documents/request-upload",
 0174            dto,
 0175            _logger,
 0176            $"document upload request for world {worldId}");
 0177    }
 178
 179    public async Task<WorldDocumentDto?> ConfirmDocumentUploadAsync(Guid worldId, Guid documentId)
 180    {
 0181        var dto = new WorldDocumentConfirmUploadDto { DocumentId = documentId };
 0182        return await _http.PostEntityAsync<WorldDocumentDto>(
 0183            $"worlds/{worldId}/documents/{documentId}/confirm",
 0184            dto,
 0185            _logger,
 0186            $"document upload confirmation for {documentId}");
 0187    }
 188
 189    public async Task<List<WorldDocumentDto>> GetWorldDocumentsAsync(Guid worldId)
 190    {
 0191        return await _http.GetListAsync<WorldDocumentDto>(
 0192            $"worlds/{worldId}/documents",
 0193            _logger,
 0194            $"documents for world {worldId}");
 0195    }
 196
 197    public async Task<DocumentDownloadResult?> DownloadDocumentAsync(Guid documentId)
 198    {
 199        try
 200        {
 0201            var downloadInfo = await _http.GetEntityAsync<WorldDocumentDownloadDto>(
 0202                $"/documents/{documentId}/content",
 0203                _logger,
 0204                $"download URL for document {documentId}");
 205
 0206            if (downloadInfo == null)
 0207                return null;
 208
 0209            return new DocumentDownloadResult(
 0210                downloadInfo.DownloadUrl,
 0211                downloadInfo.FileName,
 0212                downloadInfo.ContentType,
 0213                downloadInfo.FileSizeBytes);
 214        }
 0215        catch (Exception ex)
 216        {
 0217            _logger.LogError(ex, "Error getting download URL for document {DocumentId}", documentId);
 0218            return null;
 219        }
 0220    }
 221
 222    public async Task<WorldDocumentDto?> UpdateDocumentAsync(
 223        Guid worldId,
 224        Guid documentId,
 225        WorldDocumentUpdateDto dto)
 226    {
 0227        return await _http.PutEntityAsync<WorldDocumentDto>(
 0228            $"worlds/{worldId}/documents/{documentId}",
 0229            dto,
 0230            _logger,
 0231            $"document {documentId} for world {worldId}");
 0232    }
 233
 234    public async Task<bool> DeleteDocumentAsync(Guid worldId, Guid documentId)
 235    {
 0236        return await _http.DeleteEntityAsync(
 0237            $"worlds/{worldId}/documents/{documentId}",
 0238            _logger,
 0239            $"document {documentId} from world {worldId}");
 0240    }
 241}