From d6629a72eb0442a9e24b566ed3f6a431aa8d4bfb Mon Sep 17 00:00:00 2001 From: Polaris Date: Tue, 20 Aug 2024 16:49:01 -0400 Subject: [PATCH] added chunithm version selector in admin settings --- .../(admin components)/extraction/page.tsx | 6 +- .../gameversions/actions.ts | 68 ++++++++ .../gameversions/gameSelection.tsx | 162 ++++++++++++++++++ .../(admin components)/gameversions/page.tsx | 28 +++ .../admin/(admin components)/home/page.tsx | 16 +- .../home/{home.tsx => unlock.tsx} | 4 +- .../admin/(admin components)/unlock/page.tsx | 6 +- app/(authenticated)/chunithm/page.tsx | 12 +- auth/queries/getauth.ts | 8 +- bun.lockb | Bin 357622 -> 357910 bytes .../avatarcustomization/actions.ts | 5 +- .../avatarcustomization/page.tsx | 35 ++-- .../mapiconcustomization/actions.ts | 4 +- .../mapiconcustomization/page.tsx | 10 +- .../nameplatecustomization/actions.ts | 4 +- .../nameplatecustomization/page.tsx | 6 +- .../systemvoicecustomization/actions.ts | 6 +- .../systemvoicecustomization/page.tsx | 2 +- .../trophycustomization/actions.ts | 4 +- .../trophycustomization/page.tsx | 6 +- components/navigationbar/adminnavigation.tsx | 1 + components/userRatingBaseHotList/action.ts | 3 +- components/userRatingBaseList/action.ts | 3 +- global.d.ts | 9 + lib/api.ts | 54 ++++++ lib/helpers.ts | 10 +- lib/prisma.ts | 46 +++-- package.json | 3 +- .../schemas/daphnis/generated/daphnis/edge.js | 17 +- .../generated/daphnis/index-browser.js | 10 ++ .../daphnis/generated/daphnis/index.d.ts | 102 ++++++++++- .../daphnis/generated/daphnis/index.js | 17 +- .../daphnis/generated/daphnis/package.json | 2 +- .../daphnis/generated/daphnis/schema.prisma | 20 ++- .../schemas/daphnis/generated/daphnis/wasm.js | 10 ++ .../migrations/20240820170604_/migration.sql | 2 + prisma/schemas/daphnis/schema.prisma | 20 ++- 37 files changed, 614 insertions(+), 107 deletions(-) create mode 100644 app/(authenticated)/(admin)/admin/(admin components)/gameversions/actions.ts create mode 100644 app/(authenticated)/(admin)/admin/(admin components)/gameversions/gameSelection.tsx create mode 100644 app/(authenticated)/(admin)/admin/(admin components)/gameversions/page.tsx rename app/(authenticated)/(admin)/admin/(admin components)/home/{home.tsx => unlock.tsx} (94%) create mode 100644 global.d.ts create mode 100644 prisma/schemas/daphnis/migrations/20240820170604_/migration.sql diff --git a/app/(authenticated)/(admin)/admin/(admin components)/extraction/page.tsx b/app/(authenticated)/(admin)/admin/(admin components)/extraction/page.tsx index 26ad08b..1a0bea7 100644 --- a/app/(authenticated)/(admin)/admin/(admin components)/extraction/page.tsx +++ b/app/(authenticated)/(admin)/admin/(admin components)/extraction/page.tsx @@ -1,10 +1,6 @@ import ExtractData from "./extraction"; const FileExtractionPage = async () => { - return ( -
- -
- ); + return ; }; export default FileExtractionPage; diff --git a/app/(authenticated)/(admin)/admin/(admin components)/gameversions/actions.ts b/app/(authenticated)/(admin)/admin/(admin components)/gameversions/actions.ts new file mode 100644 index 0000000..bede1ee --- /dev/null +++ b/app/(authenticated)/(admin)/admin/(admin components)/gameversions/actions.ts @@ -0,0 +1,68 @@ +"use server"; + +import { getAuth } from "@/auth/queries/getauth"; +import { daphnis } from "@/lib/prisma"; +import { GameVersion } from "@/prisma/schemas/daphnis/generated/daphnis"; + +export async function getCurrentGame() { + const { user } = await getAuth(); + + if (!user || !user.accessCode) { + throw new Error("User is not authenticated or accessCode is missing"); + } + + const currentGameVersion = await daphnis.user.findMany({ + where: { + UserId: user.UserId, + }, + select: { + gameVersion: true, + }, + }); + return currentGameVersion; +} +export async function updatePlayerGameVersionChuni(gameVersion?: GameVersion) { + const { user } = await getAuth(); + + if (!user || !user.accessCode) { + throw new Error("User is not authenticated or accessCode is missing"); + } + + if (gameVersion === undefined) { + throw new Error("gameVersion is required"); + } + + try { + const updatedUser = await daphnis.user.update({ + where: { + UserId: user.UserId, + }, + data: { + gameVersion, + }, + select: { + gameVersion: true, + }, + }); + + return { gameVersion: updatedUser.gameVersion }; + } catch (error) { + console.error("Error updating game version:", error); + throw error; + } +} + +export async function getAllGameVersionsChuni() { + const { user } = await getAuth(); + + if (!user || !user.accessCode) { + throw new Error("User is not authenticated or accessCode is missing"); + } + + const AllGameVersions = await daphnis.user.findMany({ + select: { + gameVersion: true, + }, + }); + return AllGameVersions; +} diff --git a/app/(authenticated)/(admin)/admin/(admin components)/gameversions/gameSelection.tsx b/app/(authenticated)/(admin)/admin/(admin components)/gameversions/gameSelection.tsx new file mode 100644 index 0000000..d5e8ab6 --- /dev/null +++ b/app/(authenticated)/(admin)/admin/(admin components)/gameversions/gameSelection.tsx @@ -0,0 +1,162 @@ +"use client"; + +import React, { FC, useState } from "react"; +import { Check, ChevronsUpDown } from "lucide-react"; +import { cn } from "@/lib/utils"; +import { Button } from "@/components/ui/button"; +import { + Command, + CommandEmpty, + CommandGroup, + CommandItem, + CommandList, +} from "@/components/ui/command"; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { toast } from "@/components/ui/use-toast"; +import { z } from "zod"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { GameVersion, User } from "@/prisma/schemas/daphnis/generated/daphnis"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover"; +import { updatePlayerGameVersionChuni } from "./actions"; + +type ChunithmGameVersionSelectionProps = { + chunithmGameVersionNumber: { + gameVersions: { gameVersion: GameVersion }[]; + }; +}; +export function ChunithmGameVersionSelection({ + chunithmGameVersionNumber, +}: ChunithmGameVersionSelectionProps) { + const FormSchema = z.object({ + mapIconId: z.string({ + required_error: "Please select a Game Version.", + }), + }); + const form = useForm>({ + resolver: zodResolver(FormSchema), + }); + + const [selectedGameVersion, setSelectedGameVersion] = useState< + string | undefined + >(Object.values(GameVersion)[0]); + function onSubmit(data: z.infer) { + const newGameVersion = data.mapIconId ?? selectedGameVersion; + + // console.log("Submitted Game Version:", newGameVersion); + + updatePlayerGameVersionChuni(newGameVersion as GameVersion) + .then((result) => { + toast({ + title: "Game version updated successfully!", + description: ( +
+              
+                {JSON.stringify(result, null, 2)}
+              
+            
+ ), + }); + + setSelectedGameVersion(newGameVersion); + + form.reset({ + mapIconId: undefined, + }); + }) + .catch((error) => { + toast({ + title: "Error updating game version", + description: ( +
+              {error.message}
+            
+ ), + variant: "destructive", + }); + }); + } + + return ( +
+
+ + ( + + Chunithm + + + + + + + + + + No game version found. + + {Object.values(GameVersion).map((version) => ( + { + form.setValue("mapIconId", version); + setSelectedGameVersion(version); + }} + > + + {version} + + ))} + + + + + + + + + )} + /> + +
+ +
+ + +
+ ); +} diff --git a/app/(authenticated)/(admin)/admin/(admin components)/gameversions/page.tsx b/app/(authenticated)/(admin)/admin/(admin components)/gameversions/page.tsx new file mode 100644 index 0000000..4f323ce --- /dev/null +++ b/app/(authenticated)/(admin)/admin/(admin components)/gameversions/page.tsx @@ -0,0 +1,28 @@ +"use server"; +//https://github.com/vercel/next.js/discussions/63862 +import React from "react"; +import { Card, CardHeader, CardTitle } from "@/components/ui/card"; +import { ChunithmGameVersionSelection } from "./gameSelection"; +import { getAllGameVersionsChuni } from "./actions"; + +const getAllGamesChunithm = async () => { + const gameVersions = await getAllGameVersionsChuni(); + return { gameVersions }; +}; + +const Page = async () => { + const AllChunithmVersions = await getAllGamesChunithm(); + + return ( + + + Update Game Versions + + + + ); +}; + +export default Page; diff --git a/app/(authenticated)/(admin)/admin/(admin components)/home/page.tsx b/app/(authenticated)/(admin)/admin/(admin components)/home/page.tsx index e0d10c0..d4b26e6 100644 --- a/app/(authenticated)/(admin)/admin/(admin components)/home/page.tsx +++ b/app/(authenticated)/(admin)/admin/(admin components)/home/page.tsx @@ -1,14 +1,6 @@ -import { getAuth } from "@/auth/queries/getauth"; -import AdminHome from "./home"; +import UnlockUser from "./unlock"; -const ProtectedDashboardPage = async () => { - const { user } = await getAuth(); - - return ( -
- -
- ); +const FileExtractionPage = async () => { + return ; }; - -export default ProtectedDashboardPage; +export default FileExtractionPage; diff --git a/app/(authenticated)/(admin)/admin/(admin components)/home/home.tsx b/app/(authenticated)/(admin)/admin/(admin components)/home/unlock.tsx similarity index 94% rename from app/(authenticated)/(admin)/admin/(admin components)/home/home.tsx rename to app/(authenticated)/(admin)/admin/(admin components)/home/unlock.tsx index 0142201..c68bf03 100644 --- a/app/(authenticated)/(admin)/admin/(admin components)/home/home.tsx +++ b/app/(authenticated)/(admin)/admin/(admin components)/home/unlock.tsx @@ -4,7 +4,7 @@ import { Input } from "@/components/ui/input"; import { Label } from "@radix-ui/react-dropdown-menu"; import React from "react"; -const AdminHome = () => { +const UnlockUser = () => { return ( @@ -31,4 +31,4 @@ const AdminHome = () => { ); }; -export default AdminHome; +export default UnlockUser; diff --git a/app/(authenticated)/(admin)/admin/(admin components)/unlock/page.tsx b/app/(authenticated)/(admin)/admin/(admin components)/unlock/page.tsx index 4b8bc6e..d4b26e6 100644 --- a/app/(authenticated)/(admin)/admin/(admin components)/unlock/page.tsx +++ b/app/(authenticated)/(admin)/admin/(admin components)/unlock/page.tsx @@ -1,10 +1,6 @@ import UnlockUser from "./unlock"; const FileExtractionPage = async () => { - return ( -
- -
- ); + return ; }; export default FileExtractionPage; diff --git a/app/(authenticated)/chunithm/page.tsx b/app/(authenticated)/chunithm/page.tsx index d4fa667..b873eae 100644 --- a/app/(authenticated)/chunithm/page.tsx +++ b/app/(authenticated)/chunithm/page.tsx @@ -89,16 +89,19 @@ const Page = async () => { const HotChuniPlays = await getChuniHotPlays(); return ( -
+
Scores Customize Top Plays Hot Plays - Patcher + Settings + + Patcher + - + @@ -140,6 +143,9 @@ const Page = async () => { + + +
); diff --git a/auth/queries/getauth.ts b/auth/queries/getauth.ts index 328f50a..057e0ae 100644 --- a/auth/queries/getauth.ts +++ b/auth/queries/getauth.ts @@ -1,8 +1,8 @@ -import { cookies } from "next/headers"; import { cache } from "react"; import type { Session, User } from "lucia"; import { lucia } from "@/lib/lucia"; +import { cookies } from "next/dist/client/components/headers"; export const getAuth = cache( async (): Promise< @@ -24,7 +24,7 @@ export const getAuth = cache( cookies().set( sessionCookie.name, sessionCookie.value, - sessionCookie.attributes + sessionCookie.attributes, ); } if (!result.session) { @@ -32,10 +32,10 @@ export const getAuth = cache( cookies().set( sessionCookie.name, sessionCookie.value, - sessionCookie.attributes + sessionCookie.attributes, ); } } catch {} return result; - } + }, ); diff --git a/bun.lockb b/bun.lockb index f153e0a0be4c95fd02bb487cebf1288436dc67f5..3b4c2420a3c068aa7bbdf78084e8fa3639f9b748 100755 GIT binary patch delta 59315 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 L9nMI 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¿x-GRxj0I8h+2o0VXjC*16;A~-<+F^TVpE(np=v@A6q2m6rdl_sXXvKXch9MylB2xLn9Ij%S!p@wi zX1ENBHiLu_gg+Jo>6ZUV4Z14+xXf{xv`=`@NqnC5wogW9GvQ5`-v5RP@8T zRdIY39+dHk>6yu*E0$fVLUL(KcR)hel3x6C!I2aT0M;=Oi z7Xe9Vf}+5FiUQNjwo(+blFMz8t_UrVVP9slu2f51`$=_a);p5RUqZn;gvb>WQ)gAg zs^lDeV8une4zIu|YQV#YE?rMi?Im|yU>)0Da?>5aA8u)n*q9?}<-AvSY3hV|U-%Ex zY1!=#po3p4rIUa_`R(oY(l@3(D8XRP%~f}GK)1p|+^=T$kHJh$h7B$50FNeyG+G~$ z-zHE1sX-)Eh2QPf-K#=9Baztb!{39FV)1J;_ab5aVn|(%M2$L1ZOShg@n?nb6)hMU zNEcb%h@6}nB!n+H{bc9gO*$dn8%zB=!TC?aPczp6(YLD{&vⅆk5AR02jB(7ueG3 zPDl&Z*ivpM=-iL!z(VZ|k5l!Q26XWg9S}JAH4R>Lo}Ncuoz-xw``MO0=q$P0=Aw54 z^p>@W6{v%~P=xh>H7>-j2eZKItKYaMFJ|gxj12ap;9MhUfU(8Vv(8ANti*d*^(G|7 za*E>kNqWC`#}>-y$+gy&biORV)rm~%mCRAclOiW8Ns&{a^^7Rv4XvEJM|kPt;$t6~ z1S0S&A{7yOU5+Oe9@{<-QC1mYu9Wl0I)xQTZelVnmWUv4`XoU_Dy?74xj-O8(|v z_Z2RQSIasm8>i4g{N=aJ(GU)IwPflk)e9^IpP1x(F5f&mxXPR@Lh?`zD^>wY6{)CR z=@VMi6T;`t$uu2*^nexWZ5h0>^UnUM{}sFk$CubsVNduW?vI>s`zoXt)MSltM?Ef% zYwTePf`0ypA?z>&cSmmWLi#YivE}lk6(4k(a>13adVJZDx#FnK+tbcoh!z(8ha4_$ z*wg)9SWp+)Q~lmj16`>-we0KmCjrr+SrwcRI#JKOig!j65KYIJh-tn>NhwtH?B^W)1^ypV@$`5;= z*we@Tr7&Gd9a`02st@iQ>MyzCaT|~1rHwiI7o*27?UmKQc^%%XqxWRT=$bDan&oWA zJJa+1!7=ZKk7{vlNhoihH}~t*E=g&d*W#UFGdwsWetFZ8bAG}*i;SV&-Wu}W7ne4k z!aFnHKl1OaiVR3`>WC2j2HwA`KlP^uBhTs^=7rLi171e!&;TjCUJ0@VhQ^ejfTP+m zHJ`6wKS79p1Cp{E#z;r?ROLgdO^qRm0}}=(dL|4{`e^vD?7kmLiDB8lWlGDZ(df&P Zs~$#4KKrGH*@v6hc { if (id === undefined) return ""; return `avatarAccessory/CHU_UI_Avatar_Tex_0${id}.png`; -} +}; type AvatarSelectionProps = { avatarHeadSelectionData: { @@ -116,18 +115,18 @@ export const AvatarCustomization: FC = ({ }, []); function onSubmit(data: z.infer) { // Existing state - const unchangedHeadId = avatarHeadId; - const unchangedFaceId = avatarFaceId; - const unchangedBackId = avatarBackId; - const unchangedWearId = avatarWearId; - const unchangedItemId = avatarItemId; + const defaultHeadId = avatarHeadId; + const defaultFaceId = avatarFaceId; + const defaultBackId = avatarBackId; + const defaultWearId = avatarWearId; + const defaultItemId = avatarItemId; - // either change to the new body part id or fallback to the unchanged if nothing has changed - const newHeadId = data.AvatarHeadAccessory ?? unchangedHeadId; - const newFaceId = data.AvatarFaceAccessory ?? unchangedFaceId; - const newBackId = data.AvatarBackAccessory ?? unchangedBackId; - const newWearId = data.AvatarWearAccessory ?? unchangedWearId; - const newItemId = data.AvatarItemAccessory ?? unchangedItemId; + // either change to the new body part id or fallback to the default if nothing has changed + const newHeadId = data.AvatarHeadAccessory ?? defaultHeadId; + const newFaceId = data.AvatarFaceAccessory ?? defaultFaceId; + const newBackId = data.AvatarBackAccessory ?? defaultBackId; + const newWearId = data.AvatarWearAccessory ?? defaultWearId; + const newItemId = data.AvatarItemAccessory ?? defaultItemId; updateAvatarParts(newHeadId, newFaceId, newBackId, newWearId, newItemId) .then(() => { @@ -265,7 +264,7 @@ export const AvatarCustomization: FC = ({ name="AvatarHeadAccessory" render={({ field }) => ( - Avatar Head Item + Avatar Head Item @@ -330,7 +329,7 @@ export const AvatarCustomization: FC = ({ name="AvatarFaceAccessory" render={({ field }) => ( - Avatar Face Item + Avatar Face Item @@ -395,7 +394,7 @@ export const AvatarCustomization: FC = ({ name="AvatarItemAccessory" render={({ field }) => ( - Avatar Hand Item + Avatar Hand Item @@ -460,7 +459,7 @@ export const AvatarCustomization: FC = ({ name="AvatarBackAccessory" render={({ field }) => ( - Avatar Back Item + Avatar Back Item @@ -525,7 +524,7 @@ export const AvatarCustomization: FC = ({ name="AvatarWearAccessory" render={({ field }) => ( - Avatar Clothing Item + Avatar Clothing Item diff --git a/components/(customization)/mapiconcustomization/actions.ts b/components/(customization)/mapiconcustomization/actions.ts index d62d03f..4a10439 100644 --- a/components/(customization)/mapiconcustomization/actions.ts +++ b/components/(customization)/mapiconcustomization/actions.ts @@ -1,11 +1,12 @@ "use server"; import { getAuth } from "@/auth/queries/getauth"; -import { supportedVersionNumber } from "@/lib/helpers"; +import { getSupportedVersionNumber } from "@/lib/api"; import { artemis } from "@/lib/prisma"; export async function getCurrentMapIcon() { const { user } = await getAuth(); + const supportedVersionNumber = await getSupportedVersionNumber(); if (!user || !user.accessCode) { throw new Error("User is not authenticated or accessCode is missing"); @@ -25,6 +26,7 @@ export async function getCurrentMapIcon() { export async function updatePlayerMapIcon(mapIconId?: number) { const { user } = await getAuth(); + const supportedVersionNumber = await getSupportedVersionNumber(); if (!user || !user.accessCode) { throw new Error("User is not authenticated or accessCode is missing"); diff --git a/components/(customization)/mapiconcustomization/page.tsx b/components/(customization)/mapiconcustomization/page.tsx index e685e7e..d65f7b7 100644 --- a/components/(customization)/mapiconcustomization/page.tsx +++ b/components/(customization)/mapiconcustomization/page.tsx @@ -108,7 +108,7 @@ export const MapIconCustomization: FC = ({ mapIconId: { src: mapIconId ? getTexture( - form.watch("mapIconId"), + mapIconId, // Use mapIconId directly `mapIcon/CHU_UI_MapIcon_${mapIconId.toString().padStart(8, "0")}.png`, ) : `systemVoiceThumbnails/CHU_UI_SystemVoice_Default.png`, @@ -121,7 +121,11 @@ export const MapIconCustomization: FC = ({
{Object.entries(MapIconTextures).map(([key, { src }]) => (
- {""} + {mapIconId{" "}
))}
@@ -133,7 +137,7 @@ export const MapIconCustomization: FC = ({ name="mapIconId" render={({ field }) => ( - Select Map Icon + Select Map Icon diff --git a/components/(customization)/nameplatecustomization/actions.ts b/components/(customization)/nameplatecustomization/actions.ts index 7b9c6d9..f365022 100644 --- a/components/(customization)/nameplatecustomization/actions.ts +++ b/components/(customization)/nameplatecustomization/actions.ts @@ -1,11 +1,12 @@ "use server"; import { getAuth } from "@/auth/queries/getauth"; -import { supportedVersionNumber } from "@/lib/helpers"; +import { getSupportedVersionNumber } from "@/lib/api"; import { artemis } from "@/lib/prisma"; export async function getCurrentNameplate() { const { user } = await getAuth(); + const supportedVersionNumber = await getSupportedVersionNumber(); if (!user || !user.accessCode) { throw new Error("User is not authenticated or accessCode is missing"); @@ -25,6 +26,7 @@ export async function getCurrentNameplate() { export async function updatePlayerNamePlate(nameplateId?: number) { const { user } = await getAuth(); + const supportedVersionNumber = await getSupportedVersionNumber(); if (!user || !user.accessCode) { throw new Error("User is not authenticated or accessCode is missing"); diff --git a/components/(customization)/nameplatecustomization/page.tsx b/components/(customization)/nameplatecustomization/page.tsx index 7efba6d..fc6306e 100644 --- a/components/(customization)/nameplatecustomization/page.tsx +++ b/components/(customization)/nameplatecustomization/page.tsx @@ -77,8 +77,8 @@ export const NameplateCustomization: FC = ({ }, []); function onSubmit(data: z.infer) { - const unchangedNamePlateId = nameplateId; - const newNamePlateId = data.nameplateId ?? unchangedNamePlateId; + const defaultNamePlateId = nameplateId; + const newNamePlateId = data.nameplateId ?? defaultNamePlateId; updatePlayerNamePlate(newNamePlateId).then(() => { setNameplateId(newNamePlateId); @@ -136,7 +136,7 @@ export const NameplateCustomization: FC = ({ name="nameplateId" render={({ field }) => ( - Select Nameplate + Select Nameplate diff --git a/components/(customization)/systemvoicecustomization/actions.ts b/components/(customization)/systemvoicecustomization/actions.ts index 2d8e42f..823d255 100644 --- a/components/(customization)/systemvoicecustomization/actions.ts +++ b/components/(customization)/systemvoicecustomization/actions.ts @@ -1,11 +1,12 @@ "use server"; import { getAuth } from "@/auth/queries/getauth"; -import { supportedVersionNumber } from "@/lib/helpers"; +import { getSupportedVersionNumber } from "@/lib/api"; import { artemis } from "@/lib/prisma"; export async function getCurrentSystemVoice() { const { user } = await getAuth(); + const supportedVersionNumber = await getSupportedVersionNumber(); if (!user || !user.accessCode) { throw new Error("User is not authenticated or accessCode is missing"); @@ -25,6 +26,7 @@ export async function getCurrentSystemVoice() { export async function updatePlayerSystemVoiceId(voiceId: number) { const { user } = await getAuth(); + const supportedVersionNumber = await getSupportedVersionNumber(); if (!user || !user.accessCode) { throw new Error("User is not authenticated or accessCode is missing"); @@ -63,7 +65,7 @@ export async function updatePlayerSystemVoiceId(voiceId: number) { console.log(updatePlayerNameplate); - return updatePlayerNameplate; + return unlockedSystemVoices; } catch (error) { console.error("Error updating nameplate:", error); throw error; diff --git a/components/(customization)/systemvoicecustomization/page.tsx b/components/(customization)/systemvoicecustomization/page.tsx index b7f5c04..b1b6b04 100644 --- a/components/(customization)/systemvoicecustomization/page.tsx +++ b/components/(customization)/systemvoicecustomization/page.tsx @@ -143,7 +143,7 @@ export const SystemVoiceCustomization: FC = ({ name="PlayerSystemVoice" render={({ field }) => ( - Select System Voice + Select System Voice diff --git a/components/(customization)/trophycustomization/actions.ts b/components/(customization)/trophycustomization/actions.ts index 9747c85..d303a69 100644 --- a/components/(customization)/trophycustomization/actions.ts +++ b/components/(customization)/trophycustomization/actions.ts @@ -1,11 +1,12 @@ "use server"; import { getAuth } from "@/auth/queries/getauth"; -import { supportedVersionNumber } from "@/lib/helpers"; +import { getSupportedVersionNumber } from "@/lib/api"; import { artemis } from "@/lib/prisma"; export async function getCurrentTrophies() { const { user } = await getAuth(); + const supportedVersionNumber = await getSupportedVersionNumber(); if (!user || !user.accessCode) { throw new Error("User is not authenticated or accessCode is missing"); @@ -25,6 +26,7 @@ export async function getCurrentTrophies() { export async function updatePlayerTrophy(trophyId: number) { const { user } = await getAuth(); + const supportedVersionNumber = await getSupportedVersionNumber(); if (!user || !user.accessCode) { throw new Error("User is not authenticated or accessCode is missing"); diff --git a/components/(customization)/trophycustomization/page.tsx b/components/(customization)/trophycustomization/page.tsx index 30ae1aa..35b1337 100644 --- a/components/(customization)/trophycustomization/page.tsx +++ b/components/(customization)/trophycustomization/page.tsx @@ -76,8 +76,8 @@ export const TrophyCustomization: FC = ({ }, []); function onSubmit(data: z.infer) { - const unchangedNamePlateId = trophyID; - const newNamePlateId = data.trophies ?? unchangedNamePlateId; + const defaultNamePlateId = trophyID; + const newNamePlateId = data.trophies ?? defaultNamePlateId; updatePlayerTrophy(newNamePlateId).then(() => { setTrophyId(newNamePlateId); @@ -112,7 +112,7 @@ export const TrophyCustomization: FC = ({ name="trophies" render={({ field }) => ( - Select Trophy + Select Trophy diff --git a/components/navigationbar/adminnavigation.tsx b/components/navigationbar/adminnavigation.tsx index 0841069..0ecf215 100644 --- a/components/navigationbar/adminnavigation.tsx +++ b/components/navigationbar/adminnavigation.tsx @@ -7,6 +7,7 @@ const NAV_ITEMS = [ { href: "/admin/home", label: "Home" }, { href: "/admin/unlock", label: "Unlock User" }, { href: "/admin/extraction", label: "Extract Game Files" }, + { href: "/admin/gameversions", label: "Edit Game Version" }, ]; const AdminSubNavigation = () => { diff --git a/components/userRatingBaseHotList/action.ts b/components/userRatingBaseHotList/action.ts index bb50326..0e8f689 100644 --- a/components/userRatingBaseHotList/action.ts +++ b/components/userRatingBaseHotList/action.ts @@ -1,10 +1,11 @@ "use server"; import { getAuth } from "@/auth/queries/getauth"; -import { supportedVersionNumber } from "@/lib/helpers"; +import { getSupportedVersionNumber } from "@/lib/api"; import { artemis } from "@/lib/prisma"; export async function getUserRatingBaseHotList() { const { user } = await getAuth(); + const supportedVersionNumber = await getSupportedVersionNumber(); if (!user || !user.accessCode) { throw new Error("User is not authenticated or accessCode is missing"); diff --git a/components/userRatingBaseList/action.ts b/components/userRatingBaseList/action.ts index 703ed3a..46c3913 100644 --- a/components/userRatingBaseList/action.ts +++ b/components/userRatingBaseList/action.ts @@ -1,10 +1,11 @@ "use server"; import { getAuth } from "@/auth/queries/getauth"; -import { supportedVersionNumber } from "@/lib/helpers"; +import { getSupportedVersionNumber } from "@/lib/api"; import { artemis } from "@/lib/prisma"; export async function getUserRatingBaseList() { const { user } = await getAuth(); + const supportedVersionNumber = await getSupportedVersionNumber(); if (!user || !user.accessCode) { throw new Error("User is not authenticated or accessCode is missing"); diff --git a/global.d.ts b/global.d.ts new file mode 100644 index 0000000..ac77827 --- /dev/null +++ b/global.d.ts @@ -0,0 +1,9 @@ +// global.d.ts +import { PrismaClient as DaphnisClient } from "@/prisma/schemas/daphnis/generated/daphnis"; +import { PrismaClient as ArtemisClient } from "@/prisma/schemas/artemis/generated/artemis"; + +// adding types to global so primsa.ts doesnt freak out +declare global { + var daphnisClient: DaphnisClient | undefined; + var artemisClient: ArtemisClient | undefined; +} diff --git a/lib/api.ts b/lib/api.ts index 5c450b1..27fcd38 100644 --- a/lib/api.ts +++ b/lib/api.ts @@ -2,6 +2,7 @@ import { getAuth } from "@/auth/queries/getauth"; import { artemis, daphnis } from "@/lib/prisma"; +import { GameVersion } from "@/prisma/schemas/daphnis/generated/daphnis"; export const getUsername = async () => { const { user } = await getAuth(); @@ -45,3 +46,56 @@ export async function verifyAimeCodeAgainstArtemis() { }); return aimeUser; } + +const GameVersionToNumber: Record = { + [GameVersion.LuminousPlus]: 16, + [GameVersion.Luminous]: 15, + [GameVersion.SunPlus]: 14, + [GameVersion.Sun]: 13, + [GameVersion.NewPlus]: 12, + [GameVersion.New]: 10, +}; + +export async function getGameVersion(): Promise { + const { user } = await getAuth(); + + if (!user || !user.accessCode) { + throw new Error("User is not authenticated or accessCode is missing"); + } + + const aimeUser = await daphnis.user.findFirst({ + where: { + accessCode: user.accessCode, + }, + select: { + gameVersion: true, + }, + }); + + if (!aimeUser || !aimeUser.gameVersion) { + throw new Error("Game version not found for the user"); + } + + // console.log("User Game Version:", aimeUser.gameVersion); + + const gameVersionEnum = aimeUser.gameVersion as GameVersion; + + if (!(gameVersionEnum in GameVersionToNumber)) { + throw new Error("Unknown game version"); + } + + return gameVersionEnum; +} + +export async function getSupportedVersionNumber(): Promise { + const gameVersion = await getGameVersion(); + + const versionNumber = GameVersionToNumber[gameVersion]; + + if (versionNumber === undefined) { + throw new Error("Unknown version number"); + } + + // console.log(typeof versionNumber); + return versionNumber; +} diff --git a/lib/helpers.ts b/lib/helpers.ts index bc82fa4..a4d1ece 100644 --- a/lib/helpers.ts +++ b/lib/helpers.ts @@ -1,3 +1,9 @@ +import { getAuth } from "@/auth/queries/getauth"; +import { daphnis } from "./prisma"; +import { GameVersion } from "@/prisma/schemas/daphnis/generated/daphnis"; +import { getGameVersion } from "./api"; +import { LucideSuperscript } from "lucide-react"; + export const getDifficultyClass = (level: number) => { switch (level) { case 0: @@ -53,7 +59,3 @@ export const getGrade = (score: number) => { if (score < 500000) return "D"; return ""; }; - -export const supportedVersionNumber = Number( - process.env.SUPPORTED_CHUNITHM_VERSION_NUMBER, -); diff --git a/lib/prisma.ts b/lib/prisma.ts index b257920..38f4e02 100644 --- a/lib/prisma.ts +++ b/lib/prisma.ts @@ -1,20 +1,36 @@ -import { PrismaClient as daphnisClient } from "@/prisma/schemas/daphnis/generated/daphnis"; -import { PrismaClient as artemisClient } from "@/prisma/schemas/artemis/generated/artemis"; +import { PrismaClient as DaphnisClient } from "@/prisma/schemas/daphnis/generated/daphnis"; +import { PrismaClient as ArtemisClient } from "@/prisma/schemas/artemis/generated/artemis"; -const DaphnisSingleton = () => { - return new daphnisClient(); +// Singleton pattern for Daphnis client +const DaphnisClientSingleton = () => { + if (process.env.NODE_ENV === "production") { + return new DaphnisClient(); + } + + // In development mode, reuse existing global instance if available + if (globalThis.daphnisClient) { + return globalThis.daphnisClient as DaphnisClient; + } + const client = new DaphnisClient(); + globalThis.daphnisClient = client; + return client; }; -const aremisSingleton = () => { - return new artemisClient(); +// Singleton pattern for Artemis client +const ArtemisClientSingleton = () => { + if (process.env.NODE_ENV === "production") { + return new ArtemisClient(); + } + + // In development mode, reuse existing global instance if available + if (globalThis.artemisClient) { + return globalThis.artemisClient as ArtemisClient; + } + const client = new ArtemisClient(); + globalThis.artemisClient = client; + return client; }; -declare global { - var daphnis: undefined | ReturnType; - var artemis: undefined | ReturnType; -} - -export const daphnis = globalThis.daphnis ?? DaphnisSingleton(); -export const artemis = globalThis.artemis ?? aremisSingleton(); - -if (process.env.NODE_ENV !== "production") globalThis.daphnis = daphnis; +// Exporting the singletons +export const daphnis = DaphnisClientSingleton(); +export const artemis = ArtemisClientSingleton(); diff --git a/package.json b/package.json index c345b9f..719e425 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "@tanstack/react-query": "^5.48.0", "@tanstack/react-table": "^8.17.3", "@types/bcryptjs": "^2.4.6", + "@types/encoding-japanese": "^2.2.1", "@types/jsonwebtoken": "^9.0.6", "@types/luxon": "^3.4.2", "bcryptjs": "^2.4.3", @@ -58,7 +59,7 @@ "cmdk": "^1.0.0", "date-fns": "^3.6.0", "embla-carousel-react": "^8.1.5", - "framer-motion": "^11.2.11", + "encoding-japanese": "^2.2.0", "geist": "^1.3.0", "input-otp": "^1.2.4", "jsonwebtoken": "^9.0.2", diff --git a/prisma/schemas/daphnis/generated/daphnis/edge.js b/prisma/schemas/daphnis/generated/daphnis/edge.js index f572f1a..41bb16f 100644 --- a/prisma/schemas/daphnis/generated/daphnis/edge.js +++ b/prisma/schemas/daphnis/generated/daphnis/edge.js @@ -92,6 +92,7 @@ exports.Prisma.UserScalarFieldEnum = { username: 'username', accessCode: 'accessCode', UserId: 'UserId', + gameVersion: 'gameVersion', hashedPassword: 'hashedPassword', email: 'email', role: 'role' @@ -129,6 +130,15 @@ exports.Prisma.NullsOrder = { first: 'first', last: 'last' }; +exports.GameVersion = exports.$Enums.GameVersion = { + LuminousPlus: 'LuminousPlus', + Luminous: 'Luminous', + SunPlus: 'SunPlus', + Sun: 'Sun', + NewPlus: 'NewPlus', + New: 'New' +}; + exports.UserRole = exports.$Enums.UserRole = { ADMIN: 'ADMIN', USER: 'USER' @@ -179,7 +189,6 @@ const config = { "db" ], "activeProvider": "mysql", - "postinstall": false, "inlineDatasources": { "db": { "url": { @@ -188,13 +197,13 @@ const config = { } } }, - "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?\n// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init\n\ngenerator client {\n provider = \"prisma-client-js\"\n output = \"./generated/daphnis\"\n}\n\ndatasource db {\n provider = \"mysql\"\n url = env(\"DATABASE_URL\")\n}\n\nenum UserRole {\n ADMIN\n USER\n}\n\nmodel User {\n id String @id\n sessions Session[]\n username String @unique\n accessCode String @unique\n UserId Int @unique\n\n hashedPassword String\n email String @unique\n role UserRole @default(USER)\n PasswordResetToken PasswordResetToken[]\n LinkSharingToken LinkSharingToken[]\n}\n\nmodel PasswordResetToken {\n id String @id\n token String @unique\n createdAt DateTime @default(now())\n userId String\n resetAt DateTime?\n\n user User @relation(fields: [userId], references: [id])\n}\n\nmodel LinkSharingToken {\n id String @id\n token String @unique\n createdAt DateTime @default(now())\n userId String\n tokenExpiredAt DateTime?\n playlogId Int?\n\n user User @relation(fields: [userId], references: [id])\n}\n\nmodel Session {\n id String @id\n expiresAt DateTime\n userId String\n user User @relation(references: [id], fields: [userId], onDelete: Cascade)\n}\n", - "inlineSchemaHash": "9ced2f7606bf9582bc13832b09b5bfe17050548e1f4ce26eb09b49c1794d60d6", + "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?\n// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init\n\ngenerator client {\n provider = \"prisma-client-js\"\n output = \"./generated/daphnis\"\n}\n\ndatasource db {\n provider = \"mysql\"\n url = env(\"DATABASE_URL\")\n}\n\nenum UserRole {\n ADMIN\n USER\n}\n\nenum GameVersion {\n LuminousPlus\n Luminous\n SunPlus\n Sun\n NewPlus\n New\n}\n\nmodel User {\n id String @id\n sessions Session[]\n username String @unique\n accessCode String @unique\n UserId Int @unique\n gameVersion GameVersion @default(Luminous)\n\n hashedPassword String\n email String @unique\n role UserRole @default(USER)\n PasswordResetToken PasswordResetToken[]\n LinkSharingToken LinkSharingToken[]\n}\n\nmodel PasswordResetToken {\n id String @id\n token String @unique\n createdAt DateTime @default(now())\n userId String\n resetAt DateTime?\n\n user User @relation(fields: [userId], references: [id])\n}\n\nmodel LinkSharingToken {\n id String @id\n token String @unique\n createdAt DateTime @default(now())\n userId String\n tokenExpiredAt DateTime?\n playlogId Int?\n\n user User @relation(fields: [userId], references: [id])\n}\n\nmodel Session {\n id String @id\n expiresAt DateTime\n userId String\n user User @relation(references: [id], fields: [userId], onDelete: Cascade)\n}\n", + "inlineSchemaHash": "e0f7a5c37125ddd496192ea6be867281088c82792a958912086aede4926012bb", "copyEngine": true } config.dirname = '/' -config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sessions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Session\",\"relationName\":\"SessionToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"username\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"accessCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"UserId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"hashedPassword\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"role\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"UserRole\",\"default\":\"USER\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"PasswordResetToken\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"PasswordResetToken\",\"relationName\":\"PasswordResetTokenToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"LinkSharingToken\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"LinkSharingToken\",\"relationName\":\"LinkSharingTokenToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"PasswordResetToken\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resetAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"PasswordResetTokenToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"LinkSharingToken\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tokenExpiredAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"playlogId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"LinkSharingTokenToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Session\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"SessionToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{\"UserRole\":{\"values\":[{\"name\":\"ADMIN\",\"dbName\":null},{\"name\":\"USER\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sessions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Session\",\"relationName\":\"SessionToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"username\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"accessCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"UserId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"gameVersion\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"GameVersion\",\"default\":\"Luminous\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"hashedPassword\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"role\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"UserRole\",\"default\":\"USER\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"PasswordResetToken\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"PasswordResetToken\",\"relationName\":\"PasswordResetTokenToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"LinkSharingToken\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"LinkSharingToken\",\"relationName\":\"LinkSharingTokenToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"PasswordResetToken\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resetAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"PasswordResetTokenToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"LinkSharingToken\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tokenExpiredAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"playlogId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"LinkSharingTokenToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Session\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"SessionToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{\"UserRole\":{\"values\":[{\"name\":\"ADMIN\",\"dbName\":null},{\"name\":\"USER\",\"dbName\":null}],\"dbName\":null},\"GameVersion\":{\"values\":[{\"name\":\"LuminousPlus\",\"dbName\":null},{\"name\":\"Luminous\",\"dbName\":null},{\"name\":\"SunPlus\",\"dbName\":null},{\"name\":\"Sun\",\"dbName\":null},{\"name\":\"NewPlus\",\"dbName\":null},{\"name\":\"New\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.engineWasm = undefined diff --git a/prisma/schemas/daphnis/generated/daphnis/index-browser.js b/prisma/schemas/daphnis/generated/daphnis/index-browser.js index c976ce6..81ed358 100644 --- a/prisma/schemas/daphnis/generated/daphnis/index-browser.js +++ b/prisma/schemas/daphnis/generated/daphnis/index-browser.js @@ -124,6 +124,7 @@ exports.Prisma.UserScalarFieldEnum = { username: 'username', accessCode: 'accessCode', UserId: 'UserId', + gameVersion: 'gameVersion', hashedPassword: 'hashedPassword', email: 'email', role: 'role' @@ -161,6 +162,15 @@ exports.Prisma.NullsOrder = { first: 'first', last: 'last' }; +exports.GameVersion = exports.$Enums.GameVersion = { + LuminousPlus: 'LuminousPlus', + Luminous: 'Luminous', + SunPlus: 'SunPlus', + Sun: 'Sun', + NewPlus: 'NewPlus', + New: 'New' +}; + exports.UserRole = exports.$Enums.UserRole = { ADMIN: 'ADMIN', USER: 'USER' diff --git a/prisma/schemas/daphnis/generated/daphnis/index.d.ts b/prisma/schemas/daphnis/generated/daphnis/index.d.ts index 0ad80a3..7d84836 100644 --- a/prisma/schemas/daphnis/generated/daphnis/index.d.ts +++ b/prisma/schemas/daphnis/generated/daphnis/index.d.ts @@ -38,7 +38,19 @@ export type Session = $Result.DefaultSelection * Enums */ export namespace $Enums { - export const UserRole: { + export const GameVersion: { + LuminousPlus: 'LuminousPlus', + Luminous: 'Luminous', + SunPlus: 'SunPlus', + Sun: 'Sun', + NewPlus: 'NewPlus', + New: 'New' +}; + +export type GameVersion = (typeof GameVersion)[keyof typeof GameVersion] + + +export const UserRole: { ADMIN: 'ADMIN', USER: 'USER' }; @@ -47,6 +59,10 @@ export type UserRole = (typeof UserRole)[keyof typeof UserRole] } +export type GameVersion = $Enums.GameVersion + +export const GameVersion: typeof $Enums.GameVersion + export type UserRole = $Enums.UserRole export const UserRole: typeof $Enums.UserRole @@ -1210,6 +1226,7 @@ export namespace Prisma { username: string | null accessCode: string | null UserId: number | null + gameVersion: $Enums.GameVersion | null hashedPassword: string | null email: string | null role: $Enums.UserRole | null @@ -1220,6 +1237,7 @@ export namespace Prisma { username: string | null accessCode: string | null UserId: number | null + gameVersion: $Enums.GameVersion | null hashedPassword: string | null email: string | null role: $Enums.UserRole | null @@ -1230,6 +1248,7 @@ export namespace Prisma { username: number accessCode: number UserId: number + gameVersion: number hashedPassword: number email: number role: number @@ -1250,6 +1269,7 @@ export namespace Prisma { username?: true accessCode?: true UserId?: true + gameVersion?: true hashedPassword?: true email?: true role?: true @@ -1260,6 +1280,7 @@ export namespace Prisma { username?: true accessCode?: true UserId?: true + gameVersion?: true hashedPassword?: true email?: true role?: true @@ -1270,6 +1291,7 @@ export namespace Prisma { username?: true accessCode?: true UserId?: true + gameVersion?: true hashedPassword?: true email?: true role?: true @@ -1367,6 +1389,7 @@ export namespace Prisma { username: string accessCode: string UserId: number + gameVersion: $Enums.GameVersion hashedPassword: string email: string role: $Enums.UserRole @@ -1396,6 +1419,7 @@ export namespace Prisma { username?: boolean accessCode?: boolean UserId?: boolean + gameVersion?: boolean hashedPassword?: boolean email?: boolean role?: boolean @@ -1411,6 +1435,7 @@ export namespace Prisma { username?: boolean accessCode?: boolean UserId?: boolean + gameVersion?: boolean hashedPassword?: boolean email?: boolean role?: boolean @@ -1435,6 +1460,7 @@ export namespace Prisma { username: string accessCode: string UserId: number + gameVersion: $Enums.GameVersion hashedPassword: string email: string role: $Enums.UserRole @@ -1840,6 +1866,7 @@ export namespace Prisma { readonly username: FieldRef<"User", 'String'> readonly accessCode: FieldRef<"User", 'String'> readonly UserId: FieldRef<"User", 'Int'> + readonly gameVersion: FieldRef<"User", 'GameVersion'> readonly hashedPassword: FieldRef<"User", 'String'> readonly email: FieldRef<"User", 'String'> readonly role: FieldRef<"User", 'UserRole'> @@ -4967,6 +4994,7 @@ export namespace Prisma { username: 'username', accessCode: 'accessCode', UserId: 'UserId', + gameVersion: 'gameVersion', hashedPassword: 'hashedPassword', email: 'email', role: 'role' @@ -5042,6 +5070,13 @@ export namespace Prisma { + /** + * Reference to a field of type 'GameVersion' + */ + export type EnumGameVersionFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'GameVersion'> + + + /** * Reference to a field of type 'UserRole' */ @@ -5074,6 +5109,7 @@ export namespace Prisma { username?: StringFilter<"User"> | string accessCode?: StringFilter<"User"> | string UserId?: IntFilter<"User"> | number + gameVersion?: EnumGameVersionFilter<"User"> | $Enums.GameVersion hashedPassword?: StringFilter<"User"> | string email?: StringFilter<"User"> | string role?: EnumUserRoleFilter<"User"> | $Enums.UserRole @@ -5087,6 +5123,7 @@ export namespace Prisma { username?: SortOrder accessCode?: SortOrder UserId?: SortOrder + gameVersion?: SortOrder hashedPassword?: SortOrder email?: SortOrder role?: SortOrder @@ -5104,6 +5141,7 @@ export namespace Prisma { AND?: UserWhereInput | UserWhereInput[] OR?: UserWhereInput[] NOT?: UserWhereInput | UserWhereInput[] + gameVersion?: EnumGameVersionFilter<"User"> | $Enums.GameVersion hashedPassword?: StringFilter<"User"> | string role?: EnumUserRoleFilter<"User"> | $Enums.UserRole sessions?: SessionListRelationFilter @@ -5116,6 +5154,7 @@ export namespace Prisma { username?: SortOrder accessCode?: SortOrder UserId?: SortOrder + gameVersion?: SortOrder hashedPassword?: SortOrder email?: SortOrder role?: SortOrder @@ -5134,6 +5173,7 @@ export namespace Prisma { username?: StringWithAggregatesFilter<"User"> | string accessCode?: StringWithAggregatesFilter<"User"> | string UserId?: IntWithAggregatesFilter<"User"> | number + gameVersion?: EnumGameVersionWithAggregatesFilter<"User"> | $Enums.GameVersion hashedPassword?: StringWithAggregatesFilter<"User"> | string email?: StringWithAggregatesFilter<"User"> | string role?: EnumUserRoleWithAggregatesFilter<"User"> | $Enums.UserRole @@ -5306,6 +5346,7 @@ export namespace Prisma { username: string accessCode: string UserId: number + gameVersion?: $Enums.GameVersion hashedPassword: string email: string role?: $Enums.UserRole @@ -5319,6 +5360,7 @@ export namespace Prisma { username: string accessCode: string UserId: number + gameVersion?: $Enums.GameVersion hashedPassword: string email: string role?: $Enums.UserRole @@ -5332,6 +5374,7 @@ export namespace Prisma { username?: StringFieldUpdateOperationsInput | string accessCode?: StringFieldUpdateOperationsInput | string UserId?: IntFieldUpdateOperationsInput | number + gameVersion?: EnumGameVersionFieldUpdateOperationsInput | $Enums.GameVersion hashedPassword?: StringFieldUpdateOperationsInput | string email?: StringFieldUpdateOperationsInput | string role?: EnumUserRoleFieldUpdateOperationsInput | $Enums.UserRole @@ -5345,6 +5388,7 @@ export namespace Prisma { username?: StringFieldUpdateOperationsInput | string accessCode?: StringFieldUpdateOperationsInput | string UserId?: IntFieldUpdateOperationsInput | number + gameVersion?: EnumGameVersionFieldUpdateOperationsInput | $Enums.GameVersion hashedPassword?: StringFieldUpdateOperationsInput | string email?: StringFieldUpdateOperationsInput | string role?: EnumUserRoleFieldUpdateOperationsInput | $Enums.UserRole @@ -5358,6 +5402,7 @@ export namespace Prisma { username: string accessCode: string UserId: number + gameVersion?: $Enums.GameVersion hashedPassword: string email: string role?: $Enums.UserRole @@ -5368,6 +5413,7 @@ export namespace Prisma { username?: StringFieldUpdateOperationsInput | string accessCode?: StringFieldUpdateOperationsInput | string UserId?: IntFieldUpdateOperationsInput | number + gameVersion?: EnumGameVersionFieldUpdateOperationsInput | $Enums.GameVersion hashedPassword?: StringFieldUpdateOperationsInput | string email?: StringFieldUpdateOperationsInput | string role?: EnumUserRoleFieldUpdateOperationsInput | $Enums.UserRole @@ -5378,6 +5424,7 @@ export namespace Prisma { username?: StringFieldUpdateOperationsInput | string accessCode?: StringFieldUpdateOperationsInput | string UserId?: IntFieldUpdateOperationsInput | number + gameVersion?: EnumGameVersionFieldUpdateOperationsInput | $Enums.GameVersion hashedPassword?: StringFieldUpdateOperationsInput | string email?: StringFieldUpdateOperationsInput | string role?: EnumUserRoleFieldUpdateOperationsInput | $Enums.UserRole @@ -5566,6 +5613,13 @@ export namespace Prisma { not?: NestedIntFilter<$PrismaModel> | number } + export type EnumGameVersionFilter<$PrismaModel = never> = { + equals?: $Enums.GameVersion | EnumGameVersionFieldRefInput<$PrismaModel> + in?: $Enums.GameVersion[] + notIn?: $Enums.GameVersion[] + not?: NestedEnumGameVersionFilter<$PrismaModel> | $Enums.GameVersion + } + export type EnumUserRoleFilter<$PrismaModel = never> = { equals?: $Enums.UserRole | EnumUserRoleFieldRefInput<$PrismaModel> in?: $Enums.UserRole[] @@ -5608,6 +5662,7 @@ export namespace Prisma { username?: SortOrder accessCode?: SortOrder UserId?: SortOrder + gameVersion?: SortOrder hashedPassword?: SortOrder email?: SortOrder role?: SortOrder @@ -5622,6 +5677,7 @@ export namespace Prisma { username?: SortOrder accessCode?: SortOrder UserId?: SortOrder + gameVersion?: SortOrder hashedPassword?: SortOrder email?: SortOrder role?: SortOrder @@ -5632,6 +5688,7 @@ export namespace Prisma { username?: SortOrder accessCode?: SortOrder UserId?: SortOrder + gameVersion?: SortOrder hashedPassword?: SortOrder email?: SortOrder role?: SortOrder @@ -5674,6 +5731,16 @@ export namespace Prisma { _max?: NestedIntFilter<$PrismaModel> } + export type EnumGameVersionWithAggregatesFilter<$PrismaModel = never> = { + equals?: $Enums.GameVersion | EnumGameVersionFieldRefInput<$PrismaModel> + in?: $Enums.GameVersion[] + notIn?: $Enums.GameVersion[] + not?: NestedEnumGameVersionWithAggregatesFilter<$PrismaModel> | $Enums.GameVersion + _count?: NestedIntFilter<$PrismaModel> + _min?: NestedEnumGameVersionFilter<$PrismaModel> + _max?: NestedEnumGameVersionFilter<$PrismaModel> + } + export type EnumUserRoleWithAggregatesFilter<$PrismaModel = never> = { equals?: $Enums.UserRole | EnumUserRoleFieldRefInput<$PrismaModel> in?: $Enums.UserRole[] @@ -5902,6 +5969,10 @@ export namespace Prisma { divide?: number } + export type EnumGameVersionFieldUpdateOperationsInput = { + set?: $Enums.GameVersion + } + export type EnumUserRoleFieldUpdateOperationsInput = { set?: $Enums.UserRole } @@ -6073,6 +6144,13 @@ export namespace Prisma { not?: NestedIntFilter<$PrismaModel> | number } + export type NestedEnumGameVersionFilter<$PrismaModel = never> = { + equals?: $Enums.GameVersion | EnumGameVersionFieldRefInput<$PrismaModel> + in?: $Enums.GameVersion[] + notIn?: $Enums.GameVersion[] + not?: NestedEnumGameVersionFilter<$PrismaModel> | $Enums.GameVersion + } + export type NestedEnumUserRoleFilter<$PrismaModel = never> = { equals?: $Enums.UserRole | EnumUserRoleFieldRefInput<$PrismaModel> in?: $Enums.UserRole[] @@ -6124,6 +6202,16 @@ export namespace Prisma { not?: NestedFloatFilter<$PrismaModel> | number } + export type NestedEnumGameVersionWithAggregatesFilter<$PrismaModel = never> = { + equals?: $Enums.GameVersion | EnumGameVersionFieldRefInput<$PrismaModel> + in?: $Enums.GameVersion[] + notIn?: $Enums.GameVersion[] + not?: NestedEnumGameVersionWithAggregatesFilter<$PrismaModel> | $Enums.GameVersion + _count?: NestedIntFilter<$PrismaModel> + _min?: NestedEnumGameVersionFilter<$PrismaModel> + _max?: NestedEnumGameVersionFilter<$PrismaModel> + } + export type NestedEnumUserRoleWithAggregatesFilter<$PrismaModel = never> = { equals?: $Enums.UserRole | EnumUserRoleFieldRefInput<$PrismaModel> in?: $Enums.UserRole[] @@ -6377,6 +6465,7 @@ export namespace Prisma { username: string accessCode: string UserId: number + gameVersion?: $Enums.GameVersion hashedPassword: string email: string role?: $Enums.UserRole @@ -6389,6 +6478,7 @@ export namespace Prisma { username: string accessCode: string UserId: number + gameVersion?: $Enums.GameVersion hashedPassword: string email: string role?: $Enums.UserRole @@ -6417,6 +6507,7 @@ export namespace Prisma { username?: StringFieldUpdateOperationsInput | string accessCode?: StringFieldUpdateOperationsInput | string UserId?: IntFieldUpdateOperationsInput | number + gameVersion?: EnumGameVersionFieldUpdateOperationsInput | $Enums.GameVersion hashedPassword?: StringFieldUpdateOperationsInput | string email?: StringFieldUpdateOperationsInput | string role?: EnumUserRoleFieldUpdateOperationsInput | $Enums.UserRole @@ -6429,6 +6520,7 @@ export namespace Prisma { username?: StringFieldUpdateOperationsInput | string accessCode?: StringFieldUpdateOperationsInput | string UserId?: IntFieldUpdateOperationsInput | number + gameVersion?: EnumGameVersionFieldUpdateOperationsInput | $Enums.GameVersion hashedPassword?: StringFieldUpdateOperationsInput | string email?: StringFieldUpdateOperationsInput | string role?: EnumUserRoleFieldUpdateOperationsInput | $Enums.UserRole @@ -6441,6 +6533,7 @@ export namespace Prisma { username: string accessCode: string UserId: number + gameVersion?: $Enums.GameVersion hashedPassword: string email: string role?: $Enums.UserRole @@ -6453,6 +6546,7 @@ export namespace Prisma { username: string accessCode: string UserId: number + gameVersion?: $Enums.GameVersion hashedPassword: string email: string role?: $Enums.UserRole @@ -6481,6 +6575,7 @@ export namespace Prisma { username?: StringFieldUpdateOperationsInput | string accessCode?: StringFieldUpdateOperationsInput | string UserId?: IntFieldUpdateOperationsInput | number + gameVersion?: EnumGameVersionFieldUpdateOperationsInput | $Enums.GameVersion hashedPassword?: StringFieldUpdateOperationsInput | string email?: StringFieldUpdateOperationsInput | string role?: EnumUserRoleFieldUpdateOperationsInput | $Enums.UserRole @@ -6493,6 +6588,7 @@ export namespace Prisma { username?: StringFieldUpdateOperationsInput | string accessCode?: StringFieldUpdateOperationsInput | string UserId?: IntFieldUpdateOperationsInput | number + gameVersion?: EnumGameVersionFieldUpdateOperationsInput | $Enums.GameVersion hashedPassword?: StringFieldUpdateOperationsInput | string email?: StringFieldUpdateOperationsInput | string role?: EnumUserRoleFieldUpdateOperationsInput | $Enums.UserRole @@ -6505,6 +6601,7 @@ export namespace Prisma { username: string accessCode: string UserId: number + gameVersion?: $Enums.GameVersion hashedPassword: string email: string role?: $Enums.UserRole @@ -6517,6 +6614,7 @@ export namespace Prisma { username: string accessCode: string UserId: number + gameVersion?: $Enums.GameVersion hashedPassword: string email: string role?: $Enums.UserRole @@ -6545,6 +6643,7 @@ export namespace Prisma { username?: StringFieldUpdateOperationsInput | string accessCode?: StringFieldUpdateOperationsInput | string UserId?: IntFieldUpdateOperationsInput | number + gameVersion?: EnumGameVersionFieldUpdateOperationsInput | $Enums.GameVersion hashedPassword?: StringFieldUpdateOperationsInput | string email?: StringFieldUpdateOperationsInput | string role?: EnumUserRoleFieldUpdateOperationsInput | $Enums.UserRole @@ -6557,6 +6656,7 @@ export namespace Prisma { username?: StringFieldUpdateOperationsInput | string accessCode?: StringFieldUpdateOperationsInput | string UserId?: IntFieldUpdateOperationsInput | number + gameVersion?: EnumGameVersionFieldUpdateOperationsInput | $Enums.GameVersion hashedPassword?: StringFieldUpdateOperationsInput | string email?: StringFieldUpdateOperationsInput | string role?: EnumUserRoleFieldUpdateOperationsInput | $Enums.UserRole diff --git a/prisma/schemas/daphnis/generated/daphnis/index.js b/prisma/schemas/daphnis/generated/daphnis/index.js index 09afc19..d58b1a3 100644 --- a/prisma/schemas/daphnis/generated/daphnis/index.js +++ b/prisma/schemas/daphnis/generated/daphnis/index.js @@ -93,6 +93,7 @@ exports.Prisma.UserScalarFieldEnum = { username: 'username', accessCode: 'accessCode', UserId: 'UserId', + gameVersion: 'gameVersion', hashedPassword: 'hashedPassword', email: 'email', role: 'role' @@ -130,6 +131,15 @@ exports.Prisma.NullsOrder = { first: 'first', last: 'last' }; +exports.GameVersion = exports.$Enums.GameVersion = { + LuminousPlus: 'LuminousPlus', + Luminous: 'Luminous', + SunPlus: 'SunPlus', + Sun: 'Sun', + NewPlus: 'NewPlus', + New: 'New' +}; + exports.UserRole = exports.$Enums.UserRole = { ADMIN: 'ADMIN', USER: 'USER' @@ -180,7 +190,6 @@ const config = { "db" ], "activeProvider": "mysql", - "postinstall": false, "inlineDatasources": { "db": { "url": { @@ -189,8 +198,8 @@ const config = { } } }, - "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?\n// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init\n\ngenerator client {\n provider = \"prisma-client-js\"\n output = \"./generated/daphnis\"\n}\n\ndatasource db {\n provider = \"mysql\"\n url = env(\"DATABASE_URL\")\n}\n\nenum UserRole {\n ADMIN\n USER\n}\n\nmodel User {\n id String @id\n sessions Session[]\n username String @unique\n accessCode String @unique\n UserId Int @unique\n\n hashedPassword String\n email String @unique\n role UserRole @default(USER)\n PasswordResetToken PasswordResetToken[]\n LinkSharingToken LinkSharingToken[]\n}\n\nmodel PasswordResetToken {\n id String @id\n token String @unique\n createdAt DateTime @default(now())\n userId String\n resetAt DateTime?\n\n user User @relation(fields: [userId], references: [id])\n}\n\nmodel LinkSharingToken {\n id String @id\n token String @unique\n createdAt DateTime @default(now())\n userId String\n tokenExpiredAt DateTime?\n playlogId Int?\n\n user User @relation(fields: [userId], references: [id])\n}\n\nmodel Session {\n id String @id\n expiresAt DateTime\n userId String\n user User @relation(references: [id], fields: [userId], onDelete: Cascade)\n}\n", - "inlineSchemaHash": "9ced2f7606bf9582bc13832b09b5bfe17050548e1f4ce26eb09b49c1794d60d6", + "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?\n// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init\n\ngenerator client {\n provider = \"prisma-client-js\"\n output = \"./generated/daphnis\"\n}\n\ndatasource db {\n provider = \"mysql\"\n url = env(\"DATABASE_URL\")\n}\n\nenum UserRole {\n ADMIN\n USER\n}\n\nenum GameVersion {\n LuminousPlus\n Luminous\n SunPlus\n Sun\n NewPlus\n New\n}\n\nmodel User {\n id String @id\n sessions Session[]\n username String @unique\n accessCode String @unique\n UserId Int @unique\n gameVersion GameVersion @default(Luminous)\n\n hashedPassword String\n email String @unique\n role UserRole @default(USER)\n PasswordResetToken PasswordResetToken[]\n LinkSharingToken LinkSharingToken[]\n}\n\nmodel PasswordResetToken {\n id String @id\n token String @unique\n createdAt DateTime @default(now())\n userId String\n resetAt DateTime?\n\n user User @relation(fields: [userId], references: [id])\n}\n\nmodel LinkSharingToken {\n id String @id\n token String @unique\n createdAt DateTime @default(now())\n userId String\n tokenExpiredAt DateTime?\n playlogId Int?\n\n user User @relation(fields: [userId], references: [id])\n}\n\nmodel Session {\n id String @id\n expiresAt DateTime\n userId String\n user User @relation(references: [id], fields: [userId], onDelete: Cascade)\n}\n", + "inlineSchemaHash": "e0f7a5c37125ddd496192ea6be867281088c82792a958912086aede4926012bb", "copyEngine": true } @@ -211,7 +220,7 @@ if (!fs.existsSync(path.join(__dirname, 'schema.prisma'))) { config.isBundled = true } -config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sessions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Session\",\"relationName\":\"SessionToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"username\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"accessCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"UserId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"hashedPassword\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"role\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"UserRole\",\"default\":\"USER\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"PasswordResetToken\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"PasswordResetToken\",\"relationName\":\"PasswordResetTokenToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"LinkSharingToken\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"LinkSharingToken\",\"relationName\":\"LinkSharingTokenToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"PasswordResetToken\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resetAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"PasswordResetTokenToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"LinkSharingToken\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tokenExpiredAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"playlogId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"LinkSharingTokenToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Session\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"SessionToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{\"UserRole\":{\"values\":[{\"name\":\"ADMIN\",\"dbName\":null},{\"name\":\"USER\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sessions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Session\",\"relationName\":\"SessionToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"username\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"accessCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"UserId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"gameVersion\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"GameVersion\",\"default\":\"Luminous\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"hashedPassword\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"role\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"UserRole\",\"default\":\"USER\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"PasswordResetToken\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"PasswordResetToken\",\"relationName\":\"PasswordResetTokenToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"LinkSharingToken\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"LinkSharingToken\",\"relationName\":\"LinkSharingTokenToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"PasswordResetToken\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resetAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"PasswordResetTokenToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"LinkSharingToken\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tokenExpiredAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"playlogId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"LinkSharingTokenToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Session\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"SessionToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{\"UserRole\":{\"values\":[{\"name\":\"ADMIN\",\"dbName\":null},{\"name\":\"USER\",\"dbName\":null}],\"dbName\":null},\"GameVersion\":{\"values\":[{\"name\":\"LuminousPlus\",\"dbName\":null},{\"name\":\"Luminous\",\"dbName\":null},{\"name\":\"SunPlus\",\"dbName\":null},{\"name\":\"Sun\",\"dbName\":null},{\"name\":\"NewPlus\",\"dbName\":null},{\"name\":\"New\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.engineWasm = undefined diff --git a/prisma/schemas/daphnis/generated/daphnis/package.json b/prisma/schemas/daphnis/generated/daphnis/package.json index 18397d4..4815088 100644 --- a/prisma/schemas/daphnis/generated/daphnis/package.json +++ b/prisma/schemas/daphnis/generated/daphnis/package.json @@ -1,5 +1,5 @@ { - "name": "prisma-client-f6d74f5cbba0fb342495169b34c2d2520dafdd4c2c3b6c0b176fbebe191af770", + "name": "prisma-client-6a081666c2516e1c2776ef81fca5cd408907b1d39b2c10beb50bbdfd20560ba8", "main": "index.js", "types": "index.d.ts", "browser": "index-browser.js", diff --git a/prisma/schemas/daphnis/generated/daphnis/schema.prisma b/prisma/schemas/daphnis/generated/daphnis/schema.prisma index 81d206a..529cd90 100644 --- a/prisma/schemas/daphnis/generated/daphnis/schema.prisma +++ b/prisma/schemas/daphnis/generated/daphnis/schema.prisma @@ -19,12 +19,22 @@ enum UserRole { USER } +enum GameVersion { + LuminousPlus + Luminous + SunPlus + Sun + NewPlus + New +} + model User { - id String @id - sessions Session[] - username String @unique - accessCode String @unique - UserId Int @unique + id String @id + sessions Session[] + username String @unique + accessCode String @unique + UserId Int @unique + gameVersion GameVersion @default(Luminous) hashedPassword String email String @unique diff --git a/prisma/schemas/daphnis/generated/daphnis/wasm.js b/prisma/schemas/daphnis/generated/daphnis/wasm.js index c976ce6..81ed358 100644 --- a/prisma/schemas/daphnis/generated/daphnis/wasm.js +++ b/prisma/schemas/daphnis/generated/daphnis/wasm.js @@ -124,6 +124,7 @@ exports.Prisma.UserScalarFieldEnum = { username: 'username', accessCode: 'accessCode', UserId: 'UserId', + gameVersion: 'gameVersion', hashedPassword: 'hashedPassword', email: 'email', role: 'role' @@ -161,6 +162,15 @@ exports.Prisma.NullsOrder = { first: 'first', last: 'last' }; +exports.GameVersion = exports.$Enums.GameVersion = { + LuminousPlus: 'LuminousPlus', + Luminous: 'Luminous', + SunPlus: 'SunPlus', + Sun: 'Sun', + NewPlus: 'NewPlus', + New: 'New' +}; + exports.UserRole = exports.$Enums.UserRole = { ADMIN: 'ADMIN', USER: 'USER' diff --git a/prisma/schemas/daphnis/migrations/20240820170604_/migration.sql b/prisma/schemas/daphnis/migrations/20240820170604_/migration.sql new file mode 100644 index 0000000..902bbe4 --- /dev/null +++ b/prisma/schemas/daphnis/migrations/20240820170604_/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE `user` ADD COLUMN `gameVersion` ENUM('LuminousPlus', 'Luminous', 'SunPlus', 'Sun', 'NewPlus', 'New') NOT NULL DEFAULT 'Luminous'; diff --git a/prisma/schemas/daphnis/schema.prisma b/prisma/schemas/daphnis/schema.prisma index 81d206a..529cd90 100644 --- a/prisma/schemas/daphnis/schema.prisma +++ b/prisma/schemas/daphnis/schema.prisma @@ -19,12 +19,22 @@ enum UserRole { USER } +enum GameVersion { + LuminousPlus + Luminous + SunPlus + Sun + NewPlus + New +} + model User { - id String @id - sessions Session[] - username String @unique - accessCode String @unique - UserId Int @unique + id String @id + sessions Session[] + username String @unique + accessCode String @unique + UserId Int @unique + gameVersion GameVersion @default(Luminous) hashedPassword String email String @unique