diff --git a/server/api/links/[id].delete.ts b/server/api/links/[id].delete.ts new file mode 100644 index 0000000..fba5750 --- /dev/null +++ b/server/api/links/[id].delete.ts @@ -0,0 +1,22 @@ +import { db } from "#server/db"; +import * as tables from "#server/db/schema"; +import { eq } from "drizzle-orm"; +import { z } from "zod"; + +const paramsSchema = z.object({ + id: z.number(), +}); + +export default defineEventHandler(async (event) => { + const params = await getValidatedRouterParams(event, paramsSchema.parse); + + const [link] = await db + .delete(tables.links) + .where(eq(tables.links.id, params.id)) + .returning(); + if (!link) { + throw createError({ statusCode: 404, message: "Link not found" }); + } + + return link; +}); diff --git a/server/api/links/[id].get.ts b/server/api/links/[id].get.ts new file mode 100644 index 0000000..3763228 --- /dev/null +++ b/server/api/links/[id].get.ts @@ -0,0 +1,21 @@ +import { db } from "#server/db"; +import * as tables from "#server/db/schema"; +import { eq } from "drizzle-orm"; +import { z } from "zod"; + +const paramsSchema = z.object({ + id: z.number(), +}); + +export default defineEventHandler(async (event) => { + const params = await getValidatedRouterParams(event, paramsSchema.parse); + + const link = await db.query.links.findFirst({ + where: eq(tables.links.id, params.id), + }); + if (!link) { + throw createError({ statusCode: 404, message: "Link not found" }); + } + + return link; +}); diff --git a/server/api/links/[id].patch.ts b/server/api/links/[id].patch.ts new file mode 100644 index 0000000..6eac284 --- /dev/null +++ b/server/api/links/[id].patch.ts @@ -0,0 +1,30 @@ +import { db } from "#server/db"; +import * as tables from "#server/db/schema"; +import { eq } from "drizzle-orm"; +import { z } from "zod"; + +const paramsSchema = z.object({ + id: z.number(), +}); + +const bodySchema = z.object({ + name: z.string().min(1).optional(), + path: z.string().min(1).optional(), + url: z.url().optional(), +}); + +export default defineEventHandler(async (event) => { + const params = await getValidatedRouterParams(event, paramsSchema.parse); + const body = await readValidatedBody(event, bodySchema.parse); + + const [link] = await db + .update(tables.links) + .set(body) + .where(eq(tables.links.id, params.id)) + .returning(); + if (!link) { + throw createError({ statusCode: 404, message: "Link not found" }); + } + + return link; +}); diff --git a/server/api/links/index.get.ts b/server/api/links/index.get.ts new file mode 100644 index 0000000..697162b --- /dev/null +++ b/server/api/links/index.get.ts @@ -0,0 +1,5 @@ +import { db } from "#server/db"; + +export default defineEventHandler(async () => { + return db.query.links.findMany(); +}); diff --git a/server/api/links/index.post.ts b/server/api/links/index.post.ts new file mode 100644 index 0000000..55d5920 --- /dev/null +++ b/server/api/links/index.post.ts @@ -0,0 +1,15 @@ +import { db } from "#server/db"; +import * as tables from "#server/db/schema"; +import { z } from "zod"; + +const bodySchema = z.object({ + name: z.string().min(1), + path: z.string().min(1), + url: z.url().min(1), +}); + +export default defineEventHandler(async (event) => { + const body = await readValidatedBody(event, bodySchema.parse); + const [link] = await db.insert(tables.links).values(body).returning(); + return link; +});