From f305d6209119f2d0b71283d62b9b410cc1df2854 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Fri, 10 Oct 2025 09:39:25 +0000 Subject: [PATCH 1/2] Add user page permissions to manage access to social media pages Create the `user_page_permissions` table with foreign keys to `users` and `social_pages` tables, and add indexes for performance. 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/1VOBLTw --- init.sql | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/init.sql b/init.sql index a07f694..faa59de 100644 --- a/init.sql +++ b/init.sql @@ -31,6 +31,19 @@ VALUES ( 'user' ) ON CONFLICT (username) DO NOTHING; +-- Créer la table user_page_permissions (permissions d'accès aux pages par utilisateur) +CREATE TABLE IF NOT EXISTS user_page_permissions ( + id VARCHAR PRIMARY KEY DEFAULT gen_random_uuid(), + user_id VARCHAR NOT NULL REFERENCES users(id) ON DELETE CASCADE, + page_id VARCHAR NOT NULL REFERENCES social_pages(id) ON DELETE CASCADE, + created_at TIMESTAMP DEFAULT NOW(), + UNIQUE(user_id, page_id) +); + +-- Index pour optimiser les requêtes de permissions +CREATE INDEX IF NOT EXISTS idx_user_page_permissions_user_id ON user_page_permissions(user_id); +CREATE INDEX IF NOT EXISTS idx_user_page_permissions_page_id ON user_page_permissions(page_id); + -- Liste des tables créées automatiquement par Drizzle ORM : -- - users (utilisateurs avec rôles) -- - social_pages (pages Facebook/Instagram connectées) @@ -41,3 +54,4 @@ VALUES ( -- - scheduled_posts (publications programmées) -- - ai_generations (historique des générations IA) -- - post_media (relation many-to-many entre posts et media) +-- - user_page_permissions (permissions d'accès aux pages par utilisateur) From f21e7e5f18e5a7ee061de2e698a9c70701140917 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Fri, 10 Oct 2025 09:42:28 +0000 Subject: [PATCH 2/2] Show all scheduled posts for accessible pages to users Update scheduled post retrieval logic to fetch posts from all users and then filter by accessible pages, resolving an issue where users could not see posts created by the admin. 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/1VOBLTw --- server/routes.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/server/routes.ts b/server/routes.ts index da9b905..93f4e08 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -772,12 +772,18 @@ export async function registerRoutes(app: Express): Promise { const allPostsArrays = await Promise.all(allPostsPromises); scheduledPosts = allPostsArrays.flat(); } else { - // User voit uniquement les posts des pages qui lui sont attribuées + // User voit tous les posts programmés sur les pages qui lui sont attribuées (peu importe qui les a créés) const accessiblePages = await storage.getUserAccessiblePages(userId); const accessiblePageIds = accessiblePages.map(p => p.id); - const userScheduledPosts = await storage.getScheduledPosts(userId, start, end); - scheduledPosts = userScheduledPosts.filter(sp => accessiblePageIds.includes(sp.pageId)); + // Récupérer tous les posts programmés de tous les utilisateurs + const allUsers = await storage.getAllUsers(); + const allPostsPromises = allUsers.map(u => storage.getScheduledPosts(u.id, start, end)); + const allPostsArrays = await Promise.all(allPostsPromises); + const allScheduledPosts = allPostsArrays.flat(); + + // Filtrer uniquement les posts des pages accessibles + scheduledPosts = allScheduledPosts.filter(sp => accessiblePageIds.includes(sp.pageId)); } res.json(scheduledPosts);