feat(db): add PullRequest models and update Repository model
+ 161
- 50
new file
db/migrations/20220929150727_add_pull_request_models/migration.sql
@@ -0,0 +1,48 @@
+-- CreateEnum
+CREATE TYPE "PullRequestState" AS ENUM ('OPEN', 'CLOSE_COMPLETE', 'CLOSE_DENY');
+
+-- CreateTable
+CREATE TABLE "PullRequest" (
+    "id" TEXT NOT NULL,
+    "uid" INTEGER NOT NULL DEFAULT 0,
+    "authorId" TEXT NOT NULL,
+    "sourceRepositoryId" TEXT NOT NULL,
+    "targetRepositoryId" TEXT NOT NULL,
+    "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updatedAt" TIMESTAMP(3) NOT NULL,
+    "closedAt" TIMESTAMP(3) NOT NULL,
+    "state" "PullRequestState" NOT NULL DEFAULT 'OPEN',
+    "sourceBranch" TEXT NOT NULL,
+    "targetBranch" TEXT NOT NULL,
+    "summary" TEXT NOT NULL,
+    "textMd" TEXT NOT NULL,
+
+    CONSTRAINT "PullRequest_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "PullRequestComment" (
+    "id" TEXT NOT NULL,
+    "authorId" TEXT NOT NULL,
+    "pullRequestId" TEXT NOT NULL,
+    "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updatedAt" TIMESTAMP(3) NOT NULL,
+    "textMd" TEXT NOT NULL,
+
+    CONSTRAINT "PullRequestComment_pkey" PRIMARY KEY ("id")
+);
+
+-- AddForeignKey
+ALTER TABLE "PullRequest" ADD CONSTRAINT "PullRequest_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "PullRequest" ADD CONSTRAINT "PullRequest_sourceRepositoryId_fkey" FOREIGN KEY ("sourceRepositoryId") REFERENCES "Repository"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "PullRequest" ADD CONSTRAINT "PullRequest_targetRepositoryId_fkey" FOREIGN KEY ("targetRepositoryId") REFERENCES "Repository"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "PullRequestComment" ADD CONSTRAINT "PullRequestComment_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "PullRequestComment" ADD CONSTRAINT "PullRequestComment_pullRequestId_fkey" FOREIGN KEY ("pullRequestId") REFERENCES "PullRequest"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

@@ -1,6 +1,6 @@
 generator client {
   provider        = "prisma-client-js"
-  previewFeatures = ["fullTextSearch","interactiveTransactions","orderByNulls"]
+  previewFeatures = ["fullTextSearch", "interactiveTransactions", "orderByNulls"]
   binaryTargets   = ["native", "linux-musl", "debian-openssl-1.1.x"]
 }
 

...
@@ -10,75 +10,132 @@ datasource db {
 }
 
 model Organization {
-  id           String                   @id @default(cuid())
-  slug         String                   @unique
-  createdAt    DateTime                 @default(now())
-  updatedAt    DateTime                 @updatedAt
-  avatarUri    String?
-  displayName  String?
-  websiteUrl   String?
-  ownerId      String
-  visibility   ResourceVisibility       @default(PRIVATE)
-  kind         OrganizationKind         @default(PERSONAL)
-  owner        User                     @relation("ManyOwnedOrganizationsToOneOwnerUser", fields: [ownerId], references: [id])
+  id      String @id @default(cuid())
+  ownerId String
+  slug    String @unique
+
+  createdAt DateTime @default(now())
+  updatedAt DateTime @updatedAt
+
+  kind        OrganizationKind   @default(PERSONAL)
+  visibility  ResourceVisibility @default(PRIVATE)
+  avatarUri   String?
+  displayName String?
+  websiteUrl  String?
+
   memberships  OrganizationMembership[] @relation("OneOrganizationMembershipToOneOrganization")
+  owner        User                     @relation("ManyOwnedOrganizationsToOneOwnerUser", fields: [ownerId], references: [id])
   repositories Repository[]             @relation("ManyRepositoriesToOneOrganization")
 }
 
 model OrganizationMembership {
-  id             String           @id @default(cuid())
-  createdAt      DateTime         @default(now())
-  updatedAt      DateTime         @updatedAt
-  expiresAt      DateTime?
-  revokedAt      DateTime?
+  id             String @id @default(cuid())
   organizationId String
   userId         String
-  role           OrganizationRole @default(REVIEWER)
-  organization   Organization     @relation("OneOrganizationMembershipToOneOrganization", fields: [organizationId], references: [id])
-  user           User             @relation("OneOrganizationMembershipToOneUser", fields: [userId], references: [id])
+
+  createdAt DateTime  @default(now())
+  updatedAt DateTime  @updatedAt
+  expiresAt DateTime?
+  revokedAt DateTime?
+
+  role OrganizationRole @default(REVIEWER)
+
+  organization Organization @relation("OneOrganizationMembershipToOneOrganization", fields: [organizationId], references: [id])
+  user         User         @relation("OneOrganizationMembershipToOneUser", fields: [userId], references: [id])
+}
+
+model PullRequest {
+  id                 String @id @default(cuid())
+  uid                Int    @default(0)
+  authorId           String
+  sourceRepositoryId String
+  targetRepositoryId String
+
+  createdAt DateTime @default(now())
+  updatedAt DateTime @updatedAt
+  closedAt  DateTime
+
+  state        PullRequestState @default(OPEN)
+  sourceBranch String
+  targetBranch String
+
+  summary String
+  textMd  String
+
+  author           User                 @relation("OnePullRequestToOneUser", fields: [authorId], references: [id])
+  comments         PullRequestComment[] @relation("OnePullRequestCommentToOnePullRequest")
+  sourceRepository Repository           @relation("OneSourceRepositoryToManyPullRequests", fields: [sourceRepositoryId], references: [id])
+  targetRepository Repository           @relation("OneTargetRepositoryToManyPullRequests", fields: [targetRepositoryId], references: [id])
+}
+
+model PullRequestComment {
+  id            String @id @default(cuid())
+  authorId      String
+  pullRequestId String
+
+  createdAt DateTime @default(now())
+  updatedAt DateTime @updatedAt
+
+  textMd String
+
+  author      User        @relation("OnePullRequestToOnePRCommenterUser", fields: [authorId], references: [id])
+  pullRequest PullRequest @relation("OnePullRequestCommentToOnePullRequest", fields: [pullRequestId], references: [id])
 }
 
 model Repository {
-  id               String             @id @default(cuid())
-  slug             String             @unique
-  createdAt        DateTime           @default(now())
-  updatedAt        DateTime           @updatedAt
+  id               String  @id @default(cuid())
+  forkedFromRepoId String?
+  organizationId   String
+  slug             String  @unique
+
+  createdAt    DateTime  @default(now())
+  updatedAt    DateTime  @updatedAt
+  lastPushedAt DateTime?
+
+  visibility       ResourceVisibility @default(PRIVATE)
+  isFork           Boolean            @default(false)
+  keywords         String[]
   avatarUri        String?
   displayName      String?
-  keywords         String[]
   shortDescription String?
   websiteUrl       String?
-  organizationId   String
-  visibility       ResourceVisibility @default(PRIVATE)
-  forkedFromRepoId String?
-  isFork           Boolean            @default(false)
-  lastPushedAt     DateTime?
-  organization     Organization       @relation("ManyRepositoriesToOneOrganization", fields: [organizationId], references: [id])
+
+  organization            Organization  @relation("ManyRepositoriesToOneOrganization", fields: [organizationId], references: [id])
+  pullRequestsWhereSource PullRequest[] @relation("OneSourceRepositoryToManyPullRequests")
+  pullRequestsWhereTarget PullRequest[] @relation("OneTargetRepositoryToManyPullRequests")
 }
 
 model Session {
-  id                String    @id @default(cuid())
-  sessionId         String    @unique
-  createdAt         DateTime  @default(now())
-  updatedAt         DateTime  @updatedAt
-  expiresAt         DateTime?
-  data              Json?
-  detectedUserAgent String    @default("")
-  detectedIPAddress String    @default("")
+  id        String @id @default(cuid())
+  sessionId String @unique
+
+  createdAt DateTime  @default(now())
+  updatedAt DateTime  @updatedAt
+  expiresAt DateTime?
+
+  data Json?
+
+  detectedIPAddress String @default("")
+  detectedUserAgent String @default("")
 }
 
 model User {
-  id                      String                   @id @default(cuid())
-  role                    GlobalRole               @default(CUSTOMER)
-  createdAt               DateTime                 @default(now())
-  updatedAt               DateTime                 @updatedAt
-  username                String                   @unique
-  email                   String                   @unique
-  hashedPassword          String
-  displayName             String?
-  avatarUri               String?
-  organizations           Organization[]           @relation("ManyOwnedOrganizationsToOneOwnerUser")
-  organizationMemberships OrganizationMembership[] @relation("OneOrganizationMembershipToOneUser")
+  id String @id @default(cuid())
+
+  createdAt DateTime @default(now())
+  updatedAt DateTime @updatedAt
+
+  role           GlobalRole @default(CUSTOMER)
+  username       String     @unique
+  email          String     @unique
+  hashedPassword String
+  displayName    String?
+  avatarUri      String?
+
+  organizations                  Organization[]           @relation("ManyOwnedOrganizationsToOneOwnerUser")
+  organizationMemberships        OrganizationMembership[] @relation("OneOrganizationMembershipToOneUser")
+  pullRequestsWhereAuthor        PullRequest[]            @relation("OnePullRequestToOneUser")
+  pullRequestCommentsWhereAuthor PullRequestComment[]     @relation("OnePullRequestToOnePRCommenterUser")
 }
 
 enum GlobalRole {

...
@@ -100,6 +157,12 @@ enum OrganizationRole {
   OWNER
 }
 
+enum PullRequestState {
+  OPEN
+  CLOSE_COMPLETE
+  CLOSE_DENY
+}
+
 enum ResourceVisibility {
   PUBLIC
   UNLISTED