import { users, socialPages, media, posts, scheduledPosts, aiGenerations, type User, type InsertUser, type SocialPage, type InsertSocialPage, type Media, type InsertMedia, type Post, type InsertPost, type ScheduledPost, type InsertScheduledPost, type AiGeneration, type InsertAiGeneration, } from "@shared/schema"; import { db } from "./db"; import { eq, and, gte, lte, desc, isNull } from "drizzle-orm"; export interface IStorage { // Users getUser(id: string): Promise; getUserByUsername(username: string): Promise; createUser(user: InsertUser): Promise; // Social Pages getSocialPages(userId: string): Promise; getSocialPage(id: string): Promise; createSocialPage(page: InsertSocialPage): Promise; updateSocialPage(id: string, page: Partial): Promise; deleteSocialPage(id: string): Promise; // Media getMedia(userId: string): Promise; getMediaById(id: string): Promise; createMedia(media: InsertMedia): Promise; deleteMedia(id: string): Promise; // Posts getPosts(userId: string): Promise; getPost(id: string): Promise; createPost(post: InsertPost): Promise; updatePost(id: string, post: Partial): Promise; deletePost(id: string): Promise; // Scheduled Posts getScheduledPosts(userId: string, startDate?: Date, endDate?: Date): Promise; getScheduledPost(id: string): Promise; createScheduledPost(scheduledPost: InsertScheduledPost): Promise; updateScheduledPost(id: string, scheduledPost: Partial): Promise; deleteScheduledPost(id: string): Promise; getPendingScheduledPosts(): Promise; // AI Generations getAiGenerations(userId: string): Promise; createAiGeneration(generation: InsertAiGeneration): Promise; } export class DatabaseStorage implements IStorage { // Users async getUser(id: string): Promise { const [user] = await db.select().from(users).where(eq(users.id, id)); return user || undefined; } async getUserByUsername(username: string): Promise { const [user] = await db.select().from(users).where(eq(users.username, username)); return user || undefined; } async createUser(insertUser: InsertUser): Promise { const [user] = await db.insert(users).values(insertUser).returning(); return user; } // Social Pages async getSocialPages(userId: string): Promise { return await db.select().from(socialPages).where(eq(socialPages.userId, userId)); } async getSocialPage(id: string): Promise { const [page] = await db.select().from(socialPages).where(eq(socialPages.id, id)); return page || undefined; } async createSocialPage(page: InsertSocialPage): Promise { const [newPage] = await db.insert(socialPages).values(page).returning(); return newPage; } async updateSocialPage(id: string, page: Partial): Promise { const [updated] = await db.update(socialPages).set(page).where(eq(socialPages.id, id)).returning(); return updated; } async deleteSocialPage(id: string): Promise { await db.delete(socialPages).where(eq(socialPages.id, id)); } // Media async getMedia(userId: string): Promise { return await db.select().from(media).where(eq(media.userId, userId)).orderBy(desc(media.createdAt)); } async getMediaById(id: string): Promise { const [mediaItem] = await db.select().from(media).where(eq(media.id, id)); return mediaItem || undefined; } async createMedia(mediaItem: InsertMedia): Promise { const [newMedia] = await db.insert(media).values(mediaItem).returning(); return newMedia; } async deleteMedia(id: string): Promise { await db.delete(media).where(eq(media.id, id)); } // Posts async getPosts(userId: string): Promise { return await db.select().from(posts).where(eq(posts.userId, userId)).orderBy(desc(posts.createdAt)); } async getPost(id: string): Promise { const [post] = await db.select().from(posts).where(eq(posts.id, id)); return post || undefined; } async createPost(post: InsertPost): Promise { const [newPost] = await db.insert(posts).values(post).returning(); return newPost; } async updatePost(id: string, post: Partial): Promise { const [updated] = await db.update(posts).set({ ...post, updatedAt: new Date() }).where(eq(posts.id, id)).returning(); return updated; } async deletePost(id: string): Promise { await db.delete(posts).where(eq(posts.id, id)); } // Scheduled Posts async getScheduledPosts(userId: string, startDate?: Date, endDate?: Date): Promise { let query = db .select() .from(scheduledPosts) .innerJoin(posts, eq(scheduledPosts.postId, posts.id)) .where(eq(posts.userId, userId)); if (startDate && endDate) { const results = await query; return results .filter(r => { const scheduledAt = new Date(r.scheduled_posts.scheduledAt); return scheduledAt >= startDate && scheduledAt <= endDate; }) .map(r => r.scheduled_posts); } const results = await query; return results.map(r => r.scheduled_posts); } async getScheduledPost(id: string): Promise { const [scheduledPost] = await db.select().from(scheduledPosts).where(eq(scheduledPosts.id, id)); return scheduledPost || undefined; } async createScheduledPost(scheduledPost: InsertScheduledPost): Promise { const [newScheduledPost] = await db.insert(scheduledPosts).values(scheduledPost).returning(); return newScheduledPost; } async updateScheduledPost(id: string, scheduledPost: Partial): Promise { const [updated] = await db.update(scheduledPosts).set(scheduledPost).where(eq(scheduledPosts.id, id)).returning(); return updated; } async deleteScheduledPost(id: string): Promise { await db.delete(scheduledPosts).where(eq(scheduledPosts.id, id)); } async getPendingScheduledPosts(): Promise { const now = new Date(); const results = await db .select() .from(scheduledPosts) .where( and( isNull(scheduledPosts.publishedAt), lte(scheduledPosts.scheduledAt, now) ) ); return results; } // AI Generations async getAiGenerations(userId: string): Promise { return await db.select().from(aiGenerations).where(eq(aiGenerations.userId, userId)).orderBy(desc(aiGenerations.createdAt)); } async createAiGeneration(generation: InsertAiGeneration): Promise { const [newGeneration] = await db.insert(aiGenerations).values(generation).returning(); return newGeneration; } } export const storage = new DatabaseStorage();