From 9a34502bd75dab33aca9a68f1f5dc7919cbc9026 Mon Sep 17 00:00:00 2001 From: admtracksteel Date: Fri, 3 Apr 2026 16:12:53 +0000 Subject: [PATCH] =?UTF-8?q?Corre=C3=A7=C3=A3o=20de=20erro=20500=20em=20men?= =?UTF-8?q?sagens=20(UUID),=20cria=C3=A7=C3=A3o=20de=20tabela=20messages?= =?UTF-8?q?=20e=20tratamento=20defensivo=20no=20front-end=20para=20evitar?= =?UTF-8?q?=20crashes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- create_messages_table.sql | 17 +++++++++++++++++ src/client/components/TeamPresence.tsx | 6 +++--- src/client/context/AuthContext.tsx | 4 ++-- src/client/contexts/NotificationContext.tsx | 2 +- src/server/controllers/userController.ts | 2 +- src/server/middleware/authMiddleware.ts | 4 ++-- 6 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 create_messages_table.sql diff --git a/create_messages_table.sql b/create_messages_table.sql new file mode 100644 index 0000000..65b2697 --- /dev/null +++ b/create_messages_table.sql @@ -0,0 +1,17 @@ +-- Criar tabela de mensagens no schema gpi +CREATE TABLE IF NOT EXISTS gpi.messages ( + id uuid DEFAULT uuid_generate_v4() PRIMARY KEY, + organization_id uuid REFERENCES gpi.organizations(id) ON DELETE CASCADE, + from_user_id uuid REFERENCES gpi.users(id) ON DELETE SET NULL, + to_user_id uuid REFERENCES gpi.users(id) ON DELETE SET NULL, + message text NOT NULL, + is_read boolean DEFAULT false, + read_at timestamp with time zone, + is_archived boolean DEFAULT false, + is_deleted_by_recipient boolean DEFAULT false, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now() +); + +-- Permissões para as roles do Supabase +GRANT ALL ON gpi.messages TO postgres, anon, authenticated, service_role; diff --git a/src/client/components/TeamPresence.tsx b/src/client/components/TeamPresence.tsx index 0044a5c..69d9d6a 100644 --- a/src/client/components/TeamPresence.tsx +++ b/src/client/components/TeamPresence.tsx @@ -72,7 +72,7 @@ export const TeamPresence: React.FC = () => { // Create a map of pending messages by recipient ID const pendingMessagesByRecipient = new Map( - pendingMessages.map(msg => [msg.toUser?.email, msg]) + (pendingMessages || []).map(msg => [msg.toUser?.email, msg]) ); const handleMemberClick = (member: OrganizationMember) => { @@ -102,11 +102,11 @@ export const TeamPresence: React.FC = () => {
- Equipe ({activeUsers.length}/{allMembers.length} online) + Equipe ({(activeUsers || []).length}/{(allMembers || []).length} online)
- {allMembers.map((member) => { + {(allMembers || []).map((member) => { const isOnline = activeUserLogtoIds.has(member.logto_id); const isCurrentUser = member.logto_id === appUser?.logtoId; const hasPendingMessage = pendingMessagesByRecipient.has(member.email); diff --git a/src/client/context/AuthContext.tsx b/src/client/context/AuthContext.tsx index 8dca2d0..f409f00 100644 --- a/src/client/context/AuthContext.tsx +++ b/src/client/context/AuthContext.tsx @@ -9,7 +9,7 @@ interface AuthProviderProps { } const defaultUser: AppUser = { - id: 'guest-user', + id: '00000000-0000-0000-0000-000000000000', email: 'guest@gpi.app', name: 'Guest User', role: 'user', @@ -18,7 +18,7 @@ const defaultUser: AppUser = { updatedAt: new Date().toISOString() }; -const DEFAULT_ORGANIZATION_ID = 'default-org'; +const DEFAULT_ORGANIZATION_ID = '00000000-0000-0000-0000-000000000001'; const DEFAULT_ORGANIZATION_NAME = 'Organização Padrão'; export const AuthProvider: React.FC = ({ children }) => { diff --git a/src/client/contexts/NotificationContext.tsx b/src/client/contexts/NotificationContext.tsx index b2fcd1a..51fcc23 100644 --- a/src/client/contexts/NotificationContext.tsx +++ b/src/client/contexts/NotificationContext.tsx @@ -83,7 +83,7 @@ export const NotificationProvider: React.FC<{ children: React.ReactNode }> = ({ } }, [isSignedIn, fetchNotifications]); - const unreadCount = notifications.filter(n => !n.isRead).length; + const unreadCount = (notifications || []).filter(n => !n.isRead).length; return ( { try { if (!req.appUser) { return res.json({ - id: 'guest-user', + id: '00000000-0000-0000-0000-000000000000', email: 'guest@gpi.app', name: 'Guest User', role: 'user' diff --git a/src/server/middleware/authMiddleware.ts b/src/server/middleware/authMiddleware.ts index fec4164..75600b0 100644 --- a/src/server/middleware/authMiddleware.ts +++ b/src/server/middleware/authMiddleware.ts @@ -18,12 +18,12 @@ declare module 'express-serve-static-core' { export const extractUser = async (req: Request, res: Response, next: NextFunction) => { req.appUser = { - id: 'guest-user', + id: '00000000-0000-0000-0000-000000000000', logtoId: 'guest', email: 'guest@gpi.app', name: 'Guest User', role: 'user', - organizationId: req.headers['x-organization-id'] as string || 'default-org', + organizationId: req.headers['x-organization-id'] as string || '00000000-0000-0000-0000-000000000001', organizationRole: 'user' }; next();