< Summary

Information
Class: Api.Works.Endpoints.TagEndpoints
Assembly: Api
File(s): /home/runner/work/ProjectRead.ing/ProjectRead.ing/Api/Works/Endpoints/TagEndpoints.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 40
Coverable lines: 40
Total lines: 86
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 18
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Map(...)0%620%
QueryTags()0%272160%

File(s)

/home/runner/work/ProjectRead.ing/ProjectRead.ing/Api/Works/Endpoints/TagEndpoints.cs

#LineLine coverage
 1// SPDX-FileCopyrightText: 2026 Alper Çelik <[email protected]>
 2//
 3// SPDX-License-Identifier: AGPL-3.0-or-later
 4
 5using System.ComponentModel.DataAnnotations;
 6
 7using Api.Auth.Handlers;
 8using Api.Auth.Models;
 9using Api.Auth.Utils;
 10using Api.Database;
 11using Api.Utils;
 12using Api.Works.DTOs;
 13
 14using Microsoft.AspNetCore.Http.HttpResults;
 15using Microsoft.AspNetCore.Mvc;
 16using Microsoft.EntityFrameworkCore;
 17
 18namespace Api.Works.Endpoints;
 19
 20public static class TagEndpoints
 21{
 22
 23    public static void Map(IEndpointRouteBuilder route)
 024    {
 025        var tags = route.MapGroup("tags");
 26
 027        tags.MapMethods("", [HttpMethod.Query.Method, HttpMethod.Get.Method], QueryTags);
 028    }
 29
 30    [PermissionCheckAuthorize(UserPermissionBits.WorkTagRead | UserPermissionBits.WorkRead)]
 31    public static async Task<Results<
 32        Ok<PaginationResult<TagGetDTO>>,
 33        NotFound,
 34        BadRequest>>
 35            QueryTags(
 36                    [FromServices] PGContext db,
 37                    [FromServices] ICurrentUserId userId,
 38
 39                    [FromBody] TagQueryDTO queryDTO
 40                    )
 041    {
 042        if (userId.Id is null)
 043            return TypedResults.BadRequest();
 44
 045        var results = db.WorkTags
 046            .Where(wt => wt.OwnerId == userId.Id);
 47
 048        if (queryDTO.TagIds.Any())
 049            results = results.Where(wt => queryDTO.TagIds.Contains(wt.Id));
 50
 051        if (queryDTO.TagTypes.Any())
 052            results = results.Where(wt => queryDTO.TagTypes.Contains(wt.TagType));
 53
 054        if (queryDTO.WorkIds.Any())
 055            results = results
 056                .Include(wt => wt.WorkTagWorks)
 057                .Where(wt =>
 058                        wt.WorkTagWorks.Any(
 059                            wtw => queryDTO.WorkIds.Contains(wtw.WorkId)));
 60
 061        foreach (var sort in queryDTO.SortOptions.Distinct())
 062        {
 063            results = sort switch
 064            {
 065                TagSortOption.Id => results.OrderBy(wt => wt.Id),
 066                TagSortOption.TagType => results.OrderBy(wt => wt.TagType),
 067                TagSortOption.TagName => results.OrderBy(wt => wt.TagName),
 068                _ => results
 069            };
 070        }
 071        var totalCount = await results.CountAsync();
 72
 073        if (queryDTO.Page * queryDTO.PageSize >= totalCount)
 074            return TypedResults.NotFound();
 75
 076        return TypedResults.Ok(new PaginationResult<TagGetDTO>(
 077                    await results.Skip(queryDTO.PageSize * (queryDTO.Page - 1)).Take(queryDTO.PageSize).ProjectToDTO().T
 078                    totalCount,
 079                    queryDTO.PageSize,
 080                    queryDTO.Page,
 081(int)Math.Ceiling(totalCount / (double)queryDTO.PageSize)
 082                    ));
 83
 084    }
 85
 86}