feat: add asset variants endpoint

This commit is contained in:
William Valentin
2026-02-01 16:47:50 -08:00
parent 5058afc980
commit 8479f50daa
3 changed files with 75 additions and 0 deletions

View File

@@ -0,0 +1,43 @@
import { z } from "zod";
import { getDb } from "@tline/db";
import { shapeVariants } from "./shape";
export const runtime = "nodejs";
const paramsSchema = z.object({
id: z.string().uuid(),
});
export async function GET(
_request: Request,
context: { params: Promise<{ id: string }> },
): Promise<Response> {
const rawParams = await context.params;
const paramsParsed = paramsSchema.safeParse(rawParams);
if (!paramsParsed.success) {
return Response.json(
{ error: "invalid_params", issues: paramsParsed.error.issues },
{ status: 400 },
);
}
const db = getDb();
const rows = await db<
{
kind: string;
size: number;
key: string;
mime_type: string;
width: number | null;
height: number | null;
}[]
>`
select kind, size, key, mime_type, width, height
from asset_variants
where asset_id = ${paramsParsed.data.id}
`;
return Response.json(shapeVariants(rows));
}

View File

@@ -0,0 +1,19 @@
type VariantRow = {
kind: string;
size: number;
key: string;
};
type VariantShape = {
kind: string;
size: number;
key: string;
};
export function shapeVariants(rows: VariantRow[]): VariantShape[] {
return rows.map((row) => ({
kind: row.kind,
size: row.size,
key: row.key,
}));
}

View File

@@ -0,0 +1,13 @@
import { test, expect } from "bun:test";
test("variants route returns only kind/size/key fields", async () => {
const { shapeVariants } = await import(
"../../app/api/assets/[id]/variants/shape",
);
const rows = [
{ kind: "video_mp4", size: 720, key: "derived/video/a.mp4", mime_type: "video/mp4" },
];
expect(shapeVariants(rows)).toEqual([
{ kind: "video_mp4", size: 720, key: "derived/video/a.mp4" },
]);
});