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",
|
"dev": "tsx watch src/index.ts",
|
||||||
"lint": "eslint .",
|
"lint": "eslint .",
|
||||||
"lint:fix": "pnpm run lint --fix",
|
"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": {
|
"dependencies": {
|
||||||
"@libsql/client": "^0.15.5",
|
"@libsql/client": "^0.15.5",
|
||||||
@@ -23,6 +24,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@antfu/eslint-config": "^4.13.0",
|
"@antfu/eslint-config": "^4.13.0",
|
||||||
|
"@faker-js/faker": "^9.8.0",
|
||||||
"@types/express": "^5.0.1",
|
"@types/express": "^5.0.1",
|
||||||
"@types/node": "^22.15.17",
|
"@types/node": "^22.15.17",
|
||||||
"drizzle-kit": "^0.31.1",
|
"drizzle-kit": "^0.31.1",
|
||||||
|
|||||||
9
pnpm-lock.yaml
generated
9
pnpm-lock.yaml
generated
@@ -30,6 +30,9 @@ importers:
|
|||||||
'@antfu/eslint-config':
|
'@antfu/eslint-config':
|
||||||
specifier: ^4.13.0
|
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)
|
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':
|
'@types/express':
|
||||||
specifier: ^5.0.1
|
specifier: ^5.0.1
|
||||||
version: 5.0.1
|
version: 5.0.1
|
||||||
@@ -506,6 +509,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==}
|
resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==}
|
||||||
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
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':
|
'@humanfs/core@0.19.1':
|
||||||
resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
|
resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
|
||||||
engines: {node: '>=18.18.0'}
|
engines: {node: '>=18.18.0'}
|
||||||
@@ -2696,6 +2703,8 @@ snapshots:
|
|||||||
'@eslint/core': 0.13.0
|
'@eslint/core': 0.13.0
|
||||||
levn: 0.4.1
|
levn: 0.4.1
|
||||||
|
|
||||||
|
'@faker-js/faker@9.8.0': {}
|
||||||
|
|
||||||
'@humanfs/core@0.19.1': {}
|
'@humanfs/core@0.19.1': {}
|
||||||
|
|
||||||
'@humanfs/node@0.16.6':
|
'@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 { relations } from "drizzle-orm"
|
||||||
import { int, sqliteTable, text } from "drizzle-orm/sqlite-core"
|
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