Код IT
← Каталог

Практикум WPF — клиент на Prism — ApiTaskRepository — HttpClient к API

Фрагмент из «Практикум WPF — клиент на Prism»: ApiTaskRepository — HttpClient к API.

csharp desktopencyclopediawpf-praktikum-4 embed URL статья в энциклопедии
C# main.cs
public sealed class ApiTaskRepository : ITaskRepository
{
    private readonly HttpClient _http;

    public ApiTaskRepository(HttpClient http) => _http = http;

    public async Task<IReadOnlyList<TaskItem>> GetAllAsync(CancellationToken ct = default)
    {
        var dtos = await _http.GetFromJsonAsync<List<TaskDto>>("api/v1/tasks", ct)
                   ?? new List<TaskDto>();
        return dtos.Select(Map).ToList();
    }

    public async Task<TaskItem> CreateAsync(TaskItem task, CancellationToken ct = default)
    {
        var response = await _http.PostAsJsonAsync(
            "api/v1/tasks",
            new CreateTaskRequest(task.Title, task.Status.ToString()),
            ct);
        response.EnsureSuccessStatusCode();
        var dto = await response.Content.ReadFromJsonAsync<TaskDto>(cancellationToken: ct)
                  ?? throw new InvalidOperationException("Empty body");
        return Map(dto);
    }

    private static TaskItem Map(TaskDto dto) => new()
    {
        Id = dto.Id,
        Title = dto.Title,
        Status = Enum.Parse<TaskStatus>(dto.Status),
        CreatedAt = dto.CreatedAt
    };
}
public sealed class ApiTaskRepository : ITaskRepository
{
    private readonly HttpClient _http;

    public ApiTaskRepository(HttpClient http) => _http = http;

    public async Task<IReadOnlyList<TaskItem>> GetAllAsync(CancellationToken ct = default)
    {
        var dtos = await _http.GetFromJsonAsync<List<TaskDto>>("api/v1/tasks", ct)
                   ?? new List<TaskDto>();
        return dtos.Select(Map).ToList();
    }

    public async Task<TaskItem> CreateAsync(TaskItem task, CancellationToken ct = default)
    {
        var response = await _http.PostAsJsonAsync(
            "api/v1/tasks",
            new CreateTaskRequest(task.Title, task.Status.ToString()),
            ct);
        response.EnsureSuccessStatusCode();
        var dto = await response.Content.ReadFromJsonAsync<TaskDto>(cancellationToken: ct)
                  ?? throw new InvalidOperationException("Empty body");
        return Map(dto);
    }

    private static TaskItem Map(TaskDto dto) => new()
    {
        Id = dto.Id,
        Title = dto.Title,
        Status = Enum.Parse<TaskStatus>(dto.Status),
        CreatedAt = dto.CreatedAt
    };
}