.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 ResourceVisibility {
  PUBLIC
  UNLISTED
  PRIVATE
}

// models

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

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

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

  repositories Repository[] @relation("ManyRepositoriesToOneOrganization")

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

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