22# SPDX-License-Identifier: Apache-2.0
33from collections .abc import Collection , Sequence
44from dataclasses import dataclass
5+ from itertools import groupby
56from typing import Annotated
67
78from fastapi import Depends
89
9- from data_rentgen .db .models . job import Job
10+ from data_rentgen .db .models import Location
1011from data_rentgen .dto .pagination import PaginationDTO
12+ from data_rentgen .server .services .tag import TagData , TagValueData
1113from data_rentgen .services .uow import UnitOfWork
1214
1315
16+ @dataclass
17+ class JobData :
18+ id : int
19+ name : str
20+ type : str
21+ location : Location
22+
23+
1424@dataclass
1525class JobServiceResult :
1626 id : int
17- data : Job
27+ data : JobData
28+ tags : list [TagData ]
1829
1930
2031class JobServicePaginatedResult (PaginationDTO [JobServiceResult ]):
@@ -31,6 +42,7 @@ async def paginate(
3142 page_size : int ,
3243 job_ids : Collection [int ],
3344 job_types : Collection [str ],
45+ tag_value_ids : Collection [int ],
3446 location_ids : Collection [int ],
3547 location_types : Collection [str ],
3648 search_query : str | None ,
@@ -40,6 +52,7 @@ async def paginate(
4052 page_size = page_size ,
4153 job_ids = job_ids ,
4254 job_types = job_types ,
55+ tag_value_ids = tag_value_ids ,
4356 location_ids = location_ids ,
4457 location_types = location_types ,
4558 search_query = search_query ,
@@ -49,7 +62,31 @@ async def paginate(
4962 page = pagination .page ,
5063 page_size = pagination .page_size ,
5164 total_count = pagination .total_count ,
52- items = [JobServiceResult (id = job .id , data = job ) for job in pagination .items ],
65+ items = [
66+ JobServiceResult (
67+ id = job .id ,
68+ data = JobData (
69+ id = job .id ,
70+ name = job .name ,
71+ type = job .type ,
72+ location = job .location ,
73+ ),
74+ tags = [
75+ TagData (
76+ id = tag .id ,
77+ name = tag .name ,
78+ values = [
79+ TagValueData (id = tv .id , value = tv .value ) for tv in sorted (group , key = lambda tv : tv .value )
80+ ],
81+ )
82+ for tag , group in groupby (
83+ sorted (job .tag_values , key = lambda tv : tv .tag .name ),
84+ key = lambda tv : tv .tag ,
85+ )
86+ ],
87+ )
88+ for job in pagination .items
89+ ],
5390 )
5491
5592 async def get_job_types (self ) -> Sequence [str ]:
0 commit comments