Skip to content
Snippets Groups Projects
Select Git revision
  • 4eca093b0e3d71d25f98fa70ef84afcf12c7e925
  • main default protected
2 results

AdminController.java

Blame
  • AdminController.java 10.28 KiB
    package fr.but.infoetu.meetingplannr.controller;
    
    import java.time.LocalTime;
    import java.util.List;
    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 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.RequestService;
    import fr.but.infoetu.meetingplannr.service.UserService;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpSession;
    
    @Controller
    public class AdminController {
        @Autowired
        MeetingRepository mr;
    
        @Autowired UserRepository ur;
    
        @Autowired
        RequestRepository rr;
    
        @Autowired
        UserService us;
    
        @Autowired 
        RequestService rs;
    
        @RequestMapping
        private String redirectHome(HttpSession session) {
            if (session.getAttribute("currentUser") == null) {
                return "public/login";
            }
            return "user/listeAction";
        }
    
    
    
        @RequestMapping(value = "admin/dashboard", method = RequestMethod.GET)
        private String adminDashboard(@AuthenticationPrincipal UserDetails details, Model model) {
            User user = ur.findByUsername(details.getUsername()).get();
            
            model.addAttribute("currentUser", user);
            return "admin/dashboard";
        }
    
        @RequestMapping(value = "admin/users", method = RequestMethod.GET)
        private String usersList(@AuthenticationPrincipal UserDetails details, 
                                @RequestParam(defaultValue = "1") int page,
                                @RequestParam(required = false) String search,
                                Model model) {
    
            
            int pageSize = 5;
            List<User> allUsers = search != null && !search.trim().isEmpty() 
                ? ur.findByNameContainingOrSurnameContainingOrUsernameContaining(search, search, search)
                : ur.findAll();
            
            int start = (page - 1) * pageSize;
            int end = Math.min(start + pageSize, allUsers.size());
            List<User> users = allUsers.subList(start, end);
            
            model.addAttribute("users", users);
            model.addAttribute("currentPage", page);
            model.addAttribute("totalPages", (int) Math.ceil(allUsers.size() / (double) pageSize));
            model.addAttribute("currentUser", ur.findByUsername(details.getUsername()).get());
            
            return "admin/users";
        }
    
        @RequestMapping(value = "admin/users/ban/{uno}", method = RequestMethod.POST)
        private String banUser(@PathVariable Integer uno) {
            us.banUser(uno);
            return "redirect:/admin/users";
        }
    
        @RequestMapping(value = "admin/requests", method = RequestMethod.GET)
        private String requestsList(@AuthenticationPrincipal UserDetails details, 
                              @RequestParam(defaultValue = "1") int page,
                              @RequestParam(required = false) String search,
                              @RequestParam(required = false) Boolean filter,
                              Model model) {
        
        int pageSize = 5;
        List<Request> allRequests = search != null && !search.trim().isEmpty() 
            ? rr.findByReasonContainingOrDescriptionContaining(search, search)
            : rr.findAll();
        
        if (filter != null && filter) {
            allRequests = allRequests.stream()
                .filter(req -> !rs.hasMeeting(req))
                .collect(Collectors.toList());
        }
        
        int start = (page - 1) * pageSize;
        int end = Math.min(start + pageSize, allRequests.size());
        List<Request> requests = allRequests.subList(start, end);
        
        for (Request req : requests) {
            model.addAttribute("hasMeeting_" + req.getRno(), rs.hasMeeting(req));
        }
        
        model.addAttribute("requests", requests);
        model.addAttribute("currentPage", page);
        model.addAttribute("totalPages", (int) Math.ceil(allRequests.size() / (double) pageSize));
        model.addAttribute("currentUser", ur.findByUsername(details.getUsername()).get());
        model.addAttribute("filter", filter);
        
        return "admin/requests";
    }
    
        @RequestMapping(value = "admin/requests/validate/{rno}", method = RequestMethod.POST)
        private String validateRequest(@PathVariable int rno, @AuthenticationPrincipal UserDetails details,
                                       @RequestParam(defaultValue = "1") int page,
                                       @RequestParam(required = false) String search,
                                       @RequestParam(required = false) Boolean filter) {
            
    
            Optional<Request> requestOpt = rr.findById(rno);
            if (requestOpt.isPresent()) {
                Request request = requestOpt.get();
                User user = request.getUser();
                Meeting meeting = new Meeting();
                meeting.setRequest(request);
                meeting.setUser(user);
                if(user.getUsername().endsWith("@univ-lille.fr")) {
                    us.sendValidationMeeting(user, meeting);
                } 
                mr.save(meeting);
            }
    
            String redirectUrl = String.format("redirect:/admin/requests?page=%d", page);
            if (search != null) {
                redirectUrl += "&search=" + search;
            }
            if (filter != null) {
                redirectUrl += "&filter=" + filter;
            }
    
            return redirectUrl;
        }
    
        @RequestMapping(value = "admin/meetings", method = RequestMethod.GET)
        private String meetingsList(@AuthenticationPrincipal UserDetails details, 
                                  @RequestParam(defaultValue = "1") int page,
                                  @RequestParam(required = false) String search,
                                  Model model) {
            if (details == null || !details.getAuthorities().stream()
                    .anyMatch(a -> a.getAuthority().equals("ROLE_ADMIN"))) {
                return "redirect:/public/login";
            }
            
            int pageSize = 5;
            List<Meeting> allMeetings = search != null && !search.trim().isEmpty() 
                ? mr.findByRequestReasonContainingOrRequestDescriptionContaining(search, search)
                : mr.findAll();
            
            int start = (page - 1) * pageSize;
            int end = Math.min(start + pageSize, allMeetings.size());
            List<Meeting> meetings = allMeetings.subList(start, end);
            
            model.addAttribute("meetings", meetings);
            model.addAttribute("currentPage", page);
            model.addAttribute("totalPages", (int) Math.ceil(allMeetings.size() / (double) pageSize));
            model.addAttribute("currentUser", ur.findByUsername(details.getUsername()).get());
            
            return "admin/meetings";
        }
    
        @RequestMapping(value = "admin/meetings/delete/{mno}", method = RequestMethod.POST)
        private String adminDeleteMeeting(@PathVariable int mno, @AuthenticationPrincipal UserDetails details) {
            if (details == null || !details.getAuthorities().stream()
                    .anyMatch(a -> a.getAuthority().equals("ROLE_ADMIN"))) {
                return "redirect:/public/login";
            }
    
            Optional<Meeting> meetingOpt = mr.findById(mno);
            if (meetingOpt.isPresent()) {
                mr.delete(meetingOpt.get());
            }
    
            return "redirect:/admin/meetings";
        }
    
        @RequestMapping(value = "admin/meetings/edit/{mno}", method = RequestMethod.GET)
        private String editMeeting(@PathVariable int mno, @AuthenticationPrincipal UserDetails details, Model model) {
            if (details == null || !details.getAuthorities().stream()
                    .anyMatch(a -> a.getAuthority().equals("ROLE_ADMIN"))) {
                return "redirect:/public/login";
            }
    
            Optional<Meeting> meetingOpt = mr.findById(mno);
            if (!meetingOpt.isPresent()) {
                return "redirect:/admin/meetings";
            }
    
            Meeting meeting = meetingOpt.get();
            
    
            model.addAttribute("meeting", meeting);
            return "admin/editMeeting";
        }
    
        @RequestMapping(value = "admin/meetings/update/{mno}", method = RequestMethod.POST)
        private String updateMeeting(@PathVariable int mno, Meeting updatedMeeting, 
                                   BindingResult result, @AuthenticationPrincipal UserDetails details, 
                                   Model model) {
            if (details == null || !details.getAuthorities().stream()
                    .anyMatch(a -> a.getAuthority().equals("ROLE_ADMIN"))) {
                return "redirect:/public/login";
            }
    
            if (result.hasErrors()) {
                model.addAttribute("errorMessage", "Veuillez corriger les erreurs du formulaire.");
                return "admin/editMeeting";
            }
    
            Optional<Meeting> meetingOpt = mr.findById(mno);
            if (!meetingOpt.isPresent()) {
                return "redirect:/admin/meetings";
            }
    
            Meeting existingMeeting = meetingOpt.get();
            Request existingRequest = existingMeeting.getRequest();
            
            existingRequest.setReason(updatedMeeting.getRequest().getReason());
            existingRequest.setDescription(updatedMeeting.getRequest().getDescription());
            existingRequest.setTime(updatedMeeting.getRequest().getTime());
            
            rr.save(existingRequest);  
            mr.save(existingMeeting);  
    
            return "redirect:/admin/meetings";
        }
    
        private boolean isAuthenticated() {
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            return authentication != null && 
                   authentication.isAuthenticated() && 
                   !(authentication instanceof AnonymousAuthenticationToken);
        }
    }