Add create account functionality

This commit is contained in:
Hornwitser 2025-03-07 23:53:57 +01:00
parent 598b9fd7d6
commit 8ef4636635
8 changed files with 145 additions and 12 deletions

View file

@ -0,0 +1,53 @@
import { readAccounts, writeAccounts, nextAccountId } from "~/server/database";
import { Account } from "~/shared/types/account";
export default defineEventHandler(async (event) => {
let session = await getAccountSession(event);
if (session) {
throw createError({
status: 409,
message: "Cannot create account while having an active session."
});
}
const formData = await readFormData(event);
const name = formData.get("name");
const accounts = await readAccounts();
let account: Account;
if (typeof name === "string") {
if (name === "") {
throw createError({
status: 400,
message: "Name cannot be blank",
});
}
if (accounts.some(account => account.name && account.name.toLowerCase() === name.toLowerCase())) {
throw createError({
status: 409,
message: "User already exists",
});
}
account = {
id: await nextAccountId(),
type: "regular",
name,
};
} else if (name === null) {
account = {
id: await nextAccountId(),
type: "anonymous",
};
} else {
throw createError({
status: 400,
message: "Invalid name",
});
}
accounts.push(account);
await writeAccounts(accounts);
await setAccountSession(event, account.id);
})

View file

@ -1,3 +1,19 @@
import { readAccounts } from "~/server/database";
export default defineEventHandler(async (event) => {
const session = await getAccountSession(event);
if (session) {
const accounts = await readAccounts();
const account = accounts.find(
account => account.id === session.accountId
);
if (account && account.type === "anonymous") {
throw createError({
status: 409,
message: "Cannot log out of an anonymous account",
});
}
}
await clearAccountSession(event);
})

View file

@ -9,6 +9,7 @@ import { generateDemoSchedule, generateDemoAccounts } from "./generate-demo-sche
const schedulePath = "data/schedule.json";
const subscriptionsPath = "data/subscriptions.json";
const accountsPath = "data/accounts.json";
const nextAccountIdPath = "data/next-account-id.json";
const sessionsPath = "data/sessions.json";
const nextSessionIdPath = "data/next-session-id.json";
@ -45,6 +46,15 @@ export async function writeSubscriptions(subscriptions: Subscription[]) {
await writeFile(subscriptionsPath, JSON.stringify(subscriptions, undefined, "\t") + "\n", "utf-8");
}
export async function nextAccountId() {
let nextId = await readJson(nextAccountIdPath, 0);
if (nextId === 0) {
nextId = Math.max(...(await readAccounts()).map(account => account.id), -1) + 1;
}
await writeFile(nextAccountIdPath, String(nextId + 1), "utf-8");
return nextId;
}
export async function readAccounts() {
return await readJson(accountsPath, generateDemoAccounts);
}