Files
Socialflow/replit.md
T
michaelschal 56f1ceb84e Add multi-photo carousel posts and preview modal functionality
Implements multi-photo carousel post creation with drag-and-drop reordering, adds a new `post_media` junction table, and introduces a preview modal for realistic Facebook/Instagram rendering before publishing. Updates `POST /api/posts` to accept `mediaIds` for carousel media.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: ae4037a0-2a6f-4530-9bac-79b543286bda
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/397bca8c-984f-43ff-841a-10897aeb8140/ae4037a0-2a6f-4530-9bac-79b543286bda/LsHUZLR
2025-10-08 20:49:16 +00:00

11 KiB

Social Flow - AI-Powered Social Media Management Platform

Overview

Social Flow is a comprehensive social media automation platform designed to streamline content creation and publication across Facebook and Instagram. The application enables users to manage multiple social media pages, generate AI-powered post content, process and optimize media for different platform formats, and schedule posts with automated publishing capabilities.

Core Purpose: Automate social media content workflow from creation to publication, with AI assistance for text generation and intelligent media formatting for platform-specific requirements.

Key Features:

  • Multi-page social media account management (Facebook & Instagram)
  • AI-powered content generation using OpenRouter API
  • Automated media processing and format optimization
  • Multi-photo carousel posts (up to 10 photos per post with drag & drop reordering)
  • Preview modal with realistic Facebook/Instagram rendering before publishing
  • Post scheduling with automated publication
  • Media library management
  • Dashboard analytics and activity tracking

User Preferences

Preferred communication style: Simple, everyday language.

Authentication & Authorization

System: Passport.js avec stratégie locale et bcrypt pour le hachage des mots de passe

Rôles utilisateur:

  • admin - Accès complet à tous les paramètres, SQL, et gestion des utilisateurs
  • user - Accès aux fonctionnalités de publication uniquement (pas de paramètres)

Utilisateur par défaut:

  • Username: admin
  • Password: admin
  • Rôle: admin
  • Important: Changez ce mot de passe en production

Session Management:

  • express-session avec cookies HTTP-only
  • sameSite: 'lax' pour prévention CSRF
  • Durée de session: 7 jours
  • Secret de session via variable d'environnement SESSION_SECRET
  • Store de session:
    • Production: PostgreSQL via connect-pg-simple (table session auto-créée)
    • Développement: MemoryStore (par défaut)

Protection des routes:

  • Backend: Middleware requireAuth pour routes utilisateur, requireAdmin pour routes admin
  • Frontend: Composant ProtectedRoute avec vérification de session et redirection vers /login

System Architecture

Frontend Architecture

Framework: React with TypeScript using Vite as the build tool

Routing: Wouter for lightweight client-side routing with protected routes

  • Public: /login
  • Protected (authenticated): Dashboard, Media, AI, Posts, Calendar, Pages, Analytics, History
  • Protected (admin only): /settings, /sql, /users

State Management:

  • TanStack Query (React Query) for server state management and caching
  • Local component state with React hooks

UI Framework:

  • Radix UI primitives for accessible, unstyled components
  • shadcn/ui component library (New York style variant)
  • Tailwind CSS for styling with custom design tokens
  • Dark mode as default theme

Key Design Decisions:

  • Component-based architecture with reusable UI components
  • Custom path aliases (@/, @shared) for clean imports
  • Responsive design with mobile-first approach
  • Real-time data synchronization through React Query

Backend Architecture

Runtime: Node.js with Express.js server

Type Safety: Full TypeScript implementation across frontend, backend, and shared schema

API Design: RESTful endpoints with conventional HTTP methods

  • /api/auth/* - Authentication (login, logout, session)
  • /api/users - User management (admin only)
  • /api/sql/* - SQL administration (admin only)
  • /api/stats - Dashboard statistics (authenticated)
  • /api/ai/generate - AI text generation (authenticated)
  • /api/media/* - Media upload and management (authenticated)
  • /api/pages/* - Social page management (authenticated)
  • /api/posts/* - Post and scheduling management (authenticated)
  • /api/cloudinary/config - Cloudinary configuration (admin only)
  • /api/openrouter/config - OpenRouter configuration (admin only)

File Upload: Multer middleware for handling multipart/form-data with in-memory storage strategy, integrated with Cloudinary for cloud storage

Background Processing:

  • Node-cron for scheduled task execution
  • Scheduler service running every minute to check for pending posts
  • Automated post publication to social media platforms

Session Management:

  • Développement: MemoryStore (sessions en mémoire)
  • Production: connect-pg-simple (sessions persistées dans PostgreSQL, table session)

Key Architectural Patterns:

  • Service layer pattern (OpenRouterService, CloudinaryService, SchedulerService)
  • Storage abstraction layer for database operations
  • Middleware-based request processing pipeline
  • Separation of concerns between routes, services, and storage

Database Architecture

ORM: Drizzle ORM for type-safe database operations

Database: PostgreSQL (via Neon serverless driver with WebSocket support)

Schema Design:

Core Tables:

  • users - User authentication and profiles with role-based access (admin/user)
  • cloudinary_config - Cloudinary configuration per user (cloud name, API key, API secret)
  • social_pages - Connected Facebook/Instagram pages with access tokens
  • media - Uploaded media files with Cloudinary public IDs and transformation URLs
  • posts - Post content with AI generation tracking and status
  • post_media - NEW: Junction table linking posts to multiple media with displayOrder field for carousel ordering
  • scheduled_posts - Scheduled publication queue with page assignments
  • ai_generations - History of AI-generated content

Enumerations:

  • platform: facebook, instagram
  • post_type: feed, story
  • post_status: draft, scheduled, published, failed
  • media_type: image, video

Relationships:

  • One-to-many: users → social_pages, users → media, users → posts
  • Many-to-many: posts ↔ social_pages (through scheduled_posts)
  • Foreign key cascading deletes for data integrity

Migration Strategy: Drizzle Kit for schema migrations with PostgreSQL dialect

Media Processing Pipeline

Cloud Storage: Cloudinary for image/video storage and transformation

Format Optimization Strategy:

  • Facebook Feed: 1200x630px (landscape format)
  • Instagram Feed: 1080x1080px (square format)
  • Instagram Story: 1080x1920px (vertical format)

Storage: Cloud-based storage via Cloudinary CDN with automatic transformations

Processing Flow:

  1. Upload original file to memory buffer via Multer
  2. Upload to Cloudinary with unique public_id
  3. Cloudinary automatically generates transformation URLs for all platform formats
  4. Store Cloudinary public_id and transformation URLs in database
  5. Serve optimized images via Cloudinary CDN

External Dependencies

AI Content Generation

Service: OpenRouter API

  • Model: Anthropic Claude 3.5 Sonnet
  • Purpose: Generate multiple post text variations from product information
  • Configuration: Requires OPENROUTER_API_KEY environment variable
  • Temperature: 0.8 for creative variation

Cloud Storage

Cloudinary:

  • Purpose: Cloud-based image and video storage with automatic transformations
  • Configuration: User-configurable via Settings page (cloud name, API key, API secret)
  • Storage: Images stored in Cloudinary cloud with unique public IDs
  • Transformations: Automatic generation of platform-specific formats (Facebook Feed, Instagram Feed, Instagram Story)
  • CDN: Global content delivery network for fast image loading
  • Status: Fully integrated for media uploads

Social Media APIs

Facebook Graph API:

  • Purpose: Publishing posts to Facebook pages
  • Authentication: Page access tokens stored per social_page
  • Status: Integration prepared (not fully implemented in codebase)

Instagram Graph API:

  • Purpose: Publishing posts and stories to Instagram
  • Authentication: Page access tokens stored per social_page
  • Status: Integration prepared (not fully implemented in codebase)

Database Service

Neon Serverless PostgreSQL:

  • WebSocket-based connection pooling
  • Connection string via DATABASE_URL environment variable
  • Serverless-optimized with @neondatabase/serverless driver

Development Tools

Replit Integration:

  • Vite plugins for runtime error overlay
  • Cartographer plugin for code navigation
  • Dev banner for development environment

Build and Deployment

Production Build Process:

  1. Vite builds React frontend to dist/public
  2. esbuild bundles server code to dist/index.js
  3. Node.js serves bundled application

Environment Variables Required:

  • DATABASE_URL - PostgreSQL connection string
  • OPENROUTER_API_KEY - AI text generation API key
  • SESSION_SECRET - Session encryption key
  • APP_URL - Application public URL
  • PGPASSWORD - Database password (for Docker deployments)

UI Component Libraries

  • Radix UI: Comprehensive set of accessible UI primitives
  • React Hook Form: Form state management with validation
  • Zod: Schema validation for forms and API data
  • date-fns: Date manipulation and formatting
  • react-dropzone: Drag-and-drop file uploads
  • Lucide React: Icon library
  • @dnd-kit: Drag and drop library for photo carousel reordering

Recent Changes (October 2025)

Overview: Support for creating posts with up to 10 photos in a carousel format with drag & drop reordering and preview modal.

Database Changes:

  • Added post_media table with displayOrder integer field for ordered media
  • Posts can now have multiple photos via post_media junction table
  • API accepts array of media IDs with display order

Frontend Components:

New Post Page (/new-post):

  • Photo Selection: "Photos sélectionnées" section shows selected photos with order numbers (1, 2, 3...)
  • Drag & Drop: Uses @dnd-kit/sortable for reordering selected photos
    • Drag handle (GripVertical icon) on each selected photo
    • Visual order indicators on each photo
    • Separate section for selected vs. all photos
  • Limit: Maximum 10 photos per post
  • Preview Button: Opens PreviewModal instead of immediate publish

PreviewModal Component (client/src/components/preview-modal.tsx):

  • Realistic Rendering: Shows post exactly as it will appear on Facebook/Instagram
  • Format Switching: Toggle between:
    • Feed Facebook (1200x630px) - Horizontal carousel
    • Feed Instagram (1080x1080px) - Square carousel
    • Story Instagram (1080x1920px) - Vertical carousel
  • Carousel Navigation:
    • Next/Previous buttons (ChevronLeft/ChevronRight)
    • Clickable photo indicators (dots for Facebook, bars for Instagram)
    • Shows current photo index
  • Publish Integration: Publish button in modal triggers post creation

API Changes:

  • POST /api/posts accepts mediaIds parameter as:
    • Simple string array (using index as order): ["id1", "id2", "id3"]
    • Or array of objects with displayOrder: [{mediaId: "id1", displayOrder: 0}, ...]
  • Backwards compatible with single media posts

Storage Layer:

  • createPost method creates post_media entries with displayOrder
  • Bulk insert of media-post relationships with proper ordering