mirror of
https://github.com/pupperpowell/bibdle.git
synced 2026-10-22 05:54:10 -04:00
70 lines
2.2 KiB
TypeScript
70 lines
2.2 KiB
TypeScript
import { json } from '@sveltejs/kit';
|
|
import type { RequestHandler } from './$types';
|
|
import { db } from '$lib/server/db';
|
|
import { verseSubmissions, dailyVerses } from '$lib/server/db/schema';
|
|
import { eq, desc, asc } from 'drizzle-orm';
|
|
import { getCooldownState, todayUtcStr } from '$lib/server/verse-submission';
|
|
|
|
/**
|
|
* GET /api/submit-verse/status?localDate=YYYY-MM-DD
|
|
*
|
|
* Returns the state needed to render the win-screen submit button:
|
|
* whether the user can submit, the active cooldown (if any), their most
|
|
* recent submission, and their not-yet-reached upcoming submissions.
|
|
*/
|
|
export const GET: RequestHandler = async ({ locals }) => {
|
|
if (!locals.user) {
|
|
return json({ error: 'Unauthorized' }, { status: 401 });
|
|
}
|
|
const userId = locals.user.id;
|
|
|
|
const cooldown = await getCooldownState(db, userId);
|
|
|
|
// Most recent submission (by submitted_at) — joined to daily_verses for the
|
|
// canonical reference/window text that will actually play on its day.
|
|
const [lastRow] = await db
|
|
.select({
|
|
scheduledDate: verseSubmissions.scheduledDate,
|
|
reference: dailyVerses.reference
|
|
})
|
|
.from(verseSubmissions)
|
|
.leftJoin(dailyVerses, eq(verseSubmissions.scheduledDate, dailyVerses.date))
|
|
.where(eq(verseSubmissions.userId, userId))
|
|
.orderBy(desc(verseSubmissions.submittedAt))
|
|
.limit(1);
|
|
|
|
const lastSubmission = lastRow
|
|
? {
|
|
scheduledDate: lastRow.scheduledDate,
|
|
reference: lastRow.reference
|
|
}
|
|
: null;
|
|
|
|
// Upcoming = this user's submissions whose scheduled date hasn't been
|
|
// reached yet (server UTC today).
|
|
const today = todayUtcStr();
|
|
const upcomingRows = await db
|
|
.select({
|
|
scheduledDate: verseSubmissions.scheduledDate,
|
|
reference: dailyVerses.reference
|
|
})
|
|
.from(verseSubmissions)
|
|
.leftJoin(dailyVerses, eq(verseSubmissions.scheduledDate, dailyVerses.date))
|
|
.where(eq(verseSubmissions.userId, userId))
|
|
.orderBy(asc(verseSubmissions.scheduledDate));
|
|
|
|
const upcoming = upcomingRows
|
|
.filter((r) => r.scheduledDate > today)
|
|
.map((r) => ({
|
|
scheduledDate: r.scheduledDate,
|
|
reference: r.reference
|
|
}));
|
|
|
|
return json({
|
|
canSubmit: !cooldown.onCooldown,
|
|
cooldownEndsAt: cooldown.cooldownEndsAt,
|
|
lastSubmission,
|
|
upcoming
|
|
});
|
|
};
|