inserting signature endpoint and database methods
This commit is contained in:
11
packages/backend/src/models/database.ts
Normal file
11
packages/backend/src/models/database.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
import 'dotenv/config';
|
||||
import { drizzle } from 'drizzle-orm/node-postgres';
|
||||
import { pgTable, text, uuid } from 'drizzle-orm/pg-core';
|
||||
|
||||
const DATABASE_URL = process.env.DATABASE_URL;
|
||||
if (!DATABASE_URL) {
|
||||
throw new Error("DATABASE_URL is missing")
|
||||
}
|
||||
|
||||
export const db = drizzle(DATABASE_URL);
|
||||
|
||||
8
packages/backend/src/models/index.ts
Normal file
8
packages/backend/src/models/index.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
import { db } from "./database";
|
||||
import { signaturesTable } from "./schema";
|
||||
|
||||
export const insertSignature = async (signature: typeof signaturesTable.$inferInsert): Promise<typeof signaturesTable.$inferSelect | undefined> => {
|
||||
const [insertedSignature] = await db.insert(signaturesTable).values(signature).returning();
|
||||
|
||||
return insertedSignature;
|
||||
}
|
||||
8
packages/backend/src/models/schema.ts
Normal file
8
packages/backend/src/models/schema.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
import { pgTable, text, uuid } from "drizzle-orm/pg-core";
|
||||
|
||||
export const signaturesTable = pgTable("signatures", {
|
||||
id: uuid().primaryKey().defaultRandom(),
|
||||
email: text().notNull(),
|
||||
name: text(),
|
||||
comment: text(),
|
||||
});
|
||||
29
packages/backend/src/routes/sign-petition.ts
Normal file
29
packages/backend/src/routes/sign-petition.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
import { z } from "zod"
|
||||
import { insertSignature } from "../models";
|
||||
|
||||
const signPetitionSchema = z.object({
|
||||
email: z.string(),
|
||||
name: z.string().trim().min(1).max(30).optional(),
|
||||
comment: z.string().trim().min(10).max(10_000).optional(),
|
||||
})
|
||||
|
||||
export const signPetition = async (req: Request): Promise<Response> => {
|
||||
const body = await req.json()
|
||||
|
||||
const validatedBody = signPetitionSchema.safeParse(body);
|
||||
if (!validatedBody.success) {
|
||||
return Response.json({ error: validatedBody.error }, { status: 400 });
|
||||
}
|
||||
|
||||
const insertedSignature = await insertSignature({
|
||||
email: validatedBody.data.email,
|
||||
name: validatedBody.data.name,
|
||||
comment: validatedBody.data.comment,
|
||||
})
|
||||
|
||||
if (!insertedSignature) {
|
||||
return Response.json({ error: "inserting signature in database" }, { status: 500 });
|
||||
}
|
||||
|
||||
return Response.json(insertedSignature, { status: 200 });
|
||||
}
|
||||
Reference in New Issue
Block a user