Files
twenty/server/src/database/schema.prisma
Charles Bochet 6129444c5c [WIP] Whole FE migrated (#2517)
* Wip

* WIP

* Removed concole log

* Add relations to workspace init (#2511)

* Add relations to workspace init

* remove logs

* update prefill

* add missing isSystem

* comment relation fields

* Migrate v2 core models to graphql schema (#2509)

* migrate v2 core models to graphql schema

* Migrate to new workspace member schema

* Continue work

* migrated-main

* Finished accountOwner nested field integration on companies

* Introduce bug

* Fix

---------

Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com>
Co-authored-by: Weiko <corentin@twenty.com>
2023-11-15 15:46:06 +01:00

830 lines
21 KiB
Plaintext

generator client {
provider = "prisma-client-js"
engineType = "binary"
}
datasource db {
provider = "postgresql"
url = env("PG_DATABASE_URL")
}
generator nestgraphql {
provider = "node node_modules/prisma-nestjs-graphql"
output = "../../src/core/@generated"
noAtomicOperations = true
// field validator
fields_Validator_input = true
fields_Validator_output = true
fields_Validator_model = true
fields_Validator_from = "class-validator"
// All relations, only allow connect
decorate_all_type = "!(ActivityTarget*Input|UserSettingsUpdateOneRequiredWithoutUserNestedInput)"
decorate_all_field = "*(create|connectOrCreate|update|upsert|delete|createMany|updateMany|deleteMany)"
decorate_all_name = "HideField"
decorate_all_from = "@nestjs/graphql"
decorate_all_arguments = "[]"
// Activity: Only Allow targets createOrConnect / createMany
decorate_activityTargets_type = "*ActivityTarget*Input"
decorate_activityTargets_field = "*(update|upsert|updateMany)"
decorate_activityTargets_name = "HideField"
decorate_activityTargets_from = "@nestjs/graphql"
decorate_activityTargets_arguments = "[]"
// User Settings: Only Allow targets createOrConnect / createMany
decorate_userSettings_type = "*UserSettingsUpdateOneRequiredWithoutUserNestedInput"
decorate_userSettings_field = "!(update)"
decorate_userSettings_name = "HideField"
decorate_userSettings_from = "@nestjs/graphql"
decorate_userSettings_arguments = "[]"
// Disable _count on all models except Aggregation use case
decorate_count_type = "!(*Aggregate*|*GroupBy*|*OrderBy*)"
decorate_count_field = "_count"
decorate_count_name = "HideField"
decorate_count_from = "@nestjs/graphql"
decorate_count_arguments = "[]"
// create data validator
decorate_classValidator_type = "@(Create|Update|Upsert)*Args"
decorate_classValidator_field = "@(data|[A-Z]*)"
decorate_classValidator_name = ValidateNested
decorate_classValidator_from = "class-validator"
decorate_classValidator_arguments = "['{each: true}']"
// create data transformer
decorate_classTransformer_type = "@(Create|Update|Upsert)*Args"
decorate_classTransformer_field = "@(data|[A-Z]*)"
decorate_classTransformer_from = "class-transformer"
decorate_classTransformer_arguments = "['() => {propertyType.0}']"
decorate_classTransformer_name = Type
}
model User {
/// @Validator.IsString()
/// @Validator.IsOptional()
id String @id @default(uuid())
/// @Validator.IsString()
/// @Validator.IsOptional()
firstName String?
/// @Validator.IsString()
/// @Validator.IsOptional()
lastName String?
/// @Validator.IsEmail()
/// @Validator.IsOptional()
email String @unique
/// @Validator.IsBoolean()
/// @Validator.IsOptional()
emailVerified Boolean @default(false)
/// @Validator.IsString()
/// @Validator.IsOptional()
avatarUrl String?
/// @Validator.IsString()
/// @Validator.IsOptional()
locale String
/// @Validator.IsString()
/// @Validator.IsOptional()
phoneNumber String?
/// @Validator.IsDate()
/// @Validator.IsOptional()
lastSeen DateTime?
/// @Validator.IsBoolean()
/// @Validator.IsOptional()
disabled Boolean @default(false)
/// @TypeGraphQL.omit(input: true, output: true)
passwordHash String?
/// @Validator.IsJSON()
/// @Validator.IsOptional()
metadata Json?
/// @Validator.IsBoolean()
/// @Validator.IsOptional()
canImpersonate Boolean @default(false)
companies Company[]
/// @TypeGraphQL.omit(input: true, output: true)
refreshTokens RefreshToken[]
comments Comment[]
defaultWorkspaceId String?
authoredActivities Activity[] @relation(name: "authoredActivities")
assignedActivities Activity[] @relation(name: "assignedActivities")
authoredAttachments Attachment[] @relation(name: "authoredAttachments")
/// @TypeGraphQL.omit(input: true, output: true)
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("users")
}
enum ColorScheme {
Light
Dark
System
}
model UserSettings {
id String @id @default(uuid())
/// @Validator.IsString()
/// @Validator.IsOptional()
colorScheme ColorScheme @default(System)
/// @Validator.IsString()
locale String
WorkspaceMember WorkspaceMember[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("user_settings")
}
/// @TypeGraphQL.omit(input: true)
model Workspace {
/// @Validator.IsString()
/// @Validator.IsOptional()
id String @id @default(uuid())
/// @Validator.IsString()
/// @Validator.IsOptional()
domainName String?
/// @Validator.IsString()
/// @Validator.IsOptional()
displayName String?
/// @Validator.IsString()
/// @Validator.IsOptional()
logo String?
/// @Validator.IsString()
/// @Validator.IsOptional()
inviteHash String?
workspaceMember WorkspaceMember[]
companies Company[]
people Person[]
activities Activity[]
comments Comment[]
pipelines Pipeline[]
pipelineStages PipelineStage[]
pipelineProgresses PipelineProgress[]
activityTargets ActivityTarget[]
apiKeys ApiKey[]
webHooks WebHook[]
/// @TypeGraphQL.omit(input: true, output: true)
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
Attachment Attachment[]
@@map("workspaces")
}
model WorkspaceMember {
/// @Validator.IsString()
/// @Validator.IsOptional()
id String @id @default(uuid())
/// @Validator.IsBoolean()
/// @Validator.IsOptional()
allowImpersonation Boolean @default(true)
userId String @unique
/// @TypeGraphQL.omit(input: true, output: false)
workspace Workspace @relation(fields: [workspaceId], references: [id])
/// @TypeGraphQL.omit(input: true, output: true)
workspaceId String
/// @TypeGraphQL.omit(input: true, output: true)
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
Favorite Favorite[]
authoredActivities Activity[] @relation(name: "authoredActivities")
assignedActivities Activity[] @relation(name: "assignedActivities")
authoredAttachments Attachment[] @relation(name: "authoredAttachments")
settings UserSettings? @relation(fields: [settingsId], references: [id])
settingsId String?
companies Company[]
comments Comment[]
@@map("workspace_members")
}
model Company {
/// @Validator.IsString()
/// @Validator.IsOptional()
id String @id @default(uuid())
/// @Validator.IsString()
/// @Validator.IsOptional()
name String
/// @Validator.IsString()
/// @Validator.IsOptional()
domainName String
/// @Validator.IsString()
/// @Validator.IsOptional()
linkedinUrl String?
/// @Validator.IsNumber()
/// @Validator.IsOptional()
annualRecurringRevenue Int?
/// @Validator.IsBoolean()
/// @Validator.IsOptional()
idealCustomerProfile Boolean @default(false)
/// @Validator.IsString()
/// @Validator.IsOptional()
xUrl String?
/// @Validator.IsString()
/// @Validator.IsOptional()
address String
/// @Validator.IsNumber()
/// @Validator.IsOptional()
employees Int?
people Person[]
accountOwner User? @relation(fields: [accountOwnerId], references: [id], onDelete: SetNull)
accountOwnerId String?
workspaceMemberAccountOwner WorkspaceMember? @relation(fields: [workspaceMemberAccountOwnerId], references: [id], onDelete: SetNull)
workspaceMemberAccountOwnerId String?
/// @TypeGraphQL.omit(input: true, output: true)
workspace Workspace @relation(fields: [workspaceId], references: [id])
/// @TypeGraphQL.omit(input: true, output: true)
workspaceId String
/// @TypeGraphQL.omit(input: true, output: true)
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
ActivityTarget ActivityTarget[]
PipelineProgress PipelineProgress[]
Favorite Favorite[]
Attachment Attachment[]
@@map("companies")
}
model Person {
/// @Validator.IsString()
/// @Validator.IsOptional()
id String @id @default(uuid())
/// @Validator.IsString()
/// @Validator.IsOptional()
firstName String?
/// @Validator.IsString()
/// @Validator.IsOptional()
lastName String?
/// @Validator.IsString()
/// @Validator.IsOptional()
email String?
/// @Validator.IsString()
/// @Validator.IsOptional()
linkedinUrl String?
/// @Validator.IsString()
/// @Validator.IsOptional()
xUrl String?
/// @Validator.IsString()
/// @Validator.IsOptional()
jobTitle String?
/// @Validator.IsString()
/// @Validator.IsOptional()
phone String?
/// @Validator.IsString()
/// @Validator.IsOptional()
city String?
/// @Validator.IsString()
/// @Validator.IsOptional()
avatarUrl String?
company Company? @relation(fields: [companyId], references: [id], onDelete: SetNull)
companyId String?
/// @TypeGraphQL.omit(input: true, output: true)
workspace Workspace @relation(fields: [workspaceId], references: [id])
/// @TypeGraphQL.omit(input: true, output: true)
workspaceId String
contactPipelineProgresses PipelineProgress[] @relation("PointOfContactPipelineProgress")
/// @TypeGraphQL.omit(input: true, output: true)
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
ActivityTarget ActivityTarget[]
PipelineProgress PipelineProgress[]
Favorite Favorite[]
Attachment Attachment[]
@@map("people")
}
model RefreshToken {
/// @Validator.IsString()
/// @Validator.IsOptional()
id String @id @default(uuid())
/// @TypeGraphQL.omit(input: true, output: true)
user User @relation(fields: [userId], references: [id])
/// @TypeGraphQL.omit(input: true, output: true)
userId String
expiresAt DateTime
/// @TypeGraphQL.omit(input: true, output: true)
deletedAt DateTime?
/// @TypeGraphQL.omit(input: true, output: true)
revokedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("refresh_tokens")
}
enum ActivityType {
Note
Task
}
model Activity {
/// @Validator.IsString()
/// @Validator.IsOptional()
id String @id @default(uuid())
body String?
title String?
type ActivityType @default(Note)
reminderAt DateTime?
dueAt DateTime?
completedAt DateTime?
activityTargets ActivityTarget[]
comments Comment[]
attachments Attachment[]
author User @relation(fields: [authorId], references: [id], name: "authoredActivities", onDelete: Cascade)
authorId String
workspaceMemberAuthor WorkspaceMember? @relation(fields: [workspaceMemberAuthorId], references: [id], name: "authoredActivities", onDelete: Cascade)
workspaceMemberAuthorId String?
assignee User? @relation(fields: [assigneeId], references: [id], name: "assignedActivities", onDelete: SetNull)
assigneeId String?
workspaceMemberAssignee WorkspaceMember? @relation(fields: [workspaceMemberAssigneeId], references: [id], name: "assignedActivities", onDelete: SetNull)
workspaceMemberAssigneeId String?
/// @TypeGraphQL.omit(input: true, output: true)
workspace Workspace @relation(fields: [workspaceId], references: [id])
/// @TypeGraphQL.omit(input: true, output: true)
workspaceId String
/// @TypeGraphQL.omit(input: true, output: true)
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("activities")
}
model Comment {
/// @Validator.IsString()
/// @Validator.IsOptional()
id String @id @default(uuid())
/// @Validator.IsString()
body String
author User @relation(fields: [authorId], references: [id], onDelete: Cascade)
authorId String
workspaceMemberAuthor WorkspaceMember? @relation(fields: [workspaceMemberAuthorId], references: [id], onDelete: Cascade)
workspaceMemberAuthorId String?
activity Activity? @relation(fields: [activityId], references: [id], onDelete: Cascade)
activityId String?
commentThreadId String?
/// @TypeGraphQL.omit(input: true, output: true)
workspace Workspace @relation(fields: [workspaceId], references: [id])
/// @TypeGraphQL.omit(input: true, output: true)
workspaceId String
/// @TypeGraphQL.omit(input: true, output: true)
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("comments")
}
model ActivityTarget {
/// @Validator.IsString()
/// @Validator.IsOptional()
id String @id @default(uuid())
activity Activity @relation(fields: [activityId], references: [id], onDelete: Cascade)
activityId String
/// @TypeGraphQL.omit(input: true, output: true)
workspace Workspace @relation(fields: [workspaceId], references: [id])
/// @TypeGraphQL.omit(input: true, output: true)
workspaceId String
personId String?
person Person? @relation(fields: [personId], references: [id], onDelete: Cascade)
companyId String?
company Company? @relation(fields: [companyId], references: [id], onDelete: Cascade)
/// @TypeGraphQL.omit(input: true, output: true)
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("activity_targets")
}
// All of the world's currently active currencies based on the ISO 4217 standard
enum Currency {
AED
AFN
ALL
AMD
ANG
AOA
ARS
AUD
AWG
AZN
BAM
BBD
BDT
BGN
BHD
BIF
BMD
BND
BOB
BOV
BRL
BSD
BTN
BWP
BYN
BZD
CAD
CDF
CHF
CLF
CLP
CNY
COP
COU
CRC
CUC
CUP
CVE
CZK
DJF
DKK
DOP
DZD
EGP
ERN
ETB
EUR
FJD
FKP
GBP
GEL
GHS
GIP
GMD
GNF
GTQ
GYD
HKD
HNL
HRK
HTG
HUF
IDR
ILS
INR
IQD
IRR
ISK
JMD
JOD
JPY
KES
KGS
KHR
KMF
KPW
KRW
KWD
KYD
KZT
LAK
LBP
LKR
LRD
LSL
LYD
MAD
MDL
MGA
MKD
MMK
MNT
MOP
MRO
MRU
MUR
MVR
MWK
MXN
MXV
MYR
MZN
NAD
NGN
NIO
NOK
NPR
NZD
OMR
PAB
PEN
PGK
PHP
PKR
PLN
PYG
QAR
RON
RSD
RUB
RWF
SAR
SBD
SCR
SDD
SDG
SEK
SGD
SHP
SLL
SOS
SRD
SSP
STD
STN
SVC
SYP
SZL
THB
TJS
TMM
TMT
TND
TOP
TRY
TTD
TWD
TZS
UAH
UGX
USD
UYU
UZS
VEF
VES
VND
VUV
WST
XAF
XCD
XOF
XPF
XSU
XUA
YER
ZAR
ZMW
ZWL
}
model Pipeline {
/// @Validator.IsString()
/// @Validator.IsOptional()
id String @id @default(uuid())
/// @Validator.IsString()
name String
/// @Validator.IsString()
icon String
pipelineStages PipelineStage[]
pipelineProgresses PipelineProgress[]
pipelineProgressableType PipelineProgressableType @default(Company)
/// @TypeGraphQL.omit(input: true, output: true)
workspace Workspace @relation(fields: [workspaceId], references: [id])
/// @TypeGraphQL.omit(input: true, output: true)
workspaceId String
/// @TypeGraphQL.omit(input: true, output: true)
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
currency Currency @default(USD)
@@map("pipelines")
}
model PipelineStage {
/// @Validator.IsString()
/// @Validator.IsOptional()
id String @id @default(uuid())
/// @Validator.IsString()
/// @Validator.IsOptional()
name String
/// @Validator.IsString()
/// @Validator.IsOptional()
type String
/// @Validator.IsOptional()
/// @Validator.IsString()
color String
/// @Validator.IsNumber()
/// @Validator.IsOptional()
position Int?
pipelineProgresses PipelineProgress[]
///
pipeline Pipeline @relation(fields: [pipelineId], references: [id], onDelete: Cascade)
pipelineId String
/// @TypeGraphQL.omit(input: true, output: true)
workspace Workspace @relation(fields: [workspaceId], references: [id])
/// @TypeGraphQL.omit(input: true, output: true)
workspaceId String
/// @TypeGraphQL.omit(input: true, output: true)
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("pipeline_stages")
}
enum PipelineProgressableType {
Person
Company
}
model PipelineProgress {
/// @Validator.IsString()
/// @Validator.IsOptional()
id String @id @default(uuid())
amount Int?
closeDate DateTime?
probability Int?
pipeline Pipeline @relation(fields: [pipelineId], references: [id], onDelete: Cascade)
pipelineId String
pipelineStage PipelineStage @relation(fields: [pipelineStageId], references: [id], onDelete: Cascade)
pipelineStageId String
pointOfContact Person? @relation("PointOfContactPipelineProgress", fields: [pointOfContactId], references: [id], onDelete: SetNull)
pointOfContactId String?
/// @TypeGraphQL.omit(input: true, output: true)
workspace Workspace @relation(fields: [workspaceId], references: [id])
/// @TypeGraphQL.omit(input: true, output: true)
workspaceId String
/// @TypeGraphQL.omit(input: true, output: true)
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
companyId String?
company Company? @relation(fields: [companyId], references: [id], onDelete: Cascade)
personId String?
person Person? @relation(fields: [personId], references: [id], onDelete: Cascade)
@@map("pipeline_progresses")
}
enum AttachmentType {
Image
Audio
Video
TextDocument
Spreadsheet
Archive
Other
}
model Attachment {
/// @Validator.IsString()
/// @Validator.IsOptional()
id String @id @default(uuid())
fullPath String
type AttachmentType
name String
/// @TypeGraphQL.omit(input: true, output: true)
workspaceId String
author User @relation(fields: [authorId], references: [id], name: "authoredAttachments", onDelete: Cascade)
authorId String
workspaceMemberAuthor WorkspaceMember? @relation(fields: [workspaceMemberAuthorId], references: [id], name: "authoredAttachments", onDelete: Cascade)
workspaceMemberAuthorId String?
activity Activity? @relation(fields: [activityId], references: [id], onDelete: Cascade)
activityId String?
/// @TypeGraphQL.omit(input: true, output: false)
person Person? @relation(fields: [personId], references: [id], onDelete: Cascade)
personId String?
/// @TypeGraphQL.omit(input: true, output: false)
company Company? @relation(fields: [companyId], references: [id], onDelete: Cascade)
companyId String?
/// @TypeGraphQL.omit(input: true, output: false)
workspace Workspace @relation(fields: [workspaceId], references: [id])
/// @TypeGraphQL.omit(input: true, output: true)
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("attachments")
}
model Favorite {
id String @id @default(uuid())
workspaceId String?
/// @TypeGraphQL.omit(input: true, output: false)
person Person? @relation(fields: [personId], references: [id], onDelete: Cascade)
personId String?
/// @TypeGraphQL.omit(input: true, output: false)
company Company? @relation(fields: [companyId], references: [id], onDelete: Cascade)
companyId String?
/// @TypeGraphQL.omit(input: true, output: false)
workspaceMember WorkspaceMember? @relation(fields: [workspaceMemberId], references: [id])
workspaceMemberId String?
position Float
@@map("favorites")
}
enum ViewType {
Table
Pipeline
}
model ApiKey {
/// @Validator.IsString()
/// @Validator.IsOptional()
id String @id @default(uuid())
name String
/// @TypeGraphQL.omit(input: true, output: true)
workspace Workspace @relation(fields: [workspaceId], references: [id])
/// @TypeGraphQL.omit(input: true, output: true)
workspaceId String
expiresAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
/// @TypeGraphQL.omit(input: true, output: true)
deletedAt DateTime?
/// @TypeGraphQL.omit(input: true, output: true)
revokedAt DateTime?
@@map("api_keys")
}
model WebHook {
/// @Validator.IsString()
/// @Validator.IsOptional()
id String @id @default(uuid())
/// @TypeGraphQL.omit(input: true, output: true)
workspace Workspace @relation(fields: [workspaceId], references: [id])
/// @TypeGraphQL.omit(input: true, output: true)
workspaceId String
targetUrl String
operation String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
/// @TypeGraphQL.omit(input: true, output: true)
deletedAt DateTime?
@@map("web_hooks")
}