diff --git a/prisma/migrations/000_baseline_v1/migration.sql b/prisma/migrations/000_baseline_v2/migration.sql similarity index 96% rename from prisma/migrations/000_baseline_v1/migration.sql rename to prisma/migrations/000_baseline_v2/migration.sql index e2ec3d9..52c20b1 100644 --- a/prisma/migrations/000_baseline_v1/migration.sql +++ b/prisma/migrations/000_baseline_v2/migration.sql @@ -7,6 +7,9 @@ CREATE TYPE "MediaType" AS ENUM ('TV', 'ONA', 'OVA', 'Movie', 'Special', 'Music' -- CreateEnum CREATE TYPE "Country" AS ENUM ('Japanese', 'English', 'Indonesia', 'Korea'); +-- CreateEnum +CREATE TYPE "Season" AS ENUM ('Winter', 'Spring', 'Summer', 'Fall'); + -- CreateEnum CREATE TYPE "CharacterRole" AS ENUM ('Main', 'Supporting'); @@ -72,6 +75,8 @@ CREATE TABLE "medias" ( "deletedAt" TIMESTAMP(3), "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "season" "Season", + "yearReleased" SMALLINT NOT NULL, CONSTRAINT "medias_pkey" PRIMARY KEY ("id") ); @@ -367,7 +372,7 @@ CREATE TABLE "user_logs" ( -- CreateTable CREATE TABLE "collections" ( "id" UUID NOT NULL, - "name" VARCHAR(255) NOT NULL, + "name" VARCHAR(115) NOT NULL, "ownerId" UUID NOT NULL, "accessStatus" "AccessStatus" NOT NULL DEFAULT 'private', "password" VARCHAR(255), @@ -375,10 +380,21 @@ CREATE TABLE "collections" ( "deletedAt" TIMESTAMP(3), "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "slug" VARCHAR(115) NOT NULL, CONSTRAINT "collections_pkey" PRIMARY KEY ("id") ); +-- CreateTable +CREATE TABLE "CollectionMedia" ( + "id" UUID NOT NULL, + "collectionId" UUID NOT NULL, + "mediaId" UUID NOT NULL, + "savedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "CollectionMedia_pkey" PRIMARY KEY ("id") +); + -- CreateTable CREATE TABLE "watch_histories" ( "id" UUID NOT NULL, @@ -502,18 +518,13 @@ CREATE TABLE "email_system_histories" ( CREATE TABLE "hero_banner" ( "id" UUID NOT NULL, "orderPriority" INTEGER, - "isClickable" BOOLEAN NOT NULL DEFAULT false, - "title" VARCHAR(225), - "tags" TEXT[], - "description" TEXT, - "buttonContent" VARCHAR(100), - "buttonLink" TEXT, "imageUrl" TEXT, "startDate" TIMESTAMP(3) NOT NULL, "endDate" TIMESTAMP(3) NOT NULL, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "creatorId" UUID NOT NULL, + "mediaId" UUID NOT NULL, CONSTRAINT "hero_banner_pkey" PRIMARY KEY ("id") ); @@ -591,14 +602,6 @@ CREATE TABLE "_MediaCharacters" ( CONSTRAINT "_MediaCharacters_AB_pkey" PRIMARY KEY ("A","B") ); --- CreateTable -CREATE TABLE "_MediaCollections" ( - "A" UUID NOT NULL, - "B" UUID NOT NULL, - - CONSTRAINT "_MediaCollections_AB_pkey" PRIMARY KEY ("A","B") -); - -- CreateTable CREATE TABLE "_UserSelectedSharingCollention" ( "A" UUID NOT NULL, @@ -673,6 +676,12 @@ CREATE UNIQUE INDEX "user_roles_name_key" ON "user_roles"("name"); -- CreateIndex CREATE INDEX "user_sessions_userId_isAuthenticated_deletedAt_idx" ON "user_sessions"("userId", "isAuthenticated", "deletedAt"); +-- CreateIndex +CREATE UNIQUE INDEX "collections_slug_ownerId_key" ON "collections"("slug", "ownerId"); + +-- CreateIndex +CREATE UNIQUE INDEX "CollectionMedia_collectionId_mediaId_key" ON "CollectionMedia"("collectionId", "mediaId"); + -- CreateIndex CREATE UNIQUE INDEX "languages_code_key" ON "languages"("code"); @@ -703,24 +712,21 @@ CREATE INDEX "_UserFavoriteGenres_B_index" ON "_UserFavoriteGenres"("B"); -- CreateIndex CREATE INDEX "_MediaCharacters_B_index" ON "_MediaCharacters"("B"); --- CreateIndex -CREATE INDEX "_MediaCollections_B_index" ON "_MediaCollections"("B"); - -- CreateIndex CREATE INDEX "_UserSelectedSharingCollention_B_index" ON "_UserSelectedSharingCollention"("B"); -- AddForeignKey ALTER TABLE "medias" ADD CONSTRAINT "medias_uploadedBy_fkey" FOREIGN KEY ("uploadedBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; --- AddForeignKey -ALTER TABLE "media_logs" ADD CONSTRAINT "media_logs_proposedBy_fkey" FOREIGN KEY ("proposedBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - -- AddForeignKey ALTER TABLE "media_logs" ADD CONSTRAINT "media_logs_approvedBy_fkey" FOREIGN KEY ("approvedBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "media_logs" ADD CONSTRAINT "media_logs_mediaId_fkey" FOREIGN KEY ("mediaId") REFERENCES "medias"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +-- AddForeignKey +ALTER TABLE "media_logs" ADD CONSTRAINT "media_logs_proposedBy_fkey" FOREIGN KEY ("proposedBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + -- AddForeignKey ALTER TABLE "genres" ADD CONSTRAINT "genres_createdBy_fkey" FOREIGN KEY ("createdBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; @@ -733,15 +739,15 @@ ALTER TABLE "characters" ADD CONSTRAINT "characters_creatorId_fkey" FOREIGN KEY -- AddForeignKey ALTER TABLE "voice_actors" ADD CONSTRAINT "voice_actors_creatorId_fkey" FOREIGN KEY ("creatorId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; --- AddForeignKey -ALTER TABLE "lang_va_char" ADD CONSTRAINT "lang_va_char_vaId_fkey" FOREIGN KEY ("vaId") REFERENCES "voice_actors"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - -- AddForeignKey ALTER TABLE "lang_va_char" ADD CONSTRAINT "lang_va_char_charId_fkey" FOREIGN KEY ("charId") REFERENCES "characters"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "lang_va_char" ADD CONSTRAINT "lang_va_char_creatorId_fkey" FOREIGN KEY ("creatorId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +-- AddForeignKey +ALTER TABLE "lang_va_char" ADD CONSTRAINT "lang_va_char_vaId_fkey" FOREIGN KEY ("vaId") REFERENCES "voice_actors"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + -- AddForeignKey ALTER TABLE "episodes" ADD CONSTRAINT "episodes_mediaId_fkey" FOREIGN KEY ("mediaId") REFERENCES "medias"("id") ON DELETE RESTRICT ON UPDATE CASCADE; @@ -749,13 +755,13 @@ ALTER TABLE "episodes" ADD CONSTRAINT "episodes_mediaId_fkey" FOREIGN KEY ("medi ALTER TABLE "episodes" ADD CONSTRAINT "episodes_uploadedBy_fkey" FOREIGN KEY ("uploadedBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey -ALTER TABLE "episode_likes" ADD CONSTRAINT "episode_likes_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +ALTER TABLE "episode_likes" ADD CONSTRAINT "episode_likes_episodeId_fkey" FOREIGN KEY ("episodeId") REFERENCES "episodes"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "episode_likes" ADD CONSTRAINT "episode_likes_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "user_sessions"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey -ALTER TABLE "episode_likes" ADD CONSTRAINT "episode_likes_episodeId_fkey" FOREIGN KEY ("episodeId") REFERENCES "episodes"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +ALTER TABLE "episode_likes" ADD CONSTRAINT "episode_likes_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "videos" ADD CONSTRAINT "videos_episodeId_fkey" FOREIGN KEY ("episodeId") REFERENCES "episodes"("id") ON DELETE RESTRICT ON UPDATE CASCADE; @@ -769,23 +775,23 @@ ALTER TABLE "videos" ADD CONSTRAINT "videos_uploadedBy_fkey" FOREIGN KEY ("uploa -- AddForeignKey ALTER TABLE "video_services" ADD CONSTRAINT "video_services_createdBy_fkey" FOREIGN KEY ("createdBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; --- AddForeignKey -ALTER TABLE "user_preferences" ADD CONSTRAINT "user_preferences_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - -- AddForeignKey ALTER TABLE "user_preferences" ADD CONSTRAINT "user_preferences_langPreference_fkey" FOREIGN KEY ("langPreference") REFERENCES "languages"("code") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "user_preferences" ADD CONSTRAINT "user_preferences_serviceDefaultId_fkey" FOREIGN KEY ("serviceDefaultId") REFERENCES "video_services"("id") ON DELETE SET NULL ON UPDATE CASCADE; +-- AddForeignKey +ALTER TABLE "user_preferences" ADD CONSTRAINT "user_preferences_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + -- AddForeignKey ALTER TABLE "user_roles" ADD CONSTRAINT "user_roles_createdBy_fkey" FOREIGN KEY ("createdBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey -ALTER TABLE "user_role_assignments" ADD CONSTRAINT "user_role_assignments_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +ALTER TABLE "user_role_assignments" ADD CONSTRAINT "user_role_assignments_roleId_fkey" FOREIGN KEY ("roleId") REFERENCES "user_roles"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey -ALTER TABLE "user_role_assignments" ADD CONSTRAINT "user_role_assignments_roleId_fkey" FOREIGN KEY ("roleId") REFERENCES "user_roles"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +ALTER TABLE "user_role_assignments" ADD CONSTRAINT "user_role_assignments_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "user_notifications" ADD CONSTRAINT "user_notifications_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; @@ -794,29 +800,35 @@ ALTER TABLE "user_notifications" ADD CONSTRAINT "user_notifications_userId_fkey" ALTER TABLE "user_sessions" ADD CONSTRAINT "user_sessions_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey -ALTER TABLE "user_logs" ADD CONSTRAINT "user_logs_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +ALTER TABLE "user_logs" ADD CONSTRAINT "user_logs_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "user_sessions"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey -ALTER TABLE "user_logs" ADD CONSTRAINT "user_logs_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "user_sessions"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +ALTER TABLE "user_logs" ADD CONSTRAINT "user_logs_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "collections" ADD CONSTRAINT "collections_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey -ALTER TABLE "watch_histories" ADD CONSTRAINT "watch_histories_id_fkey" FOREIGN KEY ("id") REFERENCES "episodes"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +ALTER TABLE "CollectionMedia" ADD CONSTRAINT "CollectionMedia_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "collections"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey -ALTER TABLE "watch_histories" ADD CONSTRAINT "watch_histories_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +ALTER TABLE "CollectionMedia" ADD CONSTRAINT "CollectionMedia_mediaId_fkey" FOREIGN KEY ("mediaId") REFERENCES "medias"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "watch_histories" ADD CONSTRAINT "watch_histories_id_fkey" FOREIGN KEY ("id") REFERENCES "episodes"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "watch_histories" ADD CONSTRAINT "watch_histories_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "user_sessions"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey -ALTER TABLE "movie_reviews" ADD CONSTRAINT "movie_reviews_mediaId_fkey" FOREIGN KEY ("mediaId") REFERENCES "medias"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +ALTER TABLE "watch_histories" ADD CONSTRAINT "watch_histories_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "movie_reviews" ADD CONSTRAINT "movie_reviews_createdBy_fkey" FOREIGN KEY ("createdBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +-- AddForeignKey +ALTER TABLE "movie_reviews" ADD CONSTRAINT "movie_reviews_mediaId_fkey" FOREIGN KEY ("mediaId") REFERENCES "medias"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + -- AddForeignKey ALTER TABLE "comments" ADD CONSTRAINT "comments_episodeId_fkey" FOREIGN KEY ("episodeId") REFERENCES "episodes"("id") ON DELETE RESTRICT ON UPDATE CASCADE; @@ -833,10 +845,10 @@ ALTER TABLE "comment_likes" ADD CONSTRAINT "comment_likes_commentId_fkey" FOREIG ALTER TABLE "comment_likes" ADD CONSTRAINT "comment_likes_userLiked_fkey" FOREIGN KEY ("userLiked") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey -ALTER TABLE "comment_reports" ADD CONSTRAINT "comment_reports_userReporter_fkey" FOREIGN KEY ("userReporter") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +ALTER TABLE "comment_reports" ADD CONSTRAINT "comment_reports_approvedBy_fkey" FOREIGN KEY ("approvedBy") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey -ALTER TABLE "comment_reports" ADD CONSTRAINT "comment_reports_approvedBy_fkey" FOREIGN KEY ("approvedBy") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; +ALTER TABLE "comment_reports" ADD CONSTRAINT "comment_reports_userReporter_fkey" FOREIGN KEY ("userReporter") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "languages" ADD CONSTRAINT "languages_craetedBy_fkey" FOREIGN KEY ("craetedBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; @@ -850,6 +862,9 @@ ALTER TABLE "email_system_histories" ADD CONSTRAINT "email_system_histories_user -- AddForeignKey ALTER TABLE "hero_banner" ADD CONSTRAINT "hero_banner_creatorId_fkey" FOREIGN KEY ("creatorId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +-- AddForeignKey +ALTER TABLE "hero_banner" ADD CONSTRAINT "hero_banner_mediaId_fkey" FOREIGN KEY ("mediaId") REFERENCES "medias"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + -- AddForeignKey ALTER TABLE "system_notifications" ADD CONSTRAINT "system_notifications_createdBy_fkey" FOREIGN KEY ("createdBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; @@ -880,12 +895,6 @@ ALTER TABLE "_MediaCharacters" ADD CONSTRAINT "_MediaCharacters_A_fkey" FOREIGN -- AddForeignKey ALTER TABLE "_MediaCharacters" ADD CONSTRAINT "_MediaCharacters_B_fkey" FOREIGN KEY ("B") REFERENCES "medias"("id") ON DELETE CASCADE ON UPDATE CASCADE; --- AddForeignKey -ALTER TABLE "_MediaCollections" ADD CONSTRAINT "_MediaCollections_A_fkey" FOREIGN KEY ("A") REFERENCES "collections"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "_MediaCollections" ADD CONSTRAINT "_MediaCollections_B_fkey" FOREIGN KEY ("B") REFERENCES "medias"("id") ON DELETE CASCADE ON UPDATE CASCADE; - -- AddForeignKey ALTER TABLE "_UserSelectedSharingCollention" ADD CONSTRAINT "_UserSelectedSharingCollention_A_fkey" FOREIGN KEY ("A") REFERENCES "collections"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20260317094013_change_banner_to_media_only/migration.sql b/prisma/migrations/20260317094013_change_banner_to_media_only/migration.sql deleted file mode 100644 index 612c63e..0000000 --- a/prisma/migrations/20260317094013_change_banner_to_media_only/migration.sql +++ /dev/null @@ -1,23 +0,0 @@ -/* - Warnings: - - - You are about to drop the column `buttonContent` on the `hero_banner` table. All the data in the column will be lost. - - You are about to drop the column `buttonLink` on the `hero_banner` table. All the data in the column will be lost. - - You are about to drop the column `description` on the `hero_banner` table. All the data in the column will be lost. - - You are about to drop the column `isClickable` on the `hero_banner` table. All the data in the column will be lost. - - You are about to drop the column `tags` on the `hero_banner` table. All the data in the column will be lost. - - You are about to drop the column `title` on the `hero_banner` table. All the data in the column will be lost. - - Added the required column `mediaId` to the `hero_banner` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "hero_banner" DROP COLUMN "buttonContent", -DROP COLUMN "buttonLink", -DROP COLUMN "description", -DROP COLUMN "isClickable", -DROP COLUMN "tags", -DROP COLUMN "title", -ADD COLUMN "mediaId" UUID NOT NULL; - --- AddForeignKey -ALTER TABLE "hero_banner" ADD CONSTRAINT "hero_banner_mediaId_fkey" FOREIGN KEY ("mediaId") REFERENCES "medias"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20260327155457_add_collection_unique_by_owner_and_id/migration.sql b/prisma/migrations/20260327155457_add_collection_unique_by_owner_and_id/migration.sql deleted file mode 100644 index 5a06b55..0000000 --- a/prisma/migrations/20260327155457_add_collection_unique_by_owner_and_id/migration.sql +++ /dev/null @@ -1,14 +0,0 @@ -/* - Warnings: - - - You are about to alter the column `name` on the `collections` table. The data in that column could be lost. The data in that column will be cast from `VarChar(255)` to `VarChar(115)`. - - A unique constraint covering the columns `[slug,ownerId]` on the table `collections` will be added. If there are existing duplicate values, this will fail. - - Added the required column `slug` to the `collections` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "collections" ADD COLUMN "slug" VARCHAR(115) NOT NULL, -ALTER COLUMN "name" SET DATA TYPE VARCHAR(115); - --- CreateIndex -CREATE UNIQUE INDEX "collections_slug_ownerId_key" ON "collections"("slug", "ownerId"); diff --git a/prisma/migrations/20260329033709_create_table_pivot_for_media_collections/migration.sql b/prisma/migrations/20260329033709_create_table_pivot_for_media_collections/migration.sql deleted file mode 100644 index 7d79d3c..0000000 --- a/prisma/migrations/20260329033709_create_table_pivot_for_media_collections/migration.sql +++ /dev/null @@ -1,33 +0,0 @@ -/* - Warnings: - - - You are about to drop the `_MediaCollections` table. If the table is not empty, all the data it contains will be lost. - -*/ --- DropForeignKey -ALTER TABLE "_MediaCollections" DROP CONSTRAINT "_MediaCollections_A_fkey"; - --- DropForeignKey -ALTER TABLE "_MediaCollections" DROP CONSTRAINT "_MediaCollections_B_fkey"; - --- DropTable -DROP TABLE "_MediaCollections"; - --- CreateTable -CREATE TABLE "CollectionMedia" ( - "id" UUID NOT NULL, - "collectionId" UUID NOT NULL, - "mediaId" UUID NOT NULL, - "savedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "CollectionMedia_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "CollectionMedia_collectionId_mediaId_key" ON "CollectionMedia"("collectionId", "mediaId"); - --- AddForeignKey -ALTER TABLE "CollectionMedia" ADD CONSTRAINT "CollectionMedia_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "collections"("id") ON DELETE RESTRICT ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "CollectionMedia" ADD CONSTRAINT "CollectionMedia_mediaId_fkey" FOREIGN KEY ("mediaId") REFERENCES "medias"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20260422050909_change_enum_season/migration.sql b/prisma/migrations/20260422050909_change_enum_season/migration.sql new file mode 100644 index 0000000..12f68f2 --- /dev/null +++ b/prisma/migrations/20260422050909_change_enum_season/migration.sql @@ -0,0 +1,14 @@ +/* + Warnings: + + - The values [Winter,Spring,Summer,Fall] on the enum `Season` will be removed. If these variants are still used in the database, this will fail. + +*/ +-- AlterEnum +BEGIN; +CREATE TYPE "Season_new" AS ENUM ('winter', 'spring', 'summer', 'fall'); +ALTER TABLE "medias" ALTER COLUMN "season" TYPE "Season_new" USING ("season"::text::"Season_new"); +ALTER TYPE "Season" RENAME TO "Season_old"; +ALTER TYPE "Season_new" RENAME TO "Season"; +DROP TYPE "public"."Season_old"; +COMMIT; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 9ccae5b..808fddf 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1,746 +1,741 @@ -// 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 @db.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") - characters Character[] @relation("MediaCharacters") - onDraft Boolean @default(true) - uploader User @relation("UserUploadedMedias", fields: [uploadedBy], references: [id]) - uploadedBy String @db.Uuid - deletedAt DateTime? - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - - bannerPromotion HeroBanner[] @relation("MediaBannerPromotion") - logs MediaLog[] @relation("MediaLogs") - episodes Episode[] @relation("MediaEpisodes") - reviews MediaReview[] @relation("MediaReviews") - inCollections CollectionMedia[] @relation("CollectionMedia") - - @@index([status, onDraft, deletedAt]) - @@index([mediaType]) - @@index([uploadedBy]) - @@index([createdAt]) - @@map("medias") -} - -model MediaLog { - id String @id @db.Uuid - status MediaOperation - approval Boolean @default(false) - proposer User @relation("UserProposedMedias", fields: [proposedBy], references: [id]) - proposedBy String @db.Uuid - approver User @relation("UserApprovedMedias", fields: [approvedBy], references: [id]) - approvedBy String @db.Uuid - media Media @relation("MediaLogs", fields: [mediaId], references: [id]) - mediaId String @db.Uuid - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - @@map("media_logs") -} - -model Genre { - id String @id @db.Uuid - name String @db.VarChar(255) - slug String @db.VarChar(255) @unique - malId Int @unique - malUrl String @db.VarChar(255) - creator User @relation("UserCreatedGenres", fields: [createdBy], references: [id]) - createdBy String @db.Uuid - 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 @db.Uuid - name String @db.VarChar(255) - slug String @db.VarChar(255) @unique - linkAbout String @db.Text - malId Int @unique - logoUrl String? @db.Text - creator User @relation("UserCreatedStudios", fields: [createdBy], references: [id]) - createdBy String @db.Uuid - deletedAt DateTime? - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - - medias Media[] @relation("MediaStudios") - @@map("studios") -} - -model Character { - id String @id@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 @db.Uuid - deletedAt DateTime? - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - - medias Media[] @relation("MediaCharacters") - voice_actors LangVAChar[] @relation("CharVALanguage") - @@map("characters") -} - -model VoiceActor { - id String @id @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 @db.Uuid - deletedAt DateTime? - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - - characters LangVAChar[] @relation("VACharLanguage") - @@map("voice_actors") -} - -model LangVAChar { - id String @id @db.Uuid - language String - voiceActor VoiceActor @relation("VACharLanguage", fields: [vaId], references: [id]) - vaId String @db.Uuid - character Character @relation("CharVALanguage", fields: [charId], references: [id]) - charId String @db.Uuid - createdBy User @relation("UserCreatedLangVAChar", fields: [creatorId], references: [id]) - creatorId String @db.Uuid - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - - @@unique([language, vaId, charId]) - @@map("lang_va_char") -} - -model Episode { - id String @id @db.Uuid - media Media @relation("MediaEpisodes", fields: [mediaId], references: [id]) - mediaId String @db.Uuid - episode Int - name String @db.VarChar(255) - score Decimal @db.Decimal(4,2) @default(0.00) - 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 @db.Uuid - 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") - - @@unique([mediaId, episode]) - @@map("episodes") -} - -model EpisodeLike { - id String @id @db.Uuid - user User @relation("UserEpisodeLikes", fields: [userId], references: [id]) - userId String @db.Uuid - session UserSession @relation("SessionEpisodeLikes", fields: [sessionId], references: [id]) - sessionId String @db.Uuid - episode Episode @relation("EpisodeLikes", fields: [episodeId], references: [id]) - episodeId String @db.Uuid - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - @@map("episode_likes") -} - -model Video { - id String @id @db.Uuid - episode Episode @relation("EpisodeVideos", fields: [episodeId], references: [id]) - episodeId String @db.Uuid - service VideoService @relation("VideoServices", fields: [serviceId], references: [id]) - serviceId String @db.Uuid - videoCode String @db.VarChar(255) - thumbnailCode String? - pendingUpload Boolean @default(true) - uploader User @relation("UserVideos", fields: [uploadedBy], references: [id]) - uploadedBy String @db.Uuid - deletedAt DateTime? - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - - @@unique([serviceId, videoCode]) - @@map("videos") -} - -model VideoService { - id String @id @db.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 - endpointDownload String? - creator User @relation("UserVideoServices", fields: [createdBy], references: [id]) - createdBy String @db.Uuid - 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 @db.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") - lang_va_char LangVAChar[] @relation("UserCreatedLangVAChar") - 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") - user_hero_banner HeroBanner[] @relation("UserHeroBanner") - sys_notifications SystemNotification[] @relation("UserCreatorSystemNotifications") - sys_logs SystemLog[] @relation("UserSystemLogs") - @@map("users") -} - -model UserPreference { - id String @id @db.Uuid - user User @relation(fields: [userId], references: [id]) - userId String @unique @db.Uuid - 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? @db.Uuid - hideContries Country[] - favoriteGenres Genre[] @relation("UserFavoriteGenres") - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - @@map("user_preferences") -} - -model UserRole { - id String @id @db.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 @db.Uuid - 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 @db.Uuid - - role UserRole @relation(fields: [roleId], references: [id]) - roleId String @db.Uuid - - assignmentAt DateTime @default(now()) - - @@id([userId, roleId]) - @@map("user_role_assignments") -} - -model UserNotification { - id String @id @db.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 @db.Uuid - isReaded Boolean @default(false) - deletedAt DateTime? - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - @@map("user_notifications") -} - -model UserSession { - id String @id @db.Uuid - isAuthenticated Boolean @default(false) - user User @relation("UserSession", fields: [userId], references: [id]) - userId String @db.Uuid - 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") - - @@index([userId, isAuthenticated, deletedAt]) - @@map("user_sessions") -} - -model UserLog { - id String @id @db.Uuid - title String @db.VarChar(255) - notes String @db.Text - user User @relation("UserLogs", fields: [userId], references: [id]) - userId String @db.Uuid - session UserSession @relation("UserSessionLogs", fields: [sessionId], references: [id]) - sessionId String @db.Uuid - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - @@map("user_logs") -} - -model Collection { - id String @id @db.Uuid - name String @db.VarChar(115) - slug String @db.VarChar(115) - owner User @relation("UserCollections", fields: [ownerId], references: [id]) - ownerId String @db.Uuid - 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 - - media_saved CollectionMedia[] @relation("CollectionMedia") - @@unique([slug, ownerId]) - @@map("collections") -} - -model CollectionMedia { - id String @id @db.Uuid - collection Collection @relation("CollectionMedia", fields: [collectionId], references: [id]) - collectionId String @db.Uuid - media Media @relation("CollectionMedia", fields: [mediaId], references: [id]) - mediaId String @db.Uuid - savedAt DateTime @default(now()) - @@unique([collectionId, mediaId]) -} - -model WatchHistory { - id String @id @db.Uuid - episode Episode @relation("EpisodeWatchHistories", fields: [id], references: [id]) - episodeId String @db.Uuid - user User @relation("UserWatchHistories", fields: [userId], references: [id]) - userId String @db.Uuid - session UserSession @relation("SessionWatchHistories", fields: [sessionId], references: [id]) - sessionId String @db.Uuid - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - @@map("watch_histories") -} - -model MediaReview { - id String @id @db.Uuid - media Media @relation("MediaReviews", fields: [mediaId], references:[id]) - mediaId String @db.Uuid - rating Int - title String @db.VarChar(255) - text String @db.Text - reaction MediaReviewReaction - creator User @relation("UserMediaReviews", fields: [createdBy], references: [id]) - createdBy String @db.Uuid - deletedAt DateTime? - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - @@map("movie_reviews") -} - -model Comment { - id String @id @db.Uuid - episode Episode @relation("EpisodeComments", fields: [episodeId], references: [id]) - episodeId String @db.Uuid - text String @db.Text - isParent Boolean @default(false) - parent Comment? @relation("ParentReplyComments", fields: [parentId], references: [id]) - parentId String? @db.Uuid - user User @relation("UserComments", fields: [userId], references: [id]) - userId String @db.Uuid - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - - replies Comment[] @relation("ParentReplyComments") - likes CommentLike[] @relation("CommentLikes") - @@map("comments") -} - -model CommentLike { - id String @id @db.Uuid - comment Comment @relation("CommentLikes", fields: [commentId], references: [id]) - commentId String @db.Uuid - user User @relation("UserCommentLikes", fields: [userLiked], references: [id]) - userLiked String @db.Uuid - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - @@map("comment_likes") -} - -model CommentReport { - id String @id @db.Uuid - reporter User @relation("UserReportComments", fields: [userReporter], references: [id]) - userReporter String @db.Uuid - commentReported String @db.Uuid - isSupervisorReport Boolean @default(false) - reason ReportReason - status ReportStatus - description String @db.VarChar(255) - approver User? @relation("ApprovedReportComments", fields: [approvedBy], references: [id]) - approvedBy String? @db.Uuid - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - @@map("comment_reports") -} - -model Language { - id String @id @db.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 @db.Uuid - deletedAt DateTime? - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - - user_used UserPreference[] @relation("UserPreferenceLang") - @@map("languages") -} - -model EmailSystemAccount { - id String @id @db.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 @db.Uuid - deletedAt DateTime? - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - @@map("email_system_accounts") -} - -model EmailSystemHistory { - id String @id @db.Uuid - purpose EmailPorpose - fromEmail String @db.Text - toEmail String @db.Text - user User @relation("UserEmails", fields: [userRelated], references: [id]) - userRelated String @db.Uuid - 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 HeroBanner { - id String @id @db.Uuid - orderPriority Int? @unique - mediaId String @db.Uuid - media Media @relation("MediaBannerPromotion", fields: [mediaId], references: [id]) - imageUrl String? @db.Text - startDate DateTime - endDate DateTime - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - creatorId String @db.Uuid - createdBy User @relation("UserHeroBanner", fields: [creatorId], references: [id]) - @@map("hero_banner") -} - -model SystemPreference { - id String @id @db.Uuid - key String @db.VarChar(225) @unique - 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 @db.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 @db.Uuid - deletedAt DateTime? - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - @@map("system_notifications") -} - -model SystemLog { - id String @id @db.Uuid - title String @db.VarChar(255) - notes String @db.Text - user User? @relation("UserSystemLogs", fields: [relatedUser], references: [id]) - relatedUser String? @db.Uuid - 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 -} \ No newline at end of file +generator client { + provider = "prisma-client-js" +} + +generator dbml { + provider = "prisma-dbml-generator" +} + +datasource db { + provider = "postgresql" +} + +model Media { + id String @id @db.Uuid + title String + titleAlternative Json + slug String @unique + malId Int? @unique + pictureMedium String + pictureLarge String + country Country @default(JP) + score Decimal @default(0.00) @db.Decimal(4, 2) + status String + startAiring DateTime? + endAiring DateTime? + synopsis String + ageRating String + mediaType MediaType + source String? + onDraft Boolean @default(true) + season Season? + yearReleased Int @db.SmallInt + uploadedBy String @db.Uuid + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + inCollections CollectionMedia[] @relation("CollectionMedia") + episodes Episode[] @relation("MediaEpisodes") + bannerPromotion HeroBanner[] @relation("MediaBannerPromotion") + logs MediaLog[] @relation("MediaLogs") + uploader User @relation("UserUploadedMedias", fields: [uploadedBy], references: [id]) + reviews MediaReview[] @relation("MediaReviews") + characters Character[] @relation("MediaCharacters") + genres Genre[] @relation("MediaGenres") + studios Studio[] @relation("MediaStudios") + + @@index([status, onDraft, deletedAt]) + @@index([mediaType]) + @@index([uploadedBy]) + @@index([createdAt]) + @@map("medias") +} + +model MediaLog { + id String @id @db.Uuid + status MediaOperation + approval Boolean @default(false) + proposedBy String @db.Uuid + approvedBy String @db.Uuid + mediaId String @db.Uuid + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + approver User @relation("UserApprovedMedias", fields: [approvedBy], references: [id]) + media Media @relation("MediaLogs", fields: [mediaId], references: [id]) + proposer User @relation("UserProposedMedias", fields: [proposedBy], references: [id]) + + @@map("media_logs") +} + +model Genre { + id String @id @db.Uuid + name String @db.VarChar(255) + slug String @unique @db.VarChar(255) + malId Int @unique + malUrl String @db.VarChar(255) + createdBy String @db.Uuid + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + creator User @relation("UserCreatedGenres", fields: [createdBy], references: [id]) + medias Media[] @relation("MediaGenres") + user_favourite_genres UserPreference[] @relation("UserFavoriteGenres") + + @@map("genres") +} + +model Studio { + id String @id @db.Uuid + name String @db.VarChar(255) + slug String @unique @db.VarChar(255) + linkAbout String + malId Int @unique + logoUrl String? + createdBy String @db.Uuid + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + creator User @relation("UserCreatedStudios", fields: [createdBy], references: [id]) + medias Media[] @relation("MediaStudios") + + @@map("studios") +} + +model Character { + id String @id @db.Uuid + malId Int @unique + name String + role CharacterRole + favorites Int @default(0) + imageUrl String? + smallImageUrl String? + creatorId String @db.Uuid + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + createdBy User @relation("UserCreatedCharacters", fields: [creatorId], references: [id]) + voice_actors LangVAChar[] @relation("CharVALanguage") + medias Media[] @relation("MediaCharacters") + + @@map("characters") +} + +model VoiceActor { + id String @id @db.Uuid + malId Int @unique + name String + birthday DateTime? + description String? + aboutUrl String? + imageUrl String? + websiteUrl String? + creatorId String @db.Uuid + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + characters LangVAChar[] @relation("VACharLanguage") + createdBy User @relation("UserCreatedVoiceActors", fields: [creatorId], references: [id]) + + @@map("voice_actors") +} + +model LangVAChar { + id String @id @db.Uuid + language String + vaId String @db.Uuid + charId String @db.Uuid + creatorId String @db.Uuid + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + character Character @relation("CharVALanguage", fields: [charId], references: [id]) + createdBy User @relation("UserCreatedLangVAChar", fields: [creatorId], references: [id]) + voiceActor VoiceActor @relation("VACharLanguage", fields: [vaId], references: [id]) + + @@unique([language, vaId, charId]) + @@map("lang_va_char") +} + +model Episode { + id String @id @db.Uuid + mediaId String @db.Uuid + episode Int + name String @db.VarChar(255) + score Decimal @default(0.00) @db.Decimal(4, 2) + pictureThumbnail String? + viewed BigInt @default(0) + likes BigInt @default(0) + dislikes BigInt @default(0) + pendingUpload Boolean @default(true) + uploadedBy String @db.Uuid + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + comments Comment[] @relation("EpisodeComments") + user_likes EpisodeLike[] @relation("EpisodeLikes") + media Media @relation("MediaEpisodes", fields: [mediaId], references: [id]) + uploader User @relation("UserEpisodes", fields: [uploadedBy], references: [id]) + videos Video[] @relation("EpisodeVideos") + user_histories WatchHistory? @relation("EpisodeWatchHistories") + + @@unique([mediaId, episode]) + @@map("episodes") +} + +model EpisodeLike { + id String @id @db.Uuid + userId String @db.Uuid + sessionId String @db.Uuid + episodeId String @db.Uuid + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + episode Episode @relation("EpisodeLikes", fields: [episodeId], references: [id]) + session UserSession @relation("SessionEpisodeLikes", fields: [sessionId], references: [id]) + user User @relation("UserEpisodeLikes", fields: [userId], references: [id]) + + @@map("episode_likes") +} + +model Video { + id String @id @db.Uuid + episodeId String @db.Uuid + serviceId String @db.Uuid + videoCode String @db.VarChar(255) + thumbnailCode String? + pendingUpload Boolean @default(true) + uploadedBy String @db.Uuid + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + episode Episode @relation("EpisodeVideos", fields: [episodeId], references: [id]) + service VideoService @relation("VideoServices", fields: [serviceId], references: [id]) + uploader User @relation("UserVideos", fields: [uploadedBy], references: [id]) + + @@unique([serviceId, videoCode]) + @@map("videos") +} + +model VideoService { + id String @id @db.Uuid + name String @unique @db.VarChar(255) + domain String @db.VarChar(255) + logo String? + hexColor String @db.VarChar(10) + endpointVideo String + endpointThumbnail String? + endpointDownload String? + createdBy String @db.Uuid + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + user_preferences UserPreference[] @relation("UserServiceDefault") + creator User @relation("UserVideoServices", fields: [createdBy], references: [id]) + videos Video[] @relation("VideoServices") + + @@map("video_services") +} + +model User { + id String @id @db.Uuid + name String @db.VarChar(255) + username String @unique @db.VarChar(255) + email String @unique + password String + birthDate DateTime? @db.Date + gender UserGender? + phoneCC Int? + phoneNumber Int? + bioProfile String? + avatar String? + commentBackground String? + provider String? @db.VarChar(255) + providerId String? @unique @db.VarChar(255) + providerToken String? + providerPayload Json? @db.Json + verifiedAt DateTime? + disabledAt DateTime? + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + characters Character[] @relation("UserCreatedCharacters") + collections Collection[] @relation("UserCollections") + liked_comments CommentLike[] @relation("UserCommentLikes") + approved_comments CommentReport[] @relation("ApprovedReportComments") + reported_comments CommentReport[] @relation("UserReportComments") + comments Comment[] @relation("UserComments") + user_create_email EmailSystemAccount[] @relation("UserCreateSystemAccount") + user_emails EmailSystemHistory[] @relation("UserEmails") + episode_likes EpisodeLike[] @relation("UserEpisodeLikes") + episodes Episode[] @relation("UserEpisodes") + genres Genre[] @relation("UserCreatedGenres") + user_hero_banner HeroBanner[] @relation("UserHeroBanner") + lang_va_char LangVAChar[] @relation("UserCreatedLangVAChar") + create_languages Language[] @relation("UserCreateLanguages") + media_approveds MediaLog[] @relation("UserApprovedMedias") + media_proposeds MediaLog[] @relation("UserProposedMedias") + medias Media[] @relation("UserUploadedMedias") + media_reviews MediaReview[] @relation("UserMediaReviews") + studios Studio[] @relation("UserCreatedStudios") + sys_logs SystemLog[] @relation("UserSystemLogs") + sys_notifications SystemNotification[] @relation("UserCreatorSystemNotifications") + logs UserLog[] @relation("UserLogs") + notifications UserNotification[] @relation("UserNotifications") + preference UserPreference? + assignedRoles UserRoleAssignment[] + create_roles UserRole[] @relation("UserCreateRoles") + sessions UserSession[] @relation("UserSession") + video_services VideoService[] @relation("UserVideoServices") + videos Video[] @relation("UserVideos") + voice_actor VoiceActor[] @relation("UserCreatedVoiceActors") + watch_histories WatchHistory[] @relation("UserWatchHistories") + allowed_collections Collection[] @relation("UserSelectedSharingCollention") + + @@map("users") +} + +model UserPreference { + id String @id @db.Uuid + userId String @unique @db.Uuid + langPreference String? + adultFiltering AdultFiltering @default(hide) + adultAlert AdultAlert @default(show) + videoQuality VideoQuality @default(Q1080) + serviceDefaultId String? @db.Uuid + hideContries Country[] + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + lang Language? @relation("UserPreferenceLang", fields: [langPreference], references: [code]) + serviceDefault VideoService? @relation("UserServiceDefault", fields: [serviceDefaultId], references: [id]) + user User @relation(fields: [userId], references: [id]) + favoriteGenres Genre[] @relation("UserFavoriteGenres") + + @@map("user_preferences") +} + +model UserRole { + id String @id @db.Uuid + name String @unique @db.VarChar(255) + description String? + primaryColor String? @db.VarChar(10) + secondaryColor String? @db.VarChar(10) + pictureImage String? + badgeImage String? + 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) + createdBy String @db.Uuid + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + assignedUser UserRoleAssignment[] + creator User @relation("UserCreateRoles", fields: [createdBy], references: [id]) + + @@map("user_roles") +} + +model UserRoleAssignment { + userId String @db.Uuid + roleId String @db.Uuid + assignmentAt DateTime @default(now()) + role UserRole @relation(fields: [roleId], references: [id]) + user User @relation(fields: [userId], references: [id]) + + @@id([userId, roleId]) + @@map("user_role_assignments") +} + +model UserNotification { + id String @id @db.Uuid + title String @db.VarChar(255) + content String + picture String + state UserNotificationState + ctaLink String + userId String @db.Uuid + isReaded Boolean @default(false) + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + user User @relation("UserNotifications", fields: [userId], references: [id]) + + @@map("user_notifications") +} + +model UserSession { + id String @id @db.Uuid + isAuthenticated Boolean @default(false) + userId String @db.Uuid + 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 + episode_likes EpisodeLike[] @relation("SessionEpisodeLikes") + logs UserLog[] @relation("UserSessionLogs") + user User @relation("UserSession", fields: [userId], references: [id]) + watch_histories WatchHistory[] @relation("SessionWatchHistories") + + @@index([userId, isAuthenticated, deletedAt]) + @@map("user_sessions") +} + +model UserLog { + id String @id @db.Uuid + title String @db.VarChar(255) + notes String + userId String @db.Uuid + sessionId String @db.Uuid + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + session UserSession @relation("UserSessionLogs", fields: [sessionId], references: [id]) + user User @relation("UserLogs", fields: [userId], references: [id]) + + @@map("user_logs") +} + +model Collection { + id String @id @db.Uuid + name String @db.VarChar(115) + ownerId String @db.Uuid + accessStatus AccessStatus @default(private) + password String? @db.VarChar(255) + accessScope AccessScope @default(viewer) + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + slug String @db.VarChar(115) + media_saved CollectionMedia[] @relation("CollectionMedia") + owner User @relation("UserCollections", fields: [ownerId], references: [id]) + usersAllowed User[] @relation("UserSelectedSharingCollention") + + @@unique([slug, ownerId]) + @@map("collections") +} + +model CollectionMedia { + id String @id @db.Uuid + collectionId String @db.Uuid + mediaId String @db.Uuid + savedAt DateTime @default(now()) + collection Collection @relation("CollectionMedia", fields: [collectionId], references: [id]) + media Media @relation("CollectionMedia", fields: [mediaId], references: [id]) + + @@unique([collectionId, mediaId]) +} + +model WatchHistory { + id String @id @db.Uuid + episodeId String @db.Uuid + userId String @db.Uuid + sessionId String @db.Uuid + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + episode Episode @relation("EpisodeWatchHistories", fields: [id], references: [id]) + session UserSession @relation("SessionWatchHistories", fields: [sessionId], references: [id]) + user User @relation("UserWatchHistories", fields: [userId], references: [id]) + + @@map("watch_histories") +} + +model MediaReview { + id String @id @db.Uuid + mediaId String @db.Uuid + rating Int + title String @db.VarChar(255) + text String + reaction MediaReviewReaction + createdBy String @db.Uuid + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + creator User @relation("UserMediaReviews", fields: [createdBy], references: [id]) + media Media @relation("MediaReviews", fields: [mediaId], references: [id]) + + @@map("movie_reviews") +} + +model Comment { + id String @id @db.Uuid + episodeId String @db.Uuid + text String + isParent Boolean @default(false) + parentId String? @db.Uuid + userId String @db.Uuid + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + likes CommentLike[] @relation("CommentLikes") + episode Episode @relation("EpisodeComments", fields: [episodeId], references: [id]) + parent Comment? @relation("ParentReplyComments", fields: [parentId], references: [id]) + replies Comment[] @relation("ParentReplyComments") + user User @relation("UserComments", fields: [userId], references: [id]) + + @@map("comments") +} + +model CommentLike { + id String @id @db.Uuid + commentId String @db.Uuid + userLiked String @db.Uuid + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + comment Comment @relation("CommentLikes", fields: [commentId], references: [id]) + user User @relation("UserCommentLikes", fields: [userLiked], references: [id]) + + @@map("comment_likes") +} + +model CommentReport { + id String @id @db.Uuid + userReporter String @db.Uuid + commentReported String @db.Uuid + isSupervisorReport Boolean @default(false) + reason ReportReason + status ReportStatus + description String @db.VarChar(255) + approvedBy String? @db.Uuid + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + approver User? @relation("ApprovedReportComments", fields: [approvedBy], references: [id]) + reporter User @relation("UserReportComments", fields: [userReporter], references: [id]) + + @@map("comment_reports") +} + +model Language { + id String @id @db.Uuid + name String @db.VarChar(255) + code String @unique @db.VarChar(5) + countryFlag String @db.VarChar(10) + fileLocation String + craetedBy String @db.Uuid + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + creator User @relation("UserCreateLanguages", fields: [craetedBy], references: [id]) + user_used UserPreference[] @relation("UserPreferenceLang") + + @@map("languages") +} + +model EmailSystemAccount { + id String @id @db.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 + createdBy String @db.Uuid + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + creator User @relation("UserCreateSystemAccount", fields: [createdBy], references: [id]) + + @@map("email_system_accounts") +} + +model EmailSystemHistory { + id String @id @db.Uuid + purpose EmailPorpose + fromEmail String + toEmail String + userRelated String @db.Uuid + title String @db.VarChar(255) + htmlContent String + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + user User @relation("UserEmails", fields: [userRelated], references: [id]) + + @@map("email_system_histories") +} + +model HeroBanner { + id String @id @db.Uuid + orderPriority Int? @unique + imageUrl String? + startDate DateTime + endDate DateTime + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + creatorId String @db.Uuid + mediaId String @db.Uuid + createdBy User @relation("UserHeroBanner", fields: [creatorId], references: [id]) + media Media @relation("MediaBannerPromotion", fields: [mediaId], references: [id]) + + @@map("hero_banner") +} + +model SystemPreference { + id String @id @db.Uuid + key String @unique @db.VarChar(225) + value String @db.VarChar(225) + description String + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + + @@map("system_preferences") +} + +model SystemNotification { + id String @id @db.Uuid + type TypeSystemNotification + componentName String? @db.VarChar(255) + popupImage String? + titleToast String? @db.VarChar(255) + contentToast String? + createdBy String @db.Uuid + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + creator User @relation("UserCreatorSystemNotifications", fields: [createdBy], references: [id]) + + @@map("system_notifications") +} + +model SystemLog { + id String @id @db.Uuid + title String @db.VarChar(255) + notes String + relatedUser String? @db.Uuid + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + user User? @relation("UserSystemLogs", fields: [relatedUser], references: [id]) + + @@map("system_logs") +} + +enum MediaType { + TV + ONA + OVA + Movie + Special + Music +} + +enum Country { + JP @map("Japanese") + EN @map("English") + ID @map("Indonesia") + KR @map("Korea") +} + +enum Season { + winter + spring + summer + fall +} + +enum CharacterRole { + Main + Supporting +} + +enum MediaOperation { + create + update + delete +} + +enum UserGender { + male + female +} + +enum AdultFiltering { + hide + show + explicit +} + +enum AdultAlert { + hide + show +} + +enum VideoQuality { + Q2160 + Q1440 + Q1080 + Q720 + Q480 + Q360 + Q240 + Q144 +} + +enum UserNotificationState { + info + warning + danger +} + +enum ReportStatus { + pending + resolved + rejected +} + +enum ReportReason { + sexualize + violent + explicit + hateful + political + racist + spam + other +} + +enum AccessStatus { + private + selected + protected + public +} + +enum AccessScope { + viewer + editor +} + +enum MediaReviewReaction { + angry + sad + awesome + happy + sleepy + annoyed + disgusting + disappointed +} + +enum EmailPorpose { + forgot_password + account_activation + account_notification + subscribtion +} + +enum TypeSystemNotification { + component + popup + toast +}