boredgame/src/lib/server/api/infrastructure/database/seeds/users.ts

113 lines
2.8 KiB
TypeScript
Raw Normal View History

import { eq } from 'drizzle-orm';
import { Argon2id } from 'oslo/password';
2024-08-14 00:07:21 +00:00
import { type db } from '$lib/server/api/infrastructure/database';
import * as schema from '$lib/server/api/infrastructure/database/tables';
import users from './data/users.json';
import { config } from '../../../common/config';
type JsonUser = {
id: string;
username: string;
email: string;
password: string;
roles: {
name: string;
primary: boolean;
}[];
};
type JsonRole = {
name: string;
primary: boolean;
};
export default async function seed(db: db) {
const adminRole = await db.select().from(schema.roles).where(eq(schema.roles.name, 'admin'));
const userRole = await db.select().from(schema.roles).where(eq(schema.roles.name, 'user'));
console.log('Admin Role: ', adminRole);
const adminUser = await db
.insert(schema.usersTable)
.values({
username: `${config.ADMIN_USERNAME}`,
email: '',
first_name: 'Brad',
last_name: 'S',
verified: true,
})
.returning()
.onConflictDoNothing();
console.log('Admin user created.', adminUser);
2024-08-14 00:07:21 +00:00
await db
.insert(schema.credentialsTable)
.values({
user_id: adminUser[0].id,
type: schema.CredentialsType.PASSWORD,
secret_data: await new Argon2id().hash(`${config.ADMIN_PASSWORD}`),
});
await db
.insert(schema.collections)
.values({ user_id: adminUser[0].id })
.onConflictDoNothing();
await db
.insert(schema.wishlists)
.values({ user_id: adminUser[0].id })
.onConflictDoNothing();
await db
2024-08-14 00:07:21 +00:00
.insert(schema.user_roles)
.values({
user_id: adminUser[0].id,
role_id: adminRole[0].id,
2024-08-14 00:07:21 +00:00
primary: true,
})
.onConflictDoNothing();
console.log('Admin user given admin role.');
await db
2024-08-14 00:07:21 +00:00
.insert(schema.user_roles)
.values({
user_id: adminUser[0].id,
role_id: userRole[0].id,
2024-08-14 00:07:21 +00:00
primary: false,
})
.onConflictDoNothing();
console.log('Admin user given user role.');
await Promise.all(
users.map(async (user) => {
const [insertedUser] = await db
.insert(schema.usersTable)
.values({
...user,
})
.returning();
2024-08-14 00:07:21 +00:00
await db.insert(schema.credentialsTable).values({
user_id: insertedUser?.id,
type: schema.CredentialsType.PASSWORD,
secret_data: await new Argon2id().hash(user.password),
})
await db.insert(schema.collections).values({ user_id: insertedUser?.id });
await db.insert(schema.wishlists).values({ user_id: insertedUser?.id });
await Promise.all(
user.roles.map(async (role: JsonRole) => {
const foundRole = await db.query.roles.findFirst({
where: eq(schema.roles.name, role.name),
});
2024-08-14 00:07:21 +00:00
if (!foundRole) { throw new Error('Role not found'); };
await db.insert(schema.user_roles).values({
user_id: insertedUser?.id,
role_id: foundRole?.id,
primary: role?.primary,
});
}),
);
}),
);
}