refactor(schema): add "OrganizationMembership" model + update "Organization" and "User" to have relations to it
+ 80
- 20
new file
db/migrations/20220918020907_refactor_model_to_include_organization_memberships/migration.sql
@@ -0,0 +1,28 @@
+-- CreateEnum
+CREATE TYPE "OrganizationKind" AS ENUM ('PERSONAL', 'COMPANY');
+
+-- CreateEnum
+CREATE TYPE "OrganizationRole" AS ENUM ('REVIEWER', 'COMITTER', 'ADMIN', 'OWNER');
+
+-- AlterTable
+ALTER TABLE "Organization" ADD COLUMN     "kind" "OrganizationKind" NOT NULL DEFAULT E'PERSONAL';
+
+-- CreateTable
+CREATE TABLE "OrganizationMembership" (
+    "id" TEXT NOT NULL,
+    "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updatedAt" TIMESTAMP(3) NOT NULL,
+    "expiresAt" TIMESTAMP(3),
+    "revokedAt" TIMESTAMP(3),
+    "organizationId" TEXT NOT NULL,
+    "userId" TEXT NOT NULL,
+    "role" "OrganizationRole" NOT NULL DEFAULT E'REVIEWER',
+
+    CONSTRAINT "OrganizationMembership_pkey" PRIMARY KEY ("id")
+);
+
+-- AddForeignKey
+ALTER TABLE "OrganizationMembership" ADD CONSTRAINT "OrganizationMembership_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "OrganizationMembership" ADD CONSTRAINT "OrganizationMembership_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

@@ -17,6 +17,18 @@ enum GlobalRole {
   SUPER_ADMIN
 }
 
+enum OrganizationKind {
+  PERSONAL
+  COMPANY
+}
+
+enum OrganizationRole {
+  REVIEWER
+  COMITTER
+  ADMIN
+  OWNER
+}
+
 enum ResourceVisibility {
   PUBLIC
   UNLISTED

...
@@ -26,38 +38,57 @@ enum ResourceVisibility {
 // models
 
 model Organization {
-  id   String     @id @default(cuid())
-  slug String @unique
+  id   String           @id @default(cuid())
+  slug String           @unique
+  kind OrganizationKind @default(PERSONAL)
 
-  createdAt DateTime  @default(now())
-  updatedAt DateTime  @updatedAt
+  createdAt DateTime @default(now())
+  updatedAt DateTime @updatedAt
 
   avatarUri   String?
   displayName String?
-  visibility ResourceVisibility @default(PRIVATE)
-  websiteUrl String?
+  visibility  ResourceVisibility @default(PRIVATE)
+  websiteUrl  String?
 
-  repositories Repository[] @relation("ManyRepositoriesToOneOrganization")
+  memberships  OrganizationMembership[] @relation("OneOrganizationMembershipToOneOrganization")
+  repositories Repository[]             @relation("ManyRepositoriesToOneOrganization")
 
-  owner User @relation("ManyOwnedOrganizationsToOneOwnerUser", fields: [ownerId], references: [id])
+  owner   User   @relation("ManyOwnedOrganizationsToOneOwnerUser", fields: [ownerId], references: [id])
   ownerId String
 }
 
-model Repository {
-  id   String     @id @default(cuid())
-  slug String @unique
+model OrganizationMembership {
+  id String @id @default(cuid())
 
   createdAt DateTime  @default(now())
   updatedAt DateTime  @updatedAt
+  expiresAt DateTime?
+  revokedAt DateTime?
 
-  avatarUri   String?
-  displayName String?
-  keywords String[]
+  organization   Organization @relation("OneOrganizationMembershipToOneOrganization", fields: [organizationId], references: [id])
+  organizationId String
+
+  user   User   @relation("OneOrganizationMembershipToOneUser", fields: [userId], references: [id])
+  userId String
+
+  role OrganizationRole @default(REVIEWER)
+}
+
+model Repository {
+  id   String @id @default(cuid())
+  slug String @unique
+
+  createdAt DateTime @default(now())
+  updatedAt DateTime @updatedAt
+
+  avatarUri        String?
+  displayName      String?
+  keywords         String[]
   shortDescription String?
-  visibility ResourceVisibility @default(PRIVATE)
-  websiteUrl String?
+  visibility       ResourceVisibility @default(PRIVATE)
+  websiteUrl       String?
 
-  organization Organization @relation("ManyRepositoriesToOneOrganization", fields: [organizationId], references: [id])
+  organization   Organization @relation("ManyRepositoriesToOneOrganization", fields: [organizationId], references: [id])
   organizationId String
 }
 

...
@@ -81,8 +112,8 @@ model User {
   id   String     @id @default(cuid())
   role GlobalRole @default(CUSTOMER)
 
-  createdAt DateTime  @default(now())
-  updatedAt DateTime  @updatedAt
+  createdAt DateTime @default(now())
+  updatedAt DateTime @updatedAt
 
   username       String @unique
   email          String @unique

...
@@ -91,5 +122,6 @@ model User {
   displayName String?
   avatarUri   String?
 
-  organizations Organization[] @relation("ManyOwnedOrganizationsToOneOwnerUser")
+  organizations           Organization[]           @relation("ManyOwnedOrganizationsToOneOwnerUser")
+  organizationMemberships OrganizationMembership[] @relation("OneOrganizationMembershipToOneUser")
 }