mudanca requisicoes API do metodo PUT para POST e limpeza / organizacao dos códigos

This commit is contained in:
Vitex Tecnologia
2026-01-19 14:19:18 -03:00
parent 76cbd80eef
commit 71f9c9ab86
6 changed files with 68 additions and 311 deletions
+9 -100
View File
@@ -1,58 +1,32 @@
/**
* Serviço para integração com API do Asana
*/
/**
* Interface para workspace do Asana (resposta da API)
*/
export interface AsanaWorkspaceResponse {
gid: string;
resource_type: string;
name: string;
}
/**
* Interface para resposta da API de workspaces
*/
export interface AsanaWorkspacesResponse {
data: AsanaWorkspaceResponse[];
}
/**
* Interface para workspace formatado (usado no componente)
*/
export interface AsanaWorkspace {
id: string;
name: string;
}
/**
* Interface para usuário do Asana (resposta da API)
*/
export interface AsanaUserResponse {
gid: string;
name: string;
resource_type: string;
}
/**
* Interface para resposta da API de usuários
*/
export interface AsanaUsersResponse {
data: AsanaUserResponse[];
}
/**
* Interface para usuário formatado (usado no componente)
*/
export interface AsanaUser {
id: string;
name: string;
}
/**
* Interface para resposta da API de integração do Asana
*/
export interface AsanaIntegrationResponse {
success: boolean;
integracao_id?: string;
@@ -64,9 +38,6 @@ export interface AsanaIntegrationResponse {
usuario_asana_nome?: string;
}
/**
* Interface para request de criação/atualização de integração
*/
export interface AsanaIntegrationRequest {
user_id?: string;
api_key: string;
@@ -76,20 +47,9 @@ export interface AsanaIntegrationRequest {
usuario_asana_nome: string;
}
/**
* Serviço para integração com Asana
*/
class AsanaService {
private readonly BASE_URL = 'https://app.asana.com/api/1.0';
private readonly INTEGRATION_BASE_URL = 'https://prod-hgtx-intelligence-n8n.hgtx.com.br';
private readonly INTEGRATION_WEBHOOK_ID = 'c898beff-84cb-44df-a69c-6eff27ccd7aa';
private readonly ASANA_BASE_URL = 'https://app.asana.com/api/1.0';
/**
* Lista os workspaces do Asana usando o token fornecido
*
* @param token - Token de acesso do Asana
* @returns Promise com a lista de workspaces formatados
*/
async getWorkspaces(token: string): Promise<AsanaWorkspace[]> {
if (!token || token.trim().length === 0) {
throw {
@@ -107,12 +67,10 @@ class AsanaService {
};
const response = await axios.get<AsanaWorkspacesResponse>(
`${this.BASE_URL}/workspaces`,
`${this.ASANA_BASE_URL}/workspaces`,
{ 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((workspace) => ({
id: workspace.gid,
name: workspace.name,
@@ -120,7 +78,6 @@ class AsanaService {
} catch (error: unknown) {
console.error('Erro ao buscar workspaces 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 } };
@@ -146,13 +103,6 @@ class AsanaService {
}
}
/**
* Lista os usuários de um workspace do Asana
*
* @param token - Token de acesso do Asana
* @param workspaceId - ID do workspace (gid)
* @returns Promise com a lista de usuários formatados
*/
async getUsers(token: string, workspaceId: string): Promise<AsanaUser[]> {
if (!token || token.trim().length === 0) {
throw {
@@ -177,7 +127,7 @@ class AsanaService {
};
const response = await axios.get<AsanaUsersResponse>(
`${this.BASE_URL}/users?workspace=${workspaceId}`,
`${this.ASANA_BASE_URL}/users?workspace=${workspaceId}`,
{ headers }
);
@@ -190,7 +140,6 @@ class AsanaService {
} catch (error: unknown) {
console.error('Erro ao buscar usuários 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 } };
@@ -216,12 +165,6 @@ class AsanaService {
}
}
/**
* Obtém os detalhes da integração do Asana do usuário
*
* @param userId - ID do usuário
* @returns Promise com os detalhes da integração ou null se não houver
*/
async getIntegration(userId: string): Promise<AsanaIntegrationResponse | null> {
if (!userId || userId.trim().length === 0) {
throw {
@@ -234,7 +177,6 @@ class AsanaService {
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 || '';
@@ -243,27 +185,19 @@ class AsanaService {
'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}`;
}
// Em desenvolvimento, usa proxy do Vite para evitar CORS
const baseUrl = import.meta.env.DEV
? '/api/intelligence'
: this.INTEGRATION_BASE_URL;
const response = await axios.get<AsanaIntegrationResponse>(
`${baseUrl}/webhook/${this.INTEGRATION_WEBHOOK_ID}/codex/agente-pessoal/integracoes/asana/${userId}`,
`https://prod-hgtx-intelligence-n8n.hgtx.com.br/webhook/c898beff-84cb-44df-a69c-6eff27ccd7aa/codex/agente-pessoal/integracoes/asana/${userId}`,
{ headers }
);
// Se success é false, retorna null (não tem integração)
if (!response.data.success) {
return null;
}
@@ -280,17 +214,10 @@ class AsanaService {
}
}
// Para outros erros, retorna null silenciosamente (não quebra a aplicação)
return null;
}
}
/**
* Cria uma nova integração do Asana
*
* @param request - Dados da integração a ser criada
* @returns Promise com a resposta da criação
*/
async createIntegration(request: AsanaIntegrationRequest): Promise<AsanaIntegrationResponse> {
if (!request.user_id || !request.api_key || !request.workspace_gid || !request.usuario_asana_gid) {
throw {
@@ -322,13 +249,8 @@ class AsanaService {
headers['Authorization'] = `Bearer ${token}`;
}
// Em desenvolvimento, usa proxy do Vite para evitar CORS
const baseUrl = import.meta.env.DEV
? '/api/intelligence'
: this.INTEGRATION_BASE_URL;
const response = await axios.post<AsanaIntegrationResponse>(
`${baseUrl}/webhook/codex/agente-pessoal/integracoes/asana`,
`https://prod-hgtx-intelligence-n8n.hgtx.com.br/webhook/codex/agente-pessoal/integracoes/asana`,
request,
{ headers }
);
@@ -357,13 +279,6 @@ class AsanaService {
}
}
/**
* Atualiza uma integração existente do Asana
*
* @param integracaoId - ID da integração a ser atualizada
* @param request - Dados da integração a ser atualizada
* @returns Promise com a resposta da atualização
*/
async updateIntegration(integracaoId: string, request: Omit<AsanaIntegrationRequest, 'user_id'>): Promise<AsanaIntegrationResponse> {
if (!integracaoId || !request.api_key || !request.workspace_gid || !request.usuario_asana_gid) {
throw {
@@ -376,7 +291,6 @@ class AsanaService {
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 || '';
@@ -385,23 +299,18 @@ class AsanaService {
'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}`;
}
// Em desenvolvimento, usa proxy do Vite para evitar CORS
const baseUrl = import.meta.env.DEV
? '/api/intelligence'
: this.INTEGRATION_BASE_URL;
const response = await axios.put<AsanaIntegrationResponse>(
`${baseUrl}/webhook/${this.INTEGRATION_WEBHOOK_ID}/codex/agente-pessoal/integracoes/asana/${integracaoId}`,
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<AsanaIntegrationResponse>(
url,
request,
{ headers }
);