From 646179485c5ea448bc74295cef7681caa9907771 Mon Sep 17 00:00:00 2001 From: me Date: Tue, 24 Feb 2026 08:16:41 +0300 Subject: [PATCH] feat: implement UserService and add REST controllers --- .../controller/AdminCardController.java | 57 +++++++++++++++++ .../controller/AdminUserController.java | 45 ++++++++++++++ .../bankcards/controller/CardController.java | 61 +++++++++++++++++++ .../bankcards/service/UserService.java | 57 +++++++++++++++++ 4 files changed, 220 insertions(+) create mode 100644 src/main/java/com/example/bankcards/controller/AdminCardController.java create mode 100644 src/main/java/com/example/bankcards/controller/AdminUserController.java create mode 100644 src/main/java/com/example/bankcards/controller/CardController.java create mode 100644 src/main/java/com/example/bankcards/service/UserService.java diff --git a/src/main/java/com/example/bankcards/controller/AdminCardController.java b/src/main/java/com/example/bankcards/controller/AdminCardController.java new file mode 100644 index 0000000..b71fd4b --- /dev/null +++ b/src/main/java/com/example/bankcards/controller/AdminCardController.java @@ -0,0 +1,57 @@ +package com.example.bankcards.controller; + +import com.example.bankcards.dto.CardResponse; +import com.example.bankcards.dto.CreateCardRequest; +import com.example.bankcards.service.CardService; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/admin/cards") +@RequiredArgsConstructor +@PreAuthorize("hasAuthority('ROLE_ADMIN')") +public class AdminCardController { + + private final CardService cardService; + + @PostMapping + public ResponseEntity createCard( + @Valid @RequestBody CreateCardRequest request + ) { + return ResponseEntity.status(HttpStatus.CREATED).body( + cardService.createCard(request) + ); + } + + @GetMapping + public ResponseEntity> getAllCards(Pageable pageable) { + return ResponseEntity.ok(cardService.getAllCards(pageable)); + } + + @GetMapping("/{id}") + public ResponseEntity getCard(@PathVariable Long id) { + return ResponseEntity.ok(cardService.getCard(id, null, true)); + } + + @PatchMapping("/{id}/block") + public ResponseEntity blockCard(@PathVariable Long id) { + return ResponseEntity.ok(cardService.blockCard(id)); + } + + @PatchMapping("/{id}/activate") + public ResponseEntity activateCard(@PathVariable Long id) { + return ResponseEntity.ok(cardService.activateCard(id)); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteCard(@PathVariable Long id) { + cardService.deleteCard(id); + return ResponseEntity.noContent().build(); + } +} diff --git a/src/main/java/com/example/bankcards/controller/AdminUserController.java b/src/main/java/com/example/bankcards/controller/AdminUserController.java new file mode 100644 index 0000000..317e909 --- /dev/null +++ b/src/main/java/com/example/bankcards/controller/AdminUserController.java @@ -0,0 +1,45 @@ +package com.example.bankcards.controller; + +import com.example.bankcards.dto.UpdateUserRoleRequest; +import com.example.bankcards.dto.UserResponse; +import com.example.bankcards.service.UserService; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/admin/users") +@RequiredArgsConstructor +@PreAuthorize("hasAuthority('ROLE_ADMIN')") +public class AdminUserController { + + private final UserService userService; + + @GetMapping + public ResponseEntity> getAllUsers(Pageable pageable) { + return ResponseEntity.ok(userService.getAllUsers(pageable)); + } + + @GetMapping("/{id}") + public ResponseEntity getUser(@PathVariable Long id) { + return ResponseEntity.ok(userService.getUser(id)); + } + + @PatchMapping("/{id}/role") + public ResponseEntity updateRole( + @PathVariable Long id, + @Valid @RequestBody UpdateUserRoleRequest request + ) { + return ResponseEntity.ok(userService.updateRole(id, request)); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteUser(@PathVariable Long id) { + userService.deleteUser(id); + return ResponseEntity.noContent().build(); + } +} diff --git a/src/main/java/com/example/bankcards/controller/CardController.java b/src/main/java/com/example/bankcards/controller/CardController.java new file mode 100644 index 0000000..dcb52a5 --- /dev/null +++ b/src/main/java/com/example/bankcards/controller/CardController.java @@ -0,0 +1,61 @@ +package com.example.bankcards.controller; + +import com.example.bankcards.dto.CardResponse; +import com.example.bankcards.dto.TransferRequest; +import com.example.bankcards.entity.CardStatus; +import com.example.bankcards.service.CardService; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/cards") +@RequiredArgsConstructor +public class CardController { + + private final CardService cardService; + + @GetMapping + public ResponseEntity> getMyCards( + @AuthenticationPrincipal UserDetails userDetails, + @RequestParam(required = false) CardStatus status, + Pageable pageable + ) { + return ResponseEntity.ok( + cardService.getMyCards(userDetails.getUsername(), status, pageable) + ); + } + + @GetMapping("/{id}") + public ResponseEntity getCard( + @PathVariable Long id, + @AuthenticationPrincipal UserDetails userDetails + ) { + return ResponseEntity.ok( + cardService.getCard(id, userDetails.getUsername(), false) + ); + } + + @PostMapping("/{id}/request-block") + public ResponseEntity requestBlock( + @PathVariable Long id, + @AuthenticationPrincipal UserDetails userDetails + ) { + cardService.requestBlock(id, userDetails.getUsername()); + return ResponseEntity.ok().build(); + } + + @PostMapping("/transfer") + public ResponseEntity transfer( + @Valid @RequestBody TransferRequest request, + @AuthenticationPrincipal UserDetails userDetails + ) { + cardService.transfer(request, userDetails.getUsername()); + return ResponseEntity.ok().build(); + } +} diff --git a/src/main/java/com/example/bankcards/service/UserService.java b/src/main/java/com/example/bankcards/service/UserService.java new file mode 100644 index 0000000..5521d25 --- /dev/null +++ b/src/main/java/com/example/bankcards/service/UserService.java @@ -0,0 +1,57 @@ +package com.example.bankcards.service; + +import com.example.bankcards.dto.UpdateUserRoleRequest; +import com.example.bankcards.dto.UserResponse; +import com.example.bankcards.entity.User; +import com.example.bankcards.exception.ResourceNotFoundException; +import com.example.bankcards.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class UserService { + + private final UserRepository userRepository; + + public Page getAllUsers(Pageable pageable) { + return userRepository.findAll(pageable).map(this::toResponse); + } + + public UserResponse getUser(Long id) { + User user = userRepository + .findById(id) + .orElseThrow(() -> + new ResourceNotFoundException("User not found: " + id) + ); + return toResponse(user); + } + + public UserResponse updateRole(Long id, UpdateUserRoleRequest request) { + User user = userRepository + .findById(id) + .orElseThrow(() -> + new ResourceNotFoundException("User not found: " + id) + ); + user.setRole(request.getRole()); + return toResponse(userRepository.save(user)); + } + + public void deleteUser(Long id) { + if (!userRepository.existsById(id)) { + throw new ResourceNotFoundException("User not found: " + id); + } + userRepository.deleteById(id); + } + + public UserResponse toResponse(User user) { + UserResponse response = new UserResponse(); + response.setId(user.getId()); + response.setUsername(user.getUsername()); + response.setEmail(user.getEmail()); + response.setRole(user.getRole()); + return response; + } +}