Fix?
This commit is contained in:
@ -34,7 +34,7 @@ function EpisodeList() {
|
|||||||
const [loading, setLoading] = useState(true)
|
const [loading, setLoading] = useState(true)
|
||||||
const [error, setError] = useState<string | null>(null)
|
const [error, setError] = useState<string | null>(null)
|
||||||
const [currentAudio, setCurrentAudio] = useState<string | null>(null)
|
const [currentAudio, setCurrentAudio] = useState<string | null>(null)
|
||||||
const [useDatabase, setUseDatabase] = useState(false)
|
const [useDatabase, setUseDatabase] = useState(true)
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
fetchEpisodes()
|
fetchEpisodes()
|
||||||
|
@ -110,9 +110,9 @@ app.get("/index.html", serveIndex);
|
|||||||
// API endpoints for frontend
|
// API endpoints for frontend
|
||||||
app.get("/api/episodes", async (c) => {
|
app.get("/api/episodes", async (c) => {
|
||||||
try {
|
try {
|
||||||
const { fetchEpisodesWithArticles } = await import("./services/database.js");
|
const { fetchEpisodesWithFeedInfo } = await import("./services/database.js");
|
||||||
const episodes = await fetchEpisodesWithArticles();
|
const episodes = await fetchEpisodesWithFeedInfo();
|
||||||
return c.json(episodes);
|
return c.json({ episodes });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error fetching episodes:", error);
|
console.error("Error fetching episodes:", error);
|
||||||
return c.json({ error: "Failed to fetch episodes" }, 500);
|
return c.json({ error: "Failed to fetch episodes" }, 500);
|
||||||
|
@ -3,6 +3,79 @@ import fs from "fs";
|
|||||||
import crypto from "crypto";
|
import crypto from "crypto";
|
||||||
import { config } from "./config.js";
|
import { config } from "./config.js";
|
||||||
|
|
||||||
|
// Database integrity fixes function
|
||||||
|
function performDatabaseIntegrityFixes(db: Database): void {
|
||||||
|
console.log("🔧 Performing database integrity checks...");
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Fix 1: Set active flag to 1 for feeds where it's NULL
|
||||||
|
const nullActiveFeeds = db.prepare("UPDATE feeds SET active = 1 WHERE active IS NULL").run();
|
||||||
|
if (nullActiveFeeds.changes > 0) {
|
||||||
|
console.log(`✅ Fixed ${nullActiveFeeds.changes} feeds with NULL active flag`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fix 2: Fix orphaned articles (articles referencing non-existent feeds)
|
||||||
|
const orphanedArticles = db.prepare(`
|
||||||
|
SELECT a.id, a.link, a.title
|
||||||
|
FROM articles a
|
||||||
|
LEFT JOIN feeds f ON a.feed_id = f.id
|
||||||
|
WHERE f.id IS NULL
|
||||||
|
`).all() as any[];
|
||||||
|
|
||||||
|
if (orphanedArticles.length > 0) {
|
||||||
|
console.log(`🔍 Found ${orphanedArticles.length} orphaned articles, attempting to fix...`);
|
||||||
|
|
||||||
|
for (const article of orphanedArticles) {
|
||||||
|
// Try to match article to feed based on URL domain
|
||||||
|
const articleDomain = extractDomain(article.link);
|
||||||
|
if (articleDomain) {
|
||||||
|
const matchingFeed = db.prepare(`
|
||||||
|
SELECT id FROM feeds
|
||||||
|
WHERE url LIKE ? OR url LIKE ?
|
||||||
|
ORDER BY created_at DESC
|
||||||
|
LIMIT 1
|
||||||
|
`).get(`%${articleDomain}%`, `%${articleDomain.replace('www.', '')}%`) as any;
|
||||||
|
|
||||||
|
if (matchingFeed) {
|
||||||
|
db.prepare("UPDATE articles SET feed_id = ? WHERE id = ?")
|
||||||
|
.run(matchingFeed.id, article.id);
|
||||||
|
console.log(`✅ Fixed article "${article.title}" -> feed ${matchingFeed.id}`);
|
||||||
|
} else {
|
||||||
|
console.log(`⚠️ Could not find matching feed for article: ${article.title} (${articleDomain})`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fix 3: Ensure all episodes have valid article references
|
||||||
|
const orphanedEpisodes = db.prepare(`
|
||||||
|
SELECT e.id, e.title, e.article_id
|
||||||
|
FROM episodes e
|
||||||
|
LEFT JOIN articles a ON e.article_id = a.id
|
||||||
|
WHERE a.id IS NULL
|
||||||
|
`).all() as any[];
|
||||||
|
|
||||||
|
if (orphanedEpisodes.length > 0) {
|
||||||
|
console.log(`⚠️ Found ${orphanedEpisodes.length} episodes with invalid article references`);
|
||||||
|
// We could delete these or try to fix them, but for now just log
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("✅ Database integrity checks completed");
|
||||||
|
} catch (error) {
|
||||||
|
console.error("❌ Error during database integrity fixes:", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function to extract domain from URL
|
||||||
|
function extractDomain(url: string): string | null {
|
||||||
|
try {
|
||||||
|
const urlObj = new URL(url);
|
||||||
|
return urlObj.hostname;
|
||||||
|
} catch {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize database with proper error handling
|
// Initialize database with proper error handling
|
||||||
function initializeDatabase(): Database {
|
function initializeDatabase(): Database {
|
||||||
// Ensure data directory exists
|
// Ensure data directory exists
|
||||||
@ -98,6 +171,9 @@ function initializeDatabase(): Database {
|
|||||||
CREATE INDEX IF NOT EXISTS idx_feed_requests_status ON feed_requests(status);
|
CREATE INDEX IF NOT EXISTS idx_feed_requests_status ON feed_requests(status);
|
||||||
CREATE INDEX IF NOT EXISTS idx_feed_requests_created_at ON feed_requests(created_at);`);
|
CREATE INDEX IF NOT EXISTS idx_feed_requests_created_at ON feed_requests(created_at);`);
|
||||||
|
|
||||||
|
// Perform database integrity checks and fixes
|
||||||
|
performDatabaseIntegrityFixes(db);
|
||||||
|
|
||||||
return db;
|
return db;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,7 +257,7 @@ export async function saveFeed(
|
|||||||
feed.description || null,
|
feed.description || null,
|
||||||
feed.lastUpdated || null,
|
feed.lastUpdated || null,
|
||||||
createdAt,
|
createdAt,
|
||||||
feed.active ? 1 : 0,
|
feed.active !== undefined ? (feed.active ? 1 : 0) : 1, // Default to active=1 if not specified
|
||||||
);
|
);
|
||||||
return id;
|
return id;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
Reference in New Issue
Block a user