Files
AnimeTV-Backend/prisma/schema.prisma
2026-01-24 22:02:34 +07:00

686 lines
23 KiB
Plaintext

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
//// Prisma Configuration ////
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
}
generator dbml {
provider = "prisma-dbml-generator"
}
//// Prisma Model ////
model Media {
id String @id @default(uuid())
title String @db.Text
titleAlternative Json
slug String @db.Text @unique
malId Int? @unique
pictureMedium String @db.Text
pictureLarge String @db.Text
genres Genre[] @relation("MediaGenres")
country Country @default(JP)
score Decimal @db.Decimal(4, 2) @default(0.00)
status String
startAiring DateTime?
endAiring DateTime?
synopsis String @db.Text
ageRating String
mediaType MediaType
source String?
studios Studio[] @relation("MediaStudios")
onDraft Boolean @default(true)
uploader User @relation("UserUploadedMedias", fields: [uploadedBy], references: [id])
uploadedBy String
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
logs MediaLog[] @relation("MediaLogs")
episodes Episode[] @relation("MediaEpisodes")
collections Collection[] @relation("MediaCollections")
reviews MediaReview[] @relation("MediaReviews")
@@index([status, onDraft, deletedAt])
@@index([mediaType])
@@index([uploadedBy])
@@index([createdAt])
@@map("medias")
}
model MediaLog {
id String @id @default(uuid())
status MediaOperation
approval Boolean @default(false)
proposer User @relation("UserProposedMedias", fields: [proposedBy], references: [id])
proposedBy String
approver User @relation("UserApprovedMedias", fields: [approvedBy], references: [id])
approvedBy String
media Media @relation("MediaLogs", fields: [mediaId], references: [id])
mediaId String
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("media_logs")
}
model Genre {
id String @id @default(uuid())
name String @db.VarChar(255)
slug String @db.VarChar(255) @unique
malId Int
malUrl String @db.VarChar(255)
creator User @relation("UserCreatedGenres", fields: [createdBy], references: [id])
createdBy String
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
medias Media[] @relation("MediaGenres")
user_favourite_genres UserPreference[] @relation("UserFavoriteGenres")
@@map("genres")
}
model Studio {
id String @id @default(uuid())
name String @db.VarChar(255)
slug String @db.VarChar(255) @unique
linkAbout String @db.Text
malId Int
logoUrl String? @db.Text
creator User @relation("UserCreatedStudios", fields: [createdBy], references: [id])
createdBy String
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
medias Media[] @relation("MediaStudios")
@@map("studios")
}
model Character {
id String @id @default(uuid()) @db.Uuid
malId Int @unique
name String
role CharacterRole
favorites Int @default(0)
imageUrl String?
smallImageUrl String?
createdBy User @relation("UserCreatedCharacters", fields: [creatorId], references: [id])
creatorId String
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("characters")
}
model VoiceActor {
id String @id @default(uuid()) @db.Uuid
malId Int @unique
name String
birthday DateTime?
description String @db.Text
aboutUrl String
imageUrl String?
websiteUrl String?
createdBy User @relation("UserCreatedVoiceActors", fields: [creatorId], references: [id])
creatorId String
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("voice_actors")
}
model Episode {
id String @id @default(uuid())
media Media @relation("MediaEpisodes", fields: [mediaId], references: [id])
mediaId String
episode Int
name String @db.VarChar(255)
pictureThumbnail String @db.Text
viewed BigInt @default(0)
likes BigInt @default(0)
dislikes BigInt @default(0)
pendingUpload Boolean @default(true)
uploader User @relation("UserEpisodes", fields: [uploadedBy], references: [id])
uploadedBy String
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
user_likes EpisodeLike[] @relation("EpisodeLikes")
videos Video[] @relation("EpisodeVideos")
user_histories WatchHistory[] @relation("EpisodeWatchHistories")
comments Comment[] @relation("EpisodeComments")
@@map("episodes")
}
model EpisodeLike {
id String @id @default(uuid())
user User @relation("UserEpisodeLikes", fields: [userId], references: [id])
userId String
session UserSession @relation("SessionEpisodeLikes", fields: [sessionId], references: [id])
sessionId String
episode Episode @relation("EpisodeLikes", fields: [episodeId], references: [id])
episodeId String
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("episode_likes")
}
model Video {
id String @id @default(uuid())
episode Episode @relation("EpisodeVideos", fields: [episodeId], references: [id])
episodeId String
service VideoService @relation("VideoServices", fields: [serviceId], references: [id])
serviceId String
code String @db.VarChar(255)
pendingUpload Boolean @default(true)
uploader User @relation("UserVideos", fields: [uploadedBy], references: [id])
uploadedBy String
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("videos")
}
model VideoService {
id String @id @default(uuid())
name String @db.VarChar(255) @unique
domain String @db.VarChar(255)
logo String? @db.Text
hexColor String @db.VarChar(10)
endpointVideo String @db.Text
endpointThumbnail String? @db.Text
creator User @relation("UserVideoServices", fields: [createdBy], references: [id])
createdBy String
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
videos Video[] @relation("VideoServices")
user_preferences UserPreference[] @relation("UserServiceDefault")
@@map("video_services")
}
model User {
id String @id @default(uuid())
name String @db.VarChar(255)
username String @unique @db.VarChar(255)
email String @unique @db.Text
password String @db.Text
birthDate DateTime? @db.Date
gender UserGender?
phoneCC Int?
phoneNumber Int?
assignedRoles UserRoleAssignment[]
bioProfile String? @db.Text
avatar String? @db.Text
commentBackground String? @db.Text
provider String? @db.VarChar(255)
providerId String? @unique @db.VarChar(255)
providerToken String? @db.Text
providerPayload Json? @db.Json
preference UserPreference?
verifiedAt DateTime?
disabledAt DateTime?
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
medias Media[] @relation("UserUploadedMedias")
media_proposeds MediaLog[] @relation("UserProposedMedias")
media_approveds MediaLog[] @relation("UserApprovedMedias")
genres Genre[] @relation("UserCreatedGenres")
studios Studio[] @relation("UserCreatedStudios")
characters Character[] @relation("UserCreatedCharacters")
voice_actor VoiceActor[] @relation("UserCreatedVoiceActors")
episodes Episode[] @relation("UserEpisodes")
episode_likes EpisodeLike[] @relation("UserEpisodeLikes")
videos Video[] @relation("UserVideos")
video_services VideoService[] @relation("UserVideoServices")
create_roles UserRole[] @relation("UserCreateRoles")
notifications UserNotification[] @relation("UserNotifications")
sessions UserSession[] @relation("UserSession")
logs UserLog[] @relation("UserLogs")
collections Collection[] @relation("UserCollections")
allowed_collections Collection[] @relation("UserSelectedSharingCollention")
watch_histories WatchHistory[] @relation("UserWatchHistories")
media_reviews MediaReview[] @relation("UserMediaReviews")
comments Comment[] @relation("UserComments")
liked_comments CommentLike[] @relation("UserCommentLikes")
reported_comments CommentReport[] @relation("UserReportComments")
approved_comments CommentReport[] @relation("ApprovedReportComments")
create_languages Language[] @relation("UserCreateLanguages")
user_create_email EmailSystemAccount[] @relation("UserCreateSystemAccount")
user_emails EmailSystemHistory[] @relation("UserEmails")
sys_notifications SystemNotification[] @relation("UserCreatorSystemNotifications")
sys_logs SystemLog[] @relation("UserSystemLogs")
@@map("users")
}
model UserPreference {
id String @id @default(uuid())
user User @relation(fields: [userId], references: [id])
userId String @unique
lang Language? @relation("UserPreferenceLang", fields: [langPreference], references: [code])
langPreference String?
adultFiltering AdultFiltering @default(hide)
adultAlert AdultAlert @default(show)
videoQuality VideoQuality @default(Q1080)
serviceDefault VideoService? @relation("UserServiceDefault", fields: [serviceDefaultId], references: [id])
serviceDefaultId String?
hideContries Country[]
favoriteGenres Genre[] @relation("UserFavoriteGenres")
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("user_preferences")
}
model UserRole {
id String @id @default(uuid())
name String @db.VarChar(255) @unique
description String? @db.Text
primaryColor String? @db.VarChar(10)
secondaryColor String? @db.VarChar(10)
pictureImage String? @db.Text
badgeImage String? @db.Text
isSuperadmin Boolean @default(false)
canEditMedia Boolean @default(false)
canManageMedia Boolean @default(false)
canEditEpisodes Boolean @default(false)
canManageEpisodes Boolean @default(false)
canEditComment Boolean @default(false)
canManageComment Boolean @default(false)
canEditUser Boolean @default(false)
canManageUser Boolean @default(false)
canEditSystem Boolean @default(false)
canManageSystem Boolean @default(false)
creator User @relation("UserCreateRoles", fields: [createdBy], references: [id])
createdBy String
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
assignedUser UserRoleAssignment[]
@@map("user_roles")
}
model UserRoleAssignment {
user User @relation(fields: [userId], references: [id])
userId String
role UserRole @relation(fields: [roleId], references: [id])
roleId String
assignmentAt DateTime @default(now())
@@id([userId, roleId])
@@map("user_role_assignments")
}
model UserNotification {
id String @id @default(uuid())
title String @db.VarChar(255)
content String @db.Text
picture String @db.Text
state UserNotificationState
ctaLink String @db.Text
user User @relation("UserNotifications", fields: [userId], references: [id])
userId String
isReaded Boolean @default(false)
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("user_notifications")
}
model UserSession {
id String @id @default(uuid())
isAuthenticated Boolean @default(false)
user User @relation("UserSession", fields: [userId], references: [id])
userId String
deviceType String @db.VarChar(255)
deviceOs String @db.VarChar(255)
deviceIp String @db.VarChar(255)
browser String @db.VarChar(255)
isOnline Boolean @default(false)
lastOnline DateTime @default(now())
validUntil DateTime
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
logs UserLog[] @relation("UserSessionLogs")
episode_likes EpisodeLike[] @relation("SessionEpisodeLikes")
watch_histories WatchHistory[] @relation("SessionWatchHistories")
@@map("user_sessions")
}
model UserLog {
id String @id @default(uuid())
title String @db.VarChar(255)
notes String @db.Text
user User @relation("UserLogs", fields: [userId], references: [id])
userId String
session UserSession @relation("UserSessionLogs", fields: [sessionId], references: [id])
sessionId String
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("user_logs")
}
model Collection {
id String @id @default(uuid())
name String @db.VarChar(255)
medias Media[] @relation("MediaCollections")
owner User @relation("UserCollections", fields: [ownerId], references: [id])
ownerId String
accessStatus AccessStatus @default(private)
password String? @db.VarChar(255)
usersAllowed User[] @relation("UserSelectedSharingCollention")
accessScope AccessScope @default(viewer)
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("collections")
}
model WatchHistory {
id String @id @default(uuid())
episode Episode @relation("EpisodeWatchHistories", fields: [id], references: [id])
episodeId String
user User @relation("UserWatchHistories", fields: [userId], references: [id])
userId String
session UserSession @relation("SessionWatchHistories", fields: [sessionId], references: [id])
sessionId String
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("watch_histories")
}
model MediaReview {
id String @id @default(uuid())
media Media @relation("MediaReviews", fields: [mediaId], references:[id])
mediaId String
rating Int
title String @db.VarChar(255)
text String @db.Text
reaction MediaReviewReaction
creator User @relation("UserMediaReviews", fields: [createdBy], references: [id])
createdBy String
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("movie_reviews")
}
model Comment {
id String @id @default(uuid())
episode Episode @relation("EpisodeComments", fields: [episodeId], references: [id])
episodeId String
text String @db.Text
isParent Boolean @default(false)
parent Comment? @relation("ParentReplyComments", fields: [parentId], references: [id])
parentId String?
user User @relation("UserComments", fields: [userId], references: [id])
userId String
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
replies Comment[] @relation("ParentReplyComments")
likes CommentLike[] @relation("CommentLikes")
@@map("comments")
}
model CommentLike {
id String @id @default(uuid())
comment Comment @relation("CommentLikes", fields: [commentId], references: [id])
commentId String
user User @relation("UserCommentLikes", fields: [userLiked], references: [id])
userLiked String
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("comment_likes")
}
model CommentReport {
id String @id @default(uuid())
reporter User @relation("UserReportComments", fields: [userReporter], references: [id])
userReporter String
commentReported String
isSupervisorReport Boolean @default(false)
reason ReportReason
status ReportStatus
description String @db.VarChar(255)
approver User? @relation("ApprovedReportComments", fields: [approvedBy], references: [id])
approvedBy String?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("comment_reports")
}
model Language {
id String @id @default(uuid())
name String @db.VarChar(255)
code String @db.VarChar(5) @unique
countryFlag String @db.VarChar(10)
fileLocation String @db.Text
creator User @relation("UserCreateLanguages", fields: [craetedBy], references: [id])
craetedBy String
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
user_used UserPreference[] @relation("UserPreferenceLang")
@@map("languages")
}
model EmailSystemAccount {
id String @id @default(uuid())
name String @unique
host String @db.VarChar(255)
port Int
secure Boolean
email String @unique @db.VarChar(255)
username String @unique @db.VarChar(255)
password String @db.VarChar(255)
purpose EmailPorpose
creator User @relation("UserCreateSystemAccount", fields: [createdBy], references: [id])
createdBy String
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("email_system_accounts")
}
model EmailSystemHistory {
id String @id @default(uuid())
purpose EmailPorpose
fromEmail String @db.Text
toEmail String @db.Text
user User @relation("UserEmails", fields: [userRelated], references: [id])
userRelated String
title String @db.VarChar(255)
htmlContent String @db.Text
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("email_system_histories")
}
model SystemPreference {
id String @id @default(uuid())
key String @db.VarChar(225)
value String @db.VarChar(225)
description String @db.Text
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("system_preferences")
}
model SystemNotification {
id String @id @default(uuid())
type TypeSystemNotification
componentName String? @db.VarChar(255)
popupImage String? @db.Text
titleToast String? @db.VarChar(255)
contentToast String? @db.Text
creator User @relation("UserCreatorSystemNotifications", fields: [createdBy], references: [id])
createdBy String
deletedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("system_notifications")
}
model SystemLog {
id String @id @default(uuid())
title String @db.VarChar(255)
notes String @db.Text
user User? @relation("UserSystemLogs", fields: [relatedUser], references: [id])
relatedUser String?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("system_logs")
}
//// Prisma Enum Values ////
// Media Enum
enum MediaType {
TV
ONA
OVA
Movie
Special
Music
}
enum Country {
JP @map("Japanese")
EN @map("English")
ID @map("Indonesia")
KR @map("Korea")
}
// Character Enum
enum CharacterRole {
Main
Supporting
}
// MediaLog Enum
enum MediaOperation {
create
update
delete
}
// User Enum
enum UserGender {
male
female
}
// UserPreference Enum
enum AdultFiltering {
hide
show
explicit
}
enum AdultAlert {
hide
show
}
enum VideoQuality {
Q2160
Q1440
Q1080
Q720
Q480
Q360
Q240
Q144
}
// userNotification Enum
enum UserNotificationState {
info
warning
danger
}
// CommentReport Enum
enum ReportStatus {
pending
resolved
rejected
}
enum ReportReason {
sexualize
violent
explicit
hateful
political
racist
spam
other
}
// Collection Enum
enum AccessStatus {
private
selected
protected
public
}
enum AccessScope {
viewer
editor
}
// MediaReview Enum
enum MediaReviewReaction {
angry
sad
awesome
happy
sleepy
annoyed
disgusting
disappointed
}
// EmailSystemHistory Enum
enum EmailPorpose {
forgot_password
account_activation
account_notification
subscribtion
}
// systemNotification Enum
enum TypeSystemNotification {
component
popup
toast
}