From 21b3a7011f747db8b5f86e0fe322f607732a89a7 Mon Sep 17 00:00:00 2001 From: Rafi Arrafif Date: Sat, 9 May 2026 21:00:00 +0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=97=83=EF=B8=8F=20db:=20add=20user=20pref?= =?UTF-8?q?erence=20and=20session=20schema?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- prisma/schema.prisma | 112 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 98 insertions(+), 14 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 4b49296..b730ff8 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -20,8 +20,20 @@ enum user_sex { male female } - - +enum auth_provider { + google + github +} +enum device_type { + mobile + tablet + desktop + unknown +} +enum user_preference_state { + exclude + include +} model User { id String @id @db.Uuid @default(uuid(7)) @@ -44,10 +56,59 @@ model User { updated_at DateTime @updatedAt @db.Timestamptz() deleted_at DateTime? @db.Timestamptz() - countryId String? @db.Uuid + countryId String? @db.Uuid + oauth_accounts UserOauthAccounts[] + sessions UserSession[] @@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 @@ -65,21 +126,43 @@ model UserPreference { 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 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() +model UserGenrePreference { + user UserPreference @relation(fields: [user_id], references: [user_id]) + // genre Genre @relation(fields: [genre_id], references: [id]) + state user_preference_state - user User @relation(fields: [user_id], references: [id]) - @@map("user_addresses") + 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 Country { @@ -91,5 +174,6 @@ model Country { banner String? @db.VarChar(255) UserCountry User[] @relation("UserCountry") + UserCountryPreference UserCountryPreference[] @@map("countries") } \ No newline at end of file