Pular para o conteúdo principal

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 Error se 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);