Estou desenvolvendo um projeto para um desafio proposto na faculdade, e está quase pronto. No entanto, estou enfrentando um problema específico ao tentar implementar uma condição dentro de um bloco 'if'. A ideia é verificar se a sessão de votação expirou e, caso tenha expirado, alterar o status da votação de 'ABERTA' para 'FECHADA' no banco de dados. O problema é que, embora a condição seja verificada e a exceção seja lançada conforme esperado, a mudança de status não ocorre no banco de dados. Curiosamente, se eu realizar a alteração do status fora do bloco 'if', ela é executada com sucesso. Estou tendo dificuldades em identificar a causa desse problema. Abaixo, compartilho o trecho de código e o link para o repositório no GitHub:
@Entity
@Table(name = "voting_sessions")
public class VotingSession {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "start_session")
@JsonFormat(pattern = "dd/MM/yyyy HH:mm:ss", shape = JsonFormat.Shape.STRING)
private LocalDateTime startSession;
@Column(name = "end_session")
@JsonFormat(pattern = "dd/MM/yyyy HH:mm:ss", shape = JsonFormat.Shape.STRING)
private LocalDateTime endSession;
@ManyToOne
@JoinColumn(name = "id_topic")
private Topic topic;
@Enumerated(EnumType.STRING)
private StatusVotingSession status;
@Service
public class VoteServiceImp implements VoteService {
private final VotingSessionRepository votingSessionRepository;
private final VoteRepository voteRepository;
private final AssociateRepository associateRepository;
private final TopicRepository topicRepository;
public VoteServiceImp(VotingSessionRepository votingSessionRepository, VoteRepository voteRepository, AssociateRepository associateRepository, TopicRepository topicRepository) {
this.votingSessionRepository = votingSessionRepository;
this.voteRepository = voteRepository;
this.associateRepository = associateRepository;
this.topicRepository = topicRepository;
}
@Transactional
@Override
public void vote(VoteDTO voteDTO) {
var votingSession = votingSessionRepository.findById(voteDTO.sessionID())
.orElseThrow(() -> new SessionNotFoundException("Session not found!"));
var associate = associateRepository.findById(voteDTO.associateID())
.orElseThrow(() -> new AssociateNotFoundException("Associate not found!"));
var topic = topicRepository.findById(voteDTO.topicID())
.orElseThrow(() -> new TopicNotFoundException("topic not found!"));
boolean hasVoted = voteRepository
.existsByAssociateAndTopic(associate, topic);
if (votingSession.getEndSession().isBefore(LocalDateTime.now())) {
//Não está alterando o Status no banco
votingSession.setStatus(StatusVotingSession.CLOSED);
votingSessionRepository.save(votingSession);
throw new SessionExpiredException("Session expired!");
} else if (hasVoted) {
throw new AssociateHasAlreadyVotedException("Associate has already voted");
} else {
var vote = new Vote();
associate.setId(voteDTO.associateID());
vote.setAssociate(associate);
vote.setTopic(votingSession.getTopic());
vote.setVotingSession(votingSession);
vote.setTypeVote(voteDTO.typeVote());
voteRepository.save(vote);
}
}