52 lines
1.9 KiB
TypeScript
52 lines
1.9 KiB
TypeScript
import type { PageServerLoad } from './$types';
|
|
import { db } from '$lib/server/db';
|
|
import { applications, pets } from '$lib/server/schema';
|
|
import { eq, and, like, count, desc } from 'drizzle-orm';
|
|
import { hasPermission } from '$lib/roles';
|
|
import type { Role } from '$lib/roles';
|
|
import { error } from '@sveltejs/kit';
|
|
|
|
const PER_PAGE = 20;
|
|
|
|
export const load: PageServerLoad = async ({ url, locals }) => {
|
|
if (!hasPermission(locals.user!.role as Role, 'applications')) error(403, 'Access denied');
|
|
|
|
const q = url.searchParams.get('q')?.trim() ?? '';
|
|
const type = url.searchParams.get('type') ?? '';
|
|
const status = url.searchParams.get('status') ?? '';
|
|
const page = Math.max(1, parseInt(url.searchParams.get('page') ?? '1', 10));
|
|
const offset = (page - 1) * PER_PAGE;
|
|
|
|
const conditions = [];
|
|
if (q) conditions.push(like(applications.applicantName, `%${q}%`));
|
|
if (type) conditions.push(eq(applications.type, type as typeof applications.type.enumValues[number]));
|
|
if (status) conditions.push(eq(applications.status, status as typeof applications.status.enumValues[number]));
|
|
|
|
const where = conditions.length > 0 ? and(...conditions) : undefined;
|
|
|
|
const [totalRow] = await db.select({ total: count() }).from(applications).where(where);
|
|
const total = totalRow?.total ?? 0;
|
|
const totalPages = Math.max(1, Math.ceil(total / PER_PAGE));
|
|
|
|
const rows = await db
|
|
.select({
|
|
id: applications.id,
|
|
type: applications.type,
|
|
petId: applications.petId,
|
|
applicantName: applications.applicantName,
|
|
email: applications.applicantEmail,
|
|
phone: applications.applicantPhone,
|
|
status: applications.status,
|
|
createdAt: applications.createdAt,
|
|
petName: pets.name
|
|
})
|
|
.from(applications)
|
|
.leftJoin(pets, eq(applications.petId, pets.id))
|
|
.where(where)
|
|
.orderBy(desc(applications.createdAt))
|
|
.limit(PER_PAGE)
|
|
.offset(offset);
|
|
|
|
return { applications: rows, total, page, totalPages, q, type, status };
|
|
};
|