mirror of
https://github.com/R0m1k3/Socialflow.git
synced 2026-10-11 17:26:45 +02:00
Add Facebook publishing functionality to schedule posts
Integrate Facebook Graph API for publishing scheduled posts, including media. Update storage to handle post-media relationships and add new schema types. Replit-Commit-Author: Agent Replit-Commit-Session-Id: ae4037a0-2a6f-4530-9bac-79b543286bda Replit-Commit-Checkpoint-Type: intermediate_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/397bca8c-984f-43ff-841a-10897aeb8140/ae4037a0-2a6f-4530-9bac-79b543286bda/BuArSJC
This commit is contained in:
1 parent
0da4744f6f
commit
52148e3896
4 files changed
+39
-4
No files matched your search
@@ -18,6 +18,10 @@ externalPort = 80
|
||||
localPort = 5555
|
||||
externalPort = 3002
|
||||
|
||||
[[ports]]
|
||||
localPort = 37219
|
||||
externalPort = 3003
|
||||
|
||||
[[ports]]
|
||||
localPort = 40537
|
||||
externalPort = 3000
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import cron, { ScheduledTask } from "node-cron";
|
||||
import { storage } from "../storage";
|
||||
import { facebookService } from "./facebook";
|
||||
|
||||
export class SchedulerService {
|
||||
private task: ScheduledTask | null = null;
|
||||
@@ -47,14 +48,35 @@ export class SchedulerService {
|
||||
throw new Error("Post or page not found");
|
||||
}
|
||||
|
||||
// In a real implementation, this would call Facebook/Instagram Graph API
|
||||
// For now, we'll simulate the publishing
|
||||
console.log(`Publishing post ${post.id} to ${page.platform} page ${page.pageName}`);
|
||||
|
||||
// Get media if post has media
|
||||
const postMediaList = await storage.getPostMedia(post.id);
|
||||
const media = postMediaList.length > 0 ? await storage.getMediaById(postMediaList[0].mediaId) : undefined;
|
||||
|
||||
// Publish to Facebook/Instagram
|
||||
let externalPostId: string;
|
||||
|
||||
if (page.platform === 'facebook') {
|
||||
externalPostId = await facebookService.publishPost(post, page, scheduledPost.postType, media || undefined);
|
||||
} else if (page.platform === 'instagram') {
|
||||
// Instagram publishing not yet implemented
|
||||
console.warn(`Instagram publishing not yet implemented for post ${post.id}`);
|
||||
await storage.updateScheduledPost(scheduledPost.id, {
|
||||
error: 'Instagram publishing not yet implemented',
|
||||
});
|
||||
await storage.updatePost(post.id, {
|
||||
status: "failed",
|
||||
});
|
||||
return;
|
||||
} else {
|
||||
throw new Error(`Unsupported platform: ${page.platform}`);
|
||||
}
|
||||
|
||||
// Update the scheduled post as published
|
||||
await storage.updateScheduledPost(scheduledPost.id, {
|
||||
publishedAt: new Date(),
|
||||
externalPostId: `simulated-${Date.now()}`, // In real app, this would be the ID from FB/IG
|
||||
externalPostId,
|
||||
});
|
||||
|
||||
// Update post status
|
||||
@@ -62,7 +84,7 @@ export class SchedulerService {
|
||||
status: "published",
|
||||
});
|
||||
|
||||
console.log(`Successfully published post ${post.id}`);
|
||||
console.log(`Successfully published post ${post.id} with external ID: ${externalPostId}`);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ import {
|
||||
socialPages,
|
||||
media,
|
||||
posts,
|
||||
postMedia,
|
||||
scheduledPosts,
|
||||
aiGenerations,
|
||||
cloudinaryConfig,
|
||||
@@ -15,6 +16,7 @@ import {
|
||||
type InsertMedia,
|
||||
type Post,
|
||||
type InsertPost,
|
||||
type PostMedia,
|
||||
type ScheduledPost,
|
||||
type InsertScheduledPost,
|
||||
type AiGeneration,
|
||||
@@ -48,6 +50,7 @@ export interface IStorage {
|
||||
getMediaById(id: string): Promise<Media | undefined>;
|
||||
createMedia(media: InsertMedia): Promise<Media>;
|
||||
deleteMedia(id: string): Promise<void>;
|
||||
getPostMedia(postId: string): Promise<PostMedia[]>;
|
||||
|
||||
// Posts
|
||||
getPosts(userId: string): Promise<Post[]>;
|
||||
@@ -152,6 +155,10 @@ export class DatabaseStorage implements IStorage {
|
||||
await db.delete(media).where(eq(media.id, id));
|
||||
}
|
||||
|
||||
async getPostMedia(postId: string): Promise<PostMedia[]> {
|
||||
return await db.select().from(postMedia).where(eq(postMedia.postId, postId));
|
||||
}
|
||||
|
||||
// Posts
|
||||
async getPosts(userId: string): Promise<Post[]> {
|
||||
return await db.select().from(posts).where(eq(posts.userId, userId)).orderBy(desc(posts.createdAt));
|
||||
|
||||
@@ -254,3 +254,5 @@ export type InsertCloudinaryConfig = z.infer<typeof insertCloudinaryConfigSchema
|
||||
|
||||
export type OpenrouterConfig = typeof openrouterConfig.$inferSelect;
|
||||
export type InsertOpenrouterConfig = z.infer<typeof insertOpenrouterConfigSchema>;
|
||||
|
||||
export type PostMedia = typeof postMedia.$inferSelect;
|
||||
Reference in new issue
Block a user