Newer
Older
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);
response = new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
return response;
}
@Operation(summary = "Create a new user")
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);
}