diff options
| author | Yuval Adam <_@yuv.al> | 2025-06-27 13:14:00 +0200 |
|---|---|---|
| committer | Yuval Adam <_@yuv.al> | 2025-06-27 13:14:00 +0200 |
| commit | 72b63296438f469fc261562690495580ab8547d9 (patch) | |
| tree | 5d6e7ed36b7c59b1371f0de3f7711496d2086348 /src/pages | |
| parent | bc750614c5780ff1f3e59d692492924ffe70edd6 (diff) | |
Extract common api stuffastro-base-cf
Diffstat (limited to 'src/pages')
| -rw-r--r-- | src/pages/api/tasks.ts | 58 | ||||
| -rw-r--r-- | src/pages/api/tasks/[id].ts | 43 |
2 files changed, 21 insertions, 80 deletions
diff --git a/src/pages/api/tasks.ts b/src/pages/api/tasks.ts index 8784e97..2b76ed3 100644 --- a/src/pages/api/tasks.ts +++ b/src/pages/api/tasks.ts @@ -1,68 +1,30 @@ import type { APIRoute } from 'astro'; +import { jsonResponse, getDB, handleAPIError } from '../../lib/api'; export const prerender = false; export const GET: APIRoute = async ({ locals }) => { - try { - const db = locals.runtime?.env?.DB; - - if (!db) { - console.error('Database not available'); - return new Response(JSON.stringify([]), { - status: 200, - headers: { 'Content-Type': 'application/json' } - }); - } - + return handleAPIError(async () => { + const db = getDB(locals); const { results } = await db.prepare('SELECT * FROM tasks ORDER BY created_at DESC').all(); - - return new Response(JSON.stringify(results || []), { - status: 200, - headers: { 'Content-Type': 'application/json' } - }); - } catch (error) { - console.error('Database error:', error); - return new Response(JSON.stringify([]), { - status: 200, - headers: { 'Content-Type': 'application/json' } - }); - } + return jsonResponse(results || []); + }, []); }; export const POST: APIRoute = async ({ request, locals }) => { - try { - const db = locals.runtime?.env?.DB; - - if (!db) { - return new Response(JSON.stringify({ error: 'Database not available' }), { - status: 503, - headers: { 'Content-Type': 'application/json' } - }); - } - + return handleAPIError(async () => { + const db = getDB(locals); const body = await request.json(); const { title, description } = body; if (!title) { - return new Response(JSON.stringify({ error: 'Title is required' }), { - status: 400, - headers: { 'Content-Type': 'application/json' } - }); + return jsonResponse({ error: 'Title is required' }, 400); } const { results } = await db.prepare( 'INSERT INTO tasks (title, description) VALUES (?, ?) RETURNING *' ).bind(title, description || '').all(); - return new Response(JSON.stringify(results?.[0] || { id: Date.now(), title, description, completed: false }), { - status: 201, - headers: { 'Content-Type': 'application/json' } - }); - } catch (error) { - console.error('Database error:', error); - return new Response(JSON.stringify({ error: 'Failed to create task' }), { - status: 500, - headers: { 'Content-Type': 'application/json' } - }); - } + return jsonResponse(results?.[0] || { id: Date.now(), title, description, completed: false }, 201); + }); };
\ No newline at end of file diff --git a/src/pages/api/tasks/[id].ts b/src/pages/api/tasks/[id].ts index a078d7c..55cc603 100644 --- a/src/pages/api/tasks/[id].ts +++ b/src/pages/api/tasks/[id].ts @@ -1,10 +1,11 @@ import type { APIRoute } from 'astro'; +import { jsonResponse, getDB, handleAPIError } from '../../../lib/api'; export const prerender = false; export const PUT: APIRoute = async ({ params, request, locals }) => { - try { - const db = locals.runtime.env.DB; + return handleAPIError(async () => { + const db = getDB(locals); const id = params.id; const body = await request.json(); const { title, description, completed } = body; @@ -14,46 +15,24 @@ export const PUT: APIRoute = async ({ params, request, locals }) => { ).bind(title, description || '', completed || false, id).all(); if (results.length === 0) { - return new Response(JSON.stringify({ error: 'Task not found' }), { - status: 404, - headers: { 'Content-Type': 'application/json' } - }); + return jsonResponse({ error: 'Task not found' }, 404); } - return new Response(JSON.stringify(results[0]), { - status: 200, - headers: { 'Content-Type': 'application/json' } - }); - } catch (error) { - return new Response(JSON.stringify({ error: 'Failed to update task' }), { - status: 500, - headers: { 'Content-Type': 'application/json' } - }); - } + return jsonResponse(results[0]); + }); }; export const DELETE: APIRoute = async ({ params, locals }) => { - try { - const db = locals.runtime.env.DB; + return handleAPIError(async () => { + const db = getDB(locals); const id = params.id; const { success } = await db.prepare('DELETE FROM tasks WHERE id = ?').bind(id).run(); if (!success) { - return new Response(JSON.stringify({ error: 'Task not found' }), { - status: 404, - headers: { 'Content-Type': 'application/json' } - }); + return jsonResponse({ error: 'Task not found' }, 404); } - return new Response(JSON.stringify({ message: 'Task deleted successfully' }), { - status: 200, - headers: { 'Content-Type': 'application/json' } - }); - } catch (error) { - return new Response(JSON.stringify({ error: 'Failed to delete task' }), { - status: 500, - headers: { 'Content-Type': 'application/json' } - }); - } + return jsonResponse({ message: 'Task deleted successfully' }); + }); };
\ No newline at end of file |
