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étodo | Endpoint | Descrição |
|---|---|---|
| GET | /publicacoes/ativas | Busca publicações ativas (paginado) |
| GET | /publicacoes/:publicationId | Busca publicação por id |
| GET | /publicacoes/:publicationId/comentarios | Busca comentários de uma publicação (paginado) |
| POST | /publicacoes/:publicationId/:userId | Registra comentário |
| PUT | /publicacoes/:publicationId/:commentId | Atualiza comentário |
| DELETE | /publicacoes/:publicationId/:commentId | Remove comentário |
| PATCH | /publicacoes/:publicationId/:userId | Alterna like do usuário na publicação |
Métodos
fetchActivePublicationsRemote(solutionId, params)
Busca publicações ativas (retorna Publication[]).
Parâmetros
| Nome | Tipo | Obrigatório |
|---|---|---|
solutionId | string | Sim |
params | object | Não |
Retorno: Promise<Publication[]>
Exemplo
const pubs = await publicationService.fetchActivePublicationsRemote(
"solutionId",
{ page: 0, size: 10 },
);
Erros
| Status | Descrição |
|---|---|
| 5xx | Lanç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
| Status | Descrição |
|---|---|
| 4xx/5xx | Lanç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
| Status | Descrição |
|---|---|
| 4xx/5xx | Lança Error: PublicationService.fetchCommentsByPublicationIdRemote failed: {status} |
registerComment(params, comment)
Registra um comentário para uma publicação.
Parâmetros
| Nome | Tipo | Obrigatório |
|---|---|---|
params | { publicationId: string; userId: string } | Sim |
comment | CommentRegisterData | Sim |
Retorno: Promise<Comment>
Exemplo
const created = await publicationService.registerComment(
{ publicationId: "p1", userId: "u1" },
{ texto: "Ótimo post" },
);
Erros
| Status | Descrição |
|---|---|
| 4xx/5xx | Lança Error: PublicationService.registerComment failed: {status} |
updateComment(params, commentUpdated)
Atualiza um comentário existente.
Parâmetros
| Nome | Tipo | Obrigatório |
|---|---|---|
params | { publicationId: string; commentId: string } | Sim |
commentUpdated | CommentRegisterData | Sim |
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
| Componente | Descrição |
|---|---|
buildQueryParams | Serializa parâmetros de query para endpoints paginados |
apiWithoutAccessToken | Instâ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ário | Resultado esperado |
|---|---|
fetchActivePublicationsRemote com status 200 | Retorna pagePublicationsMock.content |
fetchActivePublicationsRemote com status 500 | Lança PublicationService.fetchActivePublicationsRemote failed: 500 |
fetchPublicationByIdRemote com status 200 | Retorna o objeto Publication |
fetchPublicationByIdRemote com status 404 | Lança PublicationService.fetchPublicationByIdRemote failed |
fetchCommentsByPublicationIdRemote com status 200 | Retorna pageCommentsMock.content |
registerComment com status 201 | Retorna o comentário criado |
updateComment com status 200 | Retorna o comentário atualizado |
deleteComment com status 204 | Retorna void |
likeToggle com status 200 | Retorna a Publication atualizada |
Mocks
Localização: __mocks__/publication.mock.ts
pagePublicationsMock— resposta paginada usada nos testes de publicaçõespageCommentsMock— 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";