Skip to content
This repository has been archived by the owner on Oct 19, 2024. It is now read-only.

Commit

Permalink
feat(144): Consome msg falha pagamento
Browse files Browse the repository at this point in the history
  • Loading branch information
dannevesdantas committed Jun 30, 2024
1 parent cc2ba2d commit b0e8c3b
Show file tree
Hide file tree
Showing 9 changed files with 201 additions and 5 deletions.
6 changes: 5 additions & 1 deletion .env.template
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ AWS_DEFAULT_REGION=us-east-1
# Amazon Cognito
COGNITO_USER_POOL_ID=
COGNITO_CLIENT_ID=
# Para provisionar o Cognito na AWS, clone o repositório rms-iac e siga as instruções no README
# Para provisionar o Cognito na AWS clone o repositório rms-iac e siga as instruções no README

# Amazon SQS
# Fila de nova cobrança
Expand All @@ -31,5 +31,9 @@ REGION_FILA_COBRANCA_GERADA=us-east-1
NOME_FILA_FALHA_COBRANCA=falha-cobranca
URL_FILA_FALHA_COBRANCA=http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/falha-cobranca
REGION_FILA_FALHA_COBRANCA=us-east-1
# Fila de falha no pagamento
NOME_FILA_FALHA_PAGAMENTO=falha-pagamento
URL_FILA_FALHA_PAGAMENTO=http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/falha-pagamento
REGION_FILA_FALHA_PAGAMENTO=us-east-1

LOCALSTACK_ENDPOINT=http://sqs.us-east-1.localhost.localstack.cloud:4566
17 changes: 16 additions & 1 deletion k8s/production/api/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,21 @@ spec:
secretKeyRef:
name: sqs-fila-pagamento-confirmado-secret
key: REGION_FILA_PAGAMENTO_CONFIRMADO
- name: NOME_FILA_FALHA_PAGAMENTO
valueFrom:
secretKeyRef:
name: sqs-fila-falha-pagamento-secret
key: NOME_FILA_FALHA_PAGAMENTO
- name: URL_FILA_FALHA_PAGAMENTO
valueFrom:
secretKeyRef:
name: sqs-fila-falha-pagamento-secret
key: URL_FILA_FALHA_PAGAMENTO
- name: REGION_FILA_FALHA_PAGAMENTO
valueFrom:
secretKeyRef:
name: sqs-fila-falha-pagamento-secret
key: REGION_FILA_FALHA_PAGAMENTO
ports:
- containerPort: 3002
resources:
Expand All @@ -136,4 +151,4 @@ spec:
limits:
cpu: "0.5"
memory: "1Gi"
ephemeral-storage: "2Gi"
ephemeral-storage: "2Gi"
18 changes: 18 additions & 0 deletions k8s/production/api/secret-provider.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,15 @@ spec:
key: URL_FILA_PAGAMENTO_CONFIRMADO
- objectName: REGION_FILA_PAGAMENTO_CONFIRMADO
key: REGION_FILA_PAGAMENTO_CONFIRMADO
- secretName: sqs-fila-falha-pagamento-secret # Nome do Secret que será montado automaticamente contendo os segredos do AWS Secrets Manager
type: Opaque
data:
- objectName: NOME_FILA_FALHA_PAGAMENTO
key: NOME_FILA_FALHA_PAGAMENTO
- objectName: URL_FILA_FALHA_PAGAMENTO
key: URL_FILA_FALHA_PAGAMENTO
- objectName: REGION_FILA_FALHA_PAGAMENTO
key: REGION_FILA_FALHA_PAGAMENTO
parameters:
# Informe abaixo no campo objectName os nomes dos Segredos do AWS Secrets Manager que deseja acessar.
# Certifique-se de que as Keys declaradas abaixo existem e estão preenchidas na AWS, caso contrário receberá o erro "Failed to fetch secret from all regions"
Expand Down Expand Up @@ -118,3 +127,12 @@ spec:
objectAlias: "URL_FILA_PAGAMENTO_CONFIRMADO"
- path: "QUEUE_REGION"
objectAlias: "REGION_FILA_PAGAMENTO_CONFIRMADO"
- objectName: "prod/RMS/SQSFalhaPagamento"
objectType: "secretsmanager"
jmesPath:
- path: "QUEUE_NAME"
objectAlias: "NOME_FILA_FALHA_PAGAMENTO"
- path: "QUEUE_URL"
objectAlias: "URL_FILA_FALHA_PAGAMENTO"
- path: "QUEUE_REGION"
objectAlias: "REGION_FILA_FALHA_PAGAMENTO"
1 change: 1 addition & 0 deletions src/domain/pedido/enums/pedido.enum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ export enum StatusPagamento {
PAGO = 'pago',
RECUSADO = 'recusado',
PENDENTE = 'pendente',
ERRO = 'erro',
}

export enum StatusPedido {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ describe('FalhaCobrancaMessageHandler', () => {
};
const atualizaPedidoDTO: AtualizaPedidoDTO = {
statusPedido: StatusPedido.CANCELADO,
statusPagamento: StatusPagamento.RECUSADO,
statusPagamento: StatusPagamento.ERRO,
};
pedidoUseCaseMock.editarPedido.mockReturnValue(HTTPResponse);

Expand All @@ -64,7 +64,7 @@ describe('FalhaCobrancaMessageHandler', () => {
it('deve lançar exceção ao consumir mensagem de falha na cobrança', async () => {
const atualizaPedidoDTO: AtualizaPedidoDTO = {
statusPedido: StatusPedido.CANCELADO,
statusPagamento: StatusPagamento.RECUSADO,
statusPagamento: StatusPagamento.ERRO,
};
pedidoUseCaseMock.editarPedido.mockRejectedValue(new Error('Erro'));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export class FalhaCobrancaMessageHandler {
);
const atualizaPedidoDTO: AtualizaPedidoDTO = {
statusPedido: StatusPedido.CANCELADO,
statusPagamento: StatusPagamento.RECUSADO,
statusPagamento: StatusPagamento.ERRO,
};
await this.pedidoUseCase.editarPedido(pedidoDTO.id, atualizaPedidoDTO);
this.logger.warn(`O pedido ${pedidoDTO.id} foi cancelado`);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import { ConfigService } from '@nestjs/config';
import { Test, TestingModule } from '@nestjs/testing';
import { pedidoDTOMock, pedidoUseCaseMock } from 'src/mocks/pedido.mock';
import { IPedidoUseCase } from 'src/domain/pedido/interfaces/pedido.use_case.port';
import { messageIdMock } from 'src/mocks/message.mock';
import { Logger } from '@nestjs/common';
import { AtualizaPedidoDTO } from 'src/presentation/rest/v1/presenters/pedido/pedido.dto';
import { FalhaPagamentoMessageHandler } from './falha_pag.handler';
import {
StatusPagamento,
StatusPedido,
} from 'src/domain/pedido/enums/pedido.enum';

describe('FalhaPagamentoMessageHandler', () => {
let falhaPagamentoMessageHandler: FalhaPagamentoMessageHandler;

beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
Logger,
FalhaPagamentoMessageHandler,
{
provide: IPedidoUseCase,
useValue: pedidoUseCaseMock,
},
{
provide: ConfigService,
useValue: {
get: jest.fn(),
getOrThrow: jest.fn(),
},
},
],
}).compile();

falhaPagamentoMessageHandler = module.get<FalhaPagamentoMessageHandler>(
FalhaPagamentoMessageHandler,
);
});

afterEach(() => {
jest.clearAllMocks();
});

it('deve consumir mensagem de falha no pagamento', async () => {
const HTTPResponse = {
mensagem: 'Pedido atualizado com sucesso',
body: pedidoDTOMock,
};
const atualizaPedidoDTO: AtualizaPedidoDTO = {
statusPagamento: StatusPagamento.RECUSADO,
statusPedido: StatusPedido.CANCELADO,
};
pedidoUseCaseMock.editarPedido.mockReturnValue(HTTPResponse);

await falhaPagamentoMessageHandler.handleMessage(messageIdMock);

expect(pedidoUseCaseMock.editarPedido).toHaveBeenCalledWith(
pedidoDTOMock.id,
atualizaPedidoDTO,
);
});

it('deve lançar exceção ao consumir mensagem de falha no pagamento', async () => {
const atualizaPedidoDTO: AtualizaPedidoDTO = {
statusPagamento: StatusPagamento.RECUSADO,
statusPedido: StatusPedido.CANCELADO,
};
pedidoUseCaseMock.editarPedido.mockRejectedValue(new Error('Erro'));

await falhaPagamentoMessageHandler.handleMessage(messageIdMock);

expect(pedidoUseCaseMock.editarPedido).toHaveBeenCalledWith(
pedidoDTOMock.id,
atualizaPedidoDTO,
);
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { Message } from '@aws-sdk/client-sqs';
import { Inject, Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { SqsConsumerEventHandler, SqsMessageHandler } from '@ssut/nestjs-sqs';
import {
StatusPagamento,
StatusPedido,
} from 'src/domain/pedido/enums/pedido.enum';
import { IPedidoUseCase } from 'src/domain/pedido/interfaces/pedido.use_case.port';
import { AtualizaPedidoDTO } from 'src/presentation/rest/v1/presenters/pedido/pedido.dto';

@Injectable()
export class FalhaPagamentoMessageHandler {
private _nomeFilaFalhaPagamento: string;

constructor(
private readonly logger: Logger,
private configService: ConfigService,
@Inject(IPedidoUseCase)
private readonly pedidoUseCase: IPedidoUseCase,
) {
this._nomeFilaFalhaPagamento = this.configService.getOrThrow<string>(
'NOME_FILA_FALHA_PAGAMENTO',
);
}

@SqsMessageHandler('falha-pagamento', false)
public async handleMessage(message: Message) {
this.logger.debug(
`Nova mensagem recebida na fila falha-pagamento`,
JSON.stringify(message),
);
try {
const idPedido: string = message.Body;
this.logger.warn(`Cancelando o pedido ${idPedido}...`);
const atualizaPedidoDTO: AtualizaPedidoDTO = {
statusPagamento: StatusPagamento.RECUSADO,
statusPedido: StatusPedido.CANCELADO,
};
this.logger.warn(
`O pedido ${idPedido} foi cancelado`,
);
await this.pedidoUseCase.editarPedido(idPedido, atualizaPedidoDTO);
} catch (error) {
this.logger.error(
`Ocorreu um erro ao processar a mensagem com MessageId ${message?.MessageId}`,
error,
JSON.stringify(message),
);
}
}

@SqsConsumerEventHandler('falha-pagamento', 'processing_error')
public onProcessingError(error: Error, message: Message) {
this.logger.error(
`Ocorreu um erro ao processar a mensagem com MessageId ${message?.MessageId}`,
error,
JSON.stringify(message),
);
}
}
19 changes: 19 additions & 0 deletions src/modules/pedido.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import { SQSClient } from '@aws-sdk/client-sqs';
import { CobrancaMessageHandler } from 'src/infrastructure/message_handlers/nova_cobranca/nova_cobranca.handler';
import { FalhaCobrancaMessageHandler } from 'src/infrastructure/message_handlers/falha_cobranca/falha_cobranca.handler';
import { PagamentoMessageHandler } from 'src/infrastructure/message_handlers/pagamento_confirmado/pag_confirmado.handler';
import { FalhaPagamentoMessageHandler } from 'src/infrastructure/message_handlers/falha_pagamento/falha_pag.handler';

@Module({
imports: [
Expand Down Expand Up @@ -93,6 +94,23 @@ import { PagamentoMessageHandler } from 'src/infrastructure/message_handlers/pag
endpoint: configService.get<string>('LOCALSTACK_ENDPOINT'),
}),
},
{
name: configService.getOrThrow<string>(
'NOME_FILA_FALHA_PAGAMENTO',
),
queueUrl: configService.getOrThrow<string>(
'URL_FILA_FALHA_PAGAMENTO',
),
region: configService.getOrThrow<string>(
'REGION_FILA_FALHA_PAGAMENTO',
),
sqs: new SQSClient({
region: configService.getOrThrow<string>(
'REGION_FILA_FALHA_PAGAMENTO',
),
endpoint: configService.get<string>('LOCALSTACK_ENDPOINT'),
}),
},
],
producers: [
{
Expand Down Expand Up @@ -122,6 +140,7 @@ import { PagamentoMessageHandler } from 'src/infrastructure/message_handlers/pag
CobrancaMessageHandler,
FalhaCobrancaMessageHandler,
PagamentoMessageHandler,
FalhaPagamentoMessageHandler,
PedidoUseCase,
{
provide: IPedidoUseCase,
Expand Down

0 comments on commit b0e8c3b

Please sign in to comment.