feat(task-35): admin People section — vets, sponsors, mentors, volunteers, users
Full CRUD for vets, sponsors, mentors, volunteer applications, and users. Includes approve/deny flows for pending users, role management, and password reset. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
import type { PageServerLoad, Actions } from './$types';
|
||||
import { db } from '$lib/server/db';
|
||||
import { sponsors } from '$lib/server/schema';
|
||||
import { eq, asc } from 'drizzle-orm';
|
||||
import { error, fail } from '@sveltejs/kit';
|
||||
import { logAudit } from '$lib/server/audit';
|
||||
import { hasPermission } from '$lib/roles';
|
||||
import type { Role } from '$lib/roles';
|
||||
|
||||
export const load: PageServerLoad = async ({ locals }) => {
|
||||
if (!hasPermission(locals.user!.role as Role, 'sponsors')) error(403, 'Access denied');
|
||||
const allSponsors = await db.select().from(sponsors).orderBy(asc(sponsors.sortOrder));
|
||||
|
||||
const grouped = {
|
||||
top_dog: allSponsors.filter(s => s.tier === 'top_dog'),
|
||||
wagging_tails: allSponsors.filter(s => s.tier === 'wagging_tails'),
|
||||
wet_noses: allSponsors.filter(s => s.tier === 'wet_noses')
|
||||
};
|
||||
|
||||
return { sponsors: allSponsors, grouped };
|
||||
};
|
||||
|
||||
export const actions: Actions = {
|
||||
toggleActive: async ({ request, locals }) => {
|
||||
if (!hasPermission(locals.user!.role as Role, 'sponsors')) error(403, 'Access denied');
|
||||
const fd = await request.formData();
|
||||
const sponsorId = parseInt(fd.get('sponsorId') as string, 10);
|
||||
const active = fd.get('active') === 'true';
|
||||
|
||||
if (!sponsorId || isNaN(sponsorId)) return fail(400, { error: 'Invalid sponsor ID' });
|
||||
|
||||
await db.update(sponsors).set({ active }).where(eq(sponsors.id, sponsorId));
|
||||
|
||||
await logAudit({
|
||||
userId: locals.user?.id ?? undefined,
|
||||
action: 'toggle_sponsor_active',
|
||||
entity: 'sponsor',
|
||||
entityId: sponsorId,
|
||||
diff: { active }
|
||||
});
|
||||
|
||||
return { success: true };
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user