Select Git revision
-
RANWEZ Pierre authoredRANWEZ Pierre authored
UserController.java 11.99 KiB
package fr.but.infoetu.meetingplannr.controller;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import fr.but.infoetu.meetingplannr.pojo.Meeting;
import fr.but.infoetu.meetingplannr.pojo.Request;
import fr.but.infoetu.meetingplannr.pojo.User;
import fr.but.infoetu.meetingplannr.repository.MeetingRepository;
import fr.but.infoetu.meetingplannr.repository.RequestRepository;
import fr.but.infoetu.meetingplannr.repository.UserRepository;
import fr.but.infoetu.meetingplannr.service.UserService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
@Controller
public class UserController {
@Autowired
MeetingRepository mr;
@Autowired UserRepository ur;
@Autowired
RequestRepository rr;
@Autowired
UserService userService;
@RequestMapping(value = "user/listeAction", method = RequestMethod.GET)
private String listeAction(@AuthenticationPrincipal UserDetails details, Model model){
if (details == null) {
return "redirect:/public/login";
}
User user = ur.findByUsername(details.getUsername()).get();
model.addAttribute("currentUser", user);
return "user/listeAction";
}
@RequestMapping(value = "user/profile", method = RequestMethod.GET)
private String profile(@AuthenticationPrincipal UserDetails details, Model model) {
if (details == null) {
return "redirect:/public/login";
}
User user = ur.findByUsername(details.getUsername()).get();
System.out.println(user);
model.addAttribute("currentUser", user);
return "user/profile";
}
@RequestMapping(value = "user/editProfile", method = RequestMethod.GET)
private String editProfile(@AuthenticationPrincipal UserDetails details, Model model) {
if (details == null) {
return "redirect:/public/login";
}
User user = ur.findByUsername(details.getUsername()).get();
model.addAttribute("currentUser", user);
return "user/editProfile";
}
@RequestMapping(value = "user/updateProfile", method = RequestMethod.POST)
private String updateProfile(User user,
@RequestParam(required = false) MultipartFile photo,
BindingResult res,
Model model,
@AuthenticationPrincipal UserDetails details) {
if (res.hasErrors()) {
StringBuilder errorMessage = new StringBuilder("Veuillez corriger les erreurs suivantes :<br>");
res.getFieldErrors().forEach(error -> errorMessage.append(error.getField()).append(": ").append(error.getDefaultMessage()).append("<br>"));
model.addAttribute("errorMessage", errorMessage.toString());
return "user/editProfile";
}
if (details == null) {
model.addAttribute("errorMessage", "Utilisateur non connecté.");
return "public/login";
}
User currentUser = ur.findByUsername(details.getUsername()).get();
if (photo != null && !photo.isEmpty()) {
try {
String fileName = userService.saveUserPhoto(photo, currentUser.getUno());
currentUser.setPhotoPath(fileName);
} catch (Exception e) {
model.addAttribute("errorMessage", "Erreur lors de l'upload de la photo: " + e.getMessage());
return "user/editProfile";
}
}
currentUser.setName(user.getName());
currentUser.setSurname(user.getSurname());
ur.save(currentUser);
return "redirect:/user/profile";
}
@RequestMapping(value = "user/meetings", method = RequestMethod.GET)
private String meetings(@AuthenticationPrincipal UserDetails details, Model model) {
if (details == null) {
return "redirect:/public/login";
}
User user = ur.findByUsername(details.getUsername()).get();
List<Meeting> meetings = mr.findByUserOrderByRequestDateAsc(user);
model.addAttribute("meetings", meetings);
model.addAttribute("currentUser", user);
return "user/rendezVous";
}
@RequestMapping(value = "user/meetings/detail/{mno}", method = RequestMethod.GET)
private String appointmentDetail(@PathVariable int mno, @AuthenticationPrincipal UserDetails details, Model model) {
if (details == null) {
return "redirect:/public/login";
}
Optional<Meeting> meetingOpt = mr.findById(mno);
if (!meetingOpt.isPresent()) {
return "redirect:/user/meetings";
}
Meeting meeting = meetingOpt.get();
User currentUser = ur.findByUsername(details.getUsername()).get();
model.addAttribute("meeting", meeting);
model.addAttribute("isOwner", meeting.getUser().getUno() == currentUser.getUno());
return "user/detailRendezVous";
}
@RequestMapping(value = "user/meetings/edit/{mno}", method = RequestMethod.GET)
private String editMeeting(@PathVariable int mno, @AuthenticationPrincipal UserDetails details, Model model) {
Optional<Meeting> meetingOpt = mr.findById(mno);
if (!meetingOpt.isPresent()) {
return "redirect:/user/meetings";
}
Meeting meeting = meetingOpt.get();
User currentUser = ur.findByUsername(details.getUsername()).get();
if (meeting.getUser().getUno() != currentUser.getUno()) {
return "redirect:/user/meetings";
}
model.addAttribute("meeting", meeting);
return "user/editMeeting";
}
@RequestMapping(value = "user/meetings/update/{mno}", method = RequestMethod.POST)
private String updateMeeting(@PathVariable int mno, Meeting updatedMeeting,
BindingResult result, @AuthenticationPrincipal UserDetails details,
Model model) {
if (result.hasErrors()) {
model.addAttribute("errorMessage", "Veuillez corriger les erreurs du formulaire.");
return "user/editMeeting";
}
Optional<Meeting> meetingOpt = mr.findById(mno);
if (!meetingOpt.isPresent()) {
return "redirect:/user/meetings";
}
Meeting existingMeeting = meetingOpt.get();
User currentUser = ur.findByUsername(details.getUsername()).get();
if (existingMeeting.getUser().getUno() != currentUser.getUno()) {
return "redirect:/user/meetings";
}
existingMeeting.getRequest().setReason(updatedMeeting.getRequest().getReason());
existingMeeting.getRequest().setDescription(updatedMeeting.getRequest().getDescription());
mr.save(existingMeeting);
rr.save(existingMeeting.getRequest());
return "redirect:/user/meetings/detail/" + mno;
}
@RequestMapping(value = "user/meetings/delete/{mno}", method = RequestMethod.GET)
private String deleteMeeting(@PathVariable int mno, @AuthenticationPrincipal UserDetails details) {
Optional<Meeting> meetingOpt = mr.findById(mno);
if (!meetingOpt.isPresent()) {
return "redirect:/user/meetings";
}
Meeting meeting = meetingOpt.get();
User currentUser = ur.findByUsername(details.getUsername()).get();
if (meeting.getUser().getUno() == currentUser.getUno()) {
mr.delete(meeting);
}
return "redirect:/user/meetings";
}
@RequestMapping(value = "user/calendar", method = RequestMethod.GET)
private String calendar(@AuthenticationPrincipal UserDetails details, Model model, HttpServletRequest request) {
if (details == null) {
return "redirect:/public/login";
}
User user = ur.findByUsername(details.getUsername()).get();
model.addAttribute("currentUser", user);
String monthParam = request.getParameter("month");
String yearParam = request.getParameter("year");
LocalDate today = LocalDate.now();
LocalDate currentDate;
if (monthParam != null && yearParam != null) {
currentDate = LocalDate.of(Integer.parseInt(yearParam), Integer.parseInt(monthParam), 1);
} else {
currentDate = LocalDate.now().withDayOfMonth(1);
}
LocalDate date = currentDate;
int month = date.getMonthValue();
Map<LocalDate, List<Meeting>> meetingsByDate = new HashMap<>();
while (date.getMonthValue() == month) {
List<Meeting> meetingsForDay = mr.findByRequestDate(date);
meetingsByDate.put(date, meetingsForDay);
date = date.plusDays(1);
}
model.addAttribute("meetingsByDate", meetingsByDate);
model.addAttribute("currentDate", currentDate);
model.addAttribute("previousMonth", currentDate.minusMonths(1));
model.addAttribute("nextMonth", currentDate.plusMonths(1));
model.addAttribute("today", today);
return "user/calendar";
}
@RequestMapping(value = "user/meetings/new", method = RequestMethod.GET)
private String newMeetingForm(@AuthenticationPrincipal UserDetails details, Model model, HttpServletRequest request) {
if (details == null) {
return "redirect:/public/login";
}
User user = ur.findByUsername(details.getUsername()).get();
String dateStr = request.getParameter("date");
LocalDate date = LocalDate.parse(dateStr);
List<Meeting> existingMeetings = mr.findByRequestDate(date);
List<LocalTime> bookedTimes = existingMeetings.stream()
.map(meeting -> meeting.getRequest().getTime())
.collect(Collectors.toList());
if (bookedTimes == null) {
bookedTimes = Collections.emptyList();
}
model.addAttribute("request", new Request());
model.addAttribute("bookedTimes", bookedTimes);
model.addAttribute("currentUser", user);
return "user/newMeeting";
}
@RequestMapping(value = "user/meetings/create", method = RequestMethod.POST)
private String createRequest(@Valid Request request,
BindingResult result,
@AuthenticationPrincipal UserDetails details,
Model model) {
if (result.hasErrors()) {
model.addAttribute("errorMessage", "Veuillez remplir tous les champs correctement");
return "user/newMeeting";
}
try{
rr.save(request);
return "redirect:/user/listeAction";
} catch (Exception e) {
model.addAttribute("errorMessage", "Erreur lors de la création du rendez-vous: " + e.getMessage());
return "user/newMeeting";
}
}
private boolean isAuthenticated() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
return authentication != null &&
authentication.isAuthenticated() &&
!(authentication instanceof AnonymousAuthenticationToken);
}
}