UserController.java
package com.nashtech.rookie.asset_management_0701.controllers;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import com.nashtech.rookie.asset_management_0701.dtos.requests.user.ChangePasswordRequest;
import com.nashtech.rookie.asset_management_0701.dtos.requests.user.FirstChangePasswordRequest;
import com.nashtech.rookie.asset_management_0701.dtos.requests.user.UserRequest;
import com.nashtech.rookie.asset_management_0701.dtos.requests.user.UserSearchDto;
import com.nashtech.rookie.asset_management_0701.dtos.requests.user.UserUpdateRequest;
import com.nashtech.rookie.asset_management_0701.dtos.responses.APIResponse;
import com.nashtech.rookie.asset_management_0701.dtos.responses.PaginationResponse;
import com.nashtech.rookie.asset_management_0701.dtos.responses.user.UserResponse;
import com.nashtech.rookie.asset_management_0701.services.user.UserService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
@RestController
@RequestMapping("/api/v1/users")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@PostMapping
@PreAuthorize("hasRole('ADMIN')")
public APIResponse<UserResponse> createUser (@RequestBody @Valid UserRequest userRequest) {
UserResponse userResponse = userService.createUser(userRequest);
return APIResponse.<UserResponse>builder().result(userResponse).build();
}
@GetMapping("/generate-username")
@PreAuthorize("hasRole('ADMIN')")
public APIResponse<String> getUsernameGenerated (@RequestParam("firstName") String firstName,
@RequestParam("lastName") String lastName) {
var result = userService.generateUsername(firstName, lastName);
return APIResponse.<String>builder().result(result).build();
}
@GetMapping
@PreAuthorize("hasRole('ADMIN')")
public APIResponse<PaginationResponse<UserResponse>> getAllUsers (@Valid @ModelAttribute UserSearchDto dto) {
var result = userService.getAllUser(dto);
return APIResponse.<PaginationResponse<UserResponse>>builder()
.result(result)
.build();
}
@GetMapping("/assign")
@PreAuthorize("hasRole('ADMIN')")
public APIResponse<PaginationResponse<UserResponse>> getAllUsersAssignment (
@Valid @ModelAttribute UserSearchDto dto) {
var result = userService.getAllUserAssignment(dto);
return APIResponse.<PaginationResponse<UserResponse>>builder()
.result(result)
.build();
}
@PatchMapping("/first-change-password")
@ResponseStatus(HttpStatus.OK)
public APIResponse<String> firstChangePassword (
@RequestBody @Valid FirstChangePasswordRequest firstChangePasswordRequest) {
userService.firstChangePassword(firstChangePasswordRequest);
return APIResponse.<String>builder().message("Change password is success").build();
}
@PatchMapping("/change-password")
@ResponseStatus(HttpStatus.OK)
public APIResponse<String> changePassword (@RequestBody @Valid ChangePasswordRequest changePasswordRequest) {
userService.changePassword(changePasswordRequest);
return APIResponse.<String>builder().message("Change password is success").build();
}
@DeleteMapping("/{id}")
@PreAuthorize("hasRole('ADMIN')")
public APIResponse<String> disableUser (@PathVariable Long id){
userService.disableUser(id);
return APIResponse.<String>builder().message("Disable user successfully").build();
}
@PutMapping("/{id}")
@PreAuthorize("hasRole('ADMIN')")
public APIResponse<UserResponse> editUser (@PathVariable Long id, @RequestBody @Valid UserUpdateRequest user){
return APIResponse.<UserResponse>builder().result(userService.editUser(id, user)).build();
}
@GetMapping("/{id}/has-assignments")
@PreAuthorize("hasRole('ADMIN')")
public APIResponse<Boolean> hasValidAssignments (@PathVariable Long id){
return APIResponse.<Boolean>builder().result(userService.existsCurrentAssignment(id)).build();
}
@GetMapping("/{id}")
@PreAuthorize("hasRole('ADMIN')")
public APIResponse<UserResponse> getUserById (@PathVariable Long id ){
return APIResponse.<UserResponse>builder().result(userService.getUserById(id)).build();
}
}