From 5dc0ab1e106a177870ffb90c5328dfb86644e221 Mon Sep 17 00:00:00 2001 From: Mattrixwv Date: Sun, 9 Mar 2025 19:49:45 -0400 Subject: [PATCH] User tab working --- .../controller/AccountController.java | 92 +++++++++++++++++++ .../account/AccountCustomRepository.java | 13 +++ .../account/AccountRepositoryImpl.java | 71 ++++++++++++++ .../RaidGroupPermissionRepository.java | 1 + .../raidbuilder/service/AccountService.java | 16 ++++ .../service/RaidGroupPermissionService.java | 4 + 6 files changed, 197 insertions(+) diff --git a/src/main/java/com/mattrixwv/raidbuilder/controller/AccountController.java b/src/main/java/com/mattrixwv/raidbuilder/controller/AccountController.java index 3bbc4ec..ec3ff52 100644 --- a/src/main/java/com/mattrixwv/raidbuilder/controller/AccountController.java +++ b/src/main/java/com/mattrixwv/raidbuilder/controller/AccountController.java @@ -18,9 +18,13 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.mattrixwv.raidbuilder.annotation.AccountAuthorization; +import com.mattrixwv.raidbuilder.annotation.RaidGroupAuthorization; import com.mattrixwv.raidbuilder.entity.Account; +import com.mattrixwv.raidbuilder.entity.RaidGroupPermission; import com.mattrixwv.raidbuilder.service.AccountService; +import com.mattrixwv.raidbuilder.service.RaidGroupPermissionService; import com.mattrixwv.raidbuilder.util.DatabaseTypeUtil.AccountPermissionType; +import com.mattrixwv.raidbuilder.util.DatabaseTypeUtil.RaidGroupPermissionType; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -33,6 +37,7 @@ import lombok.extern.slf4j.Slf4j; public class AccountController{ private final ObjectMapper mapper; private final AccountService accountService; + private final RaidGroupPermissionService rgpService; @GetMapping @@ -53,6 +58,69 @@ public class AccountController{ return accounts; } + @GetMapping("/raidGroup/{raidGroupId}") + @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) + @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN}) + public List getAccountsByRaidGroup(@PathVariable("raidGroupId") UUID raidGroupId, @RequestParam("page") int page, @RequestParam("pageSize") int pageSize, @RequestParam(value = "searchTerm", required = false) String searchTerm){ + log.info("Getting accounts by raid group {}", raidGroupId); + + + List accounts; + if(searchTerm == null){ + accounts = accountService.getAccountsByRaidGroupId(raidGroupId, page, pageSize); + } + else{ + accounts = accountService.getAccountsByRaidGroupId(raidGroupId, page, pageSize, searchTerm); + } + + + return accounts; + } + + @GetMapping("/{accountId}/raidGroup/{raidGroupId}/permission") + @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) + @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN}) + public ObjectNode getAccountPermission(@PathVariable("accountId") UUID accountId, @PathVariable("raidGroupId") UUID raidGroupId){ + log.info("Getting account permission for account {} and raid group {}", accountId, raidGroupId); + + + RaidGroupPermission permission = rgpService.getByAccountIdAndRaidGroupId(accountId, raidGroupId); + + ObjectNode returnNode = mapper.createObjectNode(); + returnNode.put("status", "success"); + returnNode.put("permission", permission.getPermission().name()); + + + return returnNode; + } + + @PutMapping("/{accountId}/raidGroup/{raidGroupId}/permission") + @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) + @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN}) + public ObjectNode updateAccountPermission(@PathVariable("accountId") UUID accountId, @PathVariable("raidGroupId") UUID raidGroupId, @RequestBody ObjectNode permissionNode){ + log.info("Updating account permission for account {} and raid group {}", accountId, raidGroupId); + + + RaidGroupPermission existingPermission = rgpService.getByAccountIdAndRaidGroupId(accountId, raidGroupId); + ObjectNode returnNode = mapper.createObjectNode(); + if(existingPermission == null){ + returnNode.put("status", "error"); + ArrayNode arrayNode = mapper.createArrayNode(); + arrayNode.add("Account does not have permission to raid group"); + returnNode.set("errors", arrayNode); + } + else{ + RaidGroupPermissionType permission = RaidGroupPermissionType.valueOf(permissionNode.get("permission").asText()); + existingPermission.setPermission(permission); + rgpService.createRaidGroupPermission(existingPermission); + + returnNode.put("status", "success"); + } + + + return returnNode; + } + @PostMapping @AccountAuthorization(permissions = {AccountPermissionType.ADMIN}) public ObjectNode createAccount(@RequestBody Account account){ @@ -99,6 +167,30 @@ public class AccountController{ return countNode; } + + @GetMapping("/raidGroup/{raidGroupId}/count") + @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) + @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN}) + public ObjectNode getAccountsCountByRaidGroup(@PathVariable("raidGroupId") UUID raidGroupId, @RequestParam(name = "searchTerm", required = false) String searchTerm){ + log.info("Getting accounts count by raid group {}", raidGroupId); + + + Long accountsCount; + if(searchTerm == null){ + accountsCount = accountService.getAccountsByRaidGroupIdCount(raidGroupId); + } + else{ + accountsCount = accountService.getAccountsByRaidGroupIdCount(raidGroupId, searchTerm); + } + + ObjectNode countNode = mapper.createObjectNode(); + countNode.put("count", accountsCount); + countNode.put("status", "success"); + + + return countNode; + } + @PutMapping("/{accountId}/forcePasswordReset") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN}) public ObjectNode forcePasswordReset(@PathVariable("accountId") UUID accountId){ diff --git a/src/main/java/com/mattrixwv/raidbuilder/repository/account/AccountCustomRepository.java b/src/main/java/com/mattrixwv/raidbuilder/repository/account/AccountCustomRepository.java index 0e26559..bc8b99e 100644 --- a/src/main/java/com/mattrixwv/raidbuilder/repository/account/AccountCustomRepository.java +++ b/src/main/java/com/mattrixwv/raidbuilder/repository/account/AccountCustomRepository.java @@ -1,5 +1,18 @@ package com.mattrixwv.raidbuilder.repository.account; +import java.util.List; +import java.util.UUID; + +import org.springframework.data.domain.PageRequest; + +import com.mattrixwv.raidbuilder.entity.Account; + + public interface AccountCustomRepository{ + public List findAllAccountsByRaidGroupId(UUID raidGroupId, PageRequest pageRequest); + public List findAllAccountsByRaidGroupId(UUID raidGroupId, String searchTerm, PageRequest pageRequest); + + public long countByRaidGroupId(UUID raidGroupId); + public long countByRaidGroupId(UUID raidGroupId, String searchTerm); } diff --git a/src/main/java/com/mattrixwv/raidbuilder/repository/account/AccountRepositoryImpl.java b/src/main/java/com/mattrixwv/raidbuilder/repository/account/AccountRepositoryImpl.java index c58ee2b..6fb51ca 100644 --- a/src/main/java/com/mattrixwv/raidbuilder/repository/account/AccountRepositoryImpl.java +++ b/src/main/java/com/mattrixwv/raidbuilder/repository/account/AccountRepositoryImpl.java @@ -1,9 +1,80 @@ package com.mattrixwv.raidbuilder.repository.account; +import java.util.List; +import java.util.UUID; + +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort.Order; import org.springframework.stereotype.Repository; +import com.mattrixwv.raidbuilder.entity.Account; + +import jakarta.persistence.EntityManager; +import lombok.RequiredArgsConstructor; + @Repository +@RequiredArgsConstructor public class AccountRepositoryImpl implements AccountCustomRepository{ + private final EntityManager entityManager; + + + public List findAllAccountsByRaidGroupId(UUID raidGroupId, PageRequest pageRequest){ + Order order = pageRequest.getSort().toList().get(0); + + + return entityManager.createQuery(""" + SELECT a FROM Account a + INNER JOIN RaidGroupPermission rgp ON a.accountId = rgp.accountId + WHERE rgp.raidGroupId = :raidGroupId + ORDER BY :orderBy + """, Account.class) + .setParameter("raidGroupId", raidGroupId) + .setParameter("orderBy", order.getProperty() + " " + order.getDirection()) + .setFirstResult(pageRequest.getPageNumber() * pageRequest.getPageSize()) + .setMaxResults(pageRequest.getPageSize()) + .getResultList(); + } + + public List findAllAccountsByRaidGroupId(UUID raidGroupId, String searchTerm, PageRequest pageRequest){ + Order order = pageRequest.getSort().toList().get(0); + + + return entityManager.createQuery(""" + SELECT a FROM Account a + INNER JOIN RaidGroupPermission rgp ON a.accountId = rgp.accountId + WHERE rgp.raidGroupId = :raidGroupId + AND LOWER(a.username) LIKE LOWER(:searchTerm) + ORDER BY :orderBy + """, Account.class) + .setParameter("raidGroupId", raidGroupId) + .setParameter("searchTerm", "%" + searchTerm + "%") + .setParameter("orderBy", order.getProperty() + " " + order.getDirection()) + .setFirstResult(pageRequest.getPageNumber() * pageRequest.getPageSize()) + .setMaxResults(pageRequest.getPageSize()) + .getResultList(); + } + + public long countByRaidGroupId(UUID raidGroupId){ + return entityManager.createQuery(""" + SELECT COUNT(a) FROM Account a + INNER JOIN RaidGroupPermission rgp ON a.accountId = rgp.accountId + WHERE rgp.raidGroupId = :raidGroupId + """, Long.class) + .setParameter("raidGroupId", raidGroupId) + .getSingleResult(); + } + + public long countByRaidGroupId(UUID raidGroupId, String searchTerm){ + return entityManager.createQuery(""" + SELECT COUNT(a) FROM Account a + INNER JOIN RaidGroupPermission rgp ON a.accountId = rgp.accountId + WHERE rgp.raidGroupId = :raidGroupId + AND LOWER(a.username) LIKE LOWER(:searchTerm) + """, Long.class) + .setParameter("raidGroupId", raidGroupId) + .setParameter("searchTerm", "%" + searchTerm + "%") + .getSingleResult(); + } } diff --git a/src/main/java/com/mattrixwv/raidbuilder/repository/raid_group_permission/RaidGroupPermissionRepository.java b/src/main/java/com/mattrixwv/raidbuilder/repository/raid_group_permission/RaidGroupPermissionRepository.java index cb20f5c..b17181b 100644 --- a/src/main/java/com/mattrixwv/raidbuilder/repository/raid_group_permission/RaidGroupPermissionRepository.java +++ b/src/main/java/com/mattrixwv/raidbuilder/repository/raid_group_permission/RaidGroupPermissionRepository.java @@ -16,4 +16,5 @@ public interface RaidGroupPermissionRepository extends RaidGroupPermissionCustom public List findAllByAccountId(UUID accountId); + public RaidGroupPermission findByAccountIdAndRaidGroupId(UUID accountId, UUID raidGroupId); } diff --git a/src/main/java/com/mattrixwv/raidbuilder/service/AccountService.java b/src/main/java/com/mattrixwv/raidbuilder/service/AccountService.java index 86542e5..1490983 100644 --- a/src/main/java/com/mattrixwv/raidbuilder/service/AccountService.java +++ b/src/main/java/com/mattrixwv/raidbuilder/service/AccountService.java @@ -149,6 +149,22 @@ public class AccountService implements UserDetailsService{ return accountRepository.countByUsernameContainingIgnoreCase(searchTerm); } + public List getAccountsByRaidGroupId(UUID raidGroupId, int page, int pageSize){ + return accountRepository.findAllAccountsByRaidGroupId(raidGroupId, PageRequest.of(page, pageSize, Sort.by("username").ascending())); + } + + public List getAccountsByRaidGroupId(UUID raidGroupId, int page, int pageSize, String searchTerm){ + return accountRepository.findAllAccountsByRaidGroupId(raidGroupId, searchTerm, PageRequest.of(page, pageSize, Sort.by("username").ascending())); + } + + public long getAccountsByRaidGroupIdCount(UUID raidGroupId){ + return accountRepository.countByRaidGroupId(raidGroupId); + } + + public long getAccountsByRaidGroupIdCount(UUID raidGroupId, String searchTerm){ + return accountRepository.countByRaidGroupId(raidGroupId, searchTerm); + } + //! UserDetailsService @Override diff --git a/src/main/java/com/mattrixwv/raidbuilder/service/RaidGroupPermissionService.java b/src/main/java/com/mattrixwv/raidbuilder/service/RaidGroupPermissionService.java index 1d1c53c..57092ad 100644 --- a/src/main/java/com/mattrixwv/raidbuilder/service/RaidGroupPermissionService.java +++ b/src/main/java/com/mattrixwv/raidbuilder/service/RaidGroupPermissionService.java @@ -42,4 +42,8 @@ public class RaidGroupPermissionService{ public List getByAccountId(UUID accountId){ return raidGroupPermissionRepository.findAllByAccountId(accountId); } + + public RaidGroupPermission getByAccountIdAndRaidGroupId(UUID accountId, UUID raidGroupId){ + return raidGroupPermissionRepository.findByAccountIdAndRaidGroupId(accountId, raidGroupId); + } }