@@ -12,6 +12,7 @@ export class DatabaseService {
12
12
private readonly prisma = new PrismaClient ( ) ;
13
13
14
14
constructor ( ) {
15
+
15
16
// Initialize the Prisma client
16
17
this . prisma
17
18
. $connect ( )
@@ -21,25 +22,20 @@ export class DatabaseService {
21
22
. catch ( ( error ) => {
22
23
this . logger . error ( 'Failed to connect to the database.' , error ) ;
23
24
} ) ;
24
- this . runMigrations ( )
25
- . then ( ( ) => {
26
- // create user after migrations
27
- this . seedDefaultData ( ) . then ( ( ) => {
28
- this . createSystemUser ( ) ;
29
- this . createAdminUser ( ) ;
30
- this . migrateLegeacyUsers ( ) ;
31
-
32
- } ) ;
33
- } )
34
- . catch ( ( error ) => {
35
- this . logger . error ( 'Error during database migrations.' , error ) ;
36
- } ) ;
25
+ }
37
26
38
- this . seedRunpacks ( ) ;
39
- this . seedPodSizes ( ) ;
27
+ public static async DBinit ( ) {
28
+ await this . Init ( ) ;
29
+ await this . RunMigrations ( ) ;
30
+ await this . SeedDefaultData ( ) ;
31
+ await this . CreateSystemUser ( ) ;
32
+ await this . CreateAdminUser ( ) ;
33
+ await this . MigrateLegacyUsers ( ) ;
34
+ await this . SeedRunpacks ( ) ;
35
+ await this . SeedPodSizes ( ) ;
40
36
}
41
37
42
- private async init ( ) {
38
+ private static async Init ( ) {
43
39
if (
44
40
process . env . DATABASE_URL === '' ||
45
41
process . env . DATABASE_URL === undefined
@@ -54,37 +50,36 @@ export class DatabaseService {
54
50
}
55
51
}
56
52
57
- private async runMigrations ( ) {
53
+ private static async RunMigrations ( ) {
58
54
const { execSync } = await import ( 'child_process' ) ;
59
55
60
- await this . init ( ) ;
61
-
62
56
const prisma = new PrismaClient ( ) ;
63
57
64
58
try {
65
- this . logger . log ( 'Running Prisma migrations...' ) ;
59
+ Logger . debug ( 'Running Prisma migrations...' , 'DatabaseService ') ;
66
60
// @ts -ignore
67
61
await prisma . $executeRawUnsafe ?.( 'PRAGMA foreign_keys=OFF;' ) ; // For SQLite, optional
68
62
// Use CLI for migrations
69
- execSync ( 'npx prisma migrate deploy' , { stdio : 'inherit' } ) ;
63
+ await execSync ( 'npx prisma migrate deploy' , { stdio : 'inherit' } ) ;
70
64
//execSync('npx prisma migrate deploy', {});
71
- this . logger . log ( 'Prisma migrations completed.' ) ;
65
+ Logger . log ( 'Prisma migrations completed.' , 'DatabaseService ') ;
72
66
//await prisma.$disconnect();
73
67
} catch ( err ) {
74
- this . logger . error ( 'Prisma migration failed' , err ) ;
68
+ Logger . error ( 'Prisma migration failed' , err , 'DatabaseService' ) ;
75
69
process . exit ( 1 ) ;
76
70
}
77
71
}
78
72
79
- private async createSystemUser ( ) {
73
+
74
+ private static async CreateSystemUser ( ) {
80
75
const prisma = new PrismaClient ( ) ;
81
76
82
77
// Check if the system user already exists
83
78
const existingUser = await prisma . user . findUnique ( {
84
79
where : { id : '1' } ,
85
80
} ) ;
86
81
if ( existingUser ) {
87
- this . logger . log ( 'System user already exists. Skipping creation.' ) ;
82
+ Logger . log ( 'System user already exists. Skipping creation.' , 'DatabaseService ') ;
88
83
return ;
89
84
}
90
85
@@ -107,21 +102,21 @@ export class DatabaseService {
107
102
: undefined ,
108
103
} ,
109
104
} ) ;
110
- this . logger . log ( 'System user created successfully.' ) ;
105
+ Logger . log ( 'System user created successfully.' , 'DatabaseService ') ;
111
106
} catch ( error ) {
112
- this . logger . error ( 'Failed to create system user.' , error ) ;
107
+ Logger . error ( 'Failed to create system user.' , error , 'DatabaseService' ) ;
113
108
}
114
109
}
115
110
116
- private async createAdminUser ( ) {
111
+ private static async CreateAdminUser ( ) {
117
112
const prisma = new PrismaClient ( ) ;
118
113
119
114
// Check if the admin user already exists
120
115
const existingUser = await prisma . user . findUnique ( {
121
116
where : { id : '2' } ,
122
117
} ) ;
123
118
if ( existingUser ) {
124
- this . logger . log ( 'Admin user already exists. Skipping creation.' ) ;
119
+ Logger . log ( 'Admin user already exists. Skipping creation.' , 'DatabaseService ') ;
125
120
return ;
126
121
}
127
122
@@ -161,9 +156,9 @@ export class DatabaseService {
161
156
updatedAt : new Date ( ) ,
162
157
} ,
163
158
} ) ;
164
- this . logger . log ( 'Admin user created successfully.' ) ;
159
+ Logger . log ( 'Admin user created successfully.' , 'DatabaseService ') ;
165
160
} catch ( error ) {
166
- Logger . error ( 'Failed to create admin user.' , error ) ;
161
+ Logger . error ( 'Failed to create admin user.' , error , 'DatabaseService' ) ;
167
162
}
168
163
}
169
164
@@ -239,17 +234,17 @@ export class DatabaseService {
239
234
}
240
235
}
241
236
242
- private async migrateLegeacyUsers ( ) {
237
+ private static async MigrateLegacyUsers ( ) {
243
238
const prisma = new PrismaClient ( ) ;
244
239
245
240
const existingUsers = await prisma . user . count ( ) ;
246
241
if ( existingUsers > 2 ) {
247
- this . logger . log ( 'Legacy users already migrated. Skipping migration.' ) ;
242
+ Logger . log ( 'Legacy users already migrated. Skipping migration.' , 'DatabaseService ') ;
248
243
return ;
249
244
}
250
245
251
246
if ( ! process . env . KUBERO_USERS || process . env . KUBERO_USERS === '' ) {
252
- this . logger . log ( 'No legacy users to migrate. KUBERO_USERS is not set.' ) ;
247
+ Logger . log ( 'No legacy users to migrate. KUBERO_USERS is not set.' , 'DatabaseService ') ;
253
248
return ;
254
249
}
255
250
@@ -263,10 +258,11 @@ export class DatabaseService {
263
258
user . insecure === true &&
264
259
process . env . KUBERO_SESSION_KEY
265
260
) {
266
- this . logger . warn (
261
+ Logger . warn (
267
262
'User with unencrypted Password detected: "' +
268
263
user . username +
269
264
'" - This feature is deprecated and will be removed in the future' ,
265
+ 'DatabaseService' ,
270
266
) ;
271
267
password = crypto
272
268
. createHmac ( 'sha256' , process . env . KUBERO_SESSION_KEY )
@@ -294,18 +290,19 @@ export class DatabaseService {
294
290
: undefined ,
295
291
} ,
296
292
} ) ;
297
- this . logger . log ( `Migrated user ${ user . username } successfully.` ) ;
293
+ Logger . log ( `Migrated user ${ user . username } successfully.` , 'DatabaseService' ) ;
298
294
} catch ( error ) {
299
- this . logger . error ( `Failed to migrate user ${ user . username } .` , error ) ;
295
+ Logger . error ( `Failed to migrate user ${ user . username } .` , error , 'DatabaseService' ) ;
300
296
}
301
297
}
302
298
303
- this . logger . log ( 'Legacy users migrated successfully.' ) ;
299
+ Logger . log ( 'Legacy users migrated successfully.' , 'DatabaseService ') ;
304
300
}
305
301
306
- private async seedDefaultData ( ) {
302
+ private static async SeedDefaultData ( ) {
303
+ const prisma = new PrismaClient ( ) ;
307
304
// Ensure the 'admin' role exists with permissions
308
- this . prisma . role
305
+ await prisma . role
309
306
. upsert ( {
310
307
where : { name : 'admin' } ,
311
308
update : { } ,
@@ -329,11 +326,11 @@ export class DatabaseService {
329
326
} ,
330
327
} )
331
328
. then ( ( ) => {
332
- this . logger . log ( 'Role "admin" seeded successfully.' ) ;
329
+ Logger . log ( 'Role "admin" seeded successfully.' , 'DatabaseService ') ;
333
330
} ) ;
334
331
335
332
// Ensure the 'member' role exists with limited permissions
336
- this . prisma . role
333
+ await prisma . role
337
334
. upsert ( {
338
335
where : { name : 'member' } ,
339
336
update : { } ,
@@ -357,11 +354,11 @@ export class DatabaseService {
357
354
} ,
358
355
} )
359
356
. then ( ( ) => {
360
- this . logger . log ( 'Role "member" seeded successfully.' ) ;
357
+ Logger . log ( 'Role "member" seeded successfully.' , 'DatabaseService ') ;
361
358
} ) ;
362
359
363
360
// Ensure the 'guest' role exists with minimal permissions
364
- this . prisma . role
361
+ await prisma . role
365
362
. upsert ( {
366
363
where : { name : 'guest' } ,
367
364
update : { } ,
@@ -385,56 +382,48 @@ export class DatabaseService {
385
382
} ,
386
383
} )
387
384
. then ( ( ) => {
388
- this . logger . log ( 'Role "guest" seeded successfully.' ) ;
385
+ Logger . log ( 'Role "guest" seeded successfully.' , 'DatabaseService ') ;
389
386
} ) ;
390
387
391
388
// Ensure the 'everyone' user group exists
392
- const existingGroup = await this . prisma . userGroup . findUnique ( {
389
+ prisma . userGroup
390
+ . upsert ( {
393
391
where : { name : 'everyone' } ,
392
+ update : { } ,
393
+ create : {
394
+ name : 'everyone' ,
395
+ description : 'Standard group for all users' ,
396
+ } ,
397
+ } )
398
+ . then ( ( ) => {
399
+ Logger . log ( 'UserGroup "everyone" seeded successfully.' , 'DatabaseService' ) ;
394
400
} ) ;
395
401
396
- if ( ! existingGroup ) {
397
- await this . prisma . userGroup . create ( {
398
- data : {
399
- name : 'everyone' ,
400
- description : 'Standard group for all users' ,
401
- } ,
402
- } ) ;
403
- this . logger . log ( 'UserGroup "everyone" created successfully.' ) ;
404
- } else {
405
- this . logger . log (
406
- 'UserGroup "everyone" already exists. Skipping creation.' ,
407
- ) ;
408
- }
409
-
410
402
// Ensure the 'admin' user group exists
411
- const adminGroup = await this . prisma . userGroup . findUnique ( {
412
- where : { name : 'admin' } ,
413
- } ) ;
414
-
415
- if ( ! adminGroup ) {
416
- await this . prisma . userGroup . create ( {
417
- data : {
403
+ await prisma . userGroup
404
+ . upsert ( {
405
+ where : { name : 'admin' } ,
406
+ update : { } ,
407
+ create : {
418
408
name : 'admin' ,
419
409
description : 'Group for admin users' ,
420
410
} ,
411
+ } )
412
+ . then ( ( ) => {
413
+ Logger . log ( 'UserGroup "admin" seeded successfully.' , 'DatabaseService' ) ;
421
414
} ) ;
422
- this . logger . log ( 'UserGroup "admin" created successfully.' ) ;
423
- } else {
424
- this . logger . log ( 'UserGroup "admin" already exists. Skipping creation.' ) ;
425
- }
426
415
427
- this . logger . log ( 'Default data seeded successfully.' ) ;
416
+ Logger . log ( 'Default data seeded successfully.' , 'DatabaseService ') ;
428
417
}
429
418
430
- private async seedRunpacks ( ) {
419
+ private static async SeedRunpacks ( ) {
420
+ const prisma = new PrismaClient ( ) ;
431
421
const config = yaml . parse ( runpacks ) ;
432
422
433
423
const buildpacks = config || [ ] ;
434
424
for ( const bp of buildpacks ) {
435
425
// Find existing by name
436
- const existing = await this . prisma . runpack . findFirst ( { where : { name : bp . name } } ) ;
437
- const prisma = this . prisma ;
426
+ const existing = await prisma . runpack . findFirst ( { where : { name : bp . name } } ) ;
438
427
const createPhase = async ( phase : any ) => {
439
428
// Create SecurityContext
440
429
const sec = await prisma . securityContext . create ( {
@@ -468,10 +457,10 @@ export class DatabaseService {
468
457
const runPhase = await createPhase ( bp . run ) ;
469
458
if ( existing ) {
470
459
// Optionally update here
471
- this . logger . log ( `Runpack/Buildpack '${ bp . name } ' already exists. Skipping.` ) ;
460
+ Logger . log ( `Runpack/Buildpack '${ bp . name } ' already exists. Skipping.` , 'DatabaseService' ) ;
472
461
continue ;
473
462
}
474
- await this . prisma . runpack . create ( {
463
+ await prisma . runpack . create ( {
475
464
data : {
476
465
name : bp . name ,
477
466
language : bp . language ,
@@ -480,21 +469,22 @@ export class DatabaseService {
480
469
runId : runPhase . id ,
481
470
} ,
482
471
} ) ;
483
- this . logger . log ( `Runpack/Buildpack '${ bp . name } ' seeded.` ) ;
472
+ Logger . log ( `Runpack/Buildpack '${ bp . name } ' seeded.` , 'DatabaseService' ) ;
484
473
}
485
- this . logger . log ( 'Buildpacks/Runpacks seeded successfully.' ) ;
474
+ Logger . log ( 'Buildpacks/Runpacks seeded successfully.' , 'DatabaseService ') ;
486
475
}
487
476
488
- private async seedPodSizes ( ) {
477
+ private static async SeedPodSizes ( ) {
478
+ const prisma = new PrismaClient ( ) ;
489
479
const config = yaml . parse ( podsizes ) ;
490
480
// seed pod sizes if the table is empty
491
- const existingSizes = await this . prisma . podSize . count ( ) ;
481
+ const existingSizes = await prisma . podSize . count ( ) ;
492
482
if ( existingSizes > 0 ) {
493
- this . logger . log ( 'Pod sizes already exist. Skipping seeding.' ) ;
483
+ Logger . log ( 'Pod sizes already exist. Skipping seeding.' , 'DatabaseService ') ;
494
484
return ;
495
485
}
496
486
for ( const size of config ) {
497
- await this . prisma . podSize . create ( {
487
+ await prisma . podSize . create ( {
498
488
data : {
499
489
name : size . name ,
500
490
description : size . description ,
@@ -504,8 +494,8 @@ export class DatabaseService {
504
494
memoryRequest : size . resources . requests . memory ,
505
495
} ,
506
496
} ) ;
507
- this . logger . log ( `Pod size '${ size . name } ' seeded successfully.` ) ;
497
+ Logger . log ( `Pod size '${ size . name } ' seeded successfully.` , 'DatabaseService' ) ;
508
498
}
509
- this . logger . log ( 'Pod sizes seeded successfully.' ) ;
499
+ Logger . log ( 'Pod sizes seeded successfully.' , 'DatabaseService ') ;
510
500
}
511
501
}
0 commit comments