Pular para o conteúdo principal

Client Attachment Service

Visão Geral

O ClientAttachmentService gerencia anexos de clientes: listar anexos de um cliente, enviar novos anexos (upload) e excluir anexos existentes.

Suporta chamadas paginadas ao endpoint de listagem, upload via FormData e remoção por attachmentId.

Localização: services/client-attachment/client-attachment.service.ts

Endpoints

MétodoEndpointDescrição
GET/cliente/anexo/cliente/{clientId}Busca anexos do cliente (paginado)
POST/cliente/anexo/{clientId}Faz upload de anexo para o cliente
DELETE/cliente/anexo/{attachmentId}Remove um anexo por ID

Métodos

fetchRemoteByClientId(clientId)

Busca anexos de um cliente (retorna o content da resposta paginada).

Parâmetros

NomeTipoObrigatório
clientIdstringSim

Retorno: Promise<ClientAttachment[]>

Exemplo

const attachments = await clientAttachmentService.fetchRemoteByClientId(
"client-123",
);

Erros

StatusDescrição
5xxLança Error: ClientAttachmentService.fetchRemoteByClientId failed: {status}

uploadAttachment(clientId, formData)

Faz upload de um anexo para o cliente usando FormData.

Parâmetros

NomeTipoObrigatório
clientIdstringSim
formDataFormDataSim

Retorno: Promise<ClientAttachment[]> (array de anexos atualizados)

Exemplo

import { makeNewAttachmentMock } from "@/__mocks__/client-attachment.mock";

const formData = makeNewAttachmentMock();
const attachments = await clientAttachmentService.uploadAttachment("client-123", formData);

Erros

StatusDescrição
4xx/5xxLança Error: ClientAttachmentService.uploadAttachment failed: {status}

deleteAttachment(attachmentId)

Remove um anexo pelo seu ID.

Parâmetros

NomeTipoObrigatório
attachmentIdstringSim

Retorno: Promise<void>

Exemplo

await clientAttachmentService.deleteAttachment("a1f9c3d2-4b6e-4f1a-9c2b-0e7d5f8a1234");

Erros

StatusDescrição
4xx/5xxLança Error: ClientAttachmentService.deleteAttachment failed: {status}

Estruturas de Dados

ClientAttachment

interface ClientAttachment {
id: string;
clientId: string;
organizationId: string;
nome: string;
organizationName: string;
attachmentUrl: string;
attachmentKey: string;
}

Upload helpers / validações

  • MAX_ATTACHMENT_SIZE_BYTES — 2 MB
  • ACCEPTED_MIME_TYPES — tipos aceitos: image/jpeg, image/png, application/pdf, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, text/csv, application/vnd.ms-excel

Componentes Relacionados

ComponenteDescrição
apiWithoutAccessTokenInstância Axios sem token de acesso utilizada nas chamadas
PageResponse<T>Tipo genérico de resposta paginada da API

Casos de Uso

Listar anexos de um cliente:

const attachments = await clientAttachmentService.fetchRemoteByClientId("client-123");
console.log(attachments.length);

Enviar um novo anexo (upload):

const formData = makeNewAttachmentMock();
const updated = await clientAttachmentService.uploadAttachment("client-123", formData);
console.log("Anexos após upload:", updated.length);

Remover um anexo:

await clientAttachmentService.deleteAttachment("attachment-123");
console.log("Anexo removido");

Testes

Localização: services/client-attachment/client-attachment.test.ts

CenárioResultado esperado
fetchRemoteByClientId status 200Retorna pageClientAttachmentResponseMock.content
fetchRemoteByClientId status 500Lança Error: ClientAttachmentService.fetchRemoteByClientId failed: 500
uploadAttachment status 201Retorna array de anexos
uploadAttachment status 400Lança Error: ClientAttachmentService.uploadAttachment failed: 400
deleteAttachment status 204Resolve sem erro (void)
deleteAttachment status 404Lança Error: ClientAttachmentService.deleteAttachment failed: 404

Mocks

Localização: __mocks__/client-attachment.mock.ts

  • clientAttachmentResponseMock — array de ClientAttachment de exemplo
  • pageClientAttachmentResponseMock — objeto paginado com content e metadados
  • makeNewAttachmentMock() — cria um FormData com um File de exemplo e campo descricao

Exemplo de uso em testes:

import { makeNewAttachmentMock, pageClientAttachmentResponseMock } from "@/__mocks__/client-attachment.mock";

const api: any = { post: jest.fn(async () => ({ status: 201, data: pageClientAttachmentResponseMock.content })) };
const service = new ClientAttachmentService({ apiWithoutAccessToken: api });
const newAttachment = makeNewAttachmentMock();
const result = await service.uploadAttachment("client-123", newAttachment);
expect(result).toStrictEqual(pageClientAttachmentResponseMock.content);