Skip to content

Commit

Permalink
optimize UserService and prisma
Browse files Browse the repository at this point in the history
  • Loading branch information
zenkiet committed Sep 22, 2023
1 parent d57cf4e commit f813be6
Show file tree
Hide file tree
Showing 14 changed files with 478 additions and 74 deletions.
19 changes: 0 additions & 19 deletions server/prisma/migrations/20230921043850_dev/migration.sql

This file was deleted.

207 changes: 207 additions & 0 deletions server/prisma/migrations/20230922152747_/migration.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
-- CreateEnum
CREATE TYPE "PolicyType" AS ENUM ('ALLOW', 'DENY');

-- CreateEnum
CREATE TYPE "Operator" AS ENUM ('EQUALS', 'NOT_EQUALS', 'GREATER_THAN', 'LESS_THAN', 'CONTAINS', 'NOT_CONTAINS', 'STARTS_WITH', 'ENDS_WITH');

-- CreateEnum
CREATE TYPE "TaskStatus" AS ENUM ('OPEN', 'IN_PROGRESS', 'RESOLVED', 'CLOSED');

-- CreateEnum
CREATE TYPE "LabelType" AS ENUM ('BUG', 'FEATURE', 'IMPROVEMENT', 'QUESTION');

-- CreateEnum
CREATE TYPE "ActivityType" AS ENUM ('COMMENT', 'STATUS_CHANGE', 'LABEL_CHANGE', 'ASSIGNMENT_CHANGE', 'CLOSE');

-- CreateTable
CREATE TABLE "Role" (
"role_id" SERIAL NOT NULL,
"name" TEXT NOT NULL,
"description" TEXT,
"userId" INTEGER,

CONSTRAINT "Role_pkey" PRIMARY KEY ("role_id")
);

-- CreateTable
CREATE TABLE "Permission" (
"permission_id" SERIAL NOT NULL,
"name" TEXT NOT NULL,
"description" TEXT,

CONSTRAINT "Permission_pkey" PRIMARY KEY ("permission_id")
);

-- CreateTable
CREATE TABLE "Policy" (
"policy_id" SERIAL NOT NULL,
"name" TEXT NOT NULL,
"effect" "PolicyType" NOT NULL,

CONSTRAINT "Policy_pkey" PRIMARY KEY ("policy_id")
);

-- CreateTable
CREATE TABLE "Condition" (
"condition_id" SERIAL NOT NULL,
"attribute" TEXT NOT NULL,
"operator" "Operator" NOT NULL,
"value" TEXT NOT NULL,
"policyId" INTEGER NOT NULL,

CONSTRAINT "Condition_pkey" PRIMARY KEY ("condition_id")
);

-- CreateTable
CREATE TABLE "User" (
"user_id" SERIAL NOT NULL,
"name" TEXT NOT NULL,
"email" VARCHAR(255) NOT NULL,
"password" TEXT NOT NULL,
"isTfaEnabled" BOOLEAN NOT NULL DEFAULT false,
"tfaSecret" TEXT,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,

CONSTRAINT "User_pkey" PRIMARY KEY ("user_id")
);

-- CreateTable
CREATE TABLE "Task" (
"task_id" SERIAL NOT NULL,
"title" TEXT NOT NULL,
"description" TEXT,
"dueDate" TIMESTAMP(3),
"status" "TaskStatus" NOT NULL DEFAULT 'OPEN',
"assigneeId" INTEGER,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,

CONSTRAINT "Task_pkey" PRIMARY KEY ("task_id")
);

-- CreateTable
CREATE TABLE "Comment" (
"comment_id" SERIAL NOT NULL,
"content" TEXT NOT NULL,
"taskId" INTEGER NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,

CONSTRAINT "Comment_pkey" PRIMARY KEY ("comment_id")
);

-- CreateTable
CREATE TABLE "Label" (
"id" SERIAL NOT NULL,
"name" TEXT NOT NULL,
"type" "LabelType" NOT NULL,

CONSTRAINT "Label_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "Activity" (
"activity_id" SERIAL NOT NULL,
"type" "ActivityType" NOT NULL,
"data" JSONB NOT NULL,
"taskId" INTEGER NOT NULL,
"userId" INTEGER NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,

CONSTRAINT "Activity_pkey" PRIMARY KEY ("activity_id")
);

-- CreateTable
CREATE TABLE "_PermissionToRole" (
"A" INTEGER NOT NULL,
"B" INTEGER NOT NULL
);

-- CreateTable
CREATE TABLE "_PolicyToRole" (
"A" INTEGER NOT NULL,
"B" INTEGER NOT NULL
);

-- CreateTable
CREATE TABLE "_LabelToTask" (
"A" INTEGER NOT NULL,
"B" INTEGER NOT NULL
);

-- CreateIndex
CREATE UNIQUE INDEX "Role_name_key" ON "Role"("name");

-- CreateIndex
CREATE UNIQUE INDEX "Permission_name_key" ON "Permission"("name");

-- CreateIndex
CREATE UNIQUE INDEX "Policy_name_key" ON "Policy"("name");

-- CreateIndex
CREATE INDEX "Condition_attribute_operator_idx" ON "Condition"("attribute", "operator");

-- CreateIndex
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");

-- CreateIndex
CREATE INDEX "user_email_idx" ON "User"("email");

-- CreateIndex
CREATE UNIQUE INDEX "Label_name_key" ON "Label"("name");

-- CreateIndex
CREATE UNIQUE INDEX "_PermissionToRole_AB_unique" ON "_PermissionToRole"("A", "B");

-- CreateIndex
CREATE INDEX "_PermissionToRole_B_index" ON "_PermissionToRole"("B");

-- CreateIndex
CREATE UNIQUE INDEX "_PolicyToRole_AB_unique" ON "_PolicyToRole"("A", "B");

-- CreateIndex
CREATE INDEX "_PolicyToRole_B_index" ON "_PolicyToRole"("B");

-- CreateIndex
CREATE UNIQUE INDEX "_LabelToTask_AB_unique" ON "_LabelToTask"("A", "B");

-- CreateIndex
CREATE INDEX "_LabelToTask_B_index" ON "_LabelToTask"("B");

-- AddForeignKey
ALTER TABLE "Role" ADD CONSTRAINT "Role_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("user_id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "Condition" ADD CONSTRAINT "Condition_policyId_fkey" FOREIGN KEY ("policyId") REFERENCES "Policy"("policy_id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "Task" ADD CONSTRAINT "Task_assigneeId_fkey" FOREIGN KEY ("assigneeId") REFERENCES "User"("user_id") ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "Comment" ADD CONSTRAINT "Comment_taskId_fkey" FOREIGN KEY ("taskId") REFERENCES "Task"("task_id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "Activity" ADD CONSTRAINT "Activity_taskId_fkey" FOREIGN KEY ("taskId") REFERENCES "Task"("task_id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "Activity" ADD CONSTRAINT "Activity_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("user_id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "_PermissionToRole" ADD CONSTRAINT "_PermissionToRole_A_fkey" FOREIGN KEY ("A") REFERENCES "Permission"("permission_id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "_PermissionToRole" ADD CONSTRAINT "_PermissionToRole_B_fkey" FOREIGN KEY ("B") REFERENCES "Role"("role_id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "_PolicyToRole" ADD CONSTRAINT "_PolicyToRole_A_fkey" FOREIGN KEY ("A") REFERENCES "Policy"("policy_id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "_PolicyToRole" ADD CONSTRAINT "_PolicyToRole_B_fkey" FOREIGN KEY ("B") REFERENCES "Role"("role_id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "_LabelToTask" ADD CONSTRAINT "_LabelToTask_A_fkey" FOREIGN KEY ("A") REFERENCES "Label"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "_LabelToTask" ADD CONSTRAINT "_LabelToTask_B_fkey" FOREIGN KEY ("B") REFERENCES "Task"("task_id") ON DELETE CASCADE ON UPDATE CASCADE;
135 changes: 127 additions & 8 deletions server/prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,137 @@ datasource db {
url = env("DATABASE_URL")
}

enum Role {
USER
ADMIN
model Role {
id Int @id @default(autoincrement()) @map("role_id")
name String @unique
description String?
permissions Permission[]
policies Policy[]
User User? @relation(fields: [userId], references: [id], onDelete: Cascade)
userId Int?
}

model Permission {
id Int @id @default(autoincrement()) @map("permission_id")
name String @unique
description String?
roles Role[]
}

model Policy {
id Int @id @default(autoincrement()) @map("policy_id")
name String @unique
effect PolicyType
conditions Condition[]
roles Role[]
}

model Condition {
id Int @id @default(autoincrement()) @map("condition_id")
attribute String
operator Operator
value String
policyId Int
policy Policy @relation(fields: [policyId], references: [id], onDelete: Cascade)
@@index([attribute, operator])
}

enum PolicyType {
ALLOW
DENY
}

enum Operator {
EQUALS
NOT_EQUALS
GREATER_THAN
LESS_THAN
CONTAINS
NOT_CONTAINS
STARTS_WITH
ENDS_WITH
}

model User {
id Int @id @default(autoincrement())
id Int @id @default(autoincrement()) @map("user_id")
name String
email String @unique
email String @unique @db.VarChar(255)
password String
role Role @default(USER)
permissions String[] @default([])
isTfaEnabled Boolean @default(false)
roles Role[]
isTfaEnabled Boolean @default(false)
tfaSecret String?
Task Task[]
Activity Activity[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([email], name: "user_email_idx")
}

enum TaskStatus {
OPEN
IN_PROGRESS
RESOLVED
CLOSED
}

model Task {
id Int @id @default(autoincrement()) @map("task_id")
title String
description String?
dueDate DateTime?
status TaskStatus @default(OPEN)
assignees User? @relation(fields: [assigneeId], references: [id])
assigneeId Int?
labels Label[]
comments Comment[]
Activity Activity[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}

model Comment {
id Int @id @default(autoincrement()) @map("comment_id")
content String
task Task @relation(fields: [taskId], references: [id])
taskId Int
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}

enum LabelType {
BUG
FEATURE
IMPROVEMENT
QUESTION
}

model Label {
id Int @id @default(autoincrement())
name String @unique
type LabelType
tasks Task[]
}

enum ActivityType {
COMMENT
STATUS_CHANGE
LABEL_CHANGE
ASSIGNMENT_CHANGE
CLOSE
}

model Activity {
id Int @id @default(autoincrement()) @map("activity_id")
type ActivityType
data Json
taskId Int
task Task @relation(fields: [taskId], references: [id])
user User @relation(fields: [userId], references: [id])
userId Int
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
Loading

0 comments on commit f813be6

Please sign in to comment.