diff --git a/src/lib/db.ts b/src/lib/db.ts index 04377d3..c9ffa35 100644 --- a/src/lib/db.ts +++ b/src/lib/db.ts @@ -1,9 +1,19 @@ -import { createClient } from "@libsql/client"; +import { createClient, type Client } from "@libsql/client"; -const client = createClient({ - url: process.env.TURSO_DATABASE_URL!, - authToken: process.env.TURSO_AUTH_TOKEN, -}); +let client: Client | null = null; + +function getClient(): Client { + if (!client) { + if (!process.env.TURSO_DATABASE_URL) { + throw new Error("TURSO_DATABASE_URL is not set"); + } + client = createClient({ + url: process.env.TURSO_DATABASE_URL, + authToken: process.env.TURSO_AUTH_TOKEN, + }); + } + return client; +} interface Release { version: string; @@ -16,14 +26,25 @@ interface Release { } export async function getAnalyzedReleases(): Promise { - const result = await client.execute( - "SELECT * FROM releases ORDER BY analyzed_at DESC", - ); - // TODO(serhalp) Verify the right turso typing pattern - return result.rows.map((row) => ({ - ...row, - relevantPRs: JSON.parse(row.relevantPRs as string), - })) as unknown[] as Release[]; + try { + const dbClient = getClient(); + const timeoutPromise = new Promise((_, reject) => { + setTimeout(() => reject(new Error("Database query timeout")), 5000); + }); + + const result = await Promise.race([ + dbClient.execute("SELECT * FROM releases ORDER BY analyzed_at DESC"), + timeoutPromise, + ]); + + return result.rows.map((row) => ({ + ...row, + relevantPRs: JSON.parse(row.relevantPRs as string), + })) as unknown[] as Release[]; + } catch (error) { + console.error("Error fetching releases:", error); + return []; + } } export async function insertAnalyzedRelease( @@ -34,7 +55,8 @@ export async function insertAnalyzedRelease( releaseLink: string, relevantPRs: string[], ): Promise { - await client.execute({ + const dbClient = getClient(); + await dbClient.execute({ sql: "INSERT INTO releases (version, summary, score, relevance, releaseLink, relevantPRs, analyzed_at) VALUES (?, ?, ?, ?, ?, ?, ?)", args: [ version, diff --git a/src/pages/index.astro b/src/pages/index.astro index 729456c..e1474c6 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -40,63 +40,72 @@ Astro.response.headers.set(
{ - releases.map((release) => ( -
60 ? "border-l-8 border-error" : "" - }`} - > -
-

- - {release.version} - -

-
-
50 ? "white" : "black"};`} - > - Impact Score: {release.score} + releases.length === 0 ? ( +
+
+

No releases yet

+

Check back soon for Next.js release analysis!

+
+
+ ) : ( + releases.map((release) => ( +
60 ? "border-l-8 border-error" : "" + }`} + > +
+

+ + {release.version} + +

+
+
50 ? "white" : "black"};`} + > + Impact Score: {release.score} +
+
+ {formatDistanceToNow(new Date(release.analyzed_at))} ago +
-
- {formatDistanceToNow(new Date(release.analyzed_at))} ago +

{release.summary}

+
+

+ Relevance to Netlify: +

+

{release.relevance}

+ {release.relevantPRs.length > 0 && ( +
+

Relevant PRs:

+ +
+ )}
-

{release.summary}

-
-

- Relevance to Netlify: -

-

{release.relevance}

-
- {release.relevantPRs.length > 0 && ( -
-

Relevant PRs:

- -
- )}
-
- )) + )) + ) }