From 5af943e8bdf235472a8b169186f6cd98e3ce8cfb Mon Sep 17 00:00:00 2001 From: Satsuki Akiba Date: Sat, 7 Jun 2025 10:38:38 +0900 Subject: [PATCH] Revert "Update" This reverts commit 7e17e30925982208faa96d33290b3e330c348a17. --- server.ts | 102 ++++++++++++++++++++++++------------------------------ 1 file changed, 46 insertions(+), 56 deletions(-) diff --git a/server.ts b/server.ts index 18aee61..335c85a 100644 --- a/server.ts +++ b/server.ts @@ -2,11 +2,11 @@ import { Hono } from "hono"; import { serve } from "@hono/node-server"; import path from "path"; import { config, validateConfig } from "./services/config.js"; -import { - fetchAllEpisodes, +import { + fetchAllEpisodes, fetchEpisodesWithArticles, getAllFeeds, - getFeedByUrl, + getFeedByUrl } from "./services/database.js"; import { batchProcess, addNewFeedUrl } from "./scripts/fetch_and_generate.js"; @@ -35,34 +35,30 @@ app.get("/api/feeds", async (c) => { app.post("/api/feeds", async (c) => { try { const { feedUrl } = await c.req.json<{ feedUrl: string }>(); - - if ( - !feedUrl || - typeof feedUrl !== "string" || - !feedUrl.startsWith("http") - ) { + + if (!feedUrl || typeof feedUrl !== "string" || !feedUrl.startsWith('http')) { return c.json({ error: "Valid feed URL is required" }, 400); } - + console.log("➕ Adding new feed URL:", feedUrl); - + // Check if feed already exists const existingFeed = await getFeedByUrl(feedUrl); if (existingFeed) { - return c.json({ - result: "EXISTS", + return c.json({ + result: "EXISTS", message: "Feed URL already exists", - feed: existingFeed, + feed: existingFeed }); } - + // Add new feed await addNewFeedUrl(feedUrl); - - return c.json({ - result: "CREATED", + + return c.json({ + result: "CREATED", message: "Feed URL added successfully", - feedUrl, + feedUrl }); } catch (error) { console.error("Error adding feed:", error); @@ -93,18 +89,18 @@ app.get("/api/episodes/simple", async (c) => { app.post("/api/episodes/:id/regenerate", async (c) => { try { const id = c.req.param("id"); - + if (!id || id.trim() === "") { return c.json({ error: "Episode ID is required" }, 400); } - + console.log("🔄 Regeneration requested for episode ID:", id); // TODO: Implement regeneration logic - return c.json({ - result: "PENDING", + return c.json({ + result: "PENDING", episodeId: id, status: "pending", - message: "Regeneration feature will be implemented in a future update", + message: "Regeneration feature will be implemented in a future update" }); } catch (error) { console.error("Error requesting regeneration:", error); @@ -117,14 +113,14 @@ app.get("/api/stats", async (c) => { try { const feeds = await getAllFeeds(); const episodes = await fetchAllEpisodes(); - + const stats = { totalFeeds: feeds.length, - activeFeeds: feeds.filter((f) => f.active).length, + activeFeeds: feeds.filter(f => f.active).length, totalEpisodes: episodes.length, - lastUpdated: new Date().toISOString(), + lastUpdated: new Date().toISOString() }; - + return c.json(stats); } catch (error) { console.error("Error fetching stats:", error); @@ -135,16 +131,16 @@ app.get("/api/stats", async (c) => { app.post("/api/batch/trigger", async (c) => { try { console.log("🚀 Manual batch process triggered via API"); - + // Run batch process in background - runBatchProcess().catch((error) => { + runBatchProcess().catch(error => { console.error("❌ Manual batch process failed:", error); }); - - return c.json({ + + return c.json({ result: "TRIGGERED", message: "Batch process started in background", - timestamp: new Date().toISOString(), + timestamp: new Date().toISOString() }); } catch (error) { console.error("Error triggering batch process:", error); @@ -159,7 +155,7 @@ app.get("/assets/*", async (c) => { try { const filePath = path.join(config.paths.frontendBuildDir, c.req.path); const file = Bun.file(filePath); - + if (await file.exists()) { const contentType = filePath.endsWith(".js") ? "application/javascript" @@ -179,18 +175,15 @@ app.get("/assets/*", async (c) => { app.get("/podcast_audio/*", async (c) => { try { const audioFileName = c.req.path.substring("/podcast_audio/".length); - + // Basic security check if (audioFileName.includes("..") || audioFileName.includes("/")) { return c.notFound(); } - - const audioFilePath = path.join( - config.paths.podcastAudioDir, - audioFileName, - ); + + const audioFilePath = path.join(config.paths.podcastAudioDir, audioFileName); const file = Bun.file(audioFilePath); - + if (await file.exists()) { const blob = await file.arrayBuffer(); return c.body(blob, 200, { "Content-Type": "audio/mpeg" }); @@ -206,7 +199,7 @@ app.get("/podcast.xml", async (c) => { try { const filePath = path.join(config.paths.publicDir, "podcast.xml"); const file = Bun.file(filePath); - + if (await file.exists()) { const blob = await file.arrayBuffer(); return c.body(blob, 200, { @@ -214,7 +207,7 @@ app.get("/podcast.xml", async (c) => { "Cache-Control": "public, max-age=3600", // Cache for 1 hour }); } - + console.warn("podcast.xml not found"); return c.notFound(); } catch (error) { @@ -225,13 +218,10 @@ app.get("/podcast.xml", async (c) => { // Legacy endpoint - redirect to new one app.post("/api/add-feed", async (c) => { - return c.json( - { - error: "This endpoint is deprecated. Use POST /api/feeds instead.", - newEndpoint: "POST /api/feeds", - }, - 410, - ); + return c.json({ + error: "This endpoint is deprecated. Use POST /api/feeds instead.", + newEndpoint: "POST /api/feeds" + }, 410); }); // Frontend fallback routes @@ -239,12 +229,12 @@ async function serveIndex(c: any) { try { const indexPath = path.join(config.paths.frontendBuildDir, "index.html"); const file = Bun.file(indexPath); - + if (await file.exists()) { const blob = await file.arrayBuffer(); return c.body(blob, 200, { "Content-Type": "text/html; charset=utf-8" }); } - + console.error(`index.html not found at ${indexPath}`); return c.text("Frontend not built. Run 'bun run build:frontend'", 404); } catch (error) { @@ -275,9 +265,9 @@ function scheduleFirstBatchProcess() { function scheduleSixHourlyBatchProcess() { const SIX_HOURS_MS = 6 * 60 * 60 * 1000; // 6 hours in milliseconds - + console.log( - `🕕 Next batch process scheduled in 6 hours (${new Date(Date.now() + SIX_HOURS_MS).toLocaleString()})`, + `🕕 Next batch process scheduled in 6 hours (${new Date(Date.now() + SIX_HOURS_MS).toLocaleString()})` ); setTimeout(async () => { @@ -295,7 +285,7 @@ function scheduleSixHourlyBatchProcess() { async function runBatchProcess(): Promise { try { - Bun.spawn(["bun", "run", "scripts/fetch_and_generate.ts"]); + await batchProcess(); } catch (error) { console.error("Batch process failed:", error); throw error; @@ -312,7 +302,7 @@ serve( console.log(`🌟 Server is running on http://localhost:${info.port}`); console.log(`📡 Using configuration from: ${config.paths.projectRoot}`); console.log(`🗄️ Database: ${config.paths.dbPath}`); - + // Schedule batch processes scheduleFirstBatchProcess(); scheduleSixHourlyBatchProcess();