ParticipationService.java
package com.archiweb.service;
import com.archiweb.model.Code;
import com.archiweb.model.Participation;
import com.archiweb.model.User;
import com.archiweb.repository.CodeRepository;
import com.archiweb.repository.ParticipationRepository;
import com.archiweb.repository.UserRepository;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
@Service
public class ParticipationService {
private final ParticipationRepository participationRepository;
private final UserRepository userRepository;
private final CodeRepository codeRepository;
public ParticipationService(ParticipationRepository participationRepository,
UserRepository userRepository,
CodeRepository codeRepository) {
this.participationRepository = participationRepository;
this.userRepository = userRepository;
this.codeRepository = codeRepository;
}
public Participation participate(Long userId, String codeValeur) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new RuntimeException("Utilisateur non trouvé"));
Code code = codeRepository.findByValeur(codeValeur)
.orElseThrow(() -> new RuntimeException("Code non trouvé"));
if (code.isUsed())
throw new RuntimeException("Ce code a déjà été utilisé");
if (participationRepository.findByUserAndCode(user, code).isPresent())
throw new RuntimeException("Ce code a déjà été utilisé par cet utilisateur");
code.setUsed(true);
code.setUsedAt(LocalDateTime.now());
codeRepository.save(code);
Participation participation = new Participation();
participation.setUser(user);
participation.setCode(code);
participation.setClaimed(true);
participation.setClaimedAt(LocalDateTime.now());
participation.setClaimChannel("WEB");
participation.setClaimedBy(user.getEmail());
return participationRepository.save(participation);
}
public Map<String, Long> getParticipationStats() {
long gagnantes = participationRepository.countByCode_Gagnant(true);
long perdantes = participationRepository.countByCode_Gagnant(false);
long total = participationRepository.count();
return Map.of("total", total, "gagnantes", gagnantes, "perdantes", perdantes);
}
}