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

273 lines
11 KiB
Markdown

# 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)
### Multi-Photo Carousel Feature
**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