55 lines
2.0 KiB
TypeScript
55 lines
2.0 KiB
TypeScript
import { Injectable, OnApplicationBootstrap, Logger } from '@nestjs/common';
|
|
import * as bcrypt from 'bcryptjs';
|
|
import { PrismaService } from '../prisma/prisma.service';
|
|
|
|
type SeedUser = {
|
|
username: string;
|
|
email: string;
|
|
passwordEnvKey: string;
|
|
role: string;
|
|
};
|
|
|
|
const SEED_USERS: SeedUser[] = [
|
|
{ username: 'Nadmin', email: 'nadmin@localhost', passwordEnvKey: 'ADMIN_NADMIN_PASSWORD', role: 'admin' },
|
|
{ username: 'Padmin', email: 'padmin@localhost', passwordEnvKey: 'ADMIN_PADMIN_PASSWORD', role: 'admin' },
|
|
{ username: 'user1', email: 'user1@localhost', passwordEnvKey: 'SEED_USER1_PASSWORD', role: 'user' },
|
|
{ username: 'user2', email: 'user2@localhost', passwordEnvKey: 'SEED_USER2_PASSWORD', role: 'user' },
|
|
];
|
|
|
|
@Injectable()
|
|
export class AdminBootstrapService implements OnApplicationBootstrap {
|
|
private readonly logger = new Logger(AdminBootstrapService.name);
|
|
|
|
constructor(private readonly prisma: PrismaService) {}
|
|
|
|
async onApplicationBootstrap() {
|
|
for (const seed of SEED_USERS) {
|
|
const password = process.env[seed.passwordEnvKey];
|
|
if (!password) {
|
|
this.logger.warn(`${seed.passwordEnvKey} not set — skipping ${seed.username}`);
|
|
continue;
|
|
}
|
|
|
|
const existing = await this.prisma.user.findUnique({ where: { username: seed.username } });
|
|
|
|
if (existing) {
|
|
if (existing.role !== seed.role) {
|
|
await this.prisma.user.update({ where: { id: existing.id }, data: { role: seed.role } });
|
|
this.logger.log(`Updated role for ${seed.username} → ${seed.role}`);
|
|
}
|
|
} else {
|
|
const passwordHash = await bcrypt.hash(password, 12);
|
|
await this.prisma.user.create({
|
|
data: {
|
|
username: seed.username,
|
|
email: seed.email,
|
|
passwordHash,
|
|
role: seed.role,
|
|
},
|
|
});
|
|
this.logger.log(`Created ${seed.role} user: ${seed.username}`);
|
|
}
|
|
}
|
|
}
|
|
}
|