Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
Expand Down
23 changes: 23 additions & 0 deletions src/main/java/com/guilherme/finance_api/config/RabbitMQConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.guilherme.finance_api.config;

import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {

@Bean
public Jackson2JsonMessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}

@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setMessageConverter(messageConverter());
return template;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.guilherme.finance_api.event;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.time.LocalDate;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class TransactionEvent {
private Long id;
private String description;
private BigDecimal amount;
private LocalDate date;
private String type;
private String userEmail;
private String categoryName;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.guilherme.finance_api.event;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Slf4j
@Component
@RequiredArgsConstructor
public class TransactionPublisher {

private final RabbitTemplate rabbitTemplate;

@Value("${rabbitmq.exchange}")
private String exchange;

@Value("${rabbitmq.routing-key}")
private String routingKey;

public void publish(TransactionEvent event) {
log.info("📤 Publicando evento na fila: transação '{}' do usuário {}",
event.getDescription(), event.getUserEmail());

rabbitTemplate.convertAndSend(exchange, routingKey, event);

log.info("✅ Evento publicado com sucesso.");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import com.guilherme.finance_api.entity.Category;
import com.guilherme.finance_api.entity.Transaction;
import com.guilherme.finance_api.entity.User;
import com.guilherme.finance_api.event.TransactionEvent;
import com.guilherme.finance_api.event.TransactionPublisher;
import com.guilherme.finance_api.exception.ResourceNotFoundException;
import com.guilherme.finance_api.repository.CategoryRepository;
import com.guilherme.finance_api.repository.TransactionRepository;
Expand All @@ -28,6 +30,7 @@ public class TransactionService {
private final TransactionRepository transactionRepository;
private final UserRepository userRepository;
private final CategoryRepository categoryRepository;
private final TransactionPublisher transactionPublisher;

public Page<TransactionResponse> findAll(TransactionFilter filter, Pageable pageable) {
String email = SecurityContextHolder.getContext().getAuthentication().getName();
Expand Down Expand Up @@ -97,6 +100,17 @@ public TransactionResponse save(TransactionRequest request) {
transaction.setCategory(category);

Transaction savedTransaction = transactionRepository.save(transaction);

TransactionEvent event = new TransactionEvent(
savedTransaction.getId(),
savedTransaction.getDescription(),
savedTransaction.getAmount(),
savedTransaction.getDate(),
savedTransaction.getType().name(),
savedTransaction.getUser().getEmail(),
savedTransaction.getCategory() != null ? savedTransaction.getCategory().getName() : null
);
transactionPublisher.publish(event);
return toResponse(savedTransaction);
}

Expand Down
8 changes: 7 additions & 1 deletion src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,10 @@ spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
jwt.secret=${JWT_SECRET:5b6f8d2a1e4c7f9b3d0e2a5c8f1b4d7e9a2c5f8b1d4e7a0c3f6b9d2e5a8c1f4}
jwt.expiration=${JWT_EXPIRATION:86400000}
jwt.expiration=${JWT_EXPIRATION:86400000}
spring.rabbitmq.host=${RABBITMQ_HOST:localhost}
spring.rabbitmq.port=${RABBITMQ_PORT:5672}
spring.rabbitmq.username=${RABBITMQ_USER:guest}
spring.rabbitmq.password=${RABBITMQ_PASSWORD:guest}
rabbitmq.exchange=transactions.exchange
rabbitmq.routing-key=transactions.created
Loading