Ctrl K
ComunidadGuías…

web/crux/prisma/schema.prisma

Rama develop · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
generator client {
  provider      = "prisma-client-js"
  binaryTargets = ["native", "darwin-arm64"]
  engineType    = "binary"
}

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

model Team {
  id        String   @id @default(uuid()) @db.Uuid
  name      String   @unique @db.VarChar(70)
  slug      String   @unique @db.VarChar(16)
  createdAt DateTime @default(now()) @db.Timestamptz(6)
  createdBy String   @db.Uuid
  updatedAt DateTime @updatedAt @db.Timestamptz(6)
  updatedBy String?  @db.Uuid

  registries    Registry[]
  projects      Project[]
  nodes         Node[]
  users         UsersOnTeams[]
  invitations   UserInvitation[]
  auditLog      AuditLog[]
  notifications Notification[]
  storages      Storage[]
  configBundles ConfigBundle[]
  pipelines     Pipeline[]
  packages      Package[]
}

model Token {
  id        String    @id @default(uuid()) @db.Uuid
  userId    String    @db.Uuid
  name      String    @db.VarChar(70)
  createdAt DateTime  @default(now()) @db.Timestamptz(6)
  expiresAt DateTime? @db.Timestamptz(6)
  nonce     String    @db.Uuid

  @@unique([userId, name, nonce])
}

enum UserInvitationStatusEnum {
  pending
  expired
  declined
}

model UserInvitation {
  userId    String                   @db.Uuid
  teamId    String                   @db.Uuid
  email     String
  status    UserInvitationStatusEnum @default(pending)
  createdAt DateTime                 @default(now()) @db.Timestamptz(6)
  team      Team                     @relation(fields: [teamId], references: [id], onDelete: Cascade)

  @@id([userId, teamId])
  @@unique([userId, teamId, email])
}

model UsersOnTeams {
  userId String       @db.Uuid
  role   UserRoleEnum
  teamId String       @db.Uuid
  team   Team         @relation(fields: [teamId], references: [id], onDelete: Cascade)

  @@id([userId, teamId])
}

model Node {
  id             String        @id @default(uuid()) @db.Uuid
  createdAt      DateTime      @default(now()) @db.Timestamptz(6)
  createdBy      String        @db.Uuid
  updatedAt      DateTime      @updatedAt @db.Timestamptz(6)
  updatedBy      String?       @db.Uuid
  name           String        @db.VarChar(70)
  type           NodeTypeEnum? @default(docker)
  description    String?
  icon           String?
  address        String?
  connectedAt    DateTime?     @db.Timestamptz(6)
  disconnectedAt DateTime?     @db.Timestamptz(6)
  team           Team          @relation(fields: [teamId], references: [id], onDelete: Cascade)
  teamId         String        @db.Uuid

  deployments  Deployment[]
  events       NodeEvent[]
  token        NodeToken?
  environments PackageEnvironment[]

  @@unique([name, teamId])
}

model NodeToken {
  nodeId    String @id @unique @db.Uuid
  nonce     String
  createdBy String @db.Uuid

  node Node @relation(fields: [nodeId], references: [id], onDelete: Cascade)
}

model Registry {
  id              String                 @id @default(uuid()) @db.Uuid
  createdAt       DateTime               @default(now()) @db.Timestamptz(6)
  createdBy       String                 @db.Uuid
  updatedAt       DateTime               @updatedAt @db.Timestamptz(6)
  updatedBy       String?                @db.Uuid
  name            String                 @db.VarChar(70)
  description     String?
  icon            String?
  url             String
  user            String?
  token           Bytes?
  type            RegistryTypeEnum
  namespace       RegistryNamespaceEnum?
  imageNamePrefix String?
  apiUrl          String?

  images        Image[]
  eventWatchers PipelineEventWatcher[]
  registryToken RegistryToken?
  team          Team                   @relation(fields: [teamId], references: [id], onDelete: Cascade)
  teamId        String                 @db.Uuid

  @@unique([name, teamId])
}

model RegistryToken {
  id         String    @id @default(uuid()) @db.Uuid
  registryId String    @db.Uuid
  createdBy  String    @db.Uuid
  createdAt  DateTime  @default(now()) @db.Timestamptz(6)
  expiresAt  DateTime? @db.Timestamptz(6)
  nonce      String    @db.Uuid

  registry Registry @relation(fields: [registryId], references: [id], onDelete: Cascade)

  @@unique([registryId])
  @@unique([registryId, nonce])
}

model Project {
  id          String          @id @default(uuid()) @db.Uuid
  createdAt   DateTime        @default(now()) @db.Timestamptz(6)
  createdBy   String          @db.Uuid
  updatedAt   DateTime        @updatedAt @db.Timestamptz(6)
  updatedBy   String?         @db.Uuid
  name        String          @db.VarChar(70)
  description String?
  type        ProjectTypeEnum

  team          Team           @relation(fields: [teamId], references: [id], onDelete: Cascade)
  teamId        String         @db.Uuid
  versions      Version[]
  versionChains VersionChain[]

  @@unique([name, teamId])
}

model Version {
  id                  String          @id @default(uuid()) @db.Uuid
  createdAt           DateTime        @default(now()) @db.Timestamptz(6)
  createdBy           String          @db.Uuid
  updatedAt           DateTime        @updatedAt @db.Timestamptz(6)
  updatedBy           String?         @db.Uuid
  name                String          @db.VarChar(70)
  changelog           String?
  default             Boolean         @default(false)
  type                VersionTypeEnum @default(incremental)
  autoCopyDeployments Boolean         @default(true)
  projectId           String          @db.Uuid
  chainId             String?         @db.Uuid

  project     Project                   @relation(fields: [projectId], references: [id], onDelete: Cascade)
  chain       VersionChain?             @relation(fields: [chainId], references: [id], onDelete: SetNull)
  images      Image[]
  deployments Deployment[]
  parent      VersionsOnParentVersion?  @relation("child")
  children    VersionsOnParentVersion[] @relation("parent")

  @@unique([projectId, name])
}

model VersionChain {
  id        String  @id @db.Uuid
  projectId String  @db.Uuid
  project   Project @relation(fields: [projectId], references: [id], onDelete: Cascade)

  members  Version[]
  packages VersionChainsOnPackage[]
}

model VersionsOnParentVersion {
  versionId       String @unique @db.Uuid
  parentVersionId String @unique @db.Uuid

  child  Version @relation(name: "child", fields: [versionId], references: [id], onDelete: Cascade)
  parent Version @relation(name: "parent", fields: [parentVersionId], references: [id], onDelete: Cascade)

  @@id([versionId, parentVersionId])
}

model Image {
  id        String   @id @default(uuid()) @db.Uuid
  createdAt DateTime @default(now()) @db.Timestamptz(6)
  createdBy String   @db.Uuid
  updatedAt DateTime @updatedAt @db.Timestamptz(6)
  updatedBy String?  @db.Uuid

  name   String
  tag    String?
  order  Int
  labels Json?

  registry   Registry @relation(fields: [registryId], references: [id], onDelete: Cascade)
  registryId String   @db.Uuid

  version   Version @relation(fields: [versionId], references: [id], onDelete: Cascade)
  versionId String  @db.Uuid

  config   ContainerConfig @relation(fields: [configId], references: [id], onDelete: Cascade)
  configId String          @unique @db.Uuid

  instances Instance[]
}

enum NetworkMode {
  none
  host
  bridge
}

enum DeploymentStrategy {
  recreate
  rolling
}

enum RestartPolicy {
  always
  unlessStopped
  no
  onFailure
}

enum ExposeStrategy {
  none
  expose
  exposeWithTls
}

enum ContainerConfigType {
  image
  instance
  deployment
  configBundle
}

model ContainerConfig {
  id        String   @id @default(uuid()) @db.Uuid
  updatedAt DateTime @updatedAt @db.Timestamptz(6)
  updatedBy String?

  type ContainerConfigType

  //Common
  name             String?
  environment      Json?
  secrets          Json?
  capabilities     Json?
  expose           ExposeStrategy?
  routing          Json?
  configContainer  Json?
  user             Int?
  workingDirectory String?
  tty              Boolean?
  ports            Json?
  portRanges       Json?
  volumes          Json?
  commands         Json?
  args             Json?
  initContainers   Json?
  storageSet       Boolean?
  storageConfig    Json?
  expectedState    Json?

  //Dagent
  logConfig     Json?
  restartPolicy RestartPolicy?
  networkMode   NetworkMode?
  networks      Json?
  dockerLabels  Json?

  //Crane
  deploymentStrategy DeploymentStrategy?
  healthCheckConfig  Json?
  resourceConfig     Json?
  proxyBuffering     Boolean?
  proxyHeaders       Json?
  useLoadBalancer    Boolean?
  extraLBAnnotations Json?
  corsHeaders        Json?
  annotations        Json?
  labels             Json?
  metrics            Json?
  replicas           Int?
  experimental       Json?

  image        Image?
  instance     Instance?
  deployment   Deployment?
  configBundle ConfigBundle?

  storage   Storage? @relation(fields: [storageId], references: [id], onDelete: Cascade)
  storageId String?  @db.Uuid
}

model Deployment {
  id         String    @id @default(uuid()) @db.Uuid
  createdAt  DateTime  @default(now()) @db.Timestamptz(6)
  createdBy  String    @db.Uuid
  updatedAt  DateTime  @updatedAt @db.Timestamptz(6)
  updatedBy  String?   @db.Uuid
  deployedAt DateTime? @db.Timestamptz(6)
  deployedBy String?   @db.Uuid

  note      String?
  prefix    String?
  status    DeploymentStatusEnum
  tries     Int                  @default(0)
  protected Boolean              @default(false)

  version   Version @relation(fields: [versionId], references: [id], onDelete: Cascade)
  versionId String  @db.Uuid

  node   Node   @relation(fields: [nodeId], references: [id], onDelete: Cascade)
  nodeId String @db.Uuid

  config   ContainerConfig @relation(fields: [configId], references: [id], onDelete: Cascade)
  configId String          @unique @db.Uuid

  instances     Instance[]
  events        DeploymentEvent[]
  token         DeploymentToken?
  configBundles ConfigBundleOnDeployments[]
}

model DeploymentToken {
  id           String    @id @default(uuid()) @db.Uuid
  deploymentId String    @unique @db.Uuid
  createdBy    String    @db.Uuid
  createdAt    DateTime  @default(now()) @db.Timestamptz(6)
  name         String
  expiresAt    DateTime? @db.Timestamptz(6)
  nonce        String    @db.Uuid

  deployment Deployment @relation(fields: [deploymentId], references: [id], onDelete: Cascade)
  AuditLog   AuditLog[]

  @@unique([deploymentId, nonce])
}

model Instance {
  id String @id @default(uuid()) @db.Uuid

  deployment   Deployment @relation(fields: [deploymentId], references: [id], onDelete: Cascade)
  deploymentId String     @db.Uuid

  image   Image  @relation(fields: [imageId], references: [id], onDelete: Cascade)
  imageId String @db.Uuid

  config   ContainerConfig @relation(fields: [configId], references: [id], onDelete: Cascade)
  configId String          @unique @db.Uuid
}

model DeploymentEvent {
  id           String                  @id @default(uuid()) @db.Uuid
  createdAt    DateTime                @default(now()) @db.Timestamptz(6)
  type         DeploymentEventTypeEnum
  value        Json
  deploymentId String                  @db.Uuid
  tryCount     Int                     @default(0)

  deployment Deployment @relation(fields: [deploymentId], references: [id], onDelete: Cascade)
}

enum AuditLogContextEnum {
  http
  ws
  rpc
}

enum AuditLogRequestMethodEnum {
  get
  post
  put
  patch
  delete
}

enum AuditLogActorTypeEnum {
  user
  deploymentToken
}

model AuditLog {
  id                String                     @id @default(uuid()) @db.Uuid
  createdAt         DateTime                   @default(now()) @db.Timestamptz(6)
  actorType         AuditLogActorTypeEnum
  userId            String?                    @db.Uuid
  deploymentTokenId String?                    @db.Uuid
  teamId            String                     @db.Uuid
  context           AuditLogContextEnum
  method            AuditLogRequestMethodEnum?
  event             String
  data              Json?

  team            Team             @relation(fields: [teamId], references: [id], onDelete: Cascade)
  deploymentToken DeploymentToken? @relation(fields: [deploymentTokenId], references: [id], onDelete: SetNull) // is it ok on SetNull
}

enum UserRoleEnum {
  owner
  admin
  user
}

model Notification {
  id        String               @id @default(uuid()) @db.Uuid
  createdAt DateTime             @default(now()) @db.Timestamptz(6)
  createdBy String               @db.Uuid
  updatedAt DateTime             @updatedAt @db.Timestamptz(6)
  updatedBy String?              @db.Uuid
  name      String               @db.VarChar(70)
  url       String
  type      NotificationTypeEnum
  active    Boolean              @default(false)
  teamId    String               @db.Uuid

  team Team @relation(fields: [teamId], references: [id], onDelete: Cascade)

  events NotificationEvent[]

  @@unique([name, teamId])
}

model NotificationEvent {
  id             String                    @id @default(uuid()) @db.Uuid
  event          NotificationEventTypeEnum
  notificationId String                    @db.Uuid

  notification Notification @relation(fields: [notificationId], references: [id], onDelete: Cascade)

  @@unique([event, notificationId])
}

model NodeEvent {
  id        String            @id @default(uuid()) @db.Uuid
  nodeId    String            @db.Uuid
  createdAt DateTime          @default(now()) @db.Timestamptz(6)
  event     NodeEventTypeEnum
  data      Json?

  node Node @relation(fields: [nodeId], references: [id], onDelete: Cascade)

  @@map("NodeEvent")
}

enum ProjectTypeEnum {
  versionless
  versioned
}

enum VersionTypeEnum {
  incremental
  rolling
}

enum DeploymentStatusEnum {
  preparing
  inProgress
  successful
  failed
  obsolete
  downgraded
}

enum DeploymentEventTypeEnum {
  log
  deploymentStatus
  containerState
}

enum RegistryTypeEnum {
  v2
  hub
  gitlab
  github
  google
  unchecked
}

enum RegistryNamespaceEnum {
  organization
  user
  group
  project
}

enum NodeTypeEnum {
  docker
  k8s
}

enum NotificationTypeEnum {
  discord
  slack
  teams
  rocket
  mattermost
}

enum NotificationEventTypeEnum {
  deploymentStatus
  versionCreated
  nodeAdded
  userInvited
  imagePushed
  imagePulled
}

enum NodeEventTypeEnum {
  installed
  connected
  left
  kicked
  update
  updateCompleted
  containerCommand
  tokenReplaced
}

model Storage {
  id          String   @id @default(uuid()) @db.Uuid
  createdAt   DateTime @default(now()) @db.Timestamptz(6)
  createdBy   String   @db.Uuid
  updatedAt   DateTime @updatedAt @db.Timestamptz(6)
  updatedBy   String?  @db.Uuid
  name        String   @db.VarChar(70)
  description String?
  icon        String?
  url         String
  accessKey   Bytes?
  secretKey   Bytes?

  team   Team   @relation(fields: [teamId], references: [id], onDelete: Cascade)
  teamId String @db.Uuid

  containerConfigs ContainerConfig[]

  @@unique([name, teamId])
}

enum PipelineTypeEnum {
  github
  gitlab
  azure
}

enum PipelineStatusEnum {
  unknown
  queued
  running
  successful
  failed
}

model Pipeline {
  id          String           @id @default(uuid()) @db.Uuid
  createdAt   DateTime         @default(now()) @db.Timestamptz(6)
  createdBy   String           @db.Uuid
  updatedAt   DateTime         @updatedAt @db.Timestamptz(6)
  updatedBy   String?          @db.Uuid
  name        String           @db.VarChar(70)
  type        PipelineTypeEnum
  description String?
  icon        String?
  token       Bytes
  repository  Json
  trigger     Json
  hooks       Json

  team   Team   @relation(fields: [teamId], references: [id], onDelete: Cascade)
  teamId String @db.Uuid

  runs          PipelineRun[]
  eventWatchers PipelineEventWatcher[]

  @@unique([name, teamId])
}

enum PipelineRunCreatorTypeEnum {
  user
  eventWatcher
}

model PipelineRun {
  id          String                     @id @default(uuid()) @db.Uuid
  externalId  Int
  status      PipelineStatusEnum
  createdAt   DateTime                   @default(now()) @db.Timestamptz(6)
  creatorType PipelineRunCreatorTypeEnum
  createdBy   String                     @db.Uuid
  finishedAt  DateTime?

  pipeline   Pipeline @relation(fields: [pipelineId], references: [id], onDelete: Cascade)
  pipelineId String   @db.Uuid

  @@unique([pipelineId, externalId])
}

enum PipelineTriggerEventEnum {
  imagePush
  imagePull
}

model PipelineEventWatcher {
  id        String                   @id @default(uuid()) @db.Uuid
  name      String
  event     PipelineTriggerEventEnum
  trigger   Json
  createdAt DateTime                 @default(now()) @db.Timestamptz(6)
  createdBy String                   @db.Uuid
  updatedAt DateTime                 @updatedAt @db.Timestamptz(6)
  updatedBy String?                  @db.Uuid

  pipeline   Pipeline @relation(fields: [pipelineId], references: [id], onDelete: Cascade)
  pipelineId String   @db.Uuid

  registry   Registry? @relation(fields: [registryId], references: [id], onDelete: Cascade)
  registryId String?   @db.Uuid
}

model ConfigBundle {
  id        String   @id @default(uuid()) @db.Uuid
  createdAt DateTime @default(now()) @db.Timestamptz(6)
  createdBy String   @db.Uuid
  updatedAt DateTime @updatedAt @db.Timestamptz(6)
  updatedBy String?  @db.Uuid

  name        String
  description String?

  team   Team   @relation(fields: [teamId], references: [id], onDelete: Cascade)
  teamId String @db.Uuid

  config   ContainerConfig @relation(fields: [configId], references: [id], onDelete: Cascade)
  configId String          @unique @db.Uuid

  deployments ConfigBundleOnDeployments[]

  @@unique([name, teamId])
}

model ConfigBundleOnDeployments {
  deployment   Deployment @relation(fields: [deploymentId], references: [id], onDelete: Cascade)
  deploymentId String     @db.Uuid

  configBundle   ConfigBundle @relation(fields: [configBundleId], references: [id], onDelete: Cascade)
  configBundleId String       @db.Uuid

  @@id([deploymentId, configBundleId])
}

model QualityAssuranceConfig {
  id   String  @id @default(uuid()) @db.Uuid
  name String?
}

model Package {
  id          String   @id @default(uuid()) @db.Uuid
  createdAt   DateTime @default(now()) @db.Timestamptz(6)
  createdBy   String   @db.Uuid
  updatedAt   DateTime @updatedAt @db.Timestamptz(6)
  updatedBy   String?  @db.Uuid
  name        String   @db.VarChar(70)
  description String?
  icon        String?

  team   Team   @relation(fields: [teamId], references: [id], onDelete: Cascade)
  teamId String @db.Uuid

  chains       VersionChainsOnPackage[]
  environments PackageEnvironment[]

  @@unique([name, teamId])
}

model VersionChainsOnPackage {
  chainId   String @db.Uuid
  packageId String @db.Uuid

  chain   VersionChain @relation(fields: [chainId], references: [id], onDelete: Cascade)
  package Package      @relation(fields: [packageId], references: [id], onDelete: Cascade)

  @@id([chainId, packageId])
  @@unique([chainId, packageId])
}

model PackageEnvironment {
  id        String @id @default(uuid()) @db.Uuid
  name      String
  packageId String @db.Uuid
  nodeId    String @db.Uuid
  prefix    String

  package Package @relation(fields: [packageId], references: [id], onDelete: Cascade)
  node    Node    @relation(fields: [nodeId], references: [id], onDelete: Cascade)

  @@unique([name, packageId])
}