/** * 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 } /** * ---------------------------------- * 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[] @@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 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) user User @relation(fields: [user_id], references: [id]) genre_preferences UserGenrePreference[] rating_preferences UserRatingPreference[] country_preferences UserCountryPreference[] @@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 Rating @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[] // external_links MediaExternalLink[] // characters MediaCharacter[] // approved_by User? @relation(fields: [approver_id], references: [id]) // approved_at Boolean @default(false) // created_by User? @relation(fields: [created_by_id], references: [id]) // created_at DateTime @default(now()) @db.Timestamptz() // updated_by User? @relation(fields: [updated_by_id], references: [id]) // 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 @@map("medias") } 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 media Media[] @@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 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") }