From 19c672fd3a3cef6980ac57c33636a7055b0340fe Mon Sep 17 00:00:00 2001 From: ScarletRedMan Date: Sat, 11 May 2024 12:27:57 +0700 Subject: [PATCH] implemented account controller --- .../picker/controller/AccountsController.java | 52 +++++++++++++++---- .../controller/response/ResponseObject.java | 8 ++- .../exception/DoesNotExistsException.java | 9 ++++ .../picker/service/AccountService.java | 2 +- .../service/impl/AccountServiceImpl.java | 4 +- 5 files changed, 60 insertions(+), 15 deletions(-) diff --git a/server/src/main/java/ru/dragonestia/picker/controller/AccountsController.java b/server/src/main/java/ru/dragonestia/picker/controller/AccountsController.java index a965d03..7f6c1bd 100644 --- a/server/src/main/java/ru/dragonestia/picker/controller/AccountsController.java +++ b/server/src/main/java/ru/dragonestia/picker/controller/AccountsController.java @@ -3,32 +3,44 @@ package ru.dragonestia.picker.controller; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.web.bind.annotation.*; import ru.dragonestia.picker.controller.response.ResponseObject; +import ru.dragonestia.picker.exception.DoesNotExistsException; +import ru.dragonestia.picker.model.account.Account; +import ru.dragonestia.picker.model.account.AccountId; +import ru.dragonestia.picker.model.account.Permission; +import ru.dragonestia.picker.service.AccountService; import java.util.List; +import java.util.stream.Collectors; @RestController @RequestMapping("/accounts") @RequiredArgsConstructor public class AccountsController { + private final AccountService accountService; + private final PasswordEncoder passwordEncoder; + @PreAuthorize("hasRole('ADMIN')") @GetMapping List listAccounts() { - throw new UnsupportedOperationException("Not implemented"); + return accountService.allAccounts().stream().map(account -> account.getId().getValue()).toList(); } @PreAuthorize("hasRole('ADMIN')") @GetMapping("/target/{accountId}") ResponseObject.Account targetAccountDetails(@PathVariable String accountId) { - throw new UnsupportedOperationException("Not implemented"); + return accountService.findAccount(AccountId.of(accountId)) + .map(ResponseObject.Account::of) + .orElseThrow(() -> DoesNotExistsException.forAccount(AccountId.of(accountId))); } @PreAuthorize("hasRole('ADMIN')") @GetMapping("/list") - ResponseObject.Account listAccountsDetails(@RequestParam List id) { - throw new UnsupportedOperationException("Not implemented"); + List listAccountsDetails(@RequestParam List id) { + return id.stream().map(this::targetAccountDetails).toList(); } @PreAuthorize("hasRole('ADMIN')") @@ -36,25 +48,45 @@ public class AccountsController { ResponseEntity createAccount(@RequestParam String username, @RequestParam String password, @RequestParam List permissions) { - throw new UnsupportedOperationException("Not implemented"); + var account = accountService.createNewAccount(AccountId.of(username), password); + setPermissions(account, permissions); + return ResponseEntity.ok().build(); } @PreAuthorize("hasRole('ADMIN')") @DeleteMapping("/target/{accountId}") ResponseEntity removeAccount(@PathVariable String accountId) { - throw new UnsupportedOperationException("Not implemented"); + accountService.findAccount(AccountId.of(accountId)).ifPresent(accountService::removeAccount); + return ResponseEntity.ok().build(); } @PreAuthorize("hasRole('ADMIN')") @PutMapping("/target/{accountId}/permissions") - ResponseEntity setPermissions(@PathVariable String accountId, - @RequestParam List permissions) { - throw new UnsupportedOperationException("Not implemented"); + ResponseEntity setPermissions(@PathVariable String accountId, @RequestParam List permissions) { + var account = accountService.findAccount(AccountId.of(accountId)) + .orElseThrow(() -> DoesNotExistsException.forAccount(AccountId.of(accountId))); + setPermissions(account, permissions); + return ResponseEntity.ok().build(); } @PreAuthorize("hasRole('ADMIN') || principal.username.equals(accountId)") @PutMapping("/target/{accountId}/password") ResponseEntity changePassword(@PathVariable String accountId, @RequestParam String newPassword) { - throw new UnsupportedOperationException("Not implemented"); + var account = accountService.findAccount(AccountId.of(accountId)) + .orElseThrow(() -> DoesNotExistsException.forAccount(AccountId.of(accountId))); + account.setPassword(passwordEncoder.encode(newPassword)); + accountService.updateState(account); + return ResponseEntity.ok().build(); + } + + private void setPermissions(Account account, List permissions) { + account.setAuthorities(permissions.stream().map(permission -> { + try { + return Permission.valueOf(permission); + } catch (IllegalArgumentException ex) { + throw DoesNotExistsException.forPermission(permission); + } + }).collect(Collectors.toSet())); + accountService.updateState(account); } } diff --git a/server/src/main/java/ru/dragonestia/picker/controller/response/ResponseObject.java b/server/src/main/java/ru/dragonestia/picker/controller/response/ResponseObject.java index 1dcab03..c3012c6 100644 --- a/server/src/main/java/ru/dragonestia/picker/controller/response/ResponseObject.java +++ b/server/src/main/java/ru/dragonestia/picker/controller/response/ResponseObject.java @@ -1,6 +1,5 @@ package ru.dragonestia.picker.controller.response; -import ru.dragonestia.picker.model.entity.EntityId; import ru.dragonestia.picker.model.instance.type.PickingMethod; import java.util.List; @@ -30,5 +29,10 @@ public final class ResponseObject { public record PickedRoom(Room room, List entities) {} - public record Account(String id, List permissions, boolean locked) {} + public record Account(String id, List permissions, boolean locked) { + + public static Account of(ru.dragonestia.picker.model.account.Account account) { + return new Account(account.getUsername(), account.getAuthorities().stream().map(Enum::name).toList(), account.isLocked()); + } + } } diff --git a/server/src/main/java/ru/dragonestia/picker/exception/DoesNotExistsException.java b/server/src/main/java/ru/dragonestia/picker/exception/DoesNotExistsException.java index 6f690e9..2733e61 100644 --- a/server/src/main/java/ru/dragonestia/picker/exception/DoesNotExistsException.java +++ b/server/src/main/java/ru/dragonestia/picker/exception/DoesNotExistsException.java @@ -1,5 +1,6 @@ package ru.dragonestia.picker.exception; +import ru.dragonestia.picker.model.account.AccountId; import ru.dragonestia.picker.model.instance.InstanceId; import ru.dragonestia.picker.model.room.RoomId; @@ -16,4 +17,12 @@ public class DoesNotExistsException extends RuntimeException { public static DoesNotExistsException forRoom(RoomId id) { return new DoesNotExistsException("Does not exists room with id '%s'".formatted(id.toString())); } + + public static DoesNotExistsException forAccount(AccountId id) { + return new DoesNotExistsException("Does not exists account with id '%s'".formatted(id.toString())); + } + + public static DoesNotExistsException forPermission(String permission) { + return new DoesNotExistsException("Does not exists permission '%s'".formatted(permission)); + } } diff --git a/server/src/main/java/ru/dragonestia/picker/service/AccountService.java b/server/src/main/java/ru/dragonestia/picker/service/AccountService.java index 3076410..56cc261 100644 --- a/server/src/main/java/ru/dragonestia/picker/service/AccountService.java +++ b/server/src/main/java/ru/dragonestia/picker/service/AccountService.java @@ -14,7 +14,7 @@ public interface AccountService extends UserDetailsService { @PreAuthorize("hasRole('ADMIN')") Account createNewAccount(AccountId id, String password); - Optional findAccount(String accountId); + Optional findAccount(AccountId id); @PreAuthorize("hasRole('ADMIN')") Collection allAccounts(); diff --git a/server/src/main/java/ru/dragonestia/picker/service/impl/AccountServiceImpl.java b/server/src/main/java/ru/dragonestia/picker/service/impl/AccountServiceImpl.java index 389b14c..aca1576 100644 --- a/server/src/main/java/ru/dragonestia/picker/service/impl/AccountServiceImpl.java +++ b/server/src/main/java/ru/dragonestia/picker/service/impl/AccountServiceImpl.java @@ -43,8 +43,8 @@ public class AccountServiceImpl implements AccountService { } @Override - public Optional findAccount(String accountId) { - return Optional.ofNullable(accounts.getOrDefault(accountId, null)); + public Optional findAccount(AccountId id) { + return Optional.ofNullable(accounts.getOrDefault(id.getValue(), null)); } @Override