"use server"; import { revalidatePath } from "next/cache"; import postgres from "postgres"; import { z } from "zod"; let sql = postgres(process.env.DATABASE_URL || process.env.POSTGRES_URL!, { ssl: "allow", }); // CREATE TABLE todos ( // id SERIAL PRIMARY KEY, // text TEXT NOT NULL // ); export async function createTodo( prevState: { message: string; }, formData: FormData, ) { const schema = z.object({ todo: z.string().min(1), }); const parse = schema.safeParse({ todo: formData.get("todo"), }); if (!parse.success) { return { message: "Failed to create todo" }; } const data = parse.data; try { await sql` INSERT INTO todos (text) VALUES (${data.todo}) `; revalidatePath("/"); return { message: `Added todo ${data.todo}` }; } catch (e) { return { message: "Failed to create todo" }; } } export async function deleteTodo( prevState: { message: string; }, formData: FormData, ) { const schema = z.object({ id: z.string().min(1), todo: z.string().min(1), }); const data = schema.parse({ id: formData.get("id"), todo: formData.get("todo"), }); try { await sql` DELETE FROM todos WHERE id = ${data.id}; `; revalidatePath("/"); return { message: `Deleted todo ${data.todo}` }; } catch (e) { return { message: "Failed to delete todo" }; } }