|
1 | 1 | /** |
2 | | - * Simple test endpoint to verify database connection |
| 2 | + * Admin-only database connectivity check. |
3 | 3 | */ |
4 | 4 |
|
5 | | -import { createDatabase, effectPatterns } from "@effect-patterns/toolkit" |
6 | | -import { Effect } from "effect" |
7 | | -import { NextResponse } from "next/server" |
8 | | - |
9 | | -export async function GET() { |
10 | | - try { |
11 | | - const dbUrl = process.env.DATABASE_URL |
12 | | - if (!dbUrl) { |
13 | | - return NextResponse.json({ |
14 | | - success: false, |
15 | | - error: "DATABASE_URL not set", |
16 | | - envKeys: Object.keys(process.env).filter(k => k.includes("DATABASE") || k.includes("POSTGRES")) |
17 | | - }, { status: 500 }) |
18 | | - } |
19 | | - |
20 | | - const result = await Effect.runPromise( |
21 | | - Effect.gen(function* () { |
22 | | - const { db, close } = createDatabase(dbUrl) |
23 | | - |
24 | | - const patterns = yield* Effect.tryPromise(async () => { |
25 | | - return await db.select({ |
26 | | - id: effectPatterns.id, |
27 | | - title: effectPatterns.title, |
28 | | - skillLevel: effectPatterns.skillLevel, |
29 | | - category: effectPatterns.category |
30 | | - }).from(effectPatterns).limit(5) |
31 | | - }) |
32 | | - |
33 | | - yield* Effect.promise(() => close()) |
34 | | - return patterns |
35 | | - }) |
36 | | - ) |
37 | | - |
38 | | - return NextResponse.json({ |
39 | | - success: true, |
40 | | - count: result.length, |
41 | | - patterns: result.map((p: any) => ({ |
42 | | - id: p.id, |
43 | | - title: p.title, |
44 | | - skillLevel: p.skillLevel, |
45 | | - category: p.category |
46 | | - })) |
47 | | - }) |
48 | | - } catch (error) { |
49 | | - console.error("Database test error:", error) |
50 | | - const errorMessage = error instanceof Error ? error.message : String(error) |
51 | | - const errorStack = error instanceof Error ? error.stack : undefined |
52 | | - return NextResponse.json( |
53 | | - { |
54 | | - success: false, |
55 | | - error: "Database connection failed", |
56 | | - details: errorMessage, |
57 | | - stack: errorStack?.split('\n').slice(0, 5) |
58 | | - }, |
59 | | - { status: 500 } |
60 | | - ) |
61 | | - } |
62 | | -} |
| 5 | +import { createDatabase, effectPatterns } from "@effect-patterns/toolkit"; |
| 6 | +import { Effect } from "effect"; |
| 7 | +import { type NextRequest, NextResponse } from "next/server"; |
| 8 | +import { validateAdminKey } from "../../../src/auth/adminAuth"; |
| 9 | +import { errorHandler } from "../../../src/server/errorHandler"; |
| 10 | +import { runWithRuntime } from "../../../src/server/init"; |
| 11 | + |
| 12 | +const handleDatabaseTest = (request: NextRequest) => |
| 13 | + Effect.gen(function* () { |
| 14 | + yield* validateAdminKey(request); |
| 15 | + |
| 16 | + const dbUrl = process.env.DATABASE_URL; |
| 17 | + if (!dbUrl) { |
| 18 | + return yield* Effect.fail(new Error("DATABASE_URL not set")); |
| 19 | + } |
| 20 | + |
| 21 | + const { db, close } = createDatabase(dbUrl); |
| 22 | + const rows = yield* Effect.tryPromise({ |
| 23 | + try: () => |
| 24 | + db |
| 25 | + .select({ |
| 26 | + id: effectPatterns.id, |
| 27 | + title: effectPatterns.title, |
| 28 | + skillLevel: effectPatterns.skillLevel, |
| 29 | + category: effectPatterns.category, |
| 30 | + }) |
| 31 | + .from(effectPatterns) |
| 32 | + .limit(5), |
| 33 | + catch: (error) => new Error(`Database connection failed: ${String(error)}`), |
| 34 | + }).pipe( |
| 35 | + Effect.ensuring( |
| 36 | + Effect.tryPromise({ |
| 37 | + try: () => close(), |
| 38 | + catch: (error) => new Error(`Failed to close database connection: ${String(error)}`), |
| 39 | + }).pipe(Effect.ignore), |
| 40 | + ), |
| 41 | + ); |
63 | 42 |
|
| 43 | + return { |
| 44 | + success: true, |
| 45 | + count: rows.length, |
| 46 | + patterns: rows, |
| 47 | + }; |
| 48 | + }); |
| 49 | + |
| 50 | +export async function GET(request: NextRequest) { |
| 51 | + const result = await runWithRuntime( |
| 52 | + handleDatabaseTest(request).pipe( |
| 53 | + Effect.catchAll((error) => errorHandler(error)), |
| 54 | + ), |
| 55 | + ); |
| 56 | + |
| 57 | + if (result instanceof Response) { |
| 58 | + return result; |
| 59 | + } |
| 60 | + |
| 61 | + return NextResponse.json(result, { status: 200 }); |
| 62 | +} |
0 commit comments