generated from Timofey-Makhankov/Node-Express-JS-Template
implemented User Schema & created seed Function for DB
This commit is contained in:
@@ -11,7 +11,8 @@
|
||||
"dev": "tsx watch src/index.ts",
|
||||
"lint": "eslint .",
|
||||
"lint:fix": "pnpm run lint --fix",
|
||||
"db:push": "npx drizzle-kit push"
|
||||
"db:push": "npx drizzle-kit push",
|
||||
"db:seed": "tsx ./src/db/seed.ts"
|
||||
},
|
||||
"dependencies": {
|
||||
"@libsql/client": "^0.15.5",
|
||||
@@ -23,6 +24,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@antfu/eslint-config": "^4.13.0",
|
||||
"@faker-js/faker": "^9.8.0",
|
||||
"@types/express": "^5.0.1",
|
||||
"@types/node": "^22.15.17",
|
||||
"drizzle-kit": "^0.31.1",
|
||||
|
||||
9
pnpm-lock.yaml
generated
9
pnpm-lock.yaml
generated
@@ -30,6 +30,9 @@ importers:
|
||||
'@antfu/eslint-config':
|
||||
specifier: ^4.13.0
|
||||
version: 4.13.0(@typescript-eslint/utils@8.32.1(eslint@9.26.0)(typescript@5.8.3))(@vue/compiler-sfc@3.5.13)(eslint-plugin-format@1.0.1(eslint@9.26.0))(eslint@9.26.0)(typescript@5.8.3)
|
||||
'@faker-js/faker':
|
||||
specifier: ^9.8.0
|
||||
version: 9.8.0
|
||||
'@types/express':
|
||||
specifier: ^5.0.1
|
||||
version: 5.0.1
|
||||
@@ -506,6 +509,10 @@ packages:
|
||||
resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==}
|
||||
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||
|
||||
'@faker-js/faker@9.8.0':
|
||||
resolution: {integrity: sha512-U9wpuSrJC93jZBxx/Qq2wPjCuYISBueyVUGK7qqdmj7r/nxaxwW8AQDCLeRO7wZnjj94sh3p246cAYjUKuqgfg==}
|
||||
engines: {node: '>=18.0.0', npm: '>=9.0.0'}
|
||||
|
||||
'@humanfs/core@0.19.1':
|
||||
resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
|
||||
engines: {node: '>=18.18.0'}
|
||||
@@ -2696,6 +2703,8 @@ snapshots:
|
||||
'@eslint/core': 0.13.0
|
||||
levn: 0.4.1
|
||||
|
||||
'@faker-js/faker@9.8.0': {}
|
||||
|
||||
'@humanfs/core@0.19.1': {}
|
||||
|
||||
'@humanfs/node@0.16.6':
|
||||
|
||||
16
src/db/domain.ts
Normal file
16
src/db/domain.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
import { permissionsTable, rolesPermissionsTable, rolesTable, usersRolesTable, usersTable } from "./schema";
|
||||
|
||||
export type User = typeof usersTable.$inferSelect
|
||||
export type InsertUser = typeof usersTable.$inferInsert
|
||||
|
||||
export type Role = typeof rolesTable.$inferSelect
|
||||
export type InsertRole = typeof rolesTable.$inferInsert
|
||||
|
||||
export type Permission = typeof permissionsTable.$inferSelect
|
||||
export type InsertPermission = typeof permissionsTable.$inferInsert
|
||||
|
||||
export type RolePermission = typeof rolesPermissionsTable.$inferSelect
|
||||
export type RolePermissionInsert = typeof rolesPermissionsTable.$inferInsert
|
||||
|
||||
export type UserRole = typeof usersRolesTable.$inferSelect
|
||||
export type UserRoleInsert = typeof usersRolesTable.$inferInsert
|
||||
@@ -1,2 +1,64 @@
|
||||
// @ts-ignore: Remove, when creating Schemas
|
||||
import { int, sqliteTable, text } from "drizzle-orm/sqlite-core"
|
||||
import { relations } from "drizzle-orm"
|
||||
import { int, sqliteTable, text, primaryKey } from "drizzle-orm/sqlite-core"
|
||||
|
||||
export const usersTable = sqliteTable("users", {
|
||||
id: int("id").primaryKey({ autoIncrement: true }),
|
||||
name: text("name").notNull(),
|
||||
password: text("hash_password").notNull(),
|
||||
email: text("email").notNull().unique()
|
||||
})
|
||||
|
||||
export const rolesTable = sqliteTable("roles", {
|
||||
id: int("id").primaryKey({ autoIncrement: true }),
|
||||
name: text("name").notNull()
|
||||
})
|
||||
|
||||
export const permissionsTable = sqliteTable("permissions", {
|
||||
id: int("id").primaryKey({ autoIncrement: true }),
|
||||
name: text("name").notNull()
|
||||
})
|
||||
|
||||
export const usersRolesTable = sqliteTable('users_roles', {
|
||||
userId: int("user_id").notNull().references(() => usersTable.id),
|
||||
roleId: int("role_id").notNull().references(() => rolesTable.id)
|
||||
}, (t) => [ primaryKey({ columns: [ t.userId, t.roleId ] }) ])
|
||||
|
||||
export const rolesPermissionsTable = sqliteTable('roles_permissions', {
|
||||
roleId: int("role_id").notNull().references(() => rolesTable.id),
|
||||
permissionId: int("permission_id").notNull().references(() => permissionsTable.id)
|
||||
}, (t) => [primaryKey({columns: [t.roleId, t.permissionId]})])
|
||||
|
||||
export const usersRelations = relations(usersTable, ({ many }) => ({
|
||||
usersToRoles: many(usersRolesTable),
|
||||
}))
|
||||
|
||||
export const rolesRelations = relations(rolesTable, ({ many }) => ({
|
||||
usersToRoles: many(usersRolesTable),
|
||||
rolesToPermissions: many(rolesPermissionsTable)
|
||||
}))
|
||||
|
||||
export const permissionsRelations = relations(permissionsTable, ({ many }) => ({
|
||||
rolesToPermissions: many(rolesPermissionsTable)
|
||||
}))
|
||||
|
||||
export const usersToRolesRelations = relations(usersRolesTable, ({ one }) => ({
|
||||
user: one(usersTable, {
|
||||
fields: [usersRolesTable.userId],
|
||||
references: [usersTable.id]
|
||||
}),
|
||||
role: one(rolesTable, {
|
||||
fields: [usersRolesTable.roleId],
|
||||
references: [rolesTable.id]
|
||||
})
|
||||
}))
|
||||
|
||||
export const rolesToPermissionsRelations = relations(rolesPermissionsTable, ({one}) => ({
|
||||
role: one(rolesTable, {
|
||||
fields: [rolesPermissionsTable.roleId],
|
||||
references: [rolesTable.id]
|
||||
}),
|
||||
permission: one(permissionsTable, {
|
||||
fields: [rolesPermissionsTable.permissionId],
|
||||
references: [permissionsTable.id]
|
||||
})
|
||||
}))
|
||||
|
||||
57
src/db/seed.ts
Normal file
57
src/db/seed.ts
Normal file
@@ -0,0 +1,57 @@
|
||||
import { db } from "./config";
|
||||
import { InsertPermission, InsertRole, InsertUser, RolePermissionInsert, UserRoleInsert } from "./domain";
|
||||
import { permissionsTable, rolesPermissionsTable, rolesTable, usersRolesTable, usersTable } from "./schema";
|
||||
import { createHash } from "node:crypto"
|
||||
import { faker } from '@faker-js/faker';
|
||||
|
||||
const permissions: InsertPermission[] = [
|
||||
{name: "READ"},
|
||||
{name: "WRITE"},
|
||||
{name: "UPDATE"},
|
||||
{name: "DELETE"}
|
||||
]
|
||||
|
||||
const roles: InsertRole[] = [
|
||||
{name: "Admin"},
|
||||
{name: "Client"},
|
||||
{name: "Employee"}
|
||||
]
|
||||
|
||||
const rolePermission: RolePermissionInsert[] = [
|
||||
{roleId: 1, permissionId: 1},
|
||||
{roleId: 1, permissionId: 2},
|
||||
{roleId: 1, permissionId: 3},
|
||||
{roleId: 1, permissionId: 4},
|
||||
{roleId: 2, permissionId: 1},
|
||||
{roleId: 3, permissionId: 1},
|
||||
{roleId: 3, permissionId: 2}
|
||||
]
|
||||
|
||||
const users: InsertUser[] = faker.helpers.multiple(() => ({
|
||||
name: faker.person.fullName(),
|
||||
password: createHash('md5').update(faker.internet.password()).digest('hex'),
|
||||
email: faker.internet.email()
|
||||
}), {count: 10})
|
||||
|
||||
const userRole: UserRoleInsert[] = [
|
||||
{userId: 1, roleId: 1},
|
||||
{userId: 2, roleId: 1},
|
||||
{userId: 3, roleId: 2},
|
||||
{userId: 4, roleId: 2},
|
||||
{userId: 5, roleId: 2},
|
||||
{userId: 6, roleId: 2},
|
||||
{userId: 7, roleId: 2},
|
||||
{userId: 8, roleId: 3},
|
||||
{userId: 9, roleId: 3},
|
||||
{userId: 10, roleId: 3},
|
||||
]
|
||||
|
||||
async function seedDB(){
|
||||
await db.insert(permissionsTable).values(permissions)
|
||||
await db.insert(rolesTable).values(roles)
|
||||
await db.insert(rolesPermissionsTable).values(rolePermission)
|
||||
await db.insert(usersTable).values(users)
|
||||
await db.insert(usersRolesTable).values(userRole)
|
||||
}
|
||||
|
||||
seedDB()
|
||||
Reference in New Issue
Block a user