Pular para o conteúdo principal

PublicationService

Visão Geral

O PublicationService expõe métodos para buscar publicações ativas, detalhes de uma publicação, gerenciar comentários e alternar "like" em publicações.

Localização: services/publication/publication.service.ts

Endpoints

MétodoEndpointDescrição
GET/publicacoes/ativasBusca publicações ativas (paginado)
GET/publicacoes/:publicationIdBusca publicação por id
GET/publicacoes/:publicationId/comentariosBusca comentários de uma publicação (paginado)
POST/publicacoes/:publicationId/:userIdRegistra comentário
PUT/publicacoes/:publicationId/:commentIdAtualiza comentário
DELETE/publicacoes/:publicationId/:commentIdRemove comentário
PATCH/publicacoes/:publicationId/:userIdAlterna like do usuário na publicação

Métodos

fetchActivePublicationsRemote(solutionId, params)

Busca publicações ativas (retorna Publication[]).

Parâmetros

NomeTipoObrigatório
solutionIdstringSim
paramsobjectNão

Retorno: Promise<Publication[]>

Exemplo

const pubs = await publicationService.fetchActivePublicationsRemote(
"solutionId",
{ page: 0, size: 10 },
);

Erros

StatusDescrição
5xxLança Error: PublicationService.fetchActivePublicationsRemote failed: {status}

fetchPublicationByIdRemote(publicationId, solutionId)

Busca e retorna a Publication referente ao publicationId.

Retorno: Promise<Publication>

Exemplo

const pub = await publicationService.fetchPublicationByIdRemote(
"publicationId",
"solutionId",
);

Erros

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

fetchCommentsByPublicationIdRemote(publicationId)

Retorna Comment[] paginados (conteúdo do PageResponse).

Retorno: Promise<Comment[]>

Exemplo

const comments =
await publicationService.fetchCommentsByPublicationIdRemote("publicationId");

Erros

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

registerComment(params, comment)

Registra um comentário para uma publicação.

Parâmetros

NomeTipoObrigatório
params{ publicationId: string; userId: string }Sim
commentCommentRegisterDataSim

Retorno: Promise<Comment>

Exemplo

const created = await publicationService.registerComment(
{ publicationId: "p1", userId: "u1" },
{ texto: "Ótimo post" },
);

Erros

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

updateComment(params, commentUpdated)

Atualiza um comentário existente.

Parâmetros

NomeTipoObrigatório
params{ publicationId: string; commentId: string }Sim
commentUpdatedCommentRegisterDataSim

Retorno: Promise<Comment>

Erros: lança Error: PublicationService.updateComment failed: {status} em não-2xx.


deleteComment(publicationId, commentId)

Remove comentário. Retorno: Promise<void> (espera 204 na API).

Erros: lança Error: PublicationService.deleteComment failed: {status} em não-2xx.


likeToggle(publicationId, userId)

Alterna o like do userId na publicação e retorna a Publication atualizada.

Retorno: Promise<Publication>

Erros: lança Error: PublicationService.likeToggle failed: {status} em não-2xx.

Estruturas de Dados

Publication

interface Publication {
id: string;
titulo: string;
subtitulo: string;
texto: string;
publicationImageKey: string | null;
publicationImageUrl: string | null;
dhInicioPublicacao: Date;
dhTerminoPublicacao: Date;
publicada: boolean;
permiteComentario: boolean;
qtdComentarios: number;
qtdCurtidas: number;
imagensAdicionais: Array<{ id: string; imageUrl: string; imageKey: string }>;
dhCriacao: Date;
dhAlteracao: Date;
}

CommentRegisterData (zod)

const commentRegisterSchema = z.object({
texto: z.string().trim().min(1, "O comentário não pode ser vazio"),
ocultar: z.boolean().optional(),
});

type CommentRegisterData = z.infer<typeof commentRegisterSchema>;

Comment

interface Comment {
id: string;
texto: string;
ocultar: boolean;
idPublicacao: string;
dhCriacao: Date;
}

Componentes Relacionados

ComponenteDescrição
buildQueryParamsSerializa parâmetros de query para endpoints paginados
apiWithoutAccessTokenInstância Axios usada para chamadas públicas
PageResponse<T>Tipo genérico para respostas paginadas

Casos de Uso

  • Listar publicações ativas com paginação
  • Exibir detalhes de uma publicação
  • Listar e gerenciar comentários de uma publicação
  • Alternar like de usuário em uma publicação

Testes

Localização: services/publication/publication.service.test.ts

Principais cenários cobertos nos testes

CenárioResultado esperado
fetchActivePublicationsRemote com status 200Retorna pagePublicationsMock.content
fetchActivePublicationsRemote com status 500Lança PublicationService.fetchActivePublicationsRemote failed: 500
fetchPublicationByIdRemote com status 200Retorna o objeto Publication
fetchPublicationByIdRemote com status 404Lança PublicationService.fetchPublicationByIdRemote failed
fetchCommentsByPublicationIdRemote com status 200Retorna pageCommentsMock.content
registerComment com status 201Retorna o comentário criado
updateComment com status 200Retorna o comentário atualizado
deleteComment com status 204Retorna void
likeToggle com status 200Retorna a Publication atualizada

Mocks

Localização: __mocks__/publication.mock.ts

  • pagePublicationsMock — resposta paginada usada nos testes de publicações
  • pageCommentsMock — resposta paginada usada nos testes de comentários

Exemplo de uso em testes (trecho do arquivo de testes):

import {
pagePublicationsMock,
pageCommentsMock,
} from "@/__mocks__/publication.mock";

const apiWithoutAccessToken: any = {
get: jest.fn(async () => ({ status: 200, data: pagePublicationsMock })),
};

const service = new PublicationService({ apiWithoutAccessToken });
const result = await service.fetchActivePublicationsRemote("solutionId");
expect(result).toEqual(pagePublicationsMock.content);

Instância

Localização: services/publication/publication.service.instance.ts

import { publicationService } from "@/services/publication/publication.service.instance";