feat: refactor & redesign parts of UI

This commit is contained in:
DecDuck
2025-01-28 15:16:34 +11:00
parent 812936926d
commit 438b236c14
21 changed files with 639 additions and 1478 deletions
@@ -20,22 +20,15 @@ export default defineEventHandler(async (h3) => {
if (!gameId)
throw createError({ statusCode: 400, statusMessage: "Game ID required" });
// Verify collection exists and user owns it
const collection = await userLibraryManager.fetchCollection(id);
if (!collection) {
const successful = await userLibraryManager.collectionRemove(
gameId,
id,
userId
);
if (!successful)
throw createError({
statusCode: 404,
statusMessage: "Collection not found",
});
}
if (collection.userId !== userId) {
throw createError({
statusCode: 403,
statusMessage: "Not authorized to modify this collection",
});
}
const removed = await userLibraryManager.collectionRemove(gameId, id);
return {};
});
@@ -20,22 +20,6 @@ export default defineEventHandler(async (h3) => {
if (!gameId)
throw createError({ statusCode: 400, statusMessage: "Game ID required" });
// Verify collection exists and user owns it
const collection = await userLibraryManager.fetchCollection(id);
if (!collection) {
throw createError({
statusCode: 404,
statusMessage: "Collection not found",
});
}
if (collection.userId !== userId) {
throw createError({
statusCode: 403,
statusMessage: "Not authorized to modify this collection",
});
}
await userLibraryManager.collectionAdd(gameId, id);
return { success: true };
await userLibraryManager.collectionAdd(gameId, id, userId);
return;
});
@@ -16,28 +16,19 @@ export default defineEventHandler(async (h3) => {
});
// Verify collection exists and user owns it
// Will not return the default collection
const collection = await userLibraryManager.fetchCollection(id);
if (!collection) {
if (!collection)
throw createError({
statusCode: 404,
statusMessage: "Collection not found",
});
}
if (collection.userId !== userId) {
if (collection.userId !== userId)
throw createError({
statusCode: 403,
statusMessage: "Not authorized to delete this collection",
});
}
// Don't allow deleting default collection
if (collection.isDefault) {
throw createError({
statusCode: 400,
statusMessage: "Cannot delete default collection",
});
}
await userLibraryManager.deleteCollection(id);
return { success: true };
@@ -16,21 +16,20 @@ export default defineEventHandler(async (h3) => {
});
// Fetch specific collection
// Will not return the default collection
const collection = await userLibraryManager.fetchCollection(id);
if (!collection) {
if (!collection)
throw createError({
statusCode: 404,
statusMessage: "Collection not found",
});
}
// Verify user owns this collection
if (collection.userId !== userId) {
if (collection.userId !== userId)
throw createError({
statusCode: 403,
statusMessage: "Not authorized to access this collection",
});
}
return collection;
});
@@ -13,18 +13,7 @@ export default defineEventHandler(async (h3) => {
if (!gameId)
throw createError({ statusCode: 400, statusMessage: "Game ID required" });
// Get the default collection for this user
const collections = await userLibraryManager.fetchCollections(userId);
const defaultCollection = collections.find(c => c.isDefault);
if (!defaultCollection) {
throw createError({
statusCode: 404,
statusMessage: "Default collection not found",
});
}
// Add the game to the default collection
await userLibraryManager.collectionAdd(gameId, defaultCollection.id);
await userLibraryManager.libraryAdd(gameId, userId);
return {};
});
@@ -0,0 +1,14 @@
import userLibraryManager from "~/server/internal/userlibrary";
export default defineEventHandler(async (h3) => {
const userId = await h3.context.session.getUserId(h3);
if (!userId)
throw createError({
statusCode: 403,
statusMessage: "Requires authentication",
});
const collection = await userLibraryManager.fetchLibrary(userId);
return collection;
});
+29 -11
View File
@@ -37,12 +37,12 @@ class UserLibraryManager {
async libraryAdd(gameId: string, userId: string) {
const userLibraryId = await this.fetchUserLibrary(userId);
await this.collectionAdd(gameId, userLibraryId);
await this.collectionAdd(gameId, userLibraryId, userId);
}
async libraryRemove(gameId: string, userId: string) {
const userLibraryId = await this.fetchUserLibrary(userId);
await this.collectionRemove(gameId, userLibraryId);
await this.collectionRemove(gameId, userLibraryId, userId);
}
async fetchLibrary(userId: string) {
@@ -55,31 +55,38 @@ class UserLibraryManager {
return userLibrary;
}
// Will not return the default library
async fetchCollection(collectionId: string) {
return await prisma.collection.findUnique({
where: { id: collectionId },
where: { id: collectionId, isDefault: false },
include: { entries: { include: { game: true } } },
});
}
async fetchCollections(userId: string) {
await this.fetchUserLibrary(userId); // Ensures user library exists, doesn't have much performance impact due to caching
return await prisma.collection.findMany({
where: { userId },
include: {
entries: true,
_count: { select: { entries: true } }
}
return await prisma.collection.findMany({
where: { userId, isDefault: false },
include: {
entries: {
include: {
game: true,
},
},
},
});
}
async collectionAdd(gameId: string, collectionId: string) {
async collectionAdd(gameId: string, collectionId: string, userId: string) {
await prisma.collectionEntry.upsert({
where: {
collectionId_gameId: {
collectionId,
gameId,
},
collection: {
userId,
},
},
create: {
collectionId,
@@ -89,7 +96,7 @@ class UserLibraryManager {
});
}
async collectionRemove(gameId: string, collectionId: string) {
async collectionRemove(gameId: string, collectionId: string, userId: string) {
// Delete if exists
return (
(
@@ -97,6 +104,9 @@ class UserLibraryManager {
where: {
collectionId,
gameId,
collection: {
userId,
},
},
})
).count > 0
@@ -109,6 +119,13 @@ class UserLibraryManager {
name,
userId: userId,
},
include: {
entries: {
include: {
game: true,
},
},
},
});
}
@@ -116,6 +133,7 @@ class UserLibraryManager {
await prisma.collection.delete({
where: {
id: collectionId,
isDefault: false,
},
});
}