7c0d422228
Ground-up TypeScript rewrite of the Vector hardware parts inventory
system. Ships the full roadmap (Phases 0-8) in one initial commit:
- pnpm + Turbo monorepo: apps/{api,web,e2e}, packages/{db,shared,ui,config}
- Express 5 + Prisma 5 + zod validation + JWT w/ refresh-token rotation
- React 19 + Vite + shadcn/ui + TanStack Query/Table + nuqs URL state
- Repair/RMA, tags, bulk ops, saved views, CSV audit export
- Analytics dashboard on Recharts + EOL tracking
- Signed webhook subscriptions (HMAC-SHA256) with in-process emitter
- Vitest unit tests (shared schemas, api services/helpers) + Playwright skeleton
- Gitea Actions CI (lint, typecheck, test+coverage, build) + Renovate
Deferred follow-ups: Postgres cutover (data-migration script ready),
BullMQ worker for webhook delivery, @react-pdf PDF export, CSV import wizard.
122 lines
3.6 KiB
SQL
122 lines
3.6 KiB
SQL
-- CreateTable
|
|
CREATE TABLE "User" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"username" TEXT NOT NULL,
|
|
"email" TEXT NOT NULL,
|
|
"passwordHash" TEXT NOT NULL,
|
|
"role" TEXT NOT NULL DEFAULT 'TECHNICIAN',
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" DATETIME NOT NULL
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Manufacturer" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"name" TEXT NOT NULL,
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" DATETIME NOT NULL
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Site" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"name" TEXT NOT NULL,
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" DATETIME NOT NULL
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Room" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"name" TEXT NOT NULL,
|
|
"siteId" TEXT NOT NULL,
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" DATETIME NOT NULL,
|
|
CONSTRAINT "Room_siteId_fkey" FOREIGN KEY ("siteId") REFERENCES "Site" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Bin" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"name" TEXT NOT NULL,
|
|
"roomId" TEXT NOT NULL,
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" DATETIME NOT NULL,
|
|
CONSTRAINT "Bin_roomId_fkey" FOREIGN KEY ("roomId") REFERENCES "Room" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Part" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"serialNumber" TEXT NOT NULL,
|
|
"mpn" TEXT NOT NULL,
|
|
"manufacturerId" TEXT NOT NULL,
|
|
"price" REAL,
|
|
"state" TEXT NOT NULL DEFAULT 'SPARE',
|
|
"binId" TEXT,
|
|
"notes" TEXT,
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" DATETIME NOT NULL,
|
|
CONSTRAINT "Part_manufacturerId_fkey" FOREIGN KEY ("manufacturerId") REFERENCES "Manufacturer" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
|
|
CONSTRAINT "Part_binId_fkey" FOREIGN KEY ("binId") REFERENCES "Bin" ("id") ON DELETE SET NULL ON UPDATE CASCADE
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "PartEvent" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"partId" TEXT NOT NULL,
|
|
"userId" TEXT,
|
|
"type" TEXT NOT NULL,
|
|
"field" TEXT,
|
|
"oldValue" TEXT,
|
|
"newValue" TEXT,
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT "PartEvent_partId_fkey" FOREIGN KEY ("partId") REFERENCES "Part" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
|
CONSTRAINT "PartEvent_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE SET NULL ON UPDATE CASCADE
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "User_username_key" ON "User"("username");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Manufacturer_name_key" ON "Manufacturer"("name");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Site_name_key" ON "Site"("name");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Room_siteId_idx" ON "Room"("siteId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Room_siteId_name_key" ON "Room"("siteId", "name");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Bin_roomId_idx" ON "Bin"("roomId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Bin_roomId_name_key" ON "Bin"("roomId", "name");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Part_serialNumber_key" ON "Part"("serialNumber");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Part_state_idx" ON "Part"("state");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Part_binId_idx" ON "Part"("binId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Part_manufacturerId_idx" ON "Part"("manufacturerId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Part_mpn_idx" ON "Part"("mpn");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "PartEvent_partId_createdAt_idx" ON "PartEvent"("partId", "createdAt" DESC);
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "PartEvent_userId_idx" ON "PartEvent"("userId");
|