Skip to content
Snippets Groups Projects
Select Git revision
  • 58aee041f92ca3ad30d27f375ba4b47c08ba67aa
  • master default protected
  • develop
  • v22w09a
  • v22w08b
  • release
6 results

main.js

Blame
  • 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);
        }
    }