Untitled

mail@pastecode.io avatar
unknown
plain_text
a month ago
1.5 kB
2
Indexable
Never
import { error } from '@sveltejs/kit';
import { db } from '$db';
import { listingsTable, cpuModelsTable, suppliersTable } from '$db/schema';
import { eq, lte } from 'drizzle-orm';
import type { PageServerLoad } from './$types';

const DEFAULT_BUDGET = 800;
const CENTS_PER_EURO = 100;

const getListingsQuery = (budget: number) =>
	db
		.select({
			id: listingsTable.id,
			name: cpuModelsTable.name,
			price: listingsTable.price,
			shippingCost: listingsTable.shippingCost,
			supplier: suppliersTable.name,
			url: listingsTable.url
		})
		.from(listingsTable)
		.innerJoin(cpuModelsTable, eq(listingsTable.cpuModelId, cpuModelsTable.id))
		.innerJoin(suppliersTable, eq(listingsTable.supplierId, suppliersTable.id))
		.where(lte(listingsTable.price, budget * CENTS_PER_EURO))
		.orderBy(listingsTable.price);

const convertCentsToEuros = (cents: number) => cents / CENTS_PER_EURO;

export const load: PageServerLoad = async ({ url }) => {
	const budget = Number(url.searchParams.get('budget')) || DEFAULT_BUDGET;

	try {
		const listings = await getListingsQuery(budget);

		return {
			listings: listings.map((listing) => ({
				...listing,
				price: convertCentsToEuros(listing.price),
				shippingCost: convertCentsToEuros(listing.shippingCost)
			}))
		};
	} catch (err) {
		console.error('Error fetching listings:', err);
		throw error(500, 'An error occurred while fetching listings');
	}
};
Leave a Comment