diff --git a/src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/controller/PreferenceController.java b/src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/controller/PreferenceController.java new file mode 100644 index 0000000..b9ddc17 --- /dev/null +++ b/src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/controller/PreferenceController.java @@ -0,0 +1,64 @@ +package fr.vincent.ramiere.mangerautourdesimplonback.controller; + +import fr.vincent.ramiere.mangerautourdesimplonback.models.Preference; +import fr.vincent.ramiere.mangerautourdesimplonback.service.PreferenceService; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * Controleur REST pour la gestion des préférences des utilisateurs. + */ +@RestController +@RequestMapping("/api/v1/preferences") +@AllArgsConstructor +public class PreferenceController { + + private final PreferenceService preferenceService; + + /** + * DTO pour recevoir les données de préférence. + */ + @Data + static class PreferenceRequest { + private Integer personneId; + private Integer restaurantId; + private Integer note; + private Boolean favori; + } + + /** + * Endpoint pour récupérer toutes les préférences d'un utilisateur. + * + * @param personneId L'ID de l'utilisateur. + * @return une ResponseEntity contenant la liste des préférences et le statut + * HTTP OK. + */ + @GetMapping("/user/{personneId}") + public ResponseEntity> getPreferencesByPersonneId(@PathVariable Integer personneId) { + List preferences = preferenceService.getPreferencesByPersonneId(personneId); + return ResponseEntity.ok(preferences); + } + + /** + * Endpoint pour créer ou mettre à jour une préférence (note et/ou favori). + * + * @param request Le corps de la requête contenant les détails de la préférence. + * @return une ResponseEntity contenant la préférence sauvegardée (OK) ou + * NOT_FOUND si l'utilisateur ou le restaurant n'existe pas. + */ + @PutMapping + public ResponseEntity saveOrUpdatePreference(@RequestBody PreferenceRequest request) { + return preferenceService.saveOrUpdatePreference( + request.getPersonneId(), + request.getRestaurantId(), + request.getNote(), + request.getFavori()) + .map(ResponseEntity::ok) + .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND)); + } +} diff --git a/src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/repository/PreferenceRepository.java b/src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/repository/PreferenceRepository.java new file mode 100644 index 0000000..75d08fc --- /dev/null +++ b/src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/repository/PreferenceRepository.java @@ -0,0 +1,17 @@ +package fr.vincent.ramiere.mangerautourdesimplonback.repository; + +import fr.vincent.ramiere.mangerautourdesimplonback.models.Preference; +import fr.vincent.ramiere.mangerautourdesimplonback.models.PreferencePK; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * Repository pour l'entité Preference. + * Fournit les méthodes pour les opérations CRUD sur les préférences. + */ +@Repository +public interface PreferenceRepository extends JpaRepository { + List findByPreferencePK_Personne_Id(Integer personneId); +} diff --git a/src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/service/PreferenceService.java b/src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/service/PreferenceService.java new file mode 100644 index 0000000..843b9de --- /dev/null +++ b/src/main/java/fr/vincent/ramiere/mangerautourdesimplonback/service/PreferenceService.java @@ -0,0 +1,71 @@ +package fr.vincent.ramiere.mangerautourdesimplonback.service; + +import fr.vincent.ramiere.mangerautourdesimplonback.models.Personne; +import fr.vincent.ramiere.mangerautourdesimplonback.models.Preference; +import fr.vincent.ramiere.mangerautourdesimplonback.models.PreferencePK; +import fr.vincent.ramiere.mangerautourdesimplonback.models.Restaurant; +import fr.vincent.ramiere.mangerautourdesimplonback.repository.PersonneRepository; +import fr.vincent.ramiere.mangerautourdesimplonback.repository.PreferenceRepository; +import fr.vincent.ramiere.mangerautourdesimplonback.repository.RestaurantRepository; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Optional; + +/** + * Service pour la gestion des préférences des utilisateurs. + */ +@Service +@AllArgsConstructor +public class PreferenceService { + + private final PreferenceRepository preferenceRepository; + private final PersonneRepository personneRepository; + private final RestaurantRepository restaurantRepository; + + /** + * Récupère toutes les préférences pour un utilisateur donné. + * + * @param personneId L'ID de l'utilisateur. + * @return Une liste de préférences. + */ + public List getPreferencesByPersonneId(Integer personneId) { + return preferenceRepository.findByPreferencePK_Personne_Id(personneId); + } + + /** + * Crée ou met à jour une préférence pour un utilisateur et un restaurant. + * + * @param personneId L'ID de l'utilisateur. + * @param restaurantId L'ID du restaurant. + * @param note La note attribuée (peut être null). + * @param favori Le statut de favori (peut être null). + * @return Un Optional contenant la préférence sauvegardée, ou un Optional vide + * si l'utilisateur ou le restaurant n'existe pas. + */ + @Transactional + public Optional saveOrUpdatePreference(Integer personneId, Integer restaurantId, Integer note, + Boolean favori) { + Optional personneOpt = personneRepository.findById(personneId); + Optional restaurantOpt = restaurantRepository.findById(restaurantId); + + if (personneOpt.isEmpty() || restaurantOpt.isEmpty()) { + return Optional.empty(); + } + + Personne personne = personneOpt.get(); + Restaurant restaurant = restaurantOpt.get(); + + PreferencePK preferencePK = new PreferencePK(personne, restaurant); + + Preference preference = preferenceRepository.findById(preferencePK) + .orElse(new Preference(preferencePK)); + + preference.setNote(note); + preference.setFavori(favori); + + return Optional.of(preferenceRepository.save(preference)); + } +}