Compare commits

...

2 Commits

Author SHA1 Message Date
6f7a40cfd9 🗃️ db: add media and related support schemas 2026-05-11 21:00:00 +07:00
f8b63184a3 🗃️ db: add following and provision schema 2026-05-10 21:00:00 +07:00
2 changed files with 209 additions and 28 deletions

View File

@ -53,6 +53,11 @@ Enum "device_type" {
"unknown" "unknown"
} }
Enum "oauth_provider" {
"google"
"github"
}
Table "public"."user_rating_preferences" { Table "public"."user_rating_preferences" {
"user_id" uuid [unique, not null, ref: > "public"."user_preferences"."user_id"] "user_id" uuid [unique, not null, ref: > "public"."user_preferences"."user_id"]
"rating_id" uuid [not null, ref: > "public"."media_age_ratings"."id"] "rating_id" uuid [not null, ref: > "public"."media_age_ratings"."id"]
@ -99,7 +104,7 @@ Table "public"."medias" {
"title" varchar(255) [not null] "title" varchar(255) [not null]
"title_secondary" varchar(255) "title_secondary" varchar(255)
"title_original" varchar(255) "title_original" varchar(255)
"title_synonyms" varchar(255) [note: 'This is Array'] "title_synonyms" varchar(255)[]
"trailers" uuid "trailers" uuid
"synopsis" text [not null] "synopsis" text [not null]
"small_image_url" varchar(255) "small_image_url" varchar(255)
@ -205,7 +210,7 @@ Table "public"."provisioned_users" {
"provisioned_by" uuid [unique, not null, ref: > "public"."users"."id"] "provisioned_by" uuid [unique, not null, ref: > "public"."users"."id"]
"provisioned_to" uuid [not null, ref: > "public"."users"."id"] "provisioned_to" uuid [not null, ref: > "public"."users"."id"]
"provisioned_at" timestamp [not null] "provisioned_at" timestamp [not null]
"reason" bigint "reason" varchar(255)
} }
Table "public"."collection_members" { Table "public"."collection_members" {
@ -319,16 +324,21 @@ Table "public"."comments" {
"deleted_at" timestamp "deleted_at" timestamp
} }
Table "public"."user_oauth_credentials" { Table "public"."user_oauth_accounts" {
"id" uuid [pk, not null, ref: > "public"."users"."id"] "id" uuid [pk, not null]
"user_id" uuid [not null] "user_id" uuid [not null, ref: > "public"."users"."id"]
"oauth_id" uuid [not null] "provider_name" oauth_provider [not null]
"provider_token" varchar(500) "provider_sub" varchar(255)
"provider_sub" varchar(500) "provider_email" varchar(255)
"last_action" timestamp [not null] "access_token" varchar(255)
"refresh_token" varchar(255)
"last_login" timestamptz [not null]
"expires_at" timestamptz
"created_at" timestamptz [not null]
"updated_at" timestamptz [not null]
Indexes { Indexes {
(oauth_id, user_id) [unique, name: "index_2"] (user_id, provider_name) [unique, name: "index_2"]
} }
} }
@ -549,23 +559,22 @@ Table "public"."user_sessions" {
"id" uuid [pk, not null] "id" uuid [pk, not null]
"user_id" uuid [not null, ref: > "public"."users"."id"] "user_id" uuid [not null, ref: > "public"."users"."id"]
"device_type" device_type [not null] "device_type" device_type [not null]
"os_type" varchar(500) "os_type" varchar(50)
"os_version" varchar(500) "os_version" varchar(50)
"browser_name" varchar(500) "browser_name" varchar(50)
"browser_version" varchar(500) "browser_version" varchar(50)
"ip_login" inet [not null] "ip_login" inet [not null]
"last_activity_at" timestamp "login_at" timestamptz [not null]
"login_at" timestamp [not null] "logout_at" timestamptz
"logout_at" timestamp
} }
Table "public"."user_addresses" { Table "public"."user_addresses" {
"user_id" uuid [pk, not null] "user_id" uuid [pk, not null]
"street_address" varchar(500) [not null] "street_address" varchar(255) [not null]
"district" varchar(500) [not null] "district" varchar(100) [not null]
"city" varchar(500) [not null] "city" varchar(100) [not null]
"province" varchar(500) [not null] "province" varchar(100) [not null]
"postal_code" varchar(500) [not null] "postal_code" varchar(20) [not null]
"coordinate" varchar(500) "coordinate" varchar(50)
"updated_at" timestamp [not null] "updated_at" timestamp [not null]
} }

View File

@ -1,40 +1,73 @@
/**
* 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 { generator client {
provider = "prisma-client-js" provider = "prisma-client-js"
} }
generator dbml { generator dbml {
provider = "prisma-dbml-generator" provider = "prisma-dbml-generator"
} }
datasource db { datasource db {
provider = "postgresql" provider = "postgresql"
} }
/**
* ----------------------------------
* Enum Definitions
* ----------------------------------
*/
enum user_role { enum user_role {
user user
contributor contributor
curator curator
admin admin
} }
enum user_sex { enum user_sex {
male male
female female
} }
enum auth_provider { enum auth_provider {
google google
github github
} }
enum device_type { enum device_type {
mobile mobile
tablet tablet
desktop desktop
unknown unknown
} }
enum user_preference_state { enum user_preference_state {
exclude exclude
include include
} }
enum media_season {
winter
spring
summer
fall
}
/**
* ----------------------------------
* Model for User and related entities
* ----------------------------------
*/
model User { model User {
id String @id @db.Uuid @default(uuid(7)) id String @id @db.Uuid @default(uuid(7))
email String @unique email String @unique
@ -56,9 +89,13 @@ model User {
updated_at DateTime @updatedAt @db.Timestamptz() updated_at DateTime @updatedAt @db.Timestamptz()
deleted_at DateTime? @db.Timestamptz() deleted_at DateTime? @db.Timestamptz()
countryId String? @db.Uuid countryId String? @db.Uuid
oauth_accounts UserOauthAccounts[] oauth_accounts UserOauthAccounts[]
sessions UserSession[] sessions UserSession[]
followers UserFollow[] @relation("UserFollowFollowing")
following UserFollow[] @relation("UserFollowFollower")
provisioned_as_admin ProvisionedUser[] @relation("ProvisionedUserAdmin")
provisioned_as_user ProvisionedUser[] @relation("ProvisionedUserUser")
@@map("users") @@map("users")
} }
@ -165,6 +202,140 @@ model UserCountryPreference {
@@map("user_country_preferences") @@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 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 { model Country {
id String @id @db.Uuid @default(uuid(7)) id String @id @db.Uuid @default(uuid(7))
name String @db.VarChar(155) name String @db.VarChar(155)
@ -175,5 +346,6 @@ model Country {
UserCountry User[] @relation("UserCountry") UserCountry User[] @relation("UserCountry")
UserCountryPreference UserCountryPreference[] UserCountryPreference UserCountryPreference[]
Media Media[]
@@map("countries") @@map("countries")
} }