Add proper error type & error handling

This commit is contained in:
Zoe Roux 2024-12-08 22:23:49 +01:00
parent c8c6cccf6a
commit cdceb1a734
No known key found for this signature in database
5 changed files with 56 additions and 7 deletions

14
api/src/base.ts Normal file
View File

@ -0,0 +1,14 @@
import Elysia from "elysia";
import type { KError } from "./models/error";
export const base = new Elysia({ name: "base" })
.onError(({ code, error }) => {
if (code === "VALIDATION") {
return {
status: error.status,
message: error.message,
details: error,
} as KError;
}
})
.as("plugin");

View File

@ -1,15 +1,15 @@
import Elysia, { t } from "elysia";
import Elysia from "elysia";
import { Movie, SeedMovie } from "~/models/movie";
import { seedMovie, SeedMovieResponse } from "./movies";
import { Resource } from "~/models/utils";
import { comment } from "~/utils";
import { KError } from "~/models/error";
export const seed = new Elysia()
.model({
movie: Movie,
"seed-movie": SeedMovie,
"seed-movie-response": SeedMovieResponse,
error: t.String(),
})
.post(
"/movies",
@ -25,7 +25,7 @@ export const seed = new Elysia()
description: "Existing movie edited/updated.",
},
201: { ...SeedMovieResponse, description: "Created a new movie." },
400: "error",
400: { ...KError, description: "Invalid translation name" },
409: {
...Resource,
description: comment`
@ -33,6 +33,7 @@ export const seed = new Elysia()
Change the slug and re-run the request.
`,
},
422: { ...KError, description: "Invalid schema in body." },
},
detail: {
tags: ["movies"],

View File

@ -171,7 +171,7 @@ export const seedMovie = async (
}
return {
status: ret.updated ? "Ok" : "Created",
status: ret.updated ? "OK" : "Created",
id: ret.id,
slug: ret.slug,
videos: retVideos,

8
api/src/models/error.ts Normal file
View File

@ -0,0 +1,8 @@
import { t } from "elysia";
export const KError = t.Object({
status: t.Integer(),
message: t.String(),
details: t.Any(),
});
export type KError = typeof KError.static;

View File

@ -128,9 +128,35 @@ describe("Movie seeding", () => {
expect(body.slug).toBe(existing.slug);
});
test.todo("Missing videos send info", async () => {});
test.todo("Schema error", async () => {});
test.todo("Invalid translation name", async () => {});
it("Missing videos send info", async () => {
const vid = "a0ddf0ce-3258-4452-a670-aff36c76d524";
const [existing] = await db
.select()
.from(videos)
.where(eq(videos.id, vid))
.limit(1);
expect(existing).toBeUndefined();
const [resp, body] = await createMovie({
...dune,
videos: [vid],
});
expectStatus(resp, body).toBe(200);
expect(body.videos).toBeArrayOfSize(0);
});
it("Schema error (missing fields)", async () => {
const [resp, body] = await createMovie({
name: "dune",
} as any);
expectStatus(resp, body).toBe(422);
expect(body.status).toBe(422);
expect(body.message).toBeString();
expect(body.details).toBeObject();
// TODO: handle additional fields too
});
test.todo("Create correct video slug (version)", async () => {});
test.todo("Create correct video slug (part)", async () => {});
test.todo("Create correct video slug (rendering)", async () => {});