summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinnnus <[email protected]>2025-02-21 18:18:38 +0100
committerLinnnus <[email protected]>2025-02-21 18:18:38 +0100
commitb42bfa3abcd29cb977fbdc41a02d9f7f1ffeb1a2 (patch)
tree381320899b199ba8d2afa34b0e71a08cb2a24532
parentf014f485b0f58ca85aaa484f9d21865448aed9b0 (diff)
chore: Rename db{Conn => Client}
-rw-r--r--app/src/app.d.ts2
-rw-r--r--app/src/hooks.server.ts2
-rw-r--r--app/src/lib/server/assignments.ts22
-rw-r--r--app/src/lib/server/db.ts2
-rw-r--r--app/src/lib/server/sessions.ts23
-rw-r--r--app/src/lib/server/users.ts4
-rw-r--r--app/src/routes/assignments/+page.server.ts2
-rw-r--r--app/src/routes/assignments/[assignmentId]/+page.server.ts4
-rw-r--r--app/src/routes/login/+page.server.ts6
9 files changed, 35 insertions, 32 deletions
diff --git a/app/src/app.d.ts b/app/src/app.d.ts
index b7bd0e7..6dba3f1 100644
--- a/app/src/app.d.ts
+++ b/app/src/app.d.ts
@@ -8,7 +8,7 @@ declare global {
namespace App {
// interface Error {}
interface Locals {
- dbConn: PoolClient;
+ dbClient: PoolClient;
s3Client: S3Client;
diff --git a/app/src/hooks.server.ts b/app/src/hooks.server.ts
index 8439eb3..f342e03 100644
--- a/app/src/hooks.server.ts
+++ b/app/src/hooks.server.ts
@@ -30,7 +30,7 @@ const s3Handle = (async ({ event, resolve }) => {
const sessionHandle = (async ({ event, resolve }) => {
const sessionToken = event.cookies.get("SESSION_ID");
if (sessionToken) {
- const { user } = await validateSessionToken(event.locals.dbConn, sessionToken);
+ const { user } = await validateSessionToken(event.locals.dbClient, sessionToken);
if (user) {
event.locals.user = user;
}
diff --git a/app/src/lib/server/assignments.ts b/app/src/lib/server/assignments.ts
index 787865c..c66f25c 100644
--- a/app/src/lib/server/assignments.ts
+++ b/app/src/lib/server/assignments.ts
@@ -5,11 +5,11 @@ import type { CemetaryPlot, Assignment, AssignmentState } from "../common/assign
/**
* Retrieves all assignments for the given user.
*
- * @param dbConn Connection to database.
+ * @param dbClient Connection to database.
* @param userId ID used to identify user.
*/
-export async function getAssignments(dbConn: ClientBase, userId: number): Promise<Assignment[]> {
- const result = await dbConn.query(
+export async function getAssignments(dbClient: ClientBase, userId: number): Promise<Assignment[]> {
+ const result = await dbClient.query(
"SELECT * FROM assignments WHERE gardener_id = $1 ORDER BY date",
[userId],
);
@@ -33,7 +33,7 @@ type GetAssignmentResult =
* Retrieves a specfic assignment, along with relevant cemetary plot.
*/
export async function getAssignmentAndCemetaryById(
- dbConn: ClientBase,
+ dbClient: ClientBase,
assignmentId: number,
): Promise<GetAssignmentResult> {
const queryText = `SELECT
@@ -51,7 +51,7 @@ export async function getAssignmentAndCemetaryById(
INNER JOIN
cemetary_plots AS C ON c.id = a.cemetary_plot_id
WHERE c.id = $1`;
- const result = await dbConn.query({ rowMode: "array", text: queryText }, [assignmentId]);
+ const result = await dbClient.query({ rowMode: "array", text: queryText }, [assignmentId]);
if (result.rowCount == 0) {
return { assignment: null, cemetaryPlot: null };
}
@@ -80,7 +80,7 @@ export interface FinishAssignmentArgs {
// TODO: Error recovery.
export async function finishAssignment(
- dbConn: ClientBase,
+ dbClient: ClientBase,
s3Client: S3Client,
{ images, note, assignmentId }: FinishAssignmentArgs,
): Promise<void> {
@@ -103,13 +103,13 @@ export async function finishAssignment(
// TODO: Add beanstalkd job
- await dbConn.query("BEGIN");
+ await dbClient.query("BEGIN");
try {
// Create 'images' row for each image.
// FIXME: Apparently node-pg doesn't have an equivalent to Python's `insert_many`??
for (const image of uploadedImages) {
- dbConn.query({
+ dbClient.query({
name: "insert-assignment-image",
text: "INSERT INTO images(s3_path, original_filename, assignment_id) VALUES ($1, $2, $3)",
values: [image.key, image.name, assignmentId],
@@ -117,7 +117,7 @@ export async function finishAssignment(
}
// Update the assingment's state.
- dbConn.query(
+ dbClient.query(
`UPDATE
assignments
SET
@@ -128,13 +128,13 @@ export async function finishAssignment(
[note, assignmentId],
);
- dbConn.query("COMMIT");
+ dbClient.query("COMMIT");
} catch (err) {
// We should probably try to delete S3 objects.
// We should probably try to delete the job.
- await dbConn.query("ROLLBACK");
+ await dbClient.query("ROLLBACK");
throw err;
}
}
diff --git a/app/src/lib/server/db.ts b/app/src/lib/server/db.ts
index dcfcfd0..db001b7 100644
--- a/app/src/lib/server/db.ts
+++ b/app/src/lib/server/db.ts
@@ -15,6 +15,6 @@ pool.on("error", (err, client) => {
console.error("Database error: ", err, client);
});
-export function getDbConnection(): Promise<pg.PoolClient> {
+export function getDbClient(): Promise<pg.PoolClient> {
return pool.connect();
}
diff --git a/app/src/lib/server/sessions.ts b/app/src/lib/server/sessions.ts
index 69a8b46..502ab74 100644
--- a/app/src/lib/server/sessions.ts
+++ b/app/src/lib/server/sessions.ts
@@ -51,14 +51,14 @@ function encodeBase32LowerCaseNoPadding(input: Uint8Array): string {
const VALID_MILLISECONDS = 1000 * 60 * 60 * 24 * 30;
/** Creates a new session for the user with the given `userId`. */
-export async function createSession(dbConn: pg.ClientBase, userId: number): Promise<Session> {
+export async function createSession(dbClient: pg.ClientBase, userId: number): Promise<Session> {
const token = generateSessionToken();
const session: Session = {
token: token,
userId,
expiresAt: new Date(Date.now() + VALID_MILLISECONDS),
};
- await dbConn.query("INSERT INTO sessions(token, user_id, expires_at) VALUES ($1, $2, $3);", [
+ await dbClient.query("INSERT INTO sessions(token, user_id, expires_at) VALUES ($1, $2, $3);", [
session.token,
session.userId,
session.expiresAt,
@@ -78,11 +78,11 @@ export async function createSession(dbConn: pg.ClientBase, userId: number): Prom
* @returns A session + user pair if the session is valid, or `null` for both otherwise.
*/
export async function validateSessionToken(
- dbConn: pg.ClientBase,
+ dbClient: pg.ClientBase,
token: string,
): Promise<SessionValidationResult> {
// Step 1
- const result = await dbConn.query(
+ const result = await dbClient.query(
`SELECT * FROM sessions
INNER JOIN users ON users.id = sessions.user_id
WHERE token = $1;`,
@@ -110,7 +110,7 @@ export async function validateSessionToken(
// Step 2.
const now = Date.now();
if (now >= session.expiresAt.getTime()) {
- await invalidateSession(dbConn, session.token);
+ await invalidateSession(dbClient, session.token);
return { session: null, user: null };
}
@@ -118,7 +118,7 @@ export async function validateSessionToken(
// We only do this a bit into the period to avoid superflous database writes.
if (now >= session.expiresAt.getTime() - VALID_MILLISECONDS / 2) {
session.expiresAt = new Date(session.expiresAt.getTime() + VALID_MILLISECONDS / 2);
- await dbConn.query("UPDATE sessions SET expires_at = ? WHERE id = ?;", [
+ await dbClient.query("UPDATE sessions SET expires_at = ? WHERE id = ?;", [
session.expiresAt,
session.token,
]);
@@ -129,13 +129,16 @@ export async function validateSessionToken(
/** Invalidates the session with token `sessionToken`. */
export async function invalidateSession(
- dbConn: pg.ClientBase,
+ dbClient: pg.ClientBase,
sessionToken: string,
): Promise<void> {
- await dbConn.query("DELETE sessions WHERE token = ?;", [sessionToken]);
+ await dbClient.query("DELETE sessions WHERE token = ?;", [sessionToken]);
}
/** Invalidates all sessions for the user with the id `userId`. */
-export async function invalidateAllSessions(dbConn: pg.ClientBase, userId: number): Promise<void> {
- await dbConn.query("DELETE sessions WHERE user_id = ?", [userId]);
+export async function invalidateAllSessions(
+ dbClient: pg.ClientBase,
+ userId: number,
+): Promise<void> {
+ await dbClient.query("DELETE sessions WHERE user_id = ?", [userId]);
}
diff --git a/app/src/lib/server/users.ts b/app/src/lib/server/users.ts
index a2e734f..6998c66 100644
--- a/app/src/lib/server/users.ts
+++ b/app/src/lib/server/users.ts
@@ -17,11 +17,11 @@ export interface User {
* @returns The user, or `undefined` on authentication failure.
*/
export async function getUser(
- dbConn: pg.ClientBase,
+ dbClient: pg.ClientBase,
email: string,
password: string,
): Promise<User | undefined> {
- let result = await dbConn.query(
+ let result = await dbClient.query(
"SELECT * FROM users WHERE email = $1 AND password_hash = crypt($2, password_hash);",
[email, password],
);
diff --git a/app/src/routes/assignments/+page.server.ts b/app/src/routes/assignments/+page.server.ts
index 0b829cd..9e49def 100644
--- a/app/src/routes/assignments/+page.server.ts
+++ b/app/src/routes/assignments/+page.server.ts
@@ -7,7 +7,7 @@ export const load = (async ({ url, locals }) => {
redirect(303, `/login?redirectTo=${encodeURIComponent(url.toString())}`);
}
- const assignments = await getAssignments(locals.dbConn, locals.user.id);
+ const assignments = await getAssignments(locals.dbClient, locals.user.id);
return {
user: locals.user,
diff --git a/app/src/routes/assignments/[assignmentId]/+page.server.ts b/app/src/routes/assignments/[assignmentId]/+page.server.ts
index 280c5bd..3b53a7c 100644
--- a/app/src/routes/assignments/[assignmentId]/+page.server.ts
+++ b/app/src/routes/assignments/[assignmentId]/+page.server.ts
@@ -8,7 +8,7 @@ export const load = (async ({ params, url, locals }) => {
}
const { assignment, cemetaryPlot } = await getAssignmentAndCemetaryById(
- locals.dbConn,
+ locals.dbClient,
+params.assignmentId,
);
if (!assignment) {
@@ -42,7 +42,7 @@ export const actions = {
})),
);
- await finishAssignment(locals.dbConn, locals.s3Client, {
+ await finishAssignment(locals.dbClient, locals.s3Client, {
images,
note,
assignmentId: +params.assignmentId, // We have parsing at home...
diff --git a/app/src/routes/login/+page.server.ts b/app/src/routes/login/+page.server.ts
index d011af9..b64e190 100644
--- a/app/src/routes/login/+page.server.ts
+++ b/app/src/routes/login/+page.server.ts
@@ -4,7 +4,7 @@ import { fail, redirect } from "@sveltejs/kit";
import type { Actions } from "./$types";
export const actions = {
- default: async ({ url, cookies, request, locals: { dbConn } }) => {
+ default: async ({ url, cookies, request, locals: { dbClient: dbClient } }) => {
const formData = Object.fromEntries(await request.formData()) as {
email?: string;
password?: string;
@@ -13,7 +13,7 @@ export const actions = {
return fail(400, { failure: true, error: "Du skal udfylde alle felterne!" });
}
- const user = await getUser(dbConn, formData.email, formData.password);
+ const user = await getUser(dbClient, formData.email, formData.password);
if (!user) {
// It's important that we don't leak _which_ value is missing.
return fail(404, { failure: true, error: "Forkert email/kodeord kombi!" });
@@ -21,7 +21,7 @@ export const actions = {
console.debug("Found user %o", user);
// The user has proven that they posses the right credentials. In return they gain a session token, which can be used to authenticate future requests.
- const session = await createSession(dbConn, user.id);
+ const session = await createSession(dbClient, user.id);
cookies.set("SESSION_ID", session.token, {
path: "/",
secure: true,