refactor(db): Improve table dropping and seeding logic

- Updated the dropAllTables function to drop tables in a specific order, considering foreign key dependencies, ensuring data integrity during the drop process.
- Refactored the seed function to utilize role and permission data objects for cleaner insertion logic, enhancing readability and maintainability of the code.
This commit is contained in:
2024-12-05 13:23:47 -05:00
parent 80171b2d70
commit 8405a49d45
2 changed files with 24 additions and 12 deletions

View File

@@ -1,5 +1,4 @@
import { sql } from '@vercel/postgres'; import { sql } from '@vercel/postgres';
import { db } from './index';
import { config } from 'dotenv'; import { config } from 'dotenv';
// load .env.local // load .env.local
@@ -7,9 +6,18 @@ config({ path: '.env.local' });
async function dropAllTables() { async function dropAllTables() {
try { try {
// drop all tables, regardless of name // Drop tables in order considering foreign key dependencies
await sql` await sql`
DROP TABLE IF EXISTS ${sql.raw(Object.values(tables).map(table => table.name).join(', '))} DROP TABLE IF EXISTS
invitations,
user_roles,
role_permissions,
permissions,
roles,
participant,
study,
users
CASCADE;
`; `;
console.log('All tables dropped successfully'); console.log('All tables dropped successfully');
} catch (error) { } catch (error) {

View File

@@ -21,25 +21,29 @@ async function seed() {
// Insert roles // Insert roles
console.log("Inserting roles..."); console.log("Inserting roles...");
for (const [roleKey, roleName] of Object.entries(ROLES)) { for (const [roleKey, roleName] of Object.entries(ROLES)) {
const roleData = {
name: roleName,
description: getRoleDescription(roleKey),
} as const;
await db await db
.insert(rolesTable) .insert(rolesTable)
.values({ .values(roleData)
name: roleName,
description: getRoleDescription(roleKey),
})
.onConflictDoNothing(); .onConflictDoNothing();
} }
// Insert permissions // Insert permissions
console.log("Inserting permissions..."); console.log("Inserting permissions...");
for (const [permKey, permCode] of Object.entries(PERMISSIONS)) { for (const [permKey, permCode] of Object.entries(PERMISSIONS)) {
const permData = {
name: formatPermissionName(permKey),
code: permCode,
description: getPermissionDescription(permKey),
} as const;
await db await db
.insert(permissionsTable) .insert(permissionsTable)
.values({ .values(permData)
name: formatPermissionName(permKey),
code: permCode,
description: getPermissionDescription(permKey),
})
.onConflictDoNothing(); .onConflictDoNothing();
} }