mirror of
https://github.com/BradNut/boredgame
synced 2025-09-08 17:40:22 +00:00
215 lines
5 KiB
TypeScript
215 lines
5 KiB
TypeScript
import { type Actions, error, fail } from '@sveltejs/kit';
|
|
import { and, eq } from 'drizzle-orm';
|
|
import { zod } from 'sveltekit-superforms/adapters';
|
|
import { superValidate } from 'sveltekit-superforms/server';
|
|
import { redirect } from 'sveltekit-flash-message/server';
|
|
import { type ListGame, modifyListGameSchema } from '$lib/validations/zod-schemas';
|
|
import db from '../../../../../db';
|
|
import { notSignedInMessage } from '$lib/flashMessages.js';
|
|
import { collections, games, collection_items } from '$db/schema';
|
|
import { search_schema } from '$lib/zodValidation';
|
|
import { userFullyAuthenticated } from '$lib/server/auth-utils';
|
|
|
|
export async function load(event) {
|
|
const { locals, params, url } = event;
|
|
const { user, session } = locals;
|
|
const { id } = params;
|
|
|
|
if (userFullyAuthenticated(user, session)) {
|
|
redirect(302, '/login', notSignedInMessage, event);
|
|
}
|
|
const searchParams = Object.fromEntries(url?.searchParams);
|
|
console.log('searchParams', searchParams);
|
|
const q = searchParams?.q;
|
|
const limit = parseInt(searchParams?.limit) || 10;
|
|
const skip = parseInt(searchParams?.skip) || 0;
|
|
|
|
const searchData = {
|
|
q,
|
|
limit,
|
|
skip,
|
|
};
|
|
|
|
const searchForm = await superValidate(searchData, zod(search_schema));
|
|
const listManageForm = await superValidate(zod(modifyListGameSchema));
|
|
|
|
const collection = await db.query.collections.findFirst({
|
|
columns: {
|
|
id: true,
|
|
cuid: true,
|
|
name: true,
|
|
},
|
|
where: and(eq(collections.user_id, user.id), eq(collections.cuid, id)),
|
|
});
|
|
console.log('collection', collection);
|
|
|
|
if (!collection) {
|
|
console.log('Collection was not found');
|
|
error(404, 'Collection was not found');
|
|
}
|
|
|
|
const collectionItems = await db.query.collection_items.findMany({
|
|
columns: {
|
|
collection_id: true,
|
|
times_played: true,
|
|
},
|
|
where: eq(collection_items.collection_id, collection.id),
|
|
with: {
|
|
game: {
|
|
columns: {
|
|
id: true,
|
|
name: true,
|
|
thumb_url: true,
|
|
},
|
|
},
|
|
},
|
|
offset: skip,
|
|
limit,
|
|
});
|
|
|
|
console.log('collection_items', collectionItems);
|
|
|
|
const items: ListGame[] = [];
|
|
for (const item of collectionItems) {
|
|
console.log('item', item);
|
|
const game = item.game;
|
|
if (game) {
|
|
items.push({
|
|
game_id: '',
|
|
in_wishlist: false,
|
|
wishlist_id: '',
|
|
id: game.id,
|
|
collection_id: item.collection_id,
|
|
game_name: game.name ?? "Game doesn't have a name",
|
|
thumb_url: game.thumb_url,
|
|
times_played: item.times_played ?? 0,
|
|
in_collection: true,
|
|
});
|
|
}
|
|
}
|
|
|
|
return {
|
|
searchForm,
|
|
listManageForm,
|
|
collection: {
|
|
name: collection.name,
|
|
cuid: collection.cuid ?? '',
|
|
},
|
|
items,
|
|
};
|
|
}
|
|
|
|
export const actions: Actions = {
|
|
// Add game to a wishlist
|
|
add: async (event) => {
|
|
const { locals } = event;
|
|
const { user, session } = locals;
|
|
if (userFullyAuthenticated(user, session)) {
|
|
return fail(401);
|
|
}
|
|
|
|
const form = await superValidate(event, zod(modifyListGameSchema));
|
|
|
|
const user = event.locals.user;
|
|
const game = await db.query.games.findFirst({
|
|
where: eq(games.id, form.data.id),
|
|
});
|
|
|
|
if (!game) {
|
|
// game = await prisma.game.create({
|
|
// data: {
|
|
// name: form.name
|
|
// }
|
|
// });
|
|
console.log('game not found');
|
|
redirect(302, '/404');
|
|
}
|
|
|
|
try {
|
|
const collection = await db.query.collections.findFirst({
|
|
where: eq(collections.user_id, user.id),
|
|
});
|
|
|
|
if (!collection) {
|
|
console.log('Wishlist not found');
|
|
return error(404, 'Wishlist not found');
|
|
}
|
|
|
|
await db.insert(collection_items).values({
|
|
game_id: game.id,
|
|
collection_id: collection.id,
|
|
times_played: 0,
|
|
});
|
|
|
|
return {
|
|
form,
|
|
};
|
|
} catch (e) {
|
|
console.error(e);
|
|
return error(500, 'Something went wrong');
|
|
}
|
|
},
|
|
// Create new wishlist
|
|
create: async (event) => {
|
|
const { locals } = event;
|
|
const { user, session } = locals;
|
|
if (userFullyAuthenticated(user, session)) {
|
|
return fail(401);
|
|
}
|
|
return error(405, 'Method not allowed');
|
|
},
|
|
// Delete a wishlist
|
|
delete: async (event) => {
|
|
const { locals } = event;
|
|
const { user, session } = locals;
|
|
if (userFullyAuthenticated(user, session)) {
|
|
return fail(401);
|
|
}
|
|
return error(405, 'Method not allowed');
|
|
},
|
|
// Remove game from a wishlist
|
|
remove: async (event) => {
|
|
const { locals } = event;
|
|
const { user, session } = locals;
|
|
if (userFullyAuthenticated(user, session)) {
|
|
return fail(401);
|
|
}
|
|
const form = await superValidate(event, zod(modifyListGameSchema));
|
|
|
|
const game = await db.query.games.findFirst({
|
|
where: eq(games.id, form.data.id),
|
|
});
|
|
|
|
if (!game) {
|
|
console.log('game not found');
|
|
redirect(302, '/404');
|
|
}
|
|
|
|
try {
|
|
const collection = await db.query.collections.findFirst({
|
|
where: eq(collections.user_id, locals.user.id),
|
|
});
|
|
|
|
if (!collection) {
|
|
console.log('Collection not found');
|
|
return error(404, 'Collection not found');
|
|
}
|
|
|
|
await db
|
|
.delete(collection_items)
|
|
.where(
|
|
and(
|
|
eq(collection_items.collection_id, collection.id),
|
|
eq(collection_items.game_id, game.id),
|
|
),
|
|
);
|
|
|
|
return {
|
|
form,
|
|
};
|
|
} catch (e) {
|
|
console.error(e);
|
|
return error(500, 'Something went wrong');
|
|
}
|
|
},
|
|
};
|