feat: add patch method

This commit is contained in:
redglow
2026-06-21 15:09:19 +02:00
parent fe3fa6fca5
commit f3dff4871f
+40 -8
View File
@@ -14,7 +14,7 @@ const upload = multer({
const app = express(); const app = express();
const AddInput = z.object({ const PostInput = z.object({
file: z.object({ filename: z.string() }), file: z.object({ filename: z.string() }),
body: z.object({ body: z.object({
publication_date: z.coerce publication_date: z.coerce
@@ -25,7 +25,19 @@ const AddInput = z.object({
}), }),
}); });
const DeleteInput = z.object({ const PatchInput = z.object({
file: z.object({ filename: z.string().optional() }).optional(),
body: z.object({
publication_date: z.coerce
.date()
.optional()
.transform((x) => (x ? new Date(x).toISOString() : x)),
title: z.string().nonempty().optional(),
text: z.string().nonempty().optional(),
}),
});
const AnnouncementIdInput = z.object({
announcementId: z.coerce.number().positive(), announcementId: z.coerce.number().positive(),
}); });
@@ -34,19 +46,39 @@ app.get("/hello", (_, res) => {
}); });
app.post("/api/announcements", upload.single("image"), async (req, res) => { app.post("/api/announcements", upload.single("image"), async (req, res) => {
const addInput = AddInput.parse(req); const postInput = PostInput.parse(req);
await db await db
.insertInto("announcements") .insertInto("announcements")
.values({ .values({
title: addInput.body.title, title: postInput.body.title,
text: addInput.body.text, text: postInput.body.text,
publication_date: addInput.body.publication_date, publication_date: postInput.body.publication_date,
image: addInput.file.filename, image: postInput.file.filename,
}) })
.execute(); .execute();
res.redirect("/"); res.redirect("/");
}); });
app.patch(
"/api/announcements/:announcementId",
upload.single("image"),
async (req, res) => {
const patchInput = PatchInput.parse(req);
const { announcementId } = AnnouncementIdInput.parse(req.params);
await db
.updateTable("announcements")
.set({
title: patchInput.body.title,
text: patchInput.body.text,
publication_date: patchInput.body.publication_date,
image: patchInput.file?.filename,
})
.where("id", "=", announcementId)
.execute();
res.redirect("/");
},
);
app.get("/api/announcements", async (_, res) => { app.get("/api/announcements", async (_, res) => {
// await new Promise((resolve) => setTimeout(resolve, 1000)); // await new Promise((resolve) => setTimeout(resolve, 1000));
const announcements = await db const announcements = await db
@@ -58,7 +90,7 @@ app.get("/api/announcements", async (_, res) => {
}); });
app.delete("/api/announcements/:announcementId", async (req, res) => { app.delete("/api/announcements/:announcementId", async (req, res) => {
const { announcementId } = DeleteInput.parse(req.params); const { announcementId } = AnnouncementIdInput.parse(req.params);
const { image } = await db const { image } = await db
.selectFrom("announcements") .selectFrom("announcements")