616 lines
19 KiB
Plaintext
616 lines
19 KiB
Plaintext
/**
|
|
* This is the Prisma schema file for the application. It defines the data models, their relationships, and the database configuration.
|
|
* The schema is used by Prisma to generate the database migrations and the Prisma Client for querying the database.
|
|
*/
|
|
|
|
/**
|
|
* ----------------------------------
|
|
* Prisma Schema Configuration
|
|
* ----------------------------------
|
|
*/
|
|
generator client {
|
|
provider = "prisma-client-js"
|
|
}
|
|
generator dbml {
|
|
provider = "prisma-dbml-generator"
|
|
}
|
|
datasource db {
|
|
provider = "postgresql"
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* ----------------------------------
|
|
* Enum Definitions
|
|
* ----------------------------------
|
|
*/
|
|
enum user_role {
|
|
user
|
|
contributor
|
|
curator
|
|
admin
|
|
}
|
|
|
|
enum user_sex {
|
|
male
|
|
female
|
|
}
|
|
|
|
enum auth_provider {
|
|
google
|
|
github
|
|
}
|
|
|
|
enum device_type {
|
|
mobile
|
|
tablet
|
|
desktop
|
|
unknown
|
|
}
|
|
|
|
enum user_preference_state {
|
|
exclude
|
|
include
|
|
}
|
|
|
|
enum media_season {
|
|
winter
|
|
spring
|
|
summer
|
|
fall
|
|
}
|
|
|
|
enum character_role {
|
|
main
|
|
supporting
|
|
background
|
|
}
|
|
|
|
enum status_submission {
|
|
pending
|
|
approved
|
|
rejected
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* ----------------------------------
|
|
* Model for User and related entities
|
|
* ----------------------------------
|
|
*/
|
|
model User {
|
|
id String @id @db.Uuid @default(uuid(7))
|
|
email String @unique
|
|
password String? @db.VarChar(255)
|
|
username String @unique @db.VarChar(28)
|
|
fullname String @db.VarChar(32)
|
|
avatar String? @db.VarChar(255)
|
|
bio String? @db.Text
|
|
datebirth DateTime? @db.Date
|
|
role user_role @default(user)
|
|
sex user_sex?
|
|
phone_number String? @db.VarChar(20)
|
|
country Country? @relation(fields: [countryId], references: [id], name: "UserCountry")
|
|
auth_provider String? @db.VarChar(64)
|
|
provider_token String? @db.VarChar(255)
|
|
address UserAddress?
|
|
preferences UserPreference?
|
|
created_at DateTime @default(now()) @db.Timestamptz()
|
|
updated_at DateTime @updatedAt @db.Timestamptz()
|
|
deleted_at DateTime? @db.Timestamptz()
|
|
|
|
countryId String? @db.Uuid
|
|
oauth_accounts UserOauthAccounts[]
|
|
sessions UserSession[]
|
|
followers UserFollow[] @relation("UserFollowFollowing")
|
|
following UserFollow[] @relation("UserFollowFollower")
|
|
provisioned_as_admin ProvisionedUser[] @relation("ProvisionedUserAdmin")
|
|
provisioned_as_user ProvisionedUser[] @relation("ProvisionedUserUser")
|
|
created_producers Producer[]
|
|
submitted_media MediaSubmission[] @relation("MediaSubmissionSubmitter")
|
|
reviewed_media MediaSubmission[] @relation("MediaSubmissionReviewer")
|
|
updated_media Media[] @relation("MediaUpdater")
|
|
deleted_media Media[] @relation("MediaDeleter")
|
|
created_episodes Episode[]
|
|
created_videos Video[]
|
|
@@index([email])
|
|
@@index([username])
|
|
@@map("users")
|
|
}
|
|
|
|
model UserAddress {
|
|
user_id String @id @db.Uuid
|
|
address String @db.VarChar(255)
|
|
district String @db.VarChar(100)
|
|
city String @db.VarChar(100)
|
|
province String @db.VarChar(100)
|
|
postal_code String @db.VarChar(20)
|
|
coordinate String? @db.VarChar(50)
|
|
updated_at DateTime @updatedAt @db.Timestamptz()
|
|
|
|
user User @relation(fields: [user_id], references: [id])
|
|
@@map("user_addresses")
|
|
}
|
|
|
|
model UserOauthAccounts {
|
|
id String @id @db.Uuid @default(uuid(7))
|
|
user User @relation(fields: [user_id], references: [id])
|
|
provider_name auth_provider
|
|
provider_sub String? @db.VarChar(255)
|
|
provider_email String? @db.VarChar(255)
|
|
provider_token String? @db.VarChar(255)
|
|
refresh_token String? @db.VarChar(255)
|
|
expires_at DateTime? @db.Timestamptz()
|
|
last_login DateTime @default(now()) @db.Timestamptz()
|
|
created_at DateTime @default(now()) @db.Timestamptz()
|
|
updated_at DateTime @updatedAt @db.Timestamptz()
|
|
|
|
user_id String @db.Uuid
|
|
@@map("user_oauth_accounts")
|
|
}
|
|
|
|
model UserSession {
|
|
id String @id @db.Uuid @default(uuid(7))
|
|
user User @relation(fields: [user_id], references: [id])
|
|
device_type device_type
|
|
os_type String? @db.VarChar(50)
|
|
os_version String? @db.VarChar(50)
|
|
browser_name String? @db.VarChar(50)
|
|
browser_version String? @db.VarChar(50)
|
|
ip_login String? @db.Inet()
|
|
login_at DateTime @default(now()) @db.Timestamptz()
|
|
logout_at DateTime? @db.Timestamptz()
|
|
|
|
user_id String @db.Uuid
|
|
@@map("user_sessions")
|
|
}
|
|
|
|
model UserPreference {
|
|
user_id String @id @db.Uuid
|
|
char_as_partner Character @relation(fields: [char_as_partner_id], references: [id])
|
|
comment_picture String? @db.VarChar(255)
|
|
enable_watch_history Boolean @default(true)
|
|
enable_search_history Boolean @default(false)
|
|
is_private_account Boolean @default(false)
|
|
can_message_me Boolean @default(true)
|
|
publish_birthday Boolean @default(false)
|
|
publish_email Boolean @default(false)
|
|
publish_phone_number Boolean @default(false)
|
|
publish_country Boolean @default(false)
|
|
publish_partner Boolean @default(true)
|
|
subscribe_to_newsletter Boolean @default(true)
|
|
enable_security_alerts Boolean @default(true)
|
|
genre_preferences UserGenrePreference[]
|
|
rating_preferences UserRatingPreference[]
|
|
country_preferences UserCountryPreference[]
|
|
|
|
user User @relation(fields: [user_id], references: [id])
|
|
char_as_partner_id String @db.Uuid
|
|
@@map("user_preferences")
|
|
}
|
|
|
|
model UserGenrePreference {
|
|
user UserPreference @relation(fields: [user_id], references: [user_id])
|
|
genre Genre @relation(fields: [genre_id], references: [id])
|
|
state user_preference_state
|
|
|
|
user_id String @db.Uuid
|
|
genre_id String @db.Uuid
|
|
@@id([user_id, genre_id])
|
|
@@map("user_genre_preferences")
|
|
}
|
|
|
|
model UserRatingPreference {
|
|
user UserPreference @relation(fields: [user_id], references: [user_id])
|
|
rating MediaAgeRating @relation(fields: [rating_id], references: [id])
|
|
state user_preference_state
|
|
|
|
user_id String @db.Uuid
|
|
rating_id String @db.Uuid
|
|
@@id([user_id, rating_id])
|
|
@@map("user_rating_preferences")
|
|
}
|
|
|
|
model UserCountryPreference {
|
|
user UserPreference @relation(fields: [user_id], references: [user_id])
|
|
country Country @relation(fields: [country_id], references: [id])
|
|
state user_preference_state
|
|
|
|
user_id String @db.Uuid
|
|
country_id String @db.Uuid
|
|
@@id([user_id, country_id])
|
|
@@map("user_country_preferences")
|
|
}
|
|
|
|
model UserFollow {
|
|
follower User @relation("UserFollowFollower", fields: [follower_id], references: [id])
|
|
following User @relation("UserFollowFollowing", fields: [following_id], references: [id])
|
|
created_at DateTime @default(now()) @db.Timestamptz()
|
|
|
|
follower_id String @db.Uuid
|
|
following_id String @db.Uuid
|
|
@@id([follower_id, following_id])
|
|
@@map("user_follows")
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* ----------------------------------
|
|
* Model for Media and related entities
|
|
* ----------------------------------
|
|
*/
|
|
model Media {
|
|
id String @id @db.Uuid @default(uuid(7))
|
|
mal_id Int @unique
|
|
title String @db.VarChar(255)
|
|
title_secondary String? @db.VarChar(255)
|
|
title_original String? @db.VarChar(255)
|
|
title_synonyms String[] @db.VarChar(255)
|
|
trailer MediaTrailer?
|
|
synopsis String? @db.Text
|
|
small_image_url String? @db.VarChar(255)
|
|
medium_image_url String @db.VarChar(255)
|
|
large_image_url String? @db.VarChar(255)
|
|
type MediaType @relation(fields: [type_id], references: [id])
|
|
source MediaSource? @relation(fields: [source_id], references: [id])
|
|
status MediaStatus? @relation(fields: [status_id], references: [id])
|
|
airing Boolean
|
|
start_airing DateTime? @db.Date
|
|
end_airing DateTime? @db.Date
|
|
age_rating MediaAgeRating? @relation(fields: [age_rating_id], references: [id])
|
|
score Decimal? @db.Decimal(2, 2)
|
|
score_total Int @default(0)
|
|
score_count Int @default(0)
|
|
background String? @db.Text
|
|
season media_season
|
|
year Int? @db.SmallInt
|
|
country Country? @relation(fields: [country_id], references: [id])
|
|
broadcast_day String? @db.VarChar(20)
|
|
producers MediaProducer[]
|
|
licensors MediaLicensor[]
|
|
studios MediaStudio[]
|
|
genres MediaGenre[]
|
|
explicit_genres MediaExplicitGenre[]
|
|
themes MediaTheme[]
|
|
demographics MediaDemographic[]
|
|
relations MediaRelation[] @relation("MediaRelationMedia")
|
|
external_links MediaExternalLink[]
|
|
characters MediaCharacter[]
|
|
submissions MediaSubmission?
|
|
created_at DateTime @default(now()) @db.Timestamptz()
|
|
updated_by User? @relation(fields: [updated_by_id], references: [id], name: "MediaUpdater")
|
|
updated_at DateTime @updatedAt @db.Timestamptz()
|
|
deleted_by User? @relation(fields: [deleted_by_id], references: [id], name: "MediaDeleter")
|
|
deleted_at DateTime? @db.Timestamptz()
|
|
|
|
type_id String @db.Uuid
|
|
source_id String @db.Uuid
|
|
status_id String @db.Uuid
|
|
age_rating_id String? @db.Uuid
|
|
country_id String? @db.Uuid
|
|
related_media MediaRelation[] @relation("MediaRelationRelatedMedia")
|
|
approver_id String? @db.Uuid
|
|
created_by_id String? @db.Uuid
|
|
updated_by_id String? @db.Uuid
|
|
deleted_by_id String? @db.Uuid
|
|
@@map("medias")
|
|
}
|
|
|
|
model MediaSubmission {
|
|
id String @id @db.Uuid @default(uuid(7))
|
|
media Media @relation(fields: [media_id], references: [id])
|
|
submitter User @relation(fields: [submitter_id], references: [id], name: "MediaSubmissionSubmitter")
|
|
status status_submission @default(pending)
|
|
reviewer User? @relation(fields: [reviewer_id], references: [id], name: "MediaSubmissionReviewer")
|
|
reviewed_at DateTime? @db.Timestamptz()
|
|
reason String? @db.Text
|
|
created_at DateTime @default(now()) @db.Timestamptz()
|
|
|
|
media_id String @db.Uuid @unique
|
|
submitter_id String @db.Uuid
|
|
reviewer_id String? @db.Uuid
|
|
@@map("media_submissions")
|
|
}
|
|
|
|
model MediaTrailer {
|
|
media_id String @id @db.Uuid
|
|
url String? @db.VarChar(255)
|
|
embed_url String? @db.VarChar(255)
|
|
small_image_url String? @db.VarChar(255)
|
|
large_image_url String? @db.VarChar(255)
|
|
maximum_image_url String? @db.VarChar(255)
|
|
|
|
media Media @relation(fields: [media_id], references: [id])
|
|
@@map("media_trailers")
|
|
}
|
|
|
|
model MediaType {
|
|
id String @id @db.Uuid @default(uuid(7))
|
|
name String @db.VarChar(100) @unique
|
|
|
|
Media Media[]
|
|
@@map("media_types")
|
|
}
|
|
|
|
model MediaSource {
|
|
id String @id @db.Uuid @default(uuid(7))
|
|
name String @db.VarChar(100) @unique
|
|
|
|
media Media[]
|
|
@@map("media_sources")
|
|
}
|
|
|
|
model MediaStatus {
|
|
id String @id @db.Uuid @default(uuid(7))
|
|
name String @db.VarChar(100) @unique
|
|
|
|
media Media[]
|
|
@@map("media_statuses")
|
|
}
|
|
|
|
model MediaAgeRating {
|
|
id String @id @db.Uuid @default(uuid(7))
|
|
name String @db.VarChar(100) @unique
|
|
min_age Int @db.SmallInt
|
|
|
|
media Media[]
|
|
user_rating_preferences UserRatingPreference[]
|
|
@@map("media_age_ratings")
|
|
}
|
|
|
|
model MediaProducer {
|
|
media Media @relation(fields: [media_id], references: [id])
|
|
producer Producer @relation(fields: [producer_id], references: [id])
|
|
|
|
media_id String @db.Uuid
|
|
producer_id String @db.Uuid
|
|
@@id([media_id, producer_id])
|
|
@@map("media_producers")
|
|
}
|
|
|
|
model MediaLicensor {
|
|
media Media @relation(fields: [media_id], references: [id])
|
|
licensor Producer @relation(fields: [licensor_id], references: [id])
|
|
|
|
media_id String @db.Uuid
|
|
licensor_id String @db.Uuid
|
|
@@id([media_id, licensor_id])
|
|
@@map("media_licensors")
|
|
}
|
|
|
|
model MediaStudio {
|
|
media Media @relation(fields: [media_id], references: [id])
|
|
studio Producer @relation(fields: [studio_id], references: [id])
|
|
|
|
media_id String @db.Uuid
|
|
studio_id String @db.Uuid
|
|
@@id([media_id, studio_id])
|
|
@@map("media_studios")
|
|
}
|
|
|
|
model Producer {
|
|
id String @id @db.Uuid @default(uuid(7))
|
|
mal_id Int @unique
|
|
type String @db.VarChar(24)
|
|
name String @db.VarChar(255)
|
|
url String? @db.VarChar(255)
|
|
created_by User @relation(fields: [created_by_id], references: [id])
|
|
created_at DateTime @default(now()) @db.Timestamptz()
|
|
updated_at DateTime @updatedAt @db.Timestamptz()
|
|
deleted_at DateTime? @db.Timestamptz()
|
|
created_by_id String @db.Uuid
|
|
|
|
media_producers MediaProducer[]
|
|
media_licensors MediaLicensor[]
|
|
media_studios MediaStudio[]
|
|
@@map("producers")
|
|
}
|
|
|
|
model MediaGenre {
|
|
media Media @relation(fields: [media_id], references: [id])
|
|
genre Genre @relation(fields: [genre_id], references: [id])
|
|
|
|
media_id String @db.Uuid
|
|
genre_id String @db.Uuid
|
|
@@id([media_id, genre_id])
|
|
@@map("media_genres")
|
|
}
|
|
|
|
model MediaExplicitGenre {
|
|
media Media @relation(fields: [media_id], references: [id])
|
|
genre Genre @relation(fields: [genre_id], references: [id])
|
|
|
|
media_id String @db.Uuid
|
|
genre_id String @db.Uuid
|
|
@@id([media_id, genre_id])
|
|
@@map("media_explicit_genres")
|
|
}
|
|
|
|
model MediaTheme {
|
|
media Media @relation(fields: [media_id], references: [id])
|
|
theme Genre @relation(fields: [genre_id], references: [id])
|
|
|
|
media_id String @db.Uuid
|
|
genre_id String @db.Uuid
|
|
@@id([media_id, genre_id])
|
|
@@map("media_themes")
|
|
}
|
|
|
|
model MediaDemographic {
|
|
media Media @relation(fields: [media_id], references: [id])
|
|
demographic Genre @relation(fields: [demographic_id], references: [id])
|
|
|
|
media_id String @db.Uuid
|
|
demographic_id String @db.Uuid
|
|
@@id([media_id, demographic_id])
|
|
@@map("media_demographics")
|
|
}
|
|
|
|
model Genre {
|
|
id String @id @db.Uuid @default(uuid(7))
|
|
mal_id Int @unique @db.SmallInt
|
|
name String @db.VarChar(100)
|
|
slug String @db.VarChar(115)
|
|
thumbnail_url String? @db.VarChar(255)
|
|
|
|
media_genres MediaGenre[]
|
|
media_explicit_genres MediaExplicitGenre[]
|
|
media_themes MediaTheme[]
|
|
media_demographics MediaDemographic[]
|
|
user_genre_preferences UserGenrePreference[]
|
|
@@map("genres")
|
|
}
|
|
|
|
model MediaRelation {
|
|
media Media @relation(fields: [media_id], references: [id], name: "MediaRelationMedia")
|
|
related_media Media @relation(fields: [related_media_id], references: [id], name: "MediaRelationRelatedMedia")
|
|
relation_type String @db.VarChar(50)
|
|
|
|
media_id String @db.Uuid
|
|
related_media_id String @db.Uuid
|
|
@@id([media_id, related_media_id])
|
|
@@map("media_relations")
|
|
}
|
|
|
|
model MediaExternalLink {
|
|
id String @id @db.Uuid @default(uuid(7))
|
|
media Media @relation(fields: [media_id], references: [id])
|
|
url String @db.VarChar(255)
|
|
site_name String? @db.VarChar(100)
|
|
|
|
media_id String @db.Uuid
|
|
@@map("media_external_links")
|
|
}
|
|
|
|
model MediaCharacter {
|
|
id String @id @db.Uuid @default(uuid(7))
|
|
media Media @relation(fields: [media_id], references: [id])
|
|
character Character @relation(fields: [character_id], references: [id])
|
|
voice_actors VoiceActor[]
|
|
role character_role
|
|
|
|
media_id String @db.Uuid
|
|
character_id String @db.Uuid
|
|
@@map("media_characters")
|
|
}
|
|
|
|
model Character {
|
|
id String @id @db.Uuid @default(uuid(7))
|
|
name String @db.VarChar(255)
|
|
image String? @db.VarChar(255)
|
|
small_image String? @db.VarChar(255)
|
|
mal_id Int? @unique
|
|
fanpage_url String? @db.VarChar(255)
|
|
liked Int @default(0)
|
|
deleted_at DateTime? @db.Timestamptz()
|
|
updated_at DateTime @updatedAt @db.Timestamptz()
|
|
created_at DateTime @default(now()) @db.Timestamptz()
|
|
|
|
partnered_user UserPreference[]
|
|
media_characters MediaCharacter[]
|
|
@@map("characters")
|
|
}
|
|
|
|
model VoiceActor {
|
|
id String @id @db.Uuid @default(uuid(7))
|
|
media_character_id String @db.Uuid
|
|
language String @db.VarChar(115)
|
|
actor_staff Staff @relation(fields: [staff_id], references: [id])
|
|
|
|
staff_id String @db.Uuid
|
|
media_character MediaCharacter @relation(fields: [media_character_id], references: [id])
|
|
@@map("voice_actors")
|
|
}
|
|
|
|
model Staff {
|
|
id String @id @db.Uuid @default(uuid(7))
|
|
name String @db.VarChar(255)
|
|
image String? @db.VarChar(255)
|
|
mal_id Int? @unique
|
|
deleted_at DateTime? @db.Timestamptz()
|
|
updated_at DateTime @updatedAt @db.Timestamptz()
|
|
created_at DateTime @default(now()) @db.Timestamptz()
|
|
|
|
voice_actors VoiceActor[]
|
|
@@map("staff")
|
|
}
|
|
|
|
model Episode {
|
|
id String @id @db.Uuid @default(uuid(7))
|
|
media_id String @db.Uuid
|
|
episode Int @db.SmallInt
|
|
mal_url String? @db.VarChar(255)
|
|
forum_url String? @db.VarChar(255)
|
|
title String @db.VarChar(155)
|
|
title_origin String? @db.VarChar(155)
|
|
title_romanji String? @db.VarChar(155)
|
|
aired_at DateTime? @db.Date
|
|
filler Boolean
|
|
recap Boolean
|
|
total_score Int @default(0)
|
|
score_count Int @default(0)
|
|
deleted_at DateTime? @db.Timestamptz()
|
|
updated_at DateTime @updatedAt @db.Timestamptz()
|
|
created_at DateTime @default(now()) @db.Timestamptz()
|
|
created_by User @relation(fields: [created_by_id], references: [id])
|
|
|
|
videos Video[]
|
|
created_by_id String @db.Uuid
|
|
@@index([media_id, episode])
|
|
@@map("episodes")
|
|
}
|
|
|
|
model Video {
|
|
id String @id @db.Uuid @default(uuid(7))
|
|
// service VideoService[]
|
|
Episode Episode @relation(fields: [episode_id], references: [id])
|
|
video_code String @db.VarChar(255)
|
|
short_code String? @db.VarChar(255)
|
|
thumbnail_code String? @db.VarChar(255)
|
|
download_code String? @db.VarChar(255)
|
|
pending_upload Boolean @default(true)
|
|
created_by User @relation(fields: [created_by_id], references: [id])
|
|
created_at DateTime @default(now()) @db.Timestamptz()
|
|
deleted_at DateTime? @db.Timestamptz()
|
|
updated_at DateTime @updatedAt @db.Timestamptz()
|
|
|
|
episode_id String @db.Uuid
|
|
created_by_id String @db.Uuid
|
|
@@map("videos")
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* ----------------------------------
|
|
* Model for System Apps and related entities
|
|
* ----------------------------------
|
|
*/
|
|
model ProvisionedUser {
|
|
provisioned_by User @relation(fields: [admin_id], references: [id], name: "ProvisionedUserAdmin")
|
|
provisioned_to User @relation(fields: [user_id], references: [id], name: "ProvisionedUserUser")
|
|
provisioned_at DateTime @default(now()) @db.Timestamptz()
|
|
reason String? @db.VarChar(255)
|
|
|
|
admin_id String @db.Uuid
|
|
user_id String @db.Uuid
|
|
@@id([admin_id, user_id])
|
|
@@map("provisioned_users")
|
|
}
|
|
|
|
model Country {
|
|
id String @id @db.Uuid @default(uuid(7))
|
|
name String @db.VarChar(155)
|
|
slug String @db.VarChar(165)
|
|
code String @db.VarChar(3)
|
|
flag String? @db.VarChar(255)
|
|
banner String? @db.VarChar(255)
|
|
|
|
UserCountry User[] @relation("UserCountry")
|
|
UserCountryPreference UserCountryPreference[]
|
|
Media Media[]
|
|
@@map("countries")
|
|
} |