diff options
author | Linnnus <[email protected]> | 2025-02-21 18:18:38 +0100 |
---|---|---|
committer | Linnnus <[email protected]> | 2025-02-21 18:18:38 +0100 |
commit | b42bfa3abcd29cb977fbdc41a02d9f7f1ffeb1a2 (patch) | |
tree | 381320899b199ba8d2afa34b0e71a08cb2a24532 | |
parent | f014f485b0f58ca85aaa484f9d21865448aed9b0 (diff) |
chore: Rename db{Conn => Client}
-rw-r--r-- | app/src/app.d.ts | 2 | ||||
-rw-r--r-- | app/src/hooks.server.ts | 2 | ||||
-rw-r--r-- | app/src/lib/server/assignments.ts | 22 | ||||
-rw-r--r-- | app/src/lib/server/db.ts | 2 | ||||
-rw-r--r-- | app/src/lib/server/sessions.ts | 23 | ||||
-rw-r--r-- | app/src/lib/server/users.ts | 4 | ||||
-rw-r--r-- | app/src/routes/assignments/+page.server.ts | 2 | ||||
-rw-r--r-- | app/src/routes/assignments/[assignmentId]/+page.server.ts | 4 | ||||
-rw-r--r-- | app/src/routes/login/+page.server.ts | 6 |
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, |