boredgame/src/routes/(app)/(protected)/collections/[cuid]/+page.server.ts
2024-09-13 12:11:41 -07:00

239 lines
5.6 KiB
TypeScript

import { notSignedInMessage } from '$lib/flashMessages.js'
import { collection_items, collections, gamesTable } from '$lib/server/api/databases/tables'
import { db } from '$lib/server/api/packages/drizzle'
import { modifyListGameSchema } from '$lib/validations/zod-schemas'
import { type Actions, error } from '@sveltejs/kit'
import { and, eq } from 'drizzle-orm'
import { redirect } from 'sveltekit-flash-message/server'
import { zod } from 'sveltekit-superforms/adapters'
import { superValidate } from 'sveltekit-superforms/server'
export async function load(event) {
const { params, locals } = event
const { cuid } = params
const authedUser = await locals.getAuthedUser()
if (!authedUser) {
throw redirect(302, '/login', notSignedInMessage, event)
}
try {
const { data, errors } = await locals.api.collections[':cuid']
.$get({
param: { cuid },
})
.then(locals.parseApiResponse)
if (errors) {
return error(500, 'Failed to fetch collection')
}
const { collection } = data
if (!collection) {
redirect(302, '/404')
}
console.log('collection', collection)
return {
collection,
}
} catch (e) {
console.error(e)
}
redirect(302, '/404')
// 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 authedUser = await locals.getAuthedUser()
if (!authedUser) {
throw redirect(302, '/login', notSignedInMessage, event)
}
const form = await superValidate(event, zod(modifyListGameSchema))
const game = await db.query.gamesTable.findFirst({
where: eq(gamesTable.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, authedUser.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 authedUser = await locals.getAuthedUser()
if (!authedUser) {
throw redirect(302, '/login', notSignedInMessage, event)
}
return error(405, 'Method not allowed')
},
// Delete a wishlist
delete: async (event) => {
const { locals } = event
const authedUser = await locals.getAuthedUser()
if (!authedUser) {
throw redirect(302, '/login', notSignedInMessage, event)
}
return error(405, 'Method not allowed')
},
// Remove game from a wishlist
remove: async (event) => {
const { locals } = event
const authedUser = await locals.getAuthedUser()
if (!authedUser) {
throw redirect(302, '/login', notSignedInMessage, event)
}
const form = await superValidate(event, zod(modifyListGameSchema))
const game = await db.query.gamesTable.findFirst({
where: eq(gamesTable.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, authedUser.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')
}
},
}