TourGuideController.java
package com.openclassrooms.tourguide.controller;
import java.util.Comparator;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.openclassrooms.tourguide.dto.NearbyAttractionDTO;
import com.openclassrooms.tourguide.service.RewardsService;
import com.openclassrooms.tourguide.service.TourGuideService;
import com.openclassrooms.tourguide.user.User;
import com.openclassrooms.tourguide.user.UserReward;
import gpsUtil.location.VisitedLocation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import tripPricer.Provider;
@RestController
@RequiredArgsConstructor
@Slf4j
public class TourGuideController {
private final TourGuideService tourGuideService;
private final RewardsService rewardsService;
@RequestMapping("/")
public String index() {
return "Greetings from TourGuide!";
}
@RequestMapping("/getLocation")
public VisitedLocation getLocation(@RequestParam String userName) {
return tourGuideService.getUserLocation(getUser(userName));
}
@RequestMapping("/getNearbyAttractions")
public List<NearbyAttractionDTO> getNearbyAttractions(@RequestParam String userName) {
User user = getUser(userName);
VisitedLocation visitedLocation = tourGuideService.getUserLocation(user);
return tourGuideService.getNearByAttractions(visitedLocation).stream()
.map(attraction -> new NearbyAttractionDTO(
attraction.attractionName,
attraction.latitude,
attraction.longitude,
visitedLocation.location.latitude,
visitedLocation.location.longitude,
rewardsService.getDistance(attraction, visitedLocation.location),
rewardsService.getRewardPoints(attraction, user)))
.sorted(Comparator.comparingDouble(dto -> dto.distance))
.limit(5)
.collect(Collectors.toList());
}
@RequestMapping("/getRewards")
public List<UserReward> getRewards(@RequestParam String userName) {
return tourGuideService.getUserRewards(getUser(userName)).parallelStream()
.collect(Collectors.toList());
}
@RequestMapping("/getTripDeals")
public List<Provider> getTripDeals(@RequestParam String userName) {
return tourGuideService.getTripDeals(getUser(userName)).parallelStream()
.collect(Collectors.toList());
}
private User getUser(String userName) {
return tourGuideService.getUser(userName);
}
@RequestMapping("/addUser")
public String addUser(@RequestParam String userName, @RequestParam String phoneNumber, @RequestParam String email) {
if (tourGuideService.getUser(userName) != null) {
return "User " + userName + " already exists";
}
User user = new User(UUID.randomUUID(), userName, phoneNumber, email);
tourGuideService.addUser(user);
log.info("Utilisateur ajouté via l'API : " + userName);
return "User " + userName + " added successfully";
}
}