1
- import { type SQL , and , eq , or } from 'drizzle-orm' ;
1
+ import { type SQL , and , desc , eq , or , sql } from 'drizzle-orm' ;
2
2
3
3
import { AppErrorMessage } from '~/libs/enums/enums.js' ;
4
4
import { ApplicationError } from '~/libs/exceptions/exceptions.js' ;
@@ -9,6 +9,8 @@ import { type OperationResult } from '~/libs/types/types.js';
9
9
10
10
import { DriverEntity } from './driver.entity.js' ;
11
11
import { type DriverEntity as DriverEntityT } from './drivers.js' ;
12
+ import { countOffsetByQuery } from './libs/helpers/helpers.js' ;
13
+ import { type GetPaginatedPageQuery } from './libs/types/types.js' ;
12
14
13
15
class DriverRepository implements IRepository {
14
16
private db : Pick < IDatabase , 'driver' > ;
@@ -24,8 +26,8 @@ class DriverRepository implements IRepository {
24
26
this . driverSchema = driverSchema ;
25
27
}
26
28
27
- public find (
28
- partial : Partial < DriverEntityT > ,
29
+ public async find (
30
+ partial : Partial < Omit < DriverEntityT , 'user' > > ,
29
31
) : ReturnType < IRepository < DriverEntityT > [ 'find' ] > {
30
32
const queries = Object . entries ( partial ) . map ( ( [ key , value ] ) =>
31
33
eq (
@@ -36,22 +38,41 @@ class DriverRepository implements IRepository {
36
38
37
39
const finalQuery = queries . length === 1 ? queries [ 0 ] : and ( ...queries ) ;
38
40
39
- return this . db
41
+ const drivers = await this . db
40
42
. driver ( )
41
- . query . drivers . findMany ( { where : finalQuery } )
43
+ . query . drivers . findMany ( { where : finalQuery , with : { user : true } } )
42
44
. execute ( ) ;
45
+
46
+ return drivers . map ( ( { createdAt, updatedAt, ...pureDriver } ) =>
47
+ DriverEntity . initialize ( {
48
+ ...pureDriver ,
49
+ createdAt : createdAt . toISOString ( ) ,
50
+ } ) . toObject ( ) ,
51
+ ) ;
43
52
}
44
53
45
54
public async findAllByBusinessId (
46
55
businessId : number ,
56
+ query : GetPaginatedPageQuery ,
47
57
) : Promise < DriverEntity [ ] > {
58
+ const offset = countOffsetByQuery ( query ) ;
48
59
const drivers = await this . db
49
60
. driver ( )
50
- . select ( )
51
- . from ( this . driverSchema )
52
- . where ( eq ( this . driverSchema . businessId , businessId ) ) ;
61
+ . query . drivers . findMany ( {
62
+ limit : query . size ,
63
+ offset,
64
+ where : eq ( this . driverSchema . businessId , businessId ) ,
65
+ with : { user : true } ,
66
+ orderBy : [ desc ( this . driverSchema . createdAt ) ] ,
67
+ } )
68
+ . execute ( ) ;
53
69
54
- return drivers . map ( ( it ) => DriverEntity . initialize ( it ) ) ;
70
+ return drivers . map ( ( { createdAt, ...pureDriver } ) =>
71
+ DriverEntity . initialize ( {
72
+ ...pureDriver ,
73
+ createdAt : createdAt . toISOString ( ) ,
74
+ } ) ,
75
+ ) ;
55
76
}
56
77
57
78
public async checkExists ( {
@@ -76,7 +97,7 @@ class DriverRepository implements IRepository {
76
97
} ) ;
77
98
}
78
99
79
- const [ driver ] : DriverEntityT [ ] = await this . db
100
+ const [ driver ] = await this . db
80
101
. driver ( )
81
102
. select ( )
82
103
. from ( this . driverSchema )
@@ -90,14 +111,17 @@ class DriverRepository implements IRepository {
90
111
public async create ( entity : DriverEntity ) : Promise < DriverEntity > {
91
112
const { driverLicenseNumber, userId, businessId } = entity . toNewObject ( ) ;
92
113
93
- const [ item ] = await this . db
114
+ const [ { createdAt , ... pureDriver } ] = await this . db
94
115
. driver ( )
95
116
. insert ( this . driverSchema )
96
117
. values ( { driverLicenseNumber, userId, businessId } )
97
118
. returning ( )
98
119
. execute ( ) ;
99
120
100
- return DriverEntity . initialize ( item ) ;
121
+ return DriverEntity . initialize ( {
122
+ ...pureDriver ,
123
+ createdAt : createdAt . toISOString ( ) ,
124
+ } ) ;
101
125
}
102
126
103
127
public async update ( {
@@ -107,15 +131,18 @@ class DriverRepository implements IRepository {
107
131
id : number ;
108
132
payload : Partial < Pick < DriverEntityT , 'driverLicenseNumber' > > ;
109
133
} ) : Promise < DriverEntity > {
110
- const [ item ] = await this . db
134
+ const [ { createdAt , ... pureDriver } ] = await this . db
111
135
. driver ( )
112
136
. update ( this . driverSchema )
113
137
. set ( payload )
114
138
. where ( eq ( this . driverSchema . id , id ) )
115
139
. returning ( )
116
140
. execute ( ) ;
117
141
118
- return DriverEntity . initialize ( item ) ;
142
+ return DriverEntity . initialize ( {
143
+ ...pureDriver ,
144
+ createdAt : createdAt . toISOString ( ) ,
145
+ } ) ;
119
146
}
120
147
121
148
public async delete ( id : number ) : Promise < boolean > {
@@ -128,6 +155,16 @@ class DriverRepository implements IRepository {
128
155
129
156
return Boolean ( item ) ;
130
157
}
158
+
159
+ public async getTotal ( id : number ) : Promise < number > {
160
+ const [ driver ] = await this . db
161
+ . driver ( )
162
+ . select ( { count : sql < number > `count(*)` } )
163
+ . from ( this . driverSchema )
164
+ . where ( eq ( this . driverSchema . businessId , id ) ) ;
165
+
166
+ return driver . count ;
167
+ }
131
168
}
132
169
133
170
export { DriverRepository } ;
0 commit comments