GitFOSS
.prisma
Prisma
(text/prisma)
generator client {
  provider        = "prisma-client-js"
  previewFeatures = ["fullTextSearch", "interactiveTransactions", "orderByNulls"]
  binaryTargets   = ["native", "linux-musl", "debian-openssl-1.1.x"]
}

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

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])
  memberships  OrganizationMembership[] @relation("OneOrganizationMembershipToOneOrganization")
  repositories Repository[]             @relation("ManyRepositoriesToOneOrganization")
}

model OrganizationMembership {
  id             String           @id @default(cuid())
  createdAt      DateTime         @default(now())
  updatedAt      DateTime         @updatedAt
  expiresAt      DateTime?
  revokedAt      DateTime?
  organizationId String
  userId         String
  role           OrganizationRole @default(REVIEWER)
  organization   Organization     @relation("OneOrganizationMembershipToOneOrganization", fields: [organizationId], references: [id])
  user           User             @relation("OneOrganizationMembershipToOneUser", fields: [userId], references: [id])
}

model Repository {
  id               String             @id @default(cuid())
  slug             String
  createdAt        DateTime           @default(now())
  updatedAt        DateTime           @updatedAt
  avatarUri        String?
  displayName      String?
  keywords         String[]
  shortDescription String?
  websiteUrl       String?
  organizationId   String
  visibility       ResourceVisibility @default(PRIVATE)
  forkedFromRepoId String?
  forkedFromRepo   Repository?        @relation("OneParentRepositoryToManyForkRepository", fields: [forkedFromRepoId], references: [id])
  isFork           Boolean            @default(false)
  forks            Repository[]       @relation("OneParentRepositoryToManyForkRepository")
  lastPushedAt     DateTime?
  organization     Organization       @relation("ManyRepositoriesToOneOrganization", fields: [organizationId], references: [id])

  @@unique([organizationId, slug])
}

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

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

enum GlobalRole {
  GUEST
  CUSTOMER
  ADMIN
  SUPER_ADMIN
}

enum OrganizationKind {
  PERSONAL
  COMPANY
}

enum OrganizationRole {
  REVIEWER
  COMITTER
  ADMIN
  OWNER
}

enum ResourceVisibility {
  PUBLIC
  UNLISTED
  PRIVATE
}