aboutsummaryrefslogtreecommitdiffstats
path: root/code/api/src/Endpoints/V1/Projects/GetProjectsRoute.cs
blob: 8fe70a68c28b3ec4e24cb33a7a0964a7e73d573e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using MR.AspNetCore.Pagination;

namespace IOL.GreatOffice.Api.Endpoints.V1.Projects;

public class GetProjectsRoute : RouteBaseAsync.WithRequest<GetProjectsQueryParameters>.WithActionResult<KeysetPaginationResult<GetProjectsResponseDto>>
{
    private readonly MainAppDatabase _database;
    private readonly PaginationService _pagination;

    public GetProjectsRoute(MainAppDatabase database, PaginationService pagination) {
        _database = database;
        _pagination = pagination;
    }

    [HttpGet("~/v{version:apiVersion}/projects")]
    public override async Task<ActionResult<KeysetPaginationResult<GetProjectsResponseDto>>> HandleAsync([FromQuery] GetProjectsQueryParameters request, CancellationToken cancellationToken = default) {
        var result = await _pagination.KeysetPaginateAsync(
            _database.Projects.ForTenant(LoggedInUser).ConditionalWhere(() => request.NameQuery.HasValue(), p => p.Name.Contains(request.NameQuery)),
            b => b.Descending(x => x.CreatedAt),
            async id => await _database.Projects.FindAsync(id),
            query => query.Select(p => new GetProjectsResponseDto() {
                Id = p.Id,
                Name = p.Name
            })
        );
        return Ok(result);
    }
}

public class GetProjectsResponseDto
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}

public class GetProjectsQueryParameters
{
    [FromQuery(Name = "name")]
    public string NameQuery { get; set; }
}