Basic setup for R2 verification presigning

This commit is contained in:
Dominic Ferrando
2026-09-26 20:52:08 -04:00
parent 91f682ec71
commit db206bafa3
3 changed files with 46 additions and 18 deletions
+12 -11
View File
@@ -14,8 +14,6 @@ export const VerificationStatusSchema = t.Union([
]);
export type VerificationStatus = Static<typeof VerificationStatusSchema>;
const REQUIRED_MEDIA_ACTIVITIES = Object.values(Activity);
const MEDIA_KEY_COLUMN = {
[Activity.BackSquat]: "media_key_back_squat",
[Activity.Deadlift]: "media_key_deadlift",
@@ -33,21 +31,24 @@ const ALLOWED_FROM = {
} satisfies Record<string, VerificationStatus[]>;
export class VerificationsService {
static readonly REQUIRED_MEDIA_ACTIVITIES = Object.values(Activity);
static readonly ALLOWED_MEDIA_RE = /^(video\/(mp4|quicktime|webm)|image\/(png|jpeg))$/;
static missingActivityMediaKeys(verification: Pick<Selectable<DB["verifications"]>, (typeof MEDIA_KEY_COLUMN)[Activity]>) {
return REQUIRED_MEDIA_ACTIVITIES.filter((activity) => !verification[MEDIA_KEY_COLUMN[activity]]);
return VerificationsService.REQUIRED_MEDIA_ACTIVITIES.filter((activity) => !verification[MEDIA_KEY_COLUMN[activity]]);
}
async create(assessmentId: string, activityMediaKeys: ActivityMediaKeys) {
async create(assessmentId: string, activityMediaKeys?: ActivityMediaKeys) {
return await db.insertInto("verifications")
.values({
assessment_id: assessmentId,
status: "draft" satisfies VerificationStatus,
media_key_back_squat: activityMediaKeys[Activity.BackSquat] ?? null,
media_key_deadlift: activityMediaKeys[Activity.Deadlift] ?? null,
media_key_bench_press: activityMediaKeys[Activity.BenchPress] ?? null,
media_key_broad_jump: activityMediaKeys[Activity.BroadJump] ?? null,
media_key_run: activityMediaKeys[Activity.Run] ?? null,
media_key_cone_drill: activityMediaKeys[Activity.ConeDrill] ?? null,
media_key_back_squat: activityMediaKeys?.[Activity.BackSquat] ?? null,
media_key_deadlift: activityMediaKeys?.[Activity.Deadlift] ?? null,
media_key_bench_press: activityMediaKeys?.[Activity.BenchPress] ?? null,
media_key_broad_jump: activityMediaKeys?.[Activity.BroadJump] ?? null,
media_key_run: activityMediaKeys?.[Activity.Run] ?? null,
media_key_cone_drill: activityMediaKeys?.[Activity.ConeDrill] ?? null,
})
.onConflict((oc) => oc.column("assessment_id").doNothing())
.returning(["id", "status"])
@@ -109,7 +110,7 @@ export class VerificationsService {
.where("id", "=", id)
.where("status", "in", ALLOWED_FROM.submit)
.where((eb) => eb.and(
REQUIRED_MEDIA_ACTIVITIES.map((activity) => eb(MEDIA_KEY_COLUMN[activity], "is not", null))
VerificationsService.REQUIRED_MEDIA_ACTIVITIES.map((activity) => eb(MEDIA_KEY_COLUMN[activity], "is not", null))
))
.set({ status: "submitted" satisfies VerificationStatus, submitted_at: new Date() })
.returning(["id", "status"])