.prisma
Prisma
(text/prisma)
generator client {
  provider        = "prisma-client-js"
  previewFeatures = ["filterJson", "fullTextSearch"]
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

// enums

enum GlobalRole {
  GUEST
  CUSTOMER
  ADMIN
  SUPER_ADMIN
}

enum OrganizationKind {
  PERSONAL
  COMPANY
}

enum OrganizationRole {
  REVIEWER
  COMITTER
  ADMIN
  OWNER
}

enum ResourceVisibility {
  PUBLIC
  UNLISTED
  PRIVATE
}

// models

model Organization {
  id   String           @id @default(cuid())
  slug String           @unique
  kind OrganizationKind @default(PERSONAL)

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  avatarUri   String?
  displayName String?
  visibility  ResourceVisibility @default(PRIVATE)
  websiteUrl  String?

  memberships  OrganizationMembership[] @relation("OneOrganizationMembershipToOneOrganization")
  repositories Repository[]             @relation("ManyRepositoriesToOneOrganization")

  owner   User   @relation("ManyOwnedOrganizationsToOneOwnerUser", fields: [ownerId], references: [id])
  ownerId String
}

model OrganizationMembership {
  id String @id @default(cuid())

  createdAt DateTime  @default(now())
  updatedAt DateTime  @updatedAt
  expiresAt DateTime?
  revokedAt DateTime?

  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?

  organization   Organization @relation("ManyRepositoriesToOneOrganization", fields: [organizationId], references: [id])
  organizationId String
}

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("")

  // activities ActivityLog[] @relation("OneSessionToManyActivityLogs")
}

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")
}