This commit is contained in:
2026-06-02 10:23:09 +03:00
parent e08d555b23
commit 0c87eaef46
136 changed files with 16069 additions and 94 deletions

BIN
prisma/dev.db Normal file

Binary file not shown.

View File

@@ -0,0 +1,83 @@
-- CreateTable
CREATE TABLE "User" (
"id" TEXT NOT NULL PRIMARY KEY,
"email" TEXT NOT NULL,
"passwordHash" TEXT NOT NULL,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL
);
-- CreateTable
CREATE TABLE "Session" (
"id" TEXT NOT NULL PRIMARY KEY,
"sessionToken" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"expiresAt" DATETIME NOT NULL,
CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE
);
-- CreateTable
CREATE TABLE "PasswordResetToken" (
"id" TEXT NOT NULL PRIMARY KEY,
"token" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"expiresAt" DATETIME NOT NULL,
"used" BOOLEAN NOT NULL DEFAULT false,
CONSTRAINT "PasswordResetToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE
);
-- CreateTable
CREATE TABLE "Order" (
"id" TEXT NOT NULL PRIMARY KEY,
"title" TEXT NOT NULL,
"status" TEXT NOT NULL DEFAULT 'pending',
"notes" TEXT,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL
);
-- CreateTable
CREATE TABLE "Customer" (
"id" TEXT NOT NULL PRIMARY KEY,
"name" TEXT NOT NULL,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- CreateTable
CREATE TABLE "OrderCustomer" (
"orderId" TEXT NOT NULL,
"customerId" TEXT NOT NULL,
PRIMARY KEY ("orderId", "customerId"),
CONSTRAINT "OrderCustomer_orderId_fkey" FOREIGN KEY ("orderId") REFERENCES "Order" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT "OrderCustomer_customerId_fkey" FOREIGN KEY ("customerId") REFERENCES "Customer" ("id") ON DELETE CASCADE ON UPDATE CASCADE
);
-- CreateTable
CREATE TABLE "OrderItem" (
"id" TEXT NOT NULL PRIMARY KEY,
"orderId" TEXT NOT NULL,
"customerId" TEXT,
"itemName" TEXT NOT NULL,
"initPrice" REAL NOT NULL DEFAULT 0,
"myPrice" REAL NOT NULL DEFAULT 0,
"taxRatio" REAL NOT NULL DEFAULT 0.16,
"quantity" INTEGER NOT NULL DEFAULT 1,
"netPrice" REAL NOT NULL DEFAULT 0,
"myNetPrice" REAL NOT NULL DEFAULT 0,
"finalPrice" REAL NOT NULL DEFAULT 0,
CONSTRAINT "OrderItem_orderId_fkey" FOREIGN KEY ("orderId") REFERENCES "Order" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT "OrderItem_customerId_fkey" FOREIGN KEY ("customerId") REFERENCES "Customer" ("id") ON DELETE SET NULL ON UPDATE CASCADE
);
-- CreateIndex
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
-- CreateIndex
CREATE UNIQUE INDEX "Session_sessionToken_key" ON "Session"("sessionToken");
-- CreateIndex
CREATE UNIQUE INDEX "PasswordResetToken_token_key" ON "PasswordResetToken"("token");
-- CreateIndex
CREATE UNIQUE INDEX "Customer_name_key" ON "Customer"("name");

View File

@@ -0,0 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (e.g., Git)
provider = "sqlite"

79
prisma/schema.prisma Normal file
View File

@@ -0,0 +1,79 @@
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
model User {
id String @id @default(cuid())
email String @unique
passwordHash String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
sessions Session[]
resetTokens PasswordResetToken[]
}
model Session {
id String @id @default(cuid())
sessionToken String @unique
userId String
expiresAt DateTime
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
}
model PasswordResetToken {
id String @id @default(cuid())
token String @unique
userId String
expiresAt DateTime
used Boolean @default(false)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
}
model Order {
id String @id @default(cuid())
title String
status String @default("pending")
notes String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
customers OrderCustomer[]
items OrderItem[]
}
model Customer {
id String @id @default(cuid())
name String @unique
createdAt DateTime @default(now())
orders OrderCustomer[]
items OrderItem[]
}
model OrderCustomer {
orderId String
customerId String
order Order @relation(fields: [orderId], references: [id], onDelete: Cascade)
customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)
@@id([orderId, customerId])
}
model OrderItem {
id String @id @default(cuid())
orderId String
customerId String?
itemName String
initPrice Float @default(0)
myPrice Float @default(0)
taxRatio Float @default(0.16)
quantity Int @default(1)
netPrice Float @default(0)
myNetPrice Float @default(0)
finalPrice Float @default(0)
order Order @relation(fields: [orderId], references: [id], onDelete: Cascade)
customer Customer? @relation(fields: [customerId], references: [id], onDelete: SetNull)
}

28
prisma/seed.ts Normal file
View File

@@ -0,0 +1,28 @@
import { PrismaClient } from "@prisma/client";
import { hashPassword } from "../lib/crypto";
const prisma = new PrismaClient();
async function main() {
const email = process.env.ADMIN_EMAIL ?? "jaradatgamer@gmail.com";
const password = process.env.ADMIN_PASSWORD ?? "admin123";
const passwordHash = await hashPassword(password);
await prisma.user.upsert({
where: { email },
update: {},
create: { email, passwordHash },
});
console.log(`Seeded admin user: ${email}`);
}
main()
.catch((e) => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});