package com.mif13.authServer.controllers; import com.mif13.authServer.dao.UsersDao; import com.mif13.authServer.model.User; import java.util.Optional; import java.util.regex.PatternSyntaxException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; @RestController @RequestMapping("users") public class UserRestController { private final UsersDao usersRepo; @Autowired public UserRestController(UsersDao usersRepo) { this.usersRepo = usersRepo; } @Operation(summary = "Get user informations by id") @ApiResponses(value = { @ApiResponse(responseCode = "200 OK", description = "Found the user", content = { @Content(mediaType = "application/json", schema = @Schema(implementation = User.class))}), @ApiResponse(responseCode = "", description = "User Not Found", content = @Content) }) @GetMapping(value = "/{id}", produces = "application/json") public ResponseEntity<User> getUser(@PathVariable String id) { ResponseEntity<User> response; Optional<User> optionalUser = usersRepo.get(id); if (optionalUser.isPresent()) { User user = optionalUser.get(); response = new ResponseEntity<>(user, HttpStatus.OK); } else { response = new ResponseEntity<>(HttpStatus.NOT_FOUND); } return response; } @Operation(summary = "Create a new user") @PostMapping public ResponseEntity<Void> createUser(@RequestParam("login") String login, @RequestParam("password") String password) { ResponseEntity<Void> response; try { if (verifyLogin(login) && verifyPassword(password)) { Optional<User> optionalUser = usersRepo.get(login); if (optionalUser.isEmpty()) { User user = new User(login, password); usersRepo.save(user); response = new ResponseEntity<>(HttpStatus.CREATED); } else { response = new ResponseEntity<>(HttpStatus.FORBIDDEN); } } else { response = new ResponseEntity<>(HttpStatus.BAD_REQUEST); } } catch (PatternSyntaxException e) { response = new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } return response; } @Operation(summary = "Modify password of a user by its id") @PutMapping("/{id}") public ResponseEntity<Void> modifyUserPassword(@PathVariable String id, @RequestParam("new_password") String new_password){ ResponseEntity<Void> response; Optional<User> optionalUser = usersRepo.get(id); try { if(optionalUser.isPresent()) { User user = optionalUser.get(); user.setPassword(new_password); response = new ResponseEntity<>(HttpStatus.NO_CONTENT); } else response = new ResponseEntity<>(HttpStatus.NOT_FOUND); } catch(Exception e) { e.printStackTrace(); response = new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } return response; } @Operation(summary = "Delet a user on the database, by its id") @DeleteMapping("/{id}") public ResponseEntity<Void> deleteUser(@PathVariable String id){ ResponseEntity<Void> response; Optional<User> optionalUser = usersRepo.get(id); try { if(optionalUser.isPresent()) { User user = optionalUser.get(); usersRepo.delete(user); response = new ResponseEntity<>(HttpStatus.NO_CONTENT); } else response = new ResponseEntity<>(HttpStatus.NOT_FOUND); } catch(Exception e) { e.printStackTrace(); response = new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } return response; } private boolean verifyLogin(String login) throws PatternSyntaxException { String regex = "^[a-zA-Z][a-zA-Z0-9._-]{3,20}$"; return login.matches(regex); } private boolean verifyPassword(String pwd) throws PatternSyntaxException { String regex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#&()–[{}]:;',?/*~$^+=<>]).{8,25}$"; return pwd.matches(regex); } }