Fix Seeder User, dan role
This commit is contained in:
@@ -2163,18 +2163,18 @@ enum StatusPeminjaman {
|
|||||||
// ========================================= USER ========================================= //
|
// ========================================= USER ========================================= //
|
||||||
|
|
||||||
model User {
|
model User {
|
||||||
id String @id @default(cuid())
|
id String @id @default(cuid())
|
||||||
username String
|
username String
|
||||||
nomor String @unique
|
nomor String @unique
|
||||||
roleId String @default("2")
|
roleId String @default("2")
|
||||||
isActive Boolean @default(false)
|
isActive Boolean @default(false)
|
||||||
sessionInvalid Boolean @default(false)
|
sessionInvalid Boolean @default(false)
|
||||||
lastLogin DateTime?
|
lastLogin DateTime?
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @default(now()) @updatedAt
|
updatedAt DateTime @default(now()) @updatedAt
|
||||||
|
permissions Json?
|
||||||
sessions UserSession[] // ✅ Relasi one-to-many
|
sessions UserSession[] // ✅ Relasi one-to-many
|
||||||
role Role @relation(fields: [roleId], references: [id])
|
role Role @relation(fields: [roleId], references: [id])
|
||||||
menuAccesses UserMenuAccess[]
|
menuAccesses UserMenuAccess[]
|
||||||
|
|
||||||
@@map("users")
|
@@map("users")
|
||||||
@@ -2184,6 +2184,7 @@ model Role {
|
|||||||
id String @id @default(cuid())
|
id String @id @default(cuid())
|
||||||
name String @unique // ADMIN_DESA, ADMIN_KESEHATAN, ADMIN_SEKOLAH
|
name String @unique // ADMIN_DESA, ADMIN_KESEHATAN, ADMIN_SEKOLAH
|
||||||
description String?
|
description String?
|
||||||
|
permissions Json?
|
||||||
isActive Boolean @default(true)
|
isActive Boolean @default(true)
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
@@ -2203,18 +2204,18 @@ model KodeOtp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
model UserSession {
|
model UserSession {
|
||||||
id String @id @default(cuid())
|
id String @id @default(cuid())
|
||||||
token String @db.Text // ✅ JWT bisa panjang
|
token String @db.Text // ✅ JWT bisa panjang
|
||||||
expiresAt DateTime // ✅ Ubah jadi expiresAt (konsisten)
|
expiresAt DateTime // ✅ Ubah jadi expiresAt (konsisten)
|
||||||
active Boolean @default(true)
|
active Boolean @default(true)
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @default(now()) @updatedAt
|
updatedAt DateTime @default(now()) @updatedAt
|
||||||
|
|
||||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||||
userId String // ✅ HAPUS @unique - user bisa punya multiple sessions
|
userId String // ✅ HAPUS @unique - user bisa punya multiple sessions
|
||||||
|
|
||||||
@@index([userId]) // ✅ Index untuk query cepat
|
@@index([userId]) // ✅ Index untuk query cepat
|
||||||
@@index([token]) // ✅ Index untuk verify cepat
|
@@index([token]) // ✅ Index untuk verify cepat
|
||||||
@@map("user_sessions")
|
@@map("user_sessions")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -64,29 +64,22 @@ import { safeSeedUnique } from "./safeseedUnique";
|
|||||||
(async () => {
|
(async () => {
|
||||||
console.log("🔄 Seeding roles...");
|
console.log("🔄 Seeding roles...");
|
||||||
|
|
||||||
// Check for duplicate names in roles data
|
|
||||||
const roleNames = new Set();
|
|
||||||
const duplicateRoleNames = roles.filter((r) => {
|
|
||||||
if (roleNames.has(r.name)) {
|
|
||||||
console.warn(`⚠️ Duplicate role name found: ${r.name}`);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
roleNames.add(r.name);
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
for (const r of roles) {
|
for (const r of roles) {
|
||||||
try {
|
try {
|
||||||
|
// ✅ Destructure to remove permissions if exists
|
||||||
|
const { permissions, ...roleData } = r as any;
|
||||||
|
|
||||||
await safeSeedUnique(
|
await safeSeedUnique(
|
||||||
"role",
|
"role",
|
||||||
{ id: r.id },
|
{ id: roleData.id },
|
||||||
{
|
{
|
||||||
name: r.name,
|
name: roleData.name,
|
||||||
description: r.description,
|
description: roleData.description,
|
||||||
isActive: r.isActive,
|
permissions: roleData.permissions || {}, // ✅ Include permissions
|
||||||
|
isActive: roleData.isActive,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
console.log(`✅ Seeded role -> ${r.name}`);
|
console.log(`✅ Seeded role -> ${roleData.name}`);
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
if (error.code === "P2002") {
|
if (error.code === "P2002") {
|
||||||
console.warn(`⚠️ Role already exists (skipping): ${r.name}`);
|
console.warn(`⚠️ Role already exists (skipping): ${r.name}`);
|
||||||
@@ -96,13 +89,15 @@ import { safeSeedUnique } from "./safeseedUnique";
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.log("✅ Roles seeding completed");
|
console.log("✅ Roles seeding completed");
|
||||||
|
|
||||||
// =========== USER ===========
|
// =========== USER ===========
|
||||||
console.log("🔄 Seeding users...");
|
console.log("🔄 Seeding users...");
|
||||||
for (const u of users) {
|
for (const u of users) {
|
||||||
try {
|
try {
|
||||||
// Verify role exists
|
// Verify role exists first
|
||||||
const roleExists = await prisma.role.findUnique({
|
const roleExists = await prisma.role.findUnique({
|
||||||
where: { id: u.roleId.toString() },
|
where: { id: u.roleId.toString() },
|
||||||
|
select: { id: true }, // Only select id to minimize query
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!roleExists) {
|
if (!roleExists) {
|
||||||
@@ -125,7 +120,13 @@ import { safeSeedUnique } from "./safeseedUnique";
|
|||||||
);
|
);
|
||||||
console.log(`✅ Seeded user -> ${u.username}`);
|
console.log(`✅ Seeded user -> ${u.username}`);
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
console.error(`❌ Failed to seed user ${u.username}:`, error.message);
|
if (error.code === "P2003") {
|
||||||
|
console.error(
|
||||||
|
`❌ Foreign key constraint failed for user ${u.username}: Role ${u.roleId} does not exist`
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
console.error(`❌ Failed to seed user ${u.username}:`, error.message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.log("✅ Users seeding completed");
|
console.log("✅ Users seeding completed");
|
||||||
|
|||||||
Reference in New Issue
Block a user