Refactor ResultsArticle to handle optional num_files

This commit is contained in:
Kosztyk 2026-01-12 00:02:47 +02:00 committed by GitHub
parent 89c5b04fa8
commit 9cd47ceeb0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -12,18 +12,30 @@ import { userService } from "./user";
import { outputDir } from ".."; import { outputDir } from "..";
import { sendFileToErugo } from "../helpers/erugo"; import { sendFileToErugo } from "../helpers/erugo";
type JobsWithOptionalNumFiles = Jobs & {
num_files?: number;
};
function ResultsArticle({ function ResultsArticle({
job, job,
files, files,
outputPath, outputPath,
}: { }: {
job: Jobs; job: JobsWithOptionalNumFiles;
files: Filename[]; files: Filename[];
outputPath: string; outputPath: string;
}) { }) {
const maxFiles = Number((job as any).num_files ?? 0); // If the DB schema includes jobs.num_files use it; otherwise fall back to files.length
const doneFiles = Number(files.filter((f: any) => String((f as any).status || '').toLowerCase() === 'done').length); const maxFiles =
const isDone = doneFiles === maxFiles; typeof job.num_files === "number" && Number.isFinite(job.num_files)
? Number(job.num_files)
: Number(files.length);
const doneFiles = Number(
files.filter((f) => String(f.status ?? "").toLowerCase() === "done").length,
);
const isDone = maxFiles > 0 ? doneFiles >= maxFiles : true;
const disabledLinkClass = "pointer-events-none opacity-50"; const disabledLinkClass = "pointer-events-none opacity-50";
const busyAttrs = { disabled: true, "aria-busy": "true" } as const; const busyAttrs = { disabled: true, "aria-busy": "true" } as const;
@ -467,7 +479,7 @@ export const results = new Elysia()
const job = db const job = db
.query("SELECT * FROM jobs WHERE user_id = ? AND id = ?") .query("SELECT * FROM jobs WHERE user_id = ? AND id = ?")
.as(Jobs) .as(Jobs)
.get(user.id, params.jobId); .get(user.id, params.jobId) as JobsWithOptionalNumFiles | null;
if (!job) { if (!job) {
set.status = 404; set.status = 404;
@ -514,7 +526,7 @@ export const results = new Elysia()
const job = db const job = db
.query("SELECT * FROM jobs WHERE user_id = ? AND id = ?") .query("SELECT * FROM jobs WHERE user_id = ? AND id = ?")
.as(Jobs) .as(Jobs)
.get(user.id, params.jobId); .get(user.id, params.jobId) as JobsWithOptionalNumFiles | null;
if (!job) { if (!job) {
set.status = 404; set.status = 404;
@ -547,9 +559,7 @@ export const results = new Elysia()
} }
const file = db const file = db
.query( .query("SELECT * FROM file_names WHERE job_id = ? AND output_file_name = ?")
"SELECT * FROM file_names WHERE job_id = ? AND output_file_name = ?",
)
.as(Filename) .as(Filename)
.get(params.jobId, body.fileName); .get(params.jobId, body.fileName);
@ -575,7 +585,7 @@ export const results = new Elysia()
const result = await sendFileToErugo(payload); const result = await sendFileToErugo(payload);
return result; return result;
} catch (err: any) { } catch (err: unknown) {
console.error(err); console.error(err);
set.status = 500; set.status = 500;
return { message: "Failed to share with Erugo" }; return { message: "Failed to share with Erugo" };
@ -591,5 +601,3 @@ export const results = new Elysia()
}), }),
}, },
); );