diff --git a/db/1.0.0/8. createRaidGroupPermission.sql b/db/1.0.0/8. createRaidGroupPermission.sql index 52aecf2..b77703e 100644 --- a/db/1.0.0/8. createRaidGroupPermission.sql +++ b/db/1.0.0/8. createRaidGroupPermission.sql @@ -8,7 +8,7 @@ CREATE TABLE IF NOT EXISTS raid_builder.raid_group_permission( permission raid_builder.raid_group_permission_type NOT NULL, --Auditing - modified_by uuid NOT NULL, + modified_by uuid, modified_date timestamptz, created_by uuid NOT NULL, created_date timestamptz NOT NULL diff --git a/src/main/java/com/mattrixwv/raidbuilder/controller/RaidGroupController.java b/src/main/java/com/mattrixwv/raidbuilder/controller/RaidGroupController.java index 9034781..b7ee25c 100644 --- a/src/main/java/com/mattrixwv/raidbuilder/controller/RaidGroupController.java +++ b/src/main/java/com/mattrixwv/raidbuilder/controller/RaidGroupController.java @@ -114,6 +114,7 @@ public class RaidGroupController{ @PutMapping("/{raidGroupId}") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) + @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN}) public ObjectNode updateRaidGroup(@RequestParam(value = "iconFile", required = false) MultipartFile file, @PathVariable("raidGroupId") UUID raidGroupId, @RequestParam("raidGroupName") String raidGroupName, @RequestParam("gameId") UUID gameId, @RequestParam(value = "raidGroupIcon", required = false) String raidGroupIcon){ log.info("Updating raid group {}", raidGroupName); @@ -136,6 +137,7 @@ public class RaidGroupController{ @DeleteMapping("/{raidGroupId}") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) + @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN}) public ObjectNode deleteRaidGroup(@PathVariable("raidGroupId") UUID raidGroupId){ log.info("Deleting raid group {}", raidGroupId); @@ -149,6 +151,8 @@ public class RaidGroupController{ return returnNode; } + + //!Game @GetMapping("/game/{gameId}") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) public List getRaidGroupsByGame(@PathVariable("gameId") UUID gameId, @RequestParam("page") int page, @RequestParam("pageSize") int pageSize, @RequestParam(value = "searchTerm", required = false) String searchTermString){ @@ -186,6 +190,48 @@ public class RaidGroupController{ countNode.put("status", "success"); + return countNode; + } + + + //!Account + @GetMapping("/account/{accountId}") + @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) + public List getRaidGroupsByAccount(@PathVariable("accountId") UUID accountId, @RequestParam("page") int page, @RequestParam("pageSize") int pageSize, @RequestParam(value = "searchTerm", required = false) String searchTermString){ + log.info("Getting raid groups for account {} page {} of size {} with search term {}", accountId, page, pageSize, searchTermString); + + + List raidGroups; + if((searchTermString == null) || (searchTermString.isBlank())){ + raidGroups = raidGroupService.getRaidGroupsByAccount(accountId, page, pageSize); + } + else{ + raidGroups = raidGroupService.getRaidGroupsByAccount(accountId, page, pageSize, searchTermString); + } + + + return raidGroups; + } + + @GetMapping("/account/{accountId}/count") + @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) + public ObjectNode getRaidGroupsCountByAccount(@PathVariable("accountId") UUID accountId, @RequestParam(value = "searchTerm", required = false) String searchTerm){ + log.info("Getting raid groups count for account {} with search term {}", accountId, searchTerm); + + + Long raidGroupsCount; + if((searchTerm == null) || (searchTerm.isBlank())){ + raidGroupsCount = raidGroupService.getRaidGroupsCountByAccount(accountId); + } + else{ + raidGroupsCount = raidGroupService.getRaidGroupsCountByAccount(accountId, searchTerm); + } + + ObjectNode countNode = mapper.createObjectNode(); + countNode.put("count", raidGroupsCount); + countNode.put("status", "success"); + + return countNode; } } diff --git a/src/main/java/com/mattrixwv/raidbuilder/repository/raid_group/RaidGroupCustomRepository.java b/src/main/java/com/mattrixwv/raidbuilder/repository/raid_group/RaidGroupCustomRepository.java index b5c93e8..a9ee42a 100644 --- a/src/main/java/com/mattrixwv/raidbuilder/repository/raid_group/RaidGroupCustomRepository.java +++ b/src/main/java/com/mattrixwv/raidbuilder/repository/raid_group/RaidGroupCustomRepository.java @@ -1,5 +1,18 @@ package com.mattrixwv.raidbuilder.repository.raid_group; +import java.util.List; +import java.util.UUID; + +import org.springframework.data.domain.PageRequest; + +import com.mattrixwv.raidbuilder.entity.RaidGroup; + + public interface RaidGroupCustomRepository{ + public List findAllByAccountId(UUID accountId, PageRequest pageRequest); + public List findAllByAccountIdAndRaidGroupNameContainingIgnoreCase(UUID accountId, String raidGroupName, PageRequest pageRequest); + + public long countAllByAccountId(UUID accountId); + public long countAllByAccountIdAndRaidGroupNameContainingIgnoreCase(UUID accountId, String raidGroupName); } diff --git a/src/main/java/com/mattrixwv/raidbuilder/repository/raid_group/RaidGroupRepositoryImpl.java b/src/main/java/com/mattrixwv/raidbuilder/repository/raid_group/RaidGroupRepositoryImpl.java index 4da4efa..5e9993e 100644 --- a/src/main/java/com/mattrixwv/raidbuilder/repository/raid_group/RaidGroupRepositoryImpl.java +++ b/src/main/java/com/mattrixwv/raidbuilder/repository/raid_group/RaidGroupRepositoryImpl.java @@ -1,9 +1,91 @@ package com.mattrixwv.raidbuilder.repository.raid_group; +import java.util.List; +import java.util.UUID; + +import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Repository; +import com.mattrixwv.raidbuilder.entity.RaidGroup; + +import jakarta.persistence.EntityManager; +import lombok.RequiredArgsConstructor; + @Repository +@RequiredArgsConstructor public class RaidGroupRepositoryImpl implements RaidGroupCustomRepository{ + private final EntityManager entityManager; + + + @Override + public List findAllByAccountId(UUID accountId, PageRequest pageRequest){ + String selectString = """ + SELECT rg FROM RaidGroup rg + INNER JOIN RaidGroupPermission rgp ON rg.raidGroupId = rgp.raidGroupId + WHERE rgp.accountId = :accountId + ORDER BY rg.raidGroupName ASC + """; + + List raidGroups = entityManager.createQuery(selectString, RaidGroup.class) + .setParameter("accountId", accountId) + .setFirstResult(pageRequest.getPageNumber() * pageRequest.getPageSize()) + .setMaxResults(pageRequest.getPageSize()) + .getResultList(); + + return raidGroups; + } + + @Override + public List findAllByAccountIdAndRaidGroupNameContainingIgnoreCase(UUID accountId, String raidGroupName, PageRequest pageRequest){ + String selectString = """ + SELECT rg FROM RaidGroup rg + INNER JOIN RaidGroupPermission rgp ON rg.raidGroupId = rgp.raidGroupId + WHERE rgp.accountId = :accountId + AND LOWER(rg.raidGroupName) LIKE LOWER(:raidGroupName) + ORDER BY rg.raidGroupName ASC + """; + + List raidGroups = entityManager.createQuery(selectString, RaidGroup.class) + .setParameter("accountId", accountId) + .setParameter("raidGroupName", "%" + raidGroupName + "%") + .setFirstResult(pageRequest.getPageNumber() * pageRequest.getPageSize()) + .setMaxResults(pageRequest.getPageSize()) + .getResultList(); + + return raidGroups; + } + + @Override + public long countAllByAccountId(UUID accountId){ + String selectString = """ + SELECT count(rg) FROM RaidGroup rg + INNER JOIN RaidGroupPermission rgp ON rg.raidGroupId = rgp.raidGroupId + WHERE rgp.accountId = :accountId + """; + + Long count = entityManager.createQuery(selectString, Long.class) + .setParameter("accountId", accountId) + .getSingleResult(); + + return count; + } + + @Override + public long countAllByAccountIdAndRaidGroupNameContainingIgnoreCase(UUID accountId, String raidGroupName) { + String selectString = """ + SELECT count(rg) FROM RaidGroup rg + INNER JOIN RaidGroupPermission rgp ON rg.raidGroupId = rgp.raidGroupId + WHERE rgp.accountId = :accountId + AND LOWER(rg.raidGroupName) LIKE LOWER(:raidGroupName) + """; + + Long count = entityManager.createQuery(selectString, Long.class) + .setParameter("accountId", accountId) + .setParameter("raidGroupName", "%" + raidGroupName + "%") + .getSingleResult(); + + return count; + } } diff --git a/src/main/java/com/mattrixwv/raidbuilder/service/RaidGroupService.java b/src/main/java/com/mattrixwv/raidbuilder/service/RaidGroupService.java index 9618a75..5a12480 100644 --- a/src/main/java/com/mattrixwv/raidbuilder/service/RaidGroupService.java +++ b/src/main/java/com/mattrixwv/raidbuilder/service/RaidGroupService.java @@ -10,12 +10,16 @@ import java.util.UUID; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.jwt.Jwt; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import com.mattrixwv.raidbuilder.entity.RaidGroup; +import com.mattrixwv.raidbuilder.entity.RaidGroupPermission; import com.mattrixwv.raidbuilder.repository.raid_group.RaidGroupRepository; +import com.mattrixwv.raidbuilder.util.DatabaseTypeUtil.RaidGroupPermissionType; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -36,6 +40,7 @@ public class RaidGroupService{ //Write public RaidGroup createRaidGroup(RaidGroup raidGroup, MultipartFile file){ + //Upload the icon if(file != null){ String fileName = UUID.randomUUID().toString() + "--" + file.getOriginalFilename(); Path filePath = Paths.get(uploadFileDirectory + "/raidGroupIcons").resolve(fileName); @@ -49,7 +54,20 @@ public class RaidGroupService{ throw new RuntimeException("Error uploading file: " + error.getMessage(), error); } } - return raidGroupRepository.save(raidGroup); + + //Save the raid group + raidGroup = raidGroupRepository.save(raidGroup); + + //Add the current user as an admin of the raid group + RaidGroupPermission raidGroupPermission = new RaidGroupPermission(); + raidGroupPermission.setRaidGroupId(raidGroup.getRaidGroupId()); + raidGroupPermission.setPermission(RaidGroupPermissionType.ADMIN); + UUID accountId = UUID.fromString(((Jwt)SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getClaimAsString("accountId")); + raidGroupPermission.setAccountId(accountId); + raidGroupPermissionService.createRaidGroupPermission(raidGroupPermission); + + + return raidGroup; } public RaidGroup updateRaidGroup(RaidGroup raidGroup, MultipartFile file){ @@ -138,6 +156,15 @@ public class RaidGroupService{ return raidGroupRepository.findAllByGameIdAndRaidGroupNameContainingIgnoreCase(gameId, searchTerm, PageRequest.of(page, pageSize, Sort.by("raidGroupName").ascending())); } + public List getRaidGroupsByAccount(UUID accountId, int page, int pageSize){ + return raidGroupRepository.findAllByAccountId(accountId, PageRequest.of(page, pageSize, Sort.by("raidGroupName").ascending())); + } + + public List getRaidGroupsByAccount(UUID accountId, int page, int pageSize, String searchTerm){ + return raidGroupRepository.findAllByAccountIdAndRaidGroupNameContainingIgnoreCase(accountId, searchTerm, PageRequest.of(page, pageSize, Sort.by("raidGroupName").ascending())); + } + + //!Count public long getRaidGroupsCount(){ return raidGroupRepository.count(); } @@ -153,4 +180,12 @@ public class RaidGroupService{ public long getRaidGroupsCountByGame(UUID gameId, String searchTerm){ return raidGroupRepository.countAllByGameIdAndRaidGroupNameContainingIgnoreCase(gameId, searchTerm); } + + public long getRaidGroupsCountByAccount(UUID accountId){ + return raidGroupRepository.countAllByAccountId(accountId); + } + + public long getRaidGroupsCountByAccount(UUID accountId, String searchTerm){ + return raidGroupRepository.countAllByAccountIdAndRaidGroupNameContainingIgnoreCase(accountId, searchTerm); + } }