diff options
Diffstat (limited to 'app/src/lib')
-rw-r--r-- | app/src/lib/common/assignments.ts | 18 | ||||
-rw-r--r-- | app/src/lib/server/assignments.ts | 27 | ||||
-rw-r--r-- | app/src/lib/server/beanstalkd.ts | 19 |
3 files changed, 47 insertions, 17 deletions
diff --git a/app/src/lib/common/assignments.ts b/app/src/lib/common/assignments.ts index 79553cd..6e9d574 100644 --- a/app/src/lib/common/assignments.ts +++ b/app/src/lib/common/assignments.ts @@ -7,12 +7,12 @@ export interface CemetaryPlot { } /** Corresponds to `assignment_state`. */ -export type AssignmentState = "AWAITING_GARDENER_NOTIFICATION" - | "AWAITING_FINISH" - | "AWAITING_WATERMARKING" - | "AWAITING_OWNER_NOTIFICATION" - | "DONE" - ; +export type AssignmentState = + | "AWAITING_GARDENER_NOTIFICATION" + | "AWAITING_FINISH" + | "AWAITING_WATERMARKING" + | "AWAITING_OWNER_NOTIFICATION" + | "DONE"; /** A row from the `assignments` table. */ export interface Assignment { @@ -23,10 +23,10 @@ export interface Assignment { state: AssignmentState; } - // FIXME: We have ORM at home. A more clearly defined (OOP) model layer. /** Checks whether the state of the assignment allows it to be "finished". */ export function canBeFinished(assignment: Assignment): boolean { - return (assignment.state === "AWAITING_GARDENER_NOTIFICATION" || - assignment.state === "AWAITING_FINISH") + return ( + assignment.state === "AWAITING_GARDENER_NOTIFICATION" || assignment.state === "AWAITING_FINISH" + ); } diff --git a/app/src/lib/server/assignments.ts b/app/src/lib/server/assignments.ts index c66f25c..9c28cff 100644 --- a/app/src/lib/server/assignments.ts +++ b/app/src/lib/server/assignments.ts @@ -1,6 +1,7 @@ -import { PutObjectCommand, type S3Client } from "@aws-sdk/client-s3"; /*=;* / +import { PutObjectCommand, type S3Client } from "@aws-sdk/client-s3"; /*=;*/ import type { ClientBase } from "pg"; -import type { CemetaryPlot, Assignment, AssignmentState } from "../common/assignments"; +import type { CemetaryPlot, Assignment } from "../common/assignments"; +import type BeanstalkdClient from "beanstalkd"; /** * Retrieves all assignments for the given user. @@ -73,17 +74,24 @@ export async function getAssignmentAndCemetaryById( } export interface FinishAssignmentArgs { + dbClient: ClientBase; + s3Client: S3Client; + beanstalkdClient: BeanstalkdClient; + images: { bytes: Uint8Array; name: string }[]; note?: string; assignmentId: number; } // TODO: Error recovery. -export async function finishAssignment( - dbClient: ClientBase, - s3Client: S3Client, - { images, note, assignmentId }: FinishAssignmentArgs, -): Promise<void> { +export async function finishAssignment({ + dbClient, + s3Client, + beanstalkdClient, + images, + note, + assignmentId, +}: FinishAssignmentArgs): Promise<void> { // Upload to S3, returning path // FIXME: Should be factored out? const uploadPromises = images.map(async (image) => { @@ -101,7 +109,10 @@ export async function finishAssignment( }); const uploadedImages = await Promise.all(uploadPromises); - // TODO: Add beanstalkd job + // Instruct background worker to do watermarking. + // FIXME: magic constants yay how fun + await beanstalkdClient.use("watermarking"); + console.debug(await beanstalkdClient.put(0, 0, 60, JSON.stringify({ assignmentId }))); await dbClient.query("BEGIN"); diff --git a/app/src/lib/server/beanstalkd.ts b/app/src/lib/server/beanstalkd.ts new file mode 100644 index 0000000..10f392a --- /dev/null +++ b/app/src/lib/server/beanstalkd.ts @@ -0,0 +1,19 @@ +import pkg from "beanstalkd"; +import type { Handle } from "@sveltejs/kit"; + +// Annoying CommonJS interop issue (vitejs/vite#2139) which combines with incorrect typings from DefinitelyTyped project :( +// @ts-ignore +const BeanstalkdClient = pkg.default as typeof pkg; + +export const beanstalkdHandle = (async ({ event, resolve }) => { + // FIXME: Should obv. read from env. + const beanstalkdClient = new BeanstalkdClient("localhost", 11300); + await beanstalkdClient.connect(); + + event.locals.beanstalkdClient = beanstalkdClient; + try { + return await resolve(event); + } finally { + beanstalkdClient.quit(); + } +}) satisfies Handle; |