Stundenaufzeichnung/src/routes/+page.server.ts

173 lines
3.4 KiB
TypeScript

import type { SQLiteError } from "bun:sqlite"
import { fail, redirect } from '@sveltejs/kit';
import { toInt, parseDate, isTimeValidHHMM } from "$lib/util"
import { get_user, User } from "$lib/server/database";
export async function load({ locals }) {
return {
records: locals.user.get_entries()
};
}
export const actions = {
new_entry: async ({locals, request}) => {
const ok = "ok";
const missing = "missing";
const invalid = "invalid";
const data = await request.formData();
let date = data.get("date");
let start = data.get("start");
let end = data.get("end");
let comment = data.get("comment");
let return_obj = {
date : {
status: ok,
value: date
},
start : {
status: ok,
value: start
},
end : {
status: ok,
value: end
},
comment : {
status: ok,
value: comment
},
}
if (date == null) {
return_obj.date.status = missing;
} else if (parseDate(date) == null) {
return_obj.date.status = invalid;
}
if (start == null) {
return_obj.start.status = missing;
} else if (!isTimeValidHHMM(start)) {
return_obj.start.status = invalid;
}
if (end == null) {
return_obj.end.status = missing;
} else if (!isTimeValidHHMM(end)) {
return_obj.end.status = invalid;
}
console.log(return_obj);
if (Object.keys(return_obj).some((v) => { return return_obj[v].status != ok; })) {
return fail(400, { new_entry: return_obj });
}
let res = locals.user.insert_entry(date, start, end, comment);
if (!res) {
return fail(500, { })
}
return { new_entry: { success: true } };
},
edit_entry: async ({locals, request}) => {
const ok = "ok";
const missing = "missing";
const invalid = "invalid";
const data = await request.formData();
let id = data.get("id");
let date = data.get("date");
let start = data.get("start");
let end = data.get("end");
let comment = data.get("comment");
let return_obj = {
id: {
status: ok,
value: id,
},
date : {
status: ok,
value: date
},
start : {
status: ok,
value: start
},
end : {
status: ok,
value: end
},
comment : {
status: ok,
value: comment
},
}
if (id == null) {
return_obj.id.status = missing;
} else if (isNaN(toInt(id))) {
return_obj.id.status = invalid;
}
if (date == null) {
return_obj.date.status = missing;
} else if (parseDate(date) == null) {
return_obj.date.status = invalid;
}
if (start == null) {
return_obj.start.status = missing;
} else if (!isTimeValidHHMM(start)) {
return_obj.start.status = invalid;
}
if (end == null) {
return_obj.end.status = missing;
} else if (!isTimeValidHHMM(end)) {
return_obj.end.status = invalid;
}
if (Object.keys(return_obj).some((v) => { return return_obj[v].status != ok; })) {
return fail(400, { edit_entry: return_obj });
}
let current = locals.user.get_entry(id);
if (!current) {
return fail(404, { new_entry: return_obj });
}
if (current.id == id && current.date == date && current.start == start && current.end == end && current.comment == comment) {
return { success: false, edit_entry: { return_obj } }
}
let res = false;
try {
res = locals.user.update_entry(id, date, start, end, comment);
} catch (e) {
if (!(e instanceof SQLiteError)) {
throw e;
}
}
if (!res) {
return fail(500, { })
}
redirect(303, '/');
return { success: true };
},
}