65 lines
2.4 KiB
TypeScript
65 lines
2.4 KiB
TypeScript
import { type Article, type InsertArticle, articles } from "@shared/schema";
|
|
import { db } from "./db";
|
|
import { eq, desc, sql } from "drizzle-orm";
|
|
|
|
export interface IStorage {
|
|
getArticles(): Promise<Article[]>;
|
|
getArticleBySlug(slug: string): Promise<Article | undefined>;
|
|
getArticleById(id: number): Promise<Article | undefined>;
|
|
getFeaturedArticles(): Promise<Article[]>;
|
|
getPopularArticles(limit: number): Promise<Article[]>;
|
|
getArticlesByCategory(category: string): Promise<Article[]>;
|
|
createArticle(article: InsertArticle): Promise<Article>;
|
|
updateArticle(id: number, article: Partial<InsertArticle>): Promise<Article | undefined>;
|
|
incrementViews(id: number): Promise<void>;
|
|
deleteArticle(id: number): Promise<void>;
|
|
}
|
|
|
|
export class DatabaseStorage implements IStorage {
|
|
async getArticles(): Promise<Article[]> {
|
|
return db.select().from(articles).orderBy(desc(articles.publishedAt));
|
|
}
|
|
|
|
async getArticleBySlug(slug: string): Promise<Article | undefined> {
|
|
const [article] = await db.select().from(articles).where(eq(articles.slug, slug));
|
|
return article;
|
|
}
|
|
|
|
async getArticleById(id: number): Promise<Article | undefined> {
|
|
const [article] = await db.select().from(articles).where(eq(articles.id, id));
|
|
return article;
|
|
}
|
|
|
|
async getFeaturedArticles(): Promise<Article[]> {
|
|
return db.select().from(articles).orderBy(desc(articles.publishedAt)).limit(9);
|
|
}
|
|
|
|
async getPopularArticles(limit: number): Promise<Article[]> {
|
|
return db.select().from(articles).orderBy(desc(articles.views)).limit(limit);
|
|
}
|
|
|
|
async getArticlesByCategory(category: string): Promise<Article[]> {
|
|
return db.select().from(articles).where(eq(articles.category, category)).orderBy(desc(articles.publishedAt));
|
|
}
|
|
|
|
async createArticle(article: InsertArticle): Promise<Article> {
|
|
const [created] = await db.insert(articles).values(article).returning();
|
|
return created;
|
|
}
|
|
|
|
async updateArticle(id: number, article: Partial<InsertArticle>): Promise<Article | undefined> {
|
|
const [updated] = await db.update(articles).set(article).where(eq(articles.id, id)).returning();
|
|
return updated;
|
|
}
|
|
|
|
async incrementViews(id: number): Promise<void> {
|
|
await db.update(articles).set({ views: sql`${articles.views} + 1` }).where(eq(articles.id, id));
|
|
}
|
|
|
|
async deleteArticle(id: number): Promise<void> {
|
|
await db.delete(articles).where(eq(articles.id, id));
|
|
}
|
|
}
|
|
|
|
export const storage = new DatabaseStorage();
|