web/crux/prisma/schema.prisma
Rama develop · réplica de lectura del repositorio original.
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])
}