export interface AsanaWorkspaceResponse { gid: string; resource_type: string; name: string; } export interface AsanaWorkspacesResponse { data: AsanaWorkspaceResponse[]; } export interface AsanaWorkspace { id: string; name: string; } export interface AsanaUserResponse { gid: string; name: string; resource_type: string; } export interface AsanaUsersResponse { data: AsanaUserResponse[]; } export interface AsanaUser { id: string; name: string; } export interface AsanaIntegrationResponse { success: boolean; integracao_id?: string; id?: string; api_key?: string; workspace_gid?: string; workspace_nome?: string; usuario_asana_gid?: string; usuario_asana_nome?: string; } export interface AsanaIntegrationRequest { user_id?: string; api_key: string; workspace_gid: string; workspace_nome: string; usuario_asana_gid: string; usuario_asana_nome: string; } class AsanaService { private readonly ASANA_BASE_URL = 'https://app.asana.com/api/1.0'; async getWorkspaces(token: string): Promise { if (!token || token.trim().length === 0) { throw { success: false, message: 'Token do Asana é obrigatório', }; } try { const axios = (await import('axios')).default; const headers: Record = { 'accept': 'application/json', 'authorization': `Bearer ${token.trim()}`, }; const response = await axios.get( `${this.ASANA_BASE_URL}/workspaces`, { headers } ); return response.data.data.map((workspace) => ({ id: workspace.gid, name: workspace.name, })); } catch (error: unknown) { console.error('Erro ao buscar workspaces do Asana:', error); if (error && typeof error === 'object' && 'response' in error) { const axiosError = error as { response?: { data?: any; status?: number } }; if (axiosError.response?.status === 401) { throw { success: false, message: 'Token inválido ou expirado. Verifique sua chave de API.', }; } if (axiosError.response?.data) { throw { success: false, message: axiosError.response.data.message || 'Erro ao buscar workspaces do Asana', }; } } throw { success: false, message: error instanceof Error ? error.message : 'Erro ao buscar workspaces do Asana', }; } } async getUsers(token: string, workspaceId: string): Promise { if (!token || token.trim().length === 0) { throw { success: false, message: 'Token do Asana é obrigatório', }; } if (!workspaceId || workspaceId.trim().length === 0) { throw { success: false, message: 'ID do workspace é obrigatório', }; } try { const axios = (await import('axios')).default; const headers: Record = { 'accept': 'application/json', 'authorization': `Bearer ${token.trim()}`, }; const response = await axios.get( `${this.ASANA_BASE_URL}/users?workspace=${workspaceId}`, { headers } ); // Converte a resposta da API para o formato esperado pelo componente // A API retorna gid, mas o componente espera id return response.data.data.map((user) => ({ id: user.gid, name: user.name, })); } catch (error: unknown) { console.error('Erro ao buscar usuários do Asana:', error); if (error && typeof error === 'object' && 'response' in error) { const axiosError = error as { response?: { data?: any; status?: number } }; if (axiosError.response?.status === 401) { throw { success: false, message: 'Token inválido ou expirado. Verifique sua chave de API.', }; } if (axiosError.response?.data) { throw { success: false, message: axiosError.response.data.message || 'Erro ao buscar usuários do Asana', }; } } throw { success: false, message: error instanceof Error ? error.message : 'Erro ao buscar usuários do Asana', }; } } async getIntegration(userId: string): Promise { if (!userId || userId.trim().length === 0) { throw { success: false, message: 'ID do usuário é obrigatório', }; } try { const axios = (await import('axios')).default; const { GlobalFunctions } = await import('@/GlobalFunctions'); const token = await GlobalFunctions.getToken(); const apiKey = import.meta.env.VITE_API_KEY || ''; const headers: Record = { 'Content-Type': 'application/json', 'accept': 'application/json', }; if (apiKey) { headers['apikey'] = apiKey; } if (token) { headers['Authorization'] = `Bearer ${token}`; } const response = await axios.get( `https://prod-hgtx-intelligence-n8n.hgtx.com.br/webhook/c898beff-84cb-44df-a69c-6eff27ccd7aa/codex/agente-pessoal/integracoes/asana/${userId}`, { headers } ); if (!response.data.success) { return null; } return response.data; } catch (error: unknown) { console.error('Erro ao buscar integração do Asana:', error); // Se o erro for 404 ou similar, significa que não tem integração cadastrada if (error && typeof error === 'object' && 'response' in error) { const axiosError = error as { response?: { status?: number } }; if (axiosError.response?.status === 404) { return null; } } return null; } } async createIntegration(request: AsanaIntegrationRequest): Promise { if (!request.user_id || !request.api_key || !request.workspace_gid || !request.usuario_asana_gid) { throw { success: false, message: 'Dados incompletos para criar integração', }; } try { const axios = (await import('axios')).default; const { GlobalFunctions } = await import('@/GlobalFunctions'); // Obtém o token JWT para autenticação const token = await GlobalFunctions.getToken(); const apiKey = import.meta.env.VITE_API_KEY || ''; const headers: Record = { 'Content-Type': 'application/json', 'accept': 'application/json', }; // Adiciona API key (obrigatória) if (apiKey) { headers['apikey'] = apiKey; } // Adiciona token JWT se disponível if (token) { headers['Authorization'] = `Bearer ${token}`; } const response = await axios.post( `https://prod-hgtx-intelligence-n8n.hgtx.com.br/webhook/codex/agente-pessoal/integracoes/asana`, request, { headers } ); return response.data; } catch (error: unknown) { console.error('Erro ao criar integração do Asana:', error); // Retorna o erro da API se existir if (error && typeof error === 'object' && 'response' in error) { const axiosError = error as { response?: { data?: any; status?: number } }; if (axiosError.response?.data) { const errorData = axiosError.response.data; throw { success: false, message: errorData.message || 'Erro ao criar integração do Asana', }; } } throw { success: false, message: error instanceof Error ? error.message : 'Erro ao criar integração do Asana', }; } } async updateIntegration(integracaoId: string, request: Omit): Promise { if (!integracaoId || !request.api_key || !request.workspace_gid || !request.usuario_asana_gid) { throw { success: false, message: 'Dados incompletos para atualizar integração', }; } try { const axios = (await import('axios')).default; const { GlobalFunctions } = await import('@/GlobalFunctions'); const token = await GlobalFunctions.getToken(); const apiKey = import.meta.env.VITE_API_KEY || ''; const headers: Record = { 'Content-Type': 'application/json', 'accept': 'application/json', }; if (apiKey) { headers['apikey'] = apiKey; } if (token) { headers['Authorization'] = `Bearer ${token}`; } const url = `https://prod-hgtx-intelligence-n8n.hgtx.com.br/webhook/c898beff-84cb-44df-a69c-6eff27ccd7aa/codex/agente-pessoal/integracoes/asana/${integracaoId}`; const response = await axios.post( url, request, { headers } ); return response.data; } catch (error: unknown) { console.error('Erro ao atualizar integração do Asana:', error); // Retorna o erro da API se existir if (error && typeof error === 'object' && 'response' in error) { const axiosError = error as { response?: { data?: any; status?: number } }; if (axiosError.response?.data) { const errorData = axiosError.response.data; throw { success: false, message: errorData.message || 'Erro ao atualizar integração do Asana', }; } } throw { success: false, message: error instanceof Error ? error.message : 'Erro ao atualizar integração do Asana', }; } } } // Exporta instância única (Singleton) export const asanaService = new AsanaService();