Usage Log Service
Gerencia o registro de uso de funcionalidades do sistema, permitindo rastrear interações dos usuários e tempos de execução.
Visão Geral
O UsageLogService é responsável por:
- Registrar uso de funcionalidades específicas
- Rastrear tempo de execução de operações
- Monitorar status HTTP de requisições
- Registrar mensagens e tipos de uso
- Auxiliar no monitoramento de performance
O serviço permite rastrear como os usuários interagem com as funcionalidades do sistema, registrando eventos importantes para análise e auditoria.
Localização: services/usage-log/usage-log.service.ts
Endpoints Utilizados
Base URL
Todos os endpoints são relativos à base URL configurada em services/api.service.ts
Métodos
registerUsageLog(data)
Registra uso de uma funcionalidade específica.
Endpoint: POST /logUso
Parâmetros:
type UsageLogRegisterSchema = {
idSolucao: string;
idUsuario: string;
idFuncionalidade: string;
httpStatus: string;
tempo: number;
mensagem?: string;
tipo?: string;
};
Body: JSON com dados do uso da funcionalidade
Retorno:
Promise<UsageLogResponseSchema>;
Exemplo de uso:
import { usageLogService } from "@/services/usage-log/usage-log.service.instance";
// Registrar uso de funcionalidade
const log = await usageLogService.registerUsageLog({
idSolucao: "sol-001",
idUsuario: "user-123",
idFuncionalidade: "sync-clients",
httpStatus: "200",
tempo: 1250, // milissegundos
mensagem: "Sincronização concluída com sucesso",
tipo: "sync",
});
console.log("Log registrado:", log.id);
Tratamento de erros:
- Lança
Errorse o status da resposta não for 2xx - Mensagem:
UsageLogService.registerUsageLog failed: {status}
Estruturas de Dados
Interface UsageLogRegisterSchema
interface UsageLogRegisterSchema {
idSolucao: string;
idUsuario: string;
idFuncionalidade: string;
httpStatus: string;
tempo: number;
mensagem?: string;
tipo?: string;
}
Interface UsageLogResponseSchema
interface UsageLogResponseSchema {
id: string;
httpStatus: string;
tempo: number;
mensagem?: string;
tipo?: string;
}
Casos de Uso
Rastrear Tempo de Execução
async function trackFeatureUsage(
userId: string,
solutionId: string,
featureId: string,
action: () => Promise<any>,
) {
const startTime = Date.now();
let status = "200";
let message = "Sucesso";
try {
const result = await action();
return result;
} catch (error) {
status = "500";
message = error.message;
throw error;
} finally {
const tempo = Date.now() - startTime;
await usageLogService.registerUsageLog({
idUsuario: userId,
idSolucao: solutionId,
idFuncionalidade: featureId,
httpStatus: status,
tempo,
mensagem: message,
tipo: "execution",
});
}
}
// Exemplo de uso
await trackFeatureUsage("user-123", "sol-001", "export-pdf", async () => {
return await generatePdfReport();
});
Registrar Sincronização
async function logSyncOperation(
userId: string,
solutionId: string,
syncResult: { success: boolean; itemsCount: number; duration: number },
) {
await usageLogService.registerUsageLog({
idUsuario: userId,
idSolucao: solutionId,
idFuncionalidade: "data-sync",
httpStatus: syncResult.success ? "200" : "500",
tempo: syncResult.duration,
mensagem: `Sincronizados ${syncResult.itemsCount} itens`,
tipo: "sync",
});
}
// Exemplo de uso
await logSyncOperation("user-123", "sol-001", {
success: true,
itemsCount: 150,
duration: 2300,
});
Monitorar Ações do Usuário
async function logUserAction(
userId: string,
solutionId: string,
action: string,
details?: string,
) {
const startTime = performance.now();
// Simula ação do usuário
await performAction(action);
const endTime = performance.now();
const tempo = Math.round(endTime - startTime);
await usageLogService.registerUsageLog({
idUsuario: userId,
idSolucao: solutionId,
idFuncionalidade: action,
httpStatus: "200",
tempo,
mensagem: details,
tipo: "user-action",
});
}
// Exemplo de uso
await logUserAction(
"user-123",
"sol-001",
"create-client",
"Cliente cadastrado via formulário",
);
Testes
Localização
services/usage-log/usage-log.service.test.ts
Executar Testes
# Teste específico do serviço
npx jest services/usage-log/usage-log.service.test.ts
# Modo watch
npx jest services/usage-log/usage-log.service.test.ts --watch
# Com coverage
npx jest services/usage-log/usage-log.service.test.ts --coverage
Casos de Teste
- ✅
registerUsageLog: registro de uso com sucesso - ✅
registerUsageLog: retorna dados em status 2xx - ✅
registerUsageLog: tratamento de erros para status não-2xx
Mocks
Localização
__mocks__/usage-log.mock.ts
Dados Disponíveis
Mock com exemplo de registro de uso:
- Dados de registro (payload)
- Dados de resposta com ID gerado
- Status HTTP, tempo e mensagens
Exemplo de uso em testes:
import {
usageLogRegisterMock,
usageLogResponseMock,
} from "@/__mocks__/usage-log.mock";
// Mock registerUsageLog
const apiWithoutAccessToken: any = {
post: jest.fn(async () => ({
status: 201,
data: usageLogResponseMock,
})),
};
const service = new UsageLogService({ apiWithoutAccessToken });
const result = await service.registerUsageLog(usageLogRegisterMock);
expect(result).toEqual(usageLogResponseMock);