diff --git a/package.json b/package.json index 4c9a004..1c1d967 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "@headlessui/vue": "^1.7.23", "@heroicons/vue": "^2.1.5", "@nuxt/content": "^2.13.4", - "@prisma/client": "5.20.0", + "@prisma/client": "^6.1.0", "axios": "^1.7.7", "bcryptjs": "^2.4.3", "cookie-es": "^1.2.2", @@ -24,7 +24,7 @@ "markdown-it": "^14.1.0", "moment": "^2.30.1", "nuxt": "^3.13.2", - "prisma": "^5.22.0", + "prisma": "^6.1.0", "sanitize-filename": "^1.6.3", "stream": "^0.0.3", "stream-mime-type": "^2.0.0", diff --git a/pages/admin/library/index.vue b/pages/admin/library/index.vue index d37fe28..4545bbe 100644 --- a/pages/admin/library/index.vue +++ b/pages/admin/library/index.vue @@ -85,12 +85,20 @@
Metadata provider
- + Edit → + +
@@ -173,22 +181,25 @@ const searchQuery = ref(""); const headers = useRequestHeaders(["cookie"]); const libraryState = await $fetch("/api/v1/admin/library", { headers }); -const libraryGames = libraryState.games.map((e) => { - const noVersions = e.status.noVersions; - const toImport = e.status.unimportedVersions.length > 0; +const libraryGames = ref( + libraryState.games.map((e) => { + const noVersions = e.status.noVersions; + const toImport = e.status.unimportedVersions.length > 0; - return { - ...e.game, - notifications: { - noVersions, - toImport, - }, - hasNotifications: noVersions || toImport, - }; -}); + return { + ...e.game, + notifications: { + noVersions, + toImport, + }, + hasNotifications: noVersions || toImport, + }; + }) +); const filteredLibraryGames = computed(() => - libraryGames.filter((e) => { + // @ts-ignore + libraryGames.value.filter((e) => { if (!searchQuery.value) return true; const searchQueryLower = searchQuery.value.toLowerCase(); if (e.mName.toLowerCase().includes(searchQueryLower)) return true; @@ -197,4 +208,10 @@ const filteredLibraryGames = computed(() => return false; }) ); + +async function deleteGame(id: string) { + await $fetch(`/api/v1/admin/game?id=${id}`, { method: "DELETE" }); + const index = libraryGames.value.findIndex((e) => e.id === id); + libraryGames.value.splice(index, 1); +} diff --git a/prisma/migrations/20241223100329_add_referential_deletion_for_game_versions/migration.sql b/prisma/migrations/20241223100329_add_referential_deletion_for_game_versions/migration.sql new file mode 100644 index 0000000..c68ac5c --- /dev/null +++ b/prisma/migrations/20241223100329_add_referential_deletion_for_game_versions/migration.sql @@ -0,0 +1,5 @@ +-- DropForeignKey +ALTER TABLE "GameVersion" DROP CONSTRAINT "GameVersion_gameId_fkey"; + +-- AddForeignKey +ALTER TABLE "GameVersion" ADD CONSTRAINT "GameVersion_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "Game"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20241223100418_update_to_prisma_6/migration.sql b/prisma/migrations/20241223100418_update_to_prisma_6/migration.sql new file mode 100644 index 0000000..6d8bac7 --- /dev/null +++ b/prisma/migrations/20241223100418_update_to_prisma_6/migration.sql @@ -0,0 +1,11 @@ +-- AlterTable +ALTER TABLE "_DeveloperToGame" ADD CONSTRAINT "_DeveloperToGame_AB_pkey" PRIMARY KEY ("A", "B"); + +-- DropIndex +DROP INDEX "_DeveloperToGame_AB_unique"; + +-- AlterTable +ALTER TABLE "_GameToPublisher" ADD CONSTRAINT "_GameToPublisher_AB_pkey" PRIMARY KEY ("A", "B"); + +-- DropIndex +DROP INDEX "_GameToPublisher_AB_unique"; diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml index fbffa92..648c57f 100644 --- a/prisma/migrations/migration_lock.toml +++ b/prisma/migrations/migration_lock.toml @@ -1,3 +1,3 @@ # Please do not edit this file manually -# It should be added in your version-control system (i.e. Git) +# It should be added in your version-control system (e.g., Git) provider = "postgresql" \ No newline at end of file diff --git a/prisma/schema/content.prisma b/prisma/schema/content.prisma index aa54d8b..6888ab8 100644 --- a/prisma/schema/content.prisma +++ b/prisma/schema/content.prisma @@ -36,7 +36,7 @@ model Game { // A particular set of files that relate to the version model GameVersion { gameId String - game Game @relation(fields: [gameId], references: [id]) + game Game @relation(fields: [gameId], references: [id], onDelete: Cascade) versionName String // Sub directory for the game files created DateTime @default(now()) diff --git a/server/api/v1/admin/game/index.delete.ts b/server/api/v1/admin/game/index.delete.ts new file mode 100644 index 0000000..4cab69c --- /dev/null +++ b/server/api/v1/admin/game/index.delete.ts @@ -0,0 +1,23 @@ +import prisma from "~/server/internal/db/database"; +import libraryManager from "~/server/internal/library"; + +export default defineEventHandler(async (h3) => { + const user = await h3.context.session.getAdminUser(h3); + if (!user) throw createError({ statusCode: 403 }); + + const query = getQuery(h3); + const gameId = query.id?.toString(); + if (!gameId) + throw createError({ + statusCode: 400, + statusMessage: "Missing id in query", + }); + + await prisma.game.delete({ + where: { + id: gameId, + }, + }); + + return {}; +}); diff --git a/yarn.lock b/yarn.lock index c6f258b..124ed94 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1037,46 +1037,46 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.28.tgz#d45e01c4a56f143ee69c54dd6b12eade9e270a73" integrity sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw== -"@prisma/client@5.20.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.20.0.tgz#4fc9f2b2341c9c997c139df4445688dd6b39663b" - integrity sha512-CLv55ZuMuUawMsxoqxGtLT3bEZoa2W8L3Qnp6rDIFWy+ZBrUcOFKdoeGPSnbBqxc3SkdxJrF+D1veN/WNynZYA== +"@prisma/client@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-6.1.0.tgz#179d3b70586e7be522f6f1f0a82cca01396f719a" + integrity sha512-AbQYc5+EJKm1Ydfq3KxwcGiy7wIbm4/QbjCKWWoNROtvy7d6a3gmAGkKjK0iUCzh+rHV8xDhD5Cge8ke/kiy5Q== -"@prisma/debug@5.22.0": - version "5.22.0" - resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.22.0.tgz#58af56ed7f6f313df9fb1042b6224d3174bbf412" - integrity sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ== +"@prisma/debug@6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-6.1.0.tgz#a27a1d144f72a3bc95061ecb0255e7554d9d59ec" + integrity sha512-0himsvcM4DGBTtvXkd2Tggv6sl2JyUYLzEGXXleFY+7Kp6rZeSS3hiTW9mwtUlXrwYbJP6pwlVNB7jYElrjWUg== -"@prisma/engines-version@5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2": - version "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2" - resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2.tgz#d534dd7235c1ba5a23bacd5b92cc0ca3894c28f4" - integrity sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ== +"@prisma/engines-version@6.1.0-21.11f085a2012c0f4778414c8db2651556ee0ef959": + version "6.1.0-21.11f085a2012c0f4778414c8db2651556ee0ef959" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-6.1.0-21.11f085a2012c0f4778414c8db2651556ee0ef959.tgz#0b21ebf57362ffe35d0760c39855f90bbfa0f2fd" + integrity sha512-PdJqmYM2Fd8K0weOOtQThWylwjsDlTig+8Pcg47/jszMuLL9iLIaygC3cjWJLda69siRW4STlCTMSgOjZzvKPQ== -"@prisma/engines@5.22.0": - version "5.22.0" - resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.22.0.tgz#28f3f52a2812c990a8b66eb93a0987816a5b6d84" - integrity sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA== +"@prisma/engines@6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-6.1.0.tgz#2195244a8ce33839a8131e4465624e21d1f8d042" + integrity sha512-GnYJbCiep3Vyr1P/415ReYrgJUjP79fBNc1wCo7NP6Eia0CzL2Ot9vK7Infczv3oK7JLrCcawOSAxFxNFsAERQ== dependencies: - "@prisma/debug" "5.22.0" - "@prisma/engines-version" "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2" - "@prisma/fetch-engine" "5.22.0" - "@prisma/get-platform" "5.22.0" + "@prisma/debug" "6.1.0" + "@prisma/engines-version" "6.1.0-21.11f085a2012c0f4778414c8db2651556ee0ef959" + "@prisma/fetch-engine" "6.1.0" + "@prisma/get-platform" "6.1.0" -"@prisma/fetch-engine@5.22.0": - version "5.22.0" - resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.22.0.tgz#4fb691b483a450c5548aac2f837b267dd50ef52e" - integrity sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA== +"@prisma/fetch-engine@6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-6.1.0.tgz#2a5174787bf57c9b1d5d400bb923e0dc6a73a794" + integrity sha512-asdFi7TvPlEZ8CzSZ/+Du5wZ27q6OJbRSXh+S8ISZguu+S9KtS/gP7NeXceZyb1Jv1SM1S5YfiCv+STDsG6rrg== dependencies: - "@prisma/debug" "5.22.0" - "@prisma/engines-version" "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2" - "@prisma/get-platform" "5.22.0" + "@prisma/debug" "6.1.0" + "@prisma/engines-version" "6.1.0-21.11f085a2012c0f4778414c8db2651556ee0ef959" + "@prisma/get-platform" "6.1.0" -"@prisma/get-platform@5.22.0": - version "5.22.0" - resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.22.0.tgz#fc675bc9d12614ca2dade0506c9c4a77e7dddacd" - integrity sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q== +"@prisma/get-platform@6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-6.1.0.tgz#d4394a24ef91af6675a92382ed40e6e6e07eeb13" + integrity sha512-ia8bNjboBoHkmKGGaWtqtlgQOhCi7+f85aOkPJKgNwWvYrT6l78KgojLekE8zMhVk0R9lWcifV0Pf8l3/15V0Q== dependencies: - "@prisma/debug" "5.22.0" + "@prisma/debug" "6.1.0" "@redocly/ajv@^8.11.2": version "8.11.2" @@ -5317,12 +5317,12 @@ pretty-bytes@^6.1.1: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-6.1.1.tgz#38cd6bb46f47afbf667c202cfc754bffd2016a3b" integrity sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ== -prisma@^5.22.0: - version "5.22.0" - resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.22.0.tgz#1f6717ff487cdef5f5799cc1010459920e2e6197" - integrity sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A== +prisma@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-6.1.0.tgz#738f657fdd5ab8e6775f385db81bf7e61c70fbaf" + integrity sha512-aFI3Yi+ApUxkwCJJwyQSwpyzUX7YX3ihzuHNHOyv4GJg3X5tQsmRaJEnZ+ZyfHpMtnyahhmXVfbTZ+lS8ZtfKw== dependencies: - "@prisma/engines" "5.22.0" + "@prisma/engines" "6.1.0" optionalDependencies: fsevents "2.3.3"