diff --git a/00-pazmany-labor-2024-master/backend/pom.xml b/00-pazmany-labor-2024-master/backend/pom.xml index 236f07a12d76974334955001e897415bb120e994..ab862d6c82fe85799c032b84ef7f871c8416762e 100644 --- a/00-pazmany-labor-2024-master/backend/pom.xml +++ b/00-pazmany-labor-2024-master/backend/pom.xml @@ -17,7 +17,7 @@ <properties> <java.version>17</java.version> <openfeign.version>2.2.0</openfeign.version> - <maven-model.version>3.3.9</maven-model.version> + <maven-model.version>3.9.6</maven-model.version> <spring.openfeign.version>4.0.4</spring.openfeign.version> </properties> <dependencies> diff --git a/backend/pom.xml b/backend/pom.xml index f26b207024790180bba12fba33c8378f96d2ea88..07b1640c48246986fa98004e3f4931eba935a03a 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -10,14 +10,14 @@ <relativePath /> <!-- lookup parent from repository --> </parent> <groupId>hu.pazmany</groupId> - <artifactId>example</artifactId> + <artifactId>vauvau</artifactId> <version>0.0.1-SNAPSHOT</version> - <name>project</name> + <name>vauvau</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> <openfeign.version>2.2.0</openfeign.version> - <maven-model.version>3.3.9</maven-model.version> + <maven-model.version>3.9.6</maven-model.version> <spring.openfeign.version>4.0.4</spring.openfeign.version> </properties> <dependencies> diff --git a/backend/src/main/java/hu/pazmany/controller/Controller.java b/backend/src/main/java/hu/pazmany/controller/Controller.java index e3c456fa28d2c117c8bdbe6ac1d51910d72ea5c1..4c8227fe289318aaf812150606c38490ec43a06d 100644 --- a/backend/src/main/java/hu/pazmany/controller/Controller.java +++ b/backend/src/main/java/hu/pazmany/controller/Controller.java @@ -23,62 +23,62 @@ import java.util.regex.Pattern; @RestController @RequestMapping("/api") public class Controller { - private final DogService dogService; - private final UserService userService; - private final JwtTokenProvider jwtTokenProvider = JwtTokenProvider.getInstance(); - - @Autowired - public Controller(DogService dogService, UserService userService) { - this.dogService = dogService; - this.userService = userService; - } - - - @GetMapping("/dogs") - public List<DogDTO> getAllDogs(){ - return dogService.getAllDogs(); - } - - @GetMapping("/dogs/{id}") - public ResponseEntity<?> getDogById(@PathVariable Integer id) { - return dogService.get(id) - .map(dogEntity -> ResponseEntity.ok(new DetailedDogDTO( - dogEntity.getId(), - dogEntity.getName(), - dogEntity.getPicture(), - dogEntity.getAge(), - dogEntity.getBreed()))) - .orElse(ResponseEntity.notFound().build()); - } - - @PostMapping("/newdog") - public ResponseEntity<?> addNewDog(@RequestBody DetailedDogDTO dto, @RequestHeader("Authorization") String token) { - if(!isValidToken(token)) return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); - - // Save the dog and picture + private final DogService dogService; + private final UserService userService; + private final JwtTokenProvider jwtTokenProvider = JwtTokenProvider.getInstance(); + + @Autowired + public Controller(DogService dogService, UserService userService) { + this.dogService = dogService; + this.userService = userService; + } + + + @GetMapping("/dogs") + public List<DogDTO> getAllDogs() { + return dogService.getAllDogs(); + } + + @GetMapping("/dogs/{id}") + public ResponseEntity<?> getDogById(@PathVariable Integer id) { + return dogService.get(id) + .map(dogEntity -> ResponseEntity.ok(new DetailedDogDTO( + dogEntity.getId(), + dogEntity.getName(), + dogEntity.getPicture(), + dogEntity.getAge(), + dogEntity.getBreed()))) + .orElse(ResponseEntity.notFound().build()); + } + + @PostMapping("/newdog") + public ResponseEntity<?> addNewDog(@RequestBody DetailedDogDTO dto, @RequestHeader("Authorization") String token) { + if (!isValidToken(token)) return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + + // Save the dog and picture try { dogService.addNewDog(dto); } catch (IOException e) { return ResponseEntity.status(HttpStatus.NO_CONTENT).body("Wrong picture format, vagy nem tudom én ide csak feljárok"); } return ResponseEntity.status(HttpStatus.CREATED).body("Dog created successfully"); - } - - @PostMapping(value = "/dogs/{id}/edit", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - public ResponseEntity<?> editDog(@PathVariable Integer id, @RequestHeader("Authorization") String token, @RequestParam("dog") String stringDogDTO, @RequestParam("picture") MultipartFile mpf) { - if (!isValidToken(token)) return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); - - // Retrieve the dog entity from the database - Optional<DetailedDogDTO> optionalDog = dogService.get(id); - ObjectMapper objectMapper = new ObjectMapper(); - DetailedDogDTO dogDTO; - if (optionalDog.isPresent()) { - try { - dogDTO = objectMapper.readValue(stringDogDTO, DetailedDogDTO.class); - } catch (IOException e) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Invalid DogDTO JSON format"); - } - // Save the updated dog entity + } + + @PostMapping(value = "/dogs/{id}/edit", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public ResponseEntity<?> editDog(@PathVariable Integer id, @RequestHeader("Authorization") String token, @RequestParam("dog") String stringDogDTO, @RequestParam("picture") MultipartFile mpf) { + if (!isValidToken(token)) return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + + // Retrieve the dog entity from the database + Optional<DetailedDogDTO> optionalDog = dogService.get(id); + ObjectMapper objectMapper = new ObjectMapper(); + DetailedDogDTO dogDTO; + if (optionalDog.isPresent()) { + try { + dogDTO = objectMapper.readValue(stringDogDTO, DetailedDogDTO.class); + } catch (IOException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Invalid DogDTO JSON format"); + } + // Save the updated dog entity try { dogService.editDog(id, dogDTO, mpf); } catch (IOException e) { @@ -86,110 +86,127 @@ public class Controller { } return ResponseEntity.ok("Dog attributes updated successfully"); - } else { - return ResponseEntity.notFound().build(); - } - } - - @DeleteMapping("/dogs/{id}") - public ResponseEntity<?> deleteDog(@PathVariable Integer id, @RequestHeader("Authorization") String token) { - if (!isValidToken(token)) return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); - - dogService.deleteDog(id); - return ResponseEntity.ok().build(); - } - - @PostMapping("/register") - public ResponseEntity<?> registerUser(@Valid @RequestBody UserDTO request) { - // Validate the registration request - ValidationError validationError = validateRegisterRequest(request); - if (validationError != null) { - return ResponseEntity.badRequest().body(validationError.getMessage()); - } - - // Check if the username is already taken + } else { + return ResponseEntity.notFound().build(); + } + } + + @DeleteMapping("/dogs/{id}") + public ResponseEntity<?> deleteDog(@PathVariable Integer id, @RequestHeader("Authorization") String token) { + if (!isValidToken(token)) return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + + dogService.deleteDog(id); + return ResponseEntity.ok().build(); + } + + @PostMapping("/register") + public ResponseEntity<?> registerUser(@Valid @RequestBody UserDTO request) { + // Validate the registration request + ValidationError validationError = validateRegisterRequest(request); + if (validationError != null) { + return ResponseEntity.badRequest().body(validationError.getMessage()); + } + + // Check if the username is already taken if (userService.isUserExists(request.getUsername())) { - return ResponseEntity.badRequest().body("Username already exists"); - } + return ResponseEntity.badRequest().body("Username already exists"); + } - // Save the user entity - userService.registerUser(request); + // Save the user entity + userService.registerUser(request); - return ResponseEntity.status(HttpStatus.CREATED).body("User registered successfully"); - } + return ResponseEntity.status(HttpStatus.CREATED).body("User registered successfully"); + } - @PostMapping("/login") - public ResponseEntity<UserDTO> login(@Valid @RequestBody UserDTO request) { - if (!isValidLoginRequest(request)) { - return ResponseEntity.badRequest().body(null); - } + @PostMapping("/login") + public ResponseEntity<UserDTO> login(@Valid @RequestBody UserDTO request) { + if (!isValidLoginRequest(request)) { + return ResponseEntity.badRequest().body(null); + } - UserDTO userDTO = userService.login(request, jwtTokenProvider); + UserDTO userDTO = userService.login(request, jwtTokenProvider); - if (userDTO == null) { - return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); - } + if (userDTO == null) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + } - return ResponseEntity.ok(userDTO); - } + return ResponseEntity.ok(userDTO); + } - /*-------- Validation functions --------*/ + /*-------- Validation functions --------*/ - private boolean isValidLoginRequest(UserDTO request) { - if (request == null) { - return false; - } + private boolean isValidLoginRequest(UserDTO request) { + if (request == null) { + return false; + } - String username = request.getUsername(); - String password = request.getPassword(); + String username = request.getUsername(); + String password = request.getPassword(); return username != null && !username.isEmpty() && password != null && !password.isEmpty(); - // If all checks pass, return true - } - - private ValidationError validateRegisterRequest(UserDTO request) { - String username_regex = "^\\w{5,20}$"; - // username can contain numbers, upper and lowercase characters - String password_regex = "^(?=.*[A-Z])(?=.*\\d)[A-Za-z\\d]{8,20}$"; - - if(request == null || request.getUsername() == null || request.getPassword() == null) { - return new RequestValidationError(); - } - if(!Pattern.matches(username_regex, request.getUsername())) { - return new UsernameValidationError(); - } - if(!Pattern.matches(password_regex, request.getPassword())) { - return new PasswordValidationError(); - } - - return null; - } - - private boolean isValidToken(String token) { - return token != null && verifyTokenSignature(token); - } - - private boolean verifyTokenSignature(String token) { - if (token.startsWith("Bearer ")) { - token = token.substring(7); - return jwtTokenProvider.validateToken(token); - } else { - return false; - } - - } - - private abstract class ValidationError { - private String message; - - public String getMessage() { - return message; - } - - ValidationError(String m) { message = m; } - } - private class RequestValidationError extends ValidationError { RequestValidationError() { super("Érvénytelen kérés"); } } - private class UsernameValidationError extends ValidationError { UsernameValidationError() { super("Érvénytelen felhasználónév"); } } - private class PasswordValidationError extends ValidationError { PasswordValidationError() { super("Érvénytelen jelszó"); } } + // If all checks pass, return true + } + + private ValidationError validateRegisterRequest(UserDTO request) { + String username_regex = "^\\w{5,20}$"; + // username can contain numbers, upper and lowercase characters + String password_regex = "^(?=.*[A-Z])(?=.*\\d)[A-Za-z\\d]{8,20}$"; + + if (request == null || request.getUsername() == null || request.getPassword() == null) { + return new RequestValidationError(); + } + if (!Pattern.matches(username_regex, request.getUsername())) { + return new UsernameValidationError(); + } + if (!Pattern.matches(password_regex, request.getPassword())) { + return new PasswordValidationError(); + } + + return null; + } + + private boolean isValidToken(String token) { + return token != null && verifyTokenSignature(token); + } + + private boolean verifyTokenSignature(String token) { + if (token.startsWith("Bearer ")) { + token = token.substring(7); + return jwtTokenProvider.validateToken(token); + } else { + return false; + } + + } + + private abstract static class ValidationError { + private final String message; + + public String getMessage() { + return message; + } + + ValidationError(String m) { + message = m; + } + } + + private static class RequestValidationError extends ValidationError { + RequestValidationError() { + super("Érvénytelen kérés"); + } + } + + private static class UsernameValidationError extends ValidationError { + UsernameValidationError() { + super("Érvénytelen felhasználónév"); + } + } + + private static class PasswordValidationError extends ValidationError { + PasswordValidationError() { + super("Érvénytelen jelszó"); + } + } } diff --git a/backend/src/main/java/hu/pazmany/security/JwtTokenProvider.java b/backend/src/main/java/hu/pazmany/security/JwtTokenProvider.java index d324310096cde56d85f61f43c070583b0dd84fbc..832dc1526d53c895c53b569298a1de3a891d05c5 100644 --- a/backend/src/main/java/hu/pazmany/security/JwtTokenProvider.java +++ b/backend/src/main/java/hu/pazmany/security/JwtTokenProvider.java @@ -19,11 +19,10 @@ public class JwtTokenProvider { } public String generateToken(Integer userId) { - String token = Jwts.builder() + return Jwts.builder() .setSubject(String.valueOf(userId)) .signWith(secretKey) .compact(); - return token; } public boolean validateToken(String token) { diff --git a/backend/src/main/java/hu/pazmany/service/DogService.java b/backend/src/main/java/hu/pazmany/service/DogService.java index 58ad13312c0fbd57e21bd7351d5125d2e892f700..51be267a48e171dc3d4506d9bab2f6d96e826f77 100644 --- a/backend/src/main/java/hu/pazmany/service/DogService.java +++ b/backend/src/main/java/hu/pazmany/service/DogService.java @@ -34,8 +34,6 @@ public class DogService { public void addNewDog(DetailedDogDTO dto) throws IOException { DogEntity newDog = new DogEntity(); - //newDog.setId(dogRepository.findAllDogs().size()); - //System.out.println(newDog.getId()); newDog.setName(dto.getName()); //newDog.setPicture(pic.getBytes()); @@ -53,9 +51,8 @@ public class DogService { if (editRequest.getName() != null) { dogEntity.setName(editRequest.getName()); } - if (mpf.getBytes() != null) { - dogEntity.setPicture(mpf.getBytes()); - } + mpf.getBytes(); + dogEntity.setPicture(mpf.getBytes()); if (editRequest.getAge() != null) { dogEntity.setAge(editRequest.getAge()); }