import { fail, redirect } from '@sveltejs/kit'; import { hono } from '$lib/server/hono'; export async function load(event) { if (!event.locals.session) throw redirect(303, '/login'); const famId = event.locals.session.famId; const [configs, templates, members, progress, rewards] = await Promise.all([ hono.admin.bonusConfigs(event, famId), hono.admin.list(event, 'bonus-templates', famId), hono.admin.list(event, 'members', famId), hono.admin.bonusConfigProgress(event, famId), hono.admin.rewards(event, famId) ]); return { configs, templates, members, progress, rewards }; } export const actions = { createTemplate: async (event) => { if (!event.locals.session) throw redirect(303, '/login'); const famId = event.locals.session.famId; const fd = await event.request.formData(); const data: Record = { name: fd.get('name'), description: fd.get('description') || '', target: fd.get('target'), type: fd.get('type'), occurrence: fd.get('occurrence'), rewardType: fd.get('rewardType'), rewardValue: fd.get('rewardValue') }; const criteriaValue = fd.get('criteriaValue'); if (criteriaValue) data.criteriaValue = parseInt(criteriaValue as string, 10) || 0; const period = fd.get('period'); if (period !== null) data.period = period; if (data.occurrence === 'once') data.period = ''; try { const record = await hono.admin.create(event, 'bonus-templates', famId, data); return { record }; } catch (e) { return fail(400, { error: e instanceof Error ? e.message : 'Failed to create template' }); } }, updateTemplate: async (event) => { if (!event.locals.session) throw redirect(303, '/login'); const famId = event.locals.session.famId; const fd = await event.request.formData(); const id = fd.get('id') as string; const data: Record = {}; const name = fd.get('name'); if (name) data.name = name; const target = fd.get('target'); if (target) data.target = target; const type = fd.get('type'); if (type) data.type = type; const occurrence = fd.get('occurrence'); if (occurrence) data.occurrence = occurrence; const rewardType = fd.get('rewardType'); if (rewardType) data.rewardType = rewardType; const rewardValue = fd.get('rewardValue'); if (rewardValue) data.rewardValue = rewardValue; const criteriaValue = fd.get('criteriaValue'); if (criteriaValue) data.criteriaValue = parseInt(criteriaValue as string, 10) || 0; const period = fd.get('period'); if (period !== null) data.period = period; if (occurrence === 'once') data.period = ''; const description = fd.get('description'); if (description) data.description = description; try { const record = await hono.admin.update(event, 'bonus-templates', famId, id, data); return { record }; } catch (e) { return fail(400, { error: e instanceof Error ? e.message : 'Failed to update template' }); } }, deleteTemplate: async (event) => { if (!event.locals.session) throw redirect(303, '/login'); const famId = event.locals.session.famId; const fd = await event.request.formData(); const id = fd.get('id') as string; try { await hono.admin.remove(event, 'bonus-templates', famId, id); return { deleted: true }; } catch (e) { return fail(400, { error: e instanceof Error ? e.message : 'Failed to delete template' }); } }, createConfig: async (event) => { if (!event.locals.session) throw redirect(303, '/login'); const famId = event.locals.session.famId; const fd = await event.request.formData(); const startMode = fd.get('startMode') as string; const status = startMode === 'disabled' ? 'disabled' : 'active'; const data: Record = { name: fd.get('name'), target: fd.get('target'), type: fd.get('type'), occurrence: fd.get('occurrence'), rewardType: fd.get('rewardType'), rewardValue: fd.get('rewardValue'), status }; const criteriaValue = fd.get('criteriaValue'); if (criteriaValue) data.criteriaValue = parseInt(criteriaValue as string, 10) || 0; const period = fd.get('period'); if (period !== null) data.period = period; if (data.occurrence === 'once') data.period = ''; const description = fd.get('description'); if (description) data.description = description; const memberId = fd.get('memberId'); if (memberId) data.memberId = memberId; try { const record = await hono.admin.create(event, 'bonus-configs', famId, data); return { record }; } catch (e) { return fail(400, { error: e instanceof Error ? e.message : 'Failed to create config' }); } }, updateConfig: async (event) => { if (!event.locals.session) throw redirect(303, '/login'); const famId = event.locals.session.famId; const fd = await event.request.formData(); const id = fd.get('id') as string; const data: Record = {}; const name = fd.get('name'); if (name) data.name = name; const target = fd.get('target'); if (target) data.target = target; const type = fd.get('type'); if (type) data.type = type; const occurrence = fd.get('occurrence'); if (occurrence) data.occurrence = occurrence; const rewardType = fd.get('rewardType'); if (rewardType) data.rewardType = rewardType; const rewardValue = fd.get('rewardValue'); if (rewardValue) data.rewardValue = rewardValue; const criteriaValue = fd.get('criteriaValue'); if (criteriaValue) data.criteriaValue = parseInt(criteriaValue as string, 10) || 0; const period = fd.get('period'); if (period !== null) data.period = period; if (occurrence === 'once') data.period = ''; const description = fd.get('description'); if (description) data.description = description; const memberId = fd.get('memberId'); if (memberId !== null) data.memberId = memberId || null; try { const record = await hono.admin.update(event, 'bonus-configs', famId, id, data); return { record }; } catch (e) { return fail(400, { error: e instanceof Error ? e.message : 'Failed to update config' }); } }, deleteConfig: async (event) => { if (!event.locals.session) throw redirect(303, '/login'); const famId = event.locals.session.famId; const fd = await event.request.formData(); const id = fd.get('id') as string; try { await hono.admin.remove(event, 'bonus-configs', famId, id); return { deleted: true }; } catch (e) { return fail(400, { error: e instanceof Error ? e.message : 'Failed to delete config' }); } }, createFromTemplate: async (event) => { if (!event.locals.session) throw redirect(303, '/login'); const famId = event.locals.session.famId; const fd = await event.request.formData(); const startMode = fd.get('startMode') as string; const status = startMode === 'disabled' ? 'disabled' : 'active'; const data: Record = { name: fd.get('name'), description: fd.get('description') || '', target: fd.get('target'), type: fd.get('type'), occurrence: fd.get('occurrence'), rewardType: fd.get('rewardType'), rewardValue: fd.get('rewardValue'), criteriaValue: parseInt(fd.get('criteriaValue') as string, 10) || 0, period: fd.get('period') || '', memberId: fd.get('memberId') || '', status }; if (data.occurrence === 'once') data.period = ''; try { const record = await hono.admin.create(event, 'bonus-configs', famId, data); return { record }; } catch (e) { return fail(400, { error: e instanceof Error ? e.message : 'Failed to create bonus from template' }); } }, assignConfig: async (event) => { if (!event.locals.session) throw redirect(303, '/login'); const famId = event.locals.session.famId; const fd = await event.request.formData(); const id = fd.get('id') as string; const target = fd.get('target') as string; const memberId = fd.get('memberId') as string; try { const record = await hono.admin.assignBonusConfig(event, famId, id, { target, memberId: memberId || null }); return { record }; } catch (e) { return fail(400, { error: e instanceof Error ? e.message : 'Failed to assign bonus' }); } }, completeConfig: async (event) => { if (!event.locals.session) throw redirect(303, '/login'); const famId = event.locals.session.famId; const fd = await event.request.formData(); const id = fd.get('id') as string; try { const record = await hono.admin.completeBonusConfig(event, famId, id); return { record }; } catch (e) { return fail(400, { error: e instanceof Error ? e.message : 'Failed to complete bonus' }); } }, destroyConfig: async (event) => { if (!event.locals.session) throw redirect(303, '/login'); const famId = event.locals.session.famId; const fd = await event.request.formData(); const id = fd.get('id') as string; try { await hono.admin.destroyBonusConfig(event, famId, id); return { destroyed: true }; } catch (e) { return fail(400, { error: e instanceof Error ? e.message : 'Failed to delete bonus' }); } }, toggleConfig: async (event) => { if (!event.locals.session) throw redirect(303, '/login'); const famId = event.locals.session.famId; const fd = await event.request.formData(); const id = fd.get('id') as string; const currentStatus = fd.get('currentStatus') as string; const newStatus = currentStatus === 'disabled' ? 'active' : 'disabled'; try { const record = await hono.admin.update(event, 'bonus-configs', famId, id, { status: newStatus }); return { record }; } catch (e) { return fail(400, { error: e instanceof Error ? e.message : 'Failed to toggle bonus' }); } }, evaluate: async (event) => { if (!event.locals.session) throw redirect(303, '/login'); const famId = event.locals.session.famId; try { await hono.admin.evaluateBonusConfig(event, famId); } catch (e) { return { error: e instanceof Error ? e.message : 'Failed to evaluate' }; } } };