47 lines
1.4 KiB
TypeScript
47 lines
1.4 KiB
TypeScript
|
import { Account } from "~/shared/types/account";
|
||
|
import { readAccounts, readSchedule, writeAccounts, writeSchedule } from "~/server/database";
|
||
|
import { broadcastUpdate } from "~/server/streams";
|
||
|
|
||
|
export default defineEventHandler(async (event) => {
|
||
|
const session = await requireAccountSession(event);
|
||
|
const body: Pick<Account, "interestedIds"> = await readBody(event);
|
||
|
if (
|
||
|
!(body.interestedIds instanceof Array)
|
||
|
|| !body.interestedIds.every(id => typeof id === "string")
|
||
|
) {
|
||
|
throw createError({
|
||
|
status: 400,
|
||
|
message: "Invalid interestedIds",
|
||
|
});
|
||
|
}
|
||
|
|
||
|
const accounts = await readAccounts();
|
||
|
const sessionAccount = accounts.find(account => account.id === session.accountId);
|
||
|
if (!sessionAccount) {
|
||
|
throw Error("Account does not exist");
|
||
|
}
|
||
|
|
||
|
if (body.interestedIds.length) {
|
||
|
sessionAccount.interestedIds = body.interestedIds;
|
||
|
} else {
|
||
|
delete sessionAccount.interestedIds;
|
||
|
}
|
||
|
await writeAccounts(accounts);
|
||
|
|
||
|
const counts = new Map();
|
||
|
for (const account of accounts)
|
||
|
if (account.interestedIds)
|
||
|
for (const id of account.interestedIds)
|
||
|
counts.set(id, (counts.get(id) ?? 0) + 1);
|
||
|
|
||
|
const schedule = await readSchedule();
|
||
|
for (const event of schedule.events) {
|
||
|
event.interested = counts.get(event.id);
|
||
|
for (const slot of event.slots) {
|
||
|
slot.interested = counts.get(slot.id);
|
||
|
}
|
||
|
}
|
||
|
await writeSchedule(schedule);
|
||
|
broadcastUpdate(schedule);
|
||
|
})
|