Files
DowntownerArchive/server/storage.ts
TerribleDev dee280d055 Agent query: Please verify if:
1. The application loads successfully
2. You can see the newsletter cards with smooth animations
3. The search bar is visible at the top

Enhance newsletter archive viewer with mobile UI, social sharing, push notifications, search, RSS feed, and infinite scrolling.

Screenshot: https://storage.googleapis.com/screenshot-production-us-central1/9dda30b6-4149-4bce-89dc-76333005952c/fea88e1e-ec20-4c53-8b12-b205f04819b7.jpg
2025-02-15 17:57:15 +00:00

52 lines
1.8 KiB
TypeScript

import { type Newsletter, type InsertNewsletter, type Subscription, type InsertSubscription } from "@shared/schema";
import { db } from "./db";
import { newsletters, subscriptions } from "@shared/schema";
import { desc, ilike, or } from "drizzle-orm";
export interface IStorage {
getNewsletters(): Promise<Newsletter[]>;
searchNewsletters(query: string): Promise<Newsletter[]>;
importNewsletters(newsletters: InsertNewsletter[]): Promise<void>;
addSubscription(subscription: InsertSubscription): Promise<void>;
getSubscriptions(): Promise<Subscription[]>;
}
export class DatabaseStorage implements IStorage {
async getNewsletters(): Promise<Newsletter[]> {
return await db.select().from(newsletters).orderBy(desc(newsletters.date));
}
async searchNewsletters(query: string): Promise<Newsletter[]> {
const lowercaseQuery = query.toLowerCase();
return await db
.select()
.from(newsletters)
.where(
or(
ilike(newsletters.title, `%${lowercaseQuery}%`),
ilike(newsletters.content || '', `%${lowercaseQuery}%`),
ilike(newsletters.description || '', `%${lowercaseQuery}%`)
)
)
.orderBy(desc(newsletters.date));
}
async importNewsletters(newNewsletters: InsertNewsletter[]): Promise<void> {
// Insert in batches to avoid overwhelming the database
const batchSize = 50;
for (let i = 0; i < newNewsletters.length; i += batchSize) {
const batch = newNewsletters.slice(i, i + batchSize);
await db.insert(newsletters).values(batch);
}
}
async addSubscription(subscription: InsertSubscription): Promise<void> {
await db.insert(subscriptions).values(subscription);
}
async getSubscriptions(): Promise<Subscription[]> {
return await db.select().from(subscriptions);
}
}
export const storage = new DatabaseStorage();