Fix database conflict and update schema
This commit is contained in:
		@@ -16,6 +16,12 @@ function initializeDatabase(): Database {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const db = new Database(config.paths.dbPath);
 | 
			
		||||
  
 | 
			
		||||
  // Enable WAL mode for better concurrent access
 | 
			
		||||
  db.exec("PRAGMA journal_mode = WAL;");
 | 
			
		||||
  db.exec("PRAGMA synchronous = NORMAL;");
 | 
			
		||||
  db.exec("PRAGMA cache_size = 1000;");
 | 
			
		||||
  db.exec("PRAGMA temp_store = memory;");
 | 
			
		||||
 | 
			
		||||
  // Ensure schema is set up - use the complete schema
 | 
			
		||||
  db.exec(`CREATE TABLE IF NOT EXISTS feeds (
 | 
			
		||||
@@ -70,13 +76,27 @@ function initializeDatabase(): Database {
 | 
			
		||||
    status TEXT DEFAULT 'pending' CHECK (status IN ('pending', 'processing', 'failed'))
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  CREATE TABLE IF NOT EXISTS feed_requests (
 | 
			
		||||
    id TEXT PRIMARY KEY,
 | 
			
		||||
    url TEXT NOT NULL,
 | 
			
		||||
    requested_by TEXT,
 | 
			
		||||
    request_message TEXT,
 | 
			
		||||
    status TEXT DEFAULT 'pending' CHECK (status IN ('pending', 'approved', 'rejected')),
 | 
			
		||||
    created_at TEXT NOT NULL,
 | 
			
		||||
    reviewed_at TEXT,
 | 
			
		||||
    reviewed_by TEXT,
 | 
			
		||||
    admin_notes TEXT
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  CREATE INDEX IF NOT EXISTS idx_articles_feed_id ON articles(feed_id);
 | 
			
		||||
  CREATE INDEX IF NOT EXISTS idx_articles_pub_date ON articles(pub_date);
 | 
			
		||||
  CREATE INDEX IF NOT EXISTS idx_articles_processed ON articles(processed);
 | 
			
		||||
  CREATE INDEX IF NOT EXISTS idx_episodes_article_id ON episodes(article_id);
 | 
			
		||||
  CREATE INDEX IF NOT EXISTS idx_feeds_active ON feeds(active);
 | 
			
		||||
  CREATE INDEX IF NOT EXISTS idx_tts_queue_status ON tts_queue(status);
 | 
			
		||||
  CREATE INDEX IF NOT EXISTS idx_tts_queue_created_at ON tts_queue(created_at);`);
 | 
			
		||||
  CREATE INDEX IF NOT EXISTS idx_tts_queue_created_at ON tts_queue(created_at);
 | 
			
		||||
  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);`);
 | 
			
		||||
 | 
			
		||||
  return db;
 | 
			
		||||
}
 | 
			
		||||
@@ -601,6 +621,83 @@ export async function removeFromQueue(queueId: string): Promise<void> {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Feed Request management functions
 | 
			
		||||
export interface FeedRequest {
 | 
			
		||||
  id: string;
 | 
			
		||||
  url: string;
 | 
			
		||||
  requestedBy?: string;
 | 
			
		||||
  requestMessage?: string;
 | 
			
		||||
  status: 'pending' | 'approved' | 'rejected';
 | 
			
		||||
  createdAt: string;
 | 
			
		||||
  reviewedAt?: string;
 | 
			
		||||
  reviewedBy?: string;
 | 
			
		||||
  adminNotes?: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export async function submitFeedRequest(
 | 
			
		||||
  request: Omit<FeedRequest, "id" | "createdAt" | "status">
 | 
			
		||||
): Promise<string> {
 | 
			
		||||
  const id = crypto.randomUUID();
 | 
			
		||||
  const createdAt = new Date().toISOString();
 | 
			
		||||
 | 
			
		||||
  try {
 | 
			
		||||
    const stmt = db.prepare(
 | 
			
		||||
      "INSERT INTO feed_requests (id, url, requested_by, request_message, status, created_at) VALUES (?, ?, ?, ?, 'pending', ?)",
 | 
			
		||||
    );
 | 
			
		||||
    stmt.run(id, request.url, request.requestedBy || null, request.requestMessage || null, createdAt);
 | 
			
		||||
    console.log(`Feed request submitted: ${request.url}`);
 | 
			
		||||
    return id;
 | 
			
		||||
  } catch (error) {
 | 
			
		||||
    console.error("Error submitting feed request:", error);
 | 
			
		||||
    throw error;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export async function getFeedRequests(status?: string): Promise<FeedRequest[]> {
 | 
			
		||||
  try {
 | 
			
		||||
    const sql = status
 | 
			
		||||
      ? "SELECT * FROM feed_requests WHERE status = ? ORDER BY created_at DESC"
 | 
			
		||||
      : "SELECT * FROM feed_requests ORDER BY created_at DESC";
 | 
			
		||||
    
 | 
			
		||||
    const stmt = db.prepare(sql);
 | 
			
		||||
    const rows = status ? stmt.all(status) : stmt.all();
 | 
			
		||||
 | 
			
		||||
    return (rows as any[]).map((row) => ({
 | 
			
		||||
      id: row.id,
 | 
			
		||||
      url: row.url,
 | 
			
		||||
      requestedBy: row.requested_by,
 | 
			
		||||
      requestMessage: row.request_message,
 | 
			
		||||
      status: row.status,
 | 
			
		||||
      createdAt: row.created_at,
 | 
			
		||||
      reviewedAt: row.reviewed_at,
 | 
			
		||||
      reviewedBy: row.reviewed_by,
 | 
			
		||||
      adminNotes: row.admin_notes,
 | 
			
		||||
    }));
 | 
			
		||||
  } catch (error) {
 | 
			
		||||
    console.error("Error getting feed requests:", error);
 | 
			
		||||
    throw error;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export async function updateFeedRequestStatus(
 | 
			
		||||
  requestId: string,
 | 
			
		||||
  status: 'approved' | 'rejected',
 | 
			
		||||
  reviewedBy?: string,
 | 
			
		||||
  adminNotes?: string,
 | 
			
		||||
): Promise<boolean> {
 | 
			
		||||
  try {
 | 
			
		||||
    const reviewedAt = new Date().toISOString();
 | 
			
		||||
    const stmt = db.prepare(
 | 
			
		||||
      "UPDATE feed_requests SET status = ?, reviewed_at = ?, reviewed_by = ?, admin_notes = ? WHERE id = ?",
 | 
			
		||||
    );
 | 
			
		||||
    const result = stmt.run(status, reviewedAt, reviewedBy || null, adminNotes || null, requestId);
 | 
			
		||||
    return result.changes > 0;
 | 
			
		||||
  } catch (error) {
 | 
			
		||||
    console.error("Error updating feed request status:", error);
 | 
			
		||||
    throw error;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function closeDatabase(): void {
 | 
			
		||||
  db.close();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user