5
5
InternalRole ,
6
6
ApplicationType ,
7
7
Applications ,
8
+ hasSecrets ,
8
9
} from '@logto/schemas' ;
9
10
import { generateStandardId , generateStandardSecret } from '@logto/shared' ;
10
11
import { conditional } from '@silverhand/essentials' ;
@@ -40,28 +41,12 @@ export default function applicationRoutes<T extends ManagementApiRouter>(
40
41
...[
41
42
router ,
42
43
{
43
- queries : { applications , applicationsRoles , roles } ,
44
+ queries,
44
45
id : tenantId ,
45
46
libraries : { quota, protectedApps } ,
46
47
} ,
47
48
] : RouterInitArgs < T >
48
49
) {
49
- const {
50
- deleteApplicationById,
51
- findApplicationById,
52
- insertApplication,
53
- updateApplicationById,
54
- countApplications,
55
- findApplications,
56
- } = applications ;
57
-
58
- const {
59
- findApplicationsRolesByApplicationId,
60
- insertApplicationsRoles,
61
- deleteApplicationRole,
62
- findApplicationsRolesByRoleId,
63
- } = applicationsRoles ;
64
-
65
50
router . get (
66
51
'/applications' ,
67
52
koaPagination ( { isOptional : true } ) ,
@@ -107,15 +92,15 @@ export default function applicationRoutes<T extends ManagementApiRouter>(
107
92
const search = parseSearchParamsForSearch ( searchParams ) ;
108
93
109
94
const excludeApplicationsRoles = excludeRoleId
110
- ? await findApplicationsRolesByRoleId ( excludeRoleId )
95
+ ? await queries . applicationsRoles . findApplicationsRolesByRoleId ( excludeRoleId )
111
96
: [ ] ;
112
97
113
98
const excludeApplicationIds = excludeApplicationsRoles . map (
114
99
( { applicationId } ) => applicationId
115
100
) ;
116
101
117
102
if ( paginationDisabled ) {
118
- ctx . body = await findApplications ( {
103
+ ctx . body = await queries . applications . findApplications ( {
119
104
search,
120
105
excludeApplicationIds,
121
106
excludeOrganizationId,
@@ -127,14 +112,14 @@ export default function applicationRoutes<T extends ManagementApiRouter>(
127
112
}
128
113
129
114
const [ { count } , applications ] = await Promise . all ( [
130
- countApplications ( {
115
+ queries . applications . countApplications ( {
131
116
search,
132
117
excludeApplicationIds,
133
118
excludeOrganizationId,
134
119
isThirdParty,
135
120
types,
136
121
} ) ,
137
- findApplications (
122
+ queries . applications . findApplications (
138
123
{
139
124
search,
140
125
excludeApplicationIds,
@@ -164,36 +149,29 @@ export default function applicationRoutes<T extends ManagementApiRouter>(
164
149
async ( ctx , next ) => {
165
150
const { oidcClientMetadata, protectedAppMetadata, ...rest } = ctx . guard . body ;
166
151
167
- // When creating a m2m app, should check both m2m limit and application limit.
168
- if ( rest . type === ApplicationType . MachineToMachine ) {
169
- await quota . guardKey ( 'machineToMachineLimit' ) ;
170
- }
171
-
172
- // Guard third party application limit
173
- if ( rest . isThirdParty ) {
174
- await quota . guardKey ( 'thirdPartyApplicationsLimit' ) ;
175
- }
176
-
177
- await quota . guardKey ( 'applicationsLimit' ) ;
152
+ await Promise . all ( [
153
+ rest . type === ApplicationType . MachineToMachine && quota . guardKey ( 'machineToMachineLimit' ) ,
154
+ rest . isThirdParty && quota . guardKey ( 'thirdPartyApplicationsLimit' ) ,
155
+ quota . guardKey ( 'applicationsLimit' ) ,
156
+ ] ) ;
178
157
179
158
assertThat (
180
159
rest . type !== ApplicationType . Protected || protectedAppMetadata ,
181
160
'application.protected_app_metadata_is_required'
182
161
) ;
183
162
184
- // Third party applications must be traditional type
185
163
if ( rest . isThirdParty ) {
186
164
assertThat (
187
165
rest . type === ApplicationType . Traditional ,
188
166
'application.invalid_third_party_application_type'
189
167
) ;
190
168
}
191
169
192
- const application = await insertApplication ( {
170
+ const getSecret = ( ) =>
171
+ EnvSet . values . isDevFeaturesEnabled ? generateInternalSecret ( ) : generateStandardSecret ( ) ;
172
+ const application = await queries . applications . insertApplication ( {
193
173
id : generateStandardId ( ) ,
194
- secret : EnvSet . values . isDevFeaturesEnabled
195
- ? generateStandardSecret ( )
196
- : generateInternalSecret ( ) ,
174
+ secret : getSecret ( ) ,
197
175
oidcClientMetadata : buildOidcClientMetadata ( oidcClientMetadata ) ,
198
176
...conditional (
199
177
rest . type === ApplicationType . Protected &&
@@ -203,18 +181,25 @@ export default function applicationRoutes<T extends ManagementApiRouter>(
203
181
...rest ,
204
182
} ) ;
205
183
184
+ if ( EnvSet . values . isDevFeaturesEnabled && hasSecrets ( application . type ) ) {
185
+ await queries . applicationSecrets . insert ( {
186
+ name : 'Default secret' ,
187
+ applicationId : application . id ,
188
+ value : generateStandardSecret ( ) ,
189
+ } ) ;
190
+ }
191
+
206
192
if ( application . type === ApplicationType . Protected ) {
207
193
try {
208
194
await protectedApps . syncAppConfigsToRemote ( application . id ) ;
209
195
} catch ( error : unknown ) {
210
196
// Delete the application if failed to sync to remote
211
- await deleteApplicationById ( application . id ) ;
197
+ await queries . applications . deleteApplicationById ( application . id ) ;
212
198
throw error ;
213
199
}
214
200
}
215
201
216
202
ctx . body = application ;
217
-
218
203
return next ( ) ;
219
204
}
220
205
) ;
@@ -238,8 +223,9 @@ export default function applicationRoutes<T extends ManagementApiRouter>(
238
223
return next ( ) ;
239
224
}
240
225
241
- const application = await findApplicationById ( id ) ;
242
- const applicationsRoles = await findApplicationsRolesByApplicationId ( id ) ;
226
+ const application = await queries . applications . findApplicationById ( id ) ;
227
+ const applicationsRoles =
228
+ await queries . applicationsRoles . findApplicationsRolesByApplicationId ( id ) ;
243
229
244
230
ctx . body = {
245
231
...application ,
@@ -276,8 +262,8 @@ export default function applicationRoutes<T extends ManagementApiRouter>(
276
262
// This role is NOT intended for user assignment.
277
263
if ( isAdmin !== undefined ) {
278
264
const [ applicationsRoles , internalAdminRole ] = await Promise . all ( [
279
- findApplicationsRolesByApplicationId ( id ) ,
280
- roles . findRoleByRoleName ( InternalRole . Admin ) ,
265
+ queries . applicationsRoles . findApplicationsRolesByApplicationId ( id ) ,
266
+ queries . roles . findRoleByRoleName ( InternalRole . Admin ) ,
281
267
] ) ;
282
268
const usedToBeAdmin = includesInternalAdminRole ( applicationsRoles ) ;
283
269
@@ -291,17 +277,17 @@ export default function applicationRoutes<T extends ManagementApiRouter>(
291
277
) ;
292
278
293
279
if ( isAdmin && ! usedToBeAdmin ) {
294
- await insertApplicationsRoles ( [
280
+ await queries . applicationsRoles . insertApplicationsRoles ( [
295
281
{ id : generateStandardId ( ) , applicationId : id , roleId : internalAdminRole . id } ,
296
282
] ) ;
297
283
} else if ( ! isAdmin && usedToBeAdmin ) {
298
- await deleteApplicationRole ( id , internalAdminRole . id ) ;
284
+ await queries . applicationsRoles . deleteApplicationRole ( id , internalAdminRole . id ) ;
299
285
}
300
286
}
301
287
302
288
if ( protectedAppMetadata ) {
303
289
const { type, protectedAppMetadata : originProtectedAppMetadata } =
304
- await findApplicationById ( id ) ;
290
+ await queries . applications . findApplicationById ( id ) ;
305
291
assertThat ( type === ApplicationType . Protected , 'application.protected_application_only' ) ;
306
292
assertThat (
307
293
originProtectedAppMetadata ,
@@ -310,7 +296,7 @@ export default function applicationRoutes<T extends ManagementApiRouter>(
310
296
status : 422 ,
311
297
} )
312
298
) ;
313
- await updateApplicationById ( id , {
299
+ await queries . applications . updateApplicationById ( id , {
314
300
protectedAppMetadata : {
315
301
...originProtectedAppMetadata ,
316
302
...protectedAppMetadata ,
@@ -320,16 +306,16 @@ export default function applicationRoutes<T extends ManagementApiRouter>(
320
306
await protectedApps . syncAppConfigsToRemote ( id ) ;
321
307
} catch ( error : unknown ) {
322
308
// Revert changes on sync failure
323
- await updateApplicationById ( id , {
309
+ await queries . applications . updateApplicationById ( id , {
324
310
protectedAppMetadata : originProtectedAppMetadata ,
325
311
} ) ;
326
312
throw error ;
327
313
}
328
314
}
329
315
330
316
ctx . body = await ( Object . keys ( rest ) . length > 0
331
- ? updateApplicationById ( id , rest )
332
- : findApplicationById ( id ) ) ;
317
+ ? queries . applications . updateApplicationById ( id , rest )
318
+ : queries . applications . findApplicationById ( id ) ) ;
333
319
334
320
return next ( ) ;
335
321
}
@@ -344,7 +330,7 @@ export default function applicationRoutes<T extends ManagementApiRouter>(
344
330
} ) ,
345
331
async ( ctx , next ) => {
346
332
const { id } = ctx . guard . params ;
347
- const { type, protectedAppMetadata } = await findApplicationById ( id ) ;
333
+ const { type, protectedAppMetadata } = await queries . applications . findApplicationById ( id ) ;
348
334
if ( type === ApplicationType . Protected && protectedAppMetadata ) {
349
335
assertThat (
350
336
! protectedAppMetadata . customDomains || protectedAppMetadata . customDomains . length === 0 ,
@@ -354,7 +340,7 @@ export default function applicationRoutes<T extends ManagementApiRouter>(
354
340
await protectedApps . deleteRemoteAppConfigs ( protectedAppMetadata . host ) ;
355
341
}
356
342
// Note: will need delete cascade when application is joint with other tables
357
- await deleteApplicationById ( id ) ;
343
+ await queries . applications . deleteApplicationById ( id ) ;
358
344
ctx . status = 204 ;
359
345
360
346
return next ( ) ;
0 commit comments