From 8eb3c424c31953c4432749d06e72a6bdf76ce218 Mon Sep 17 00:00:00 2001 From: Mattrixwv Date: Sat, 15 Mar 2025 12:20:09 -0400 Subject: [PATCH] Raid Instance Creator working --- ... createRaidInstancePersonCharacterXref.sql | 18 +++++ .../controller/ClassGroupController.java | 1 + .../controller/RaidGroupController.java | 18 +++++ .../controller/RaidInstanceController.java | 10 +++ ...InstancePersonCharacterXrefController.java | 66 +++++++++++++++++++ .../controller/RaidLayoutController.java | 10 +++ .../RaidInstancePersonCharacterXref.java | 35 ++++++++++ .../PersonCharacterCustomRepository.java | 7 ++ .../PersonCharacterRepositoryImpl.java | 23 +++++++ ...cePersonCharacterXrefCustomRepository.java | 5 ++ ...InstancePersonCharacterXrefRepository.java | 20 ++++++ ...ancePersonCharacterXrefRepositoryImpl.java | 9 +++ .../service/PersonCharacterService.java | 4 ++ ...aidInstancePersonCharacterXrefService.java | 61 +++++++++++++++++ 14 files changed, 287 insertions(+) create mode 100644 db/1.0.0/18. createRaidInstancePersonCharacterXref.sql create mode 100644 src/main/java/com/mattrixwv/raidbuilder/controller/RaidInstancePersonCharacterXrefController.java create mode 100644 src/main/java/com/mattrixwv/raidbuilder/entity/RaidInstancePersonCharacterXref.java create mode 100644 src/main/java/com/mattrixwv/raidbuilder/repository/raid_instance_person_character_xref_repository/RaidInstancePersonCharacterXrefCustomRepository.java create mode 100644 src/main/java/com/mattrixwv/raidbuilder/repository/raid_instance_person_character_xref_repository/RaidInstancePersonCharacterXrefRepository.java create mode 100644 src/main/java/com/mattrixwv/raidbuilder/repository/raid_instance_person_character_xref_repository/RaidInstancePersonCharacterXrefRepositoryImpl.java create mode 100644 src/main/java/com/mattrixwv/raidbuilder/service/RaidInstancePersonCharacterXrefService.java diff --git a/db/1.0.0/18. createRaidInstancePersonCharacterXref.sql b/db/1.0.0/18. createRaidInstancePersonCharacterXref.sql new file mode 100644 index 0000000..fa4f50b --- /dev/null +++ b/db/1.0.0/18. createRaidInstancePersonCharacterXref.sql @@ -0,0 +1,18 @@ +CREATE TABLE raid_builder.raid_instance_person_character_xref( + raid_instance_person_character_xref_id uuid PRIMARY KEY, + raid_instance_id uuid REFERENCES raid_builder.raid_instance(raid_instance_id) NOT NULL, + person_character_id uuid REFERENCES raid_builder.person_character(person_character_id) NOT NULL, + group_number int NOT NULL, + position_number int NOT NULL, + + --Auditing + modified_by uuid, + modified_date timestamptz, + created_by uuid NOT NULL, + created_date timestamptz NOT NULL +); + +CREATE INDEX idx_raid_instance_person_character_xref_raid_instance_id ON raid_builder.raid_instance_person_character_xref(raid_instance_id); +CREATE INDEX idx_raid_instance_person_character_xref_person_character_id ON raid_builder.raid_instance_person_character_xref(person_character_id); + +GRANT ALL ON TABLE raid_builder.raid_instance_person_character_xref TO raid_builder; diff --git a/src/main/java/com/mattrixwv/raidbuilder/controller/ClassGroupController.java b/src/main/java/com/mattrixwv/raidbuilder/controller/ClassGroupController.java index a9cd3d1..9ed1285 100644 --- a/src/main/java/com/mattrixwv/raidbuilder/controller/ClassGroupController.java +++ b/src/main/java/com/mattrixwv/raidbuilder/controller/ClassGroupController.java @@ -99,6 +99,7 @@ public class ClassGroupController{ return classGroupService.getClassGroupsByRaidLayoutId(raidLayoutId); } + @PostMapping @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN, RaidGroupPermissionType.LEADER}) diff --git a/src/main/java/com/mattrixwv/raidbuilder/controller/RaidGroupController.java b/src/main/java/com/mattrixwv/raidbuilder/controller/RaidGroupController.java index b7ee25c..f3b58c8 100644 --- a/src/main/java/com/mattrixwv/raidbuilder/controller/RaidGroupController.java +++ b/src/main/java/com/mattrixwv/raidbuilder/controller/RaidGroupController.java @@ -18,7 +18,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.mattrixwv.raidbuilder.annotation.AccountAuthorization; import com.mattrixwv.raidbuilder.annotation.RaidGroupAuthorization; +import com.mattrixwv.raidbuilder.entity.PersonCharacter; import com.mattrixwv.raidbuilder.entity.RaidGroup; +import com.mattrixwv.raidbuilder.service.PersonCharacterService; import com.mattrixwv.raidbuilder.service.RaidGroupService; import com.mattrixwv.raidbuilder.util.DatabaseTypeUtil.AccountPermissionType; import com.mattrixwv.raidbuilder.util.DatabaseTypeUtil.RaidGroupPermissionType; @@ -34,6 +36,7 @@ import lombok.extern.slf4j.Slf4j; public class RaidGroupController{ private final ObjectMapper mapper; private final RaidGroupService raidGroupService; + private final PersonCharacterService personCharacterService; @GetMapping @@ -234,4 +237,19 @@ public class RaidGroupController{ return countNode; } + + + //!Person Character + @GetMapping("/{raidGroupId}/person/character") + @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) + @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN, RaidGroupPermissionType.LEADER, RaidGroupPermissionType.RAIDER}) + public List getPersonCharactersByRaidGroup(@PathVariable("raidGroupId") UUID raidGroupId){ + log.info("Getting person characters for raid group {}", raidGroupId); + + + List personCharacters = personCharacterService.getPersonCharactersByRaidGroupId(raidGroupId); + + + return personCharacters; + } } diff --git a/src/main/java/com/mattrixwv/raidbuilder/controller/RaidInstanceController.java b/src/main/java/com/mattrixwv/raidbuilder/controller/RaidInstanceController.java index c718d86..a5f683f 100644 --- a/src/main/java/com/mattrixwv/raidbuilder/controller/RaidInstanceController.java +++ b/src/main/java/com/mattrixwv/raidbuilder/controller/RaidInstanceController.java @@ -80,6 +80,16 @@ public class RaidInstanceController{ return returnNode; } + @GetMapping("/{raidInstanceId}") + @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) + @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN, RaidGroupPermissionType.LEADER, RaidGroupPermissionType.RAIDER}) + public RaidInstance getRaidInstance(@PathVariable("raidGroupId") UUID raidGroupId, @PathVariable("raidInstanceId") UUID raidInstanceId){ + log.info("Getting raid instance {} for raid group {}", raidInstanceId, raidGroupId); + + + return raidInstanceService.findById(raidInstanceId); + } + @PostMapping @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) diff --git a/src/main/java/com/mattrixwv/raidbuilder/controller/RaidInstancePersonCharacterXrefController.java b/src/main/java/com/mattrixwv/raidbuilder/controller/RaidInstancePersonCharacterXrefController.java new file mode 100644 index 0000000..0d6c3fc --- /dev/null +++ b/src/main/java/com/mattrixwv/raidbuilder/controller/RaidInstancePersonCharacterXrefController.java @@ -0,0 +1,66 @@ +package com.mattrixwv.raidbuilder.controller; + + +import java.util.List; +import java.util.UUID; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.mattrixwv.raidbuilder.annotation.AccountAuthorization; +import com.mattrixwv.raidbuilder.annotation.RaidGroupAuthorization; +import com.mattrixwv.raidbuilder.entity.RaidInstancePersonCharacterXref; +import com.mattrixwv.raidbuilder.service.RaidInstancePersonCharacterXrefService; +import com.mattrixwv.raidbuilder.util.DatabaseTypeUtil.AccountPermissionType; +import com.mattrixwv.raidbuilder.util.DatabaseTypeUtil.RaidGroupPermissionType; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + + +@Slf4j +@RestController +@RequestMapping("/raidGroup/{raidGroupId}/raidInstance/{raidInstanceId}/personCharacterXref") +@RequiredArgsConstructor +public class RaidInstancePersonCharacterXrefController{ + private final ObjectMapper mapper; + private final RaidInstancePersonCharacterXrefService ripcXrefService; + + + @GetMapping + @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) + @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN, RaidGroupPermissionType.LEADER, RaidGroupPermissionType.RAIDER}) + public List getXrefsForRaidInstance(@PathVariable("raidGroupId") UUID raidGroupId, @PathVariable("raidInstanceId") UUID raidInstanceId){ + log.info("Getting xrefs for raid instance {} for raid group {}", raidInstanceId, raidGroupId); + + + return ripcXrefService.getByRaidInstanceId(raidInstanceId); + } + + + @PostMapping + @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) + @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN, RaidGroupPermissionType.LEADER}) + public ObjectNode createXrefsForRaidInstance(@PathVariable("raidGroupId") UUID raidGroupId, @PathVariable("raidInstanceId") UUID raidInstanceId, @RequestBody List xrefs){ + log.info("Creating xrefs for raid instance {} for raid group {}", raidInstanceId, raidGroupId); + + + xrefs.forEach(xref -> xref.setRaidInstanceId(raidInstanceId)); + + List existingXrefs = ripcXrefService.getByRaidInstanceId(raidInstanceId); + List xrefsToDelete = existingXrefs.stream().filter(xref -> xrefs.stream().noneMatch(xref2 -> xref2.getPersonCharacterId().equals(xref.getPersonCharacterId()))).toList(); + + ripcXrefService.update(xrefs, xrefsToDelete); + ObjectNode returnNode = mapper.createObjectNode(); + returnNode.put("status", "success"); + + + return returnNode; + } +} diff --git a/src/main/java/com/mattrixwv/raidbuilder/controller/RaidLayoutController.java b/src/main/java/com/mattrixwv/raidbuilder/controller/RaidLayoutController.java index 063c42e..183339c 100644 --- a/src/main/java/com/mattrixwv/raidbuilder/controller/RaidLayoutController.java +++ b/src/main/java/com/mattrixwv/raidbuilder/controller/RaidLayoutController.java @@ -71,6 +71,16 @@ public class RaidLayoutController{ return returnNode; } + @GetMapping("/{raidLayoutId}") + @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) + @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN, RaidGroupPermissionType.LEADER, RaidGroupPermissionType.RAIDER}) + public RaidLayout getRaidLayout(@PathVariable("raidGroupId") UUID raidGroupId, @PathVariable("raidLayoutId") UUID raidLayoutId){ + log.info("Getting Raid Layout {} for Raid Group {}", raidLayoutId, raidGroupId); + + + return raidLayoutService.getRaidLayout(raidLayoutId, raidGroupId); + } + @PostMapping @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) diff --git a/src/main/java/com/mattrixwv/raidbuilder/entity/RaidInstancePersonCharacterXref.java b/src/main/java/com/mattrixwv/raidbuilder/entity/RaidInstancePersonCharacterXref.java new file mode 100644 index 0000000..3a914a5 --- /dev/null +++ b/src/main/java/com/mattrixwv/raidbuilder/entity/RaidInstancePersonCharacterXref.java @@ -0,0 +1,35 @@ +package com.mattrixwv.raidbuilder.entity; + + +import java.util.UUID; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + + +@Entity +@Table(name = "raid_instance_person_character_xref", schema = "raid_builder") +@Data +@EqualsAndHashCode(callSuper = false) +@NoArgsConstructor +public class RaidInstancePersonCharacterXref extends AuditableEntity{ + @Id + @Column(name = "raid_instance_person_character_xref_id") + @GeneratedValue(strategy = GenerationType.UUID) + private UUID raidInstancePersonCharacterXrefId; + @Column(name = "raid_instance_id") + private UUID raidInstanceId; + @Column(name = "person_character_id") + private UUID personCharacterId; + @Column(name = "group_number") + private int groupNumber; + @Column(name = "position_number") + private int positionNumber; +} diff --git a/src/main/java/com/mattrixwv/raidbuilder/repository/person_character/PersonCharacterCustomRepository.java b/src/main/java/com/mattrixwv/raidbuilder/repository/person_character/PersonCharacterCustomRepository.java index 9656504..fb8c6c4 100644 --- a/src/main/java/com/mattrixwv/raidbuilder/repository/person_character/PersonCharacterCustomRepository.java +++ b/src/main/java/com/mattrixwv/raidbuilder/repository/person_character/PersonCharacterCustomRepository.java @@ -1,5 +1,12 @@ package com.mattrixwv.raidbuilder.repository.person_character; +import java.util.List; +import java.util.UUID; + +import com.mattrixwv.raidbuilder.entity.PersonCharacter; + + public interface PersonCharacterCustomRepository{ + public List findAllByRaidGroupId(UUID raidGroupId); } diff --git a/src/main/java/com/mattrixwv/raidbuilder/repository/person_character/PersonCharacterRepositoryImpl.java b/src/main/java/com/mattrixwv/raidbuilder/repository/person_character/PersonCharacterRepositoryImpl.java index 54ed770..87d7b84 100644 --- a/src/main/java/com/mattrixwv/raidbuilder/repository/person_character/PersonCharacterRepositoryImpl.java +++ b/src/main/java/com/mattrixwv/raidbuilder/repository/person_character/PersonCharacterRepositoryImpl.java @@ -1,9 +1,32 @@ package com.mattrixwv.raidbuilder.repository.person_character; +import java.util.List; +import java.util.UUID; + import org.springframework.stereotype.Repository; +import com.mattrixwv.raidbuilder.entity.PersonCharacter; + +import jakarta.persistence.EntityManager; +import lombok.RequiredArgsConstructor; + @Repository +@RequiredArgsConstructor public class PersonCharacterRepositoryImpl implements PersonCharacterCustomRepository{ + private final EntityManager entityManager; + + + @Override + public List findAllByRaidGroupId(UUID raidGroupId){ + return entityManager.createQuery(""" + SELECT pc FROM PersonCharacter pc + INNER JOIN Person p ON pc.personId = p.personId + WHERE p.raidGroupId = :raidGroupId + ORDER BY pc.characterName ASC + """, PersonCharacter.class) + .setParameter("raidGroupId", raidGroupId) + .getResultList(); + } } diff --git a/src/main/java/com/mattrixwv/raidbuilder/repository/raid_instance_person_character_xref_repository/RaidInstancePersonCharacterXrefCustomRepository.java b/src/main/java/com/mattrixwv/raidbuilder/repository/raid_instance_person_character_xref_repository/RaidInstancePersonCharacterXrefCustomRepository.java new file mode 100644 index 0000000..32dc9d8 --- /dev/null +++ b/src/main/java/com/mattrixwv/raidbuilder/repository/raid_instance_person_character_xref_repository/RaidInstancePersonCharacterXrefCustomRepository.java @@ -0,0 +1,5 @@ +package com.mattrixwv.raidbuilder.repository.raid_instance_person_character_xref_repository; + + +public interface RaidInstancePersonCharacterXrefCustomRepository{ +} diff --git a/src/main/java/com/mattrixwv/raidbuilder/repository/raid_instance_person_character_xref_repository/RaidInstancePersonCharacterXrefRepository.java b/src/main/java/com/mattrixwv/raidbuilder/repository/raid_instance_person_character_xref_repository/RaidInstancePersonCharacterXrefRepository.java new file mode 100644 index 0000000..f106c6e --- /dev/null +++ b/src/main/java/com/mattrixwv/raidbuilder/repository/raid_instance_person_character_xref_repository/RaidInstancePersonCharacterXrefRepository.java @@ -0,0 +1,20 @@ +package com.mattrixwv.raidbuilder.repository.raid_instance_person_character_xref_repository; + + +import java.util.List; +import java.util.UUID; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.mattrixwv.raidbuilder.entity.RaidInstancePersonCharacterXref; + + +public interface RaidInstancePersonCharacterXrefRepository extends RaidInstancePersonCharacterXrefCustomRepository, JpaRepository{ + public void deleteAllByRaidInstanceId(UUID raidInstanceId); + public void deleteAllByRaidInstanceIdIn(Iterable raidInstanceIds); + + + public List findAllByPersonCharacterId(UUID personCharacterId); + public List findAllByPersonCharacterIdIn(Iterable personCharacterIds); + public List findAllByRaidInstanceId(UUID raidInstanceId); +} diff --git a/src/main/java/com/mattrixwv/raidbuilder/repository/raid_instance_person_character_xref_repository/RaidInstancePersonCharacterXrefRepositoryImpl.java b/src/main/java/com/mattrixwv/raidbuilder/repository/raid_instance_person_character_xref_repository/RaidInstancePersonCharacterXrefRepositoryImpl.java new file mode 100644 index 0000000..c784f8c --- /dev/null +++ b/src/main/java/com/mattrixwv/raidbuilder/repository/raid_instance_person_character_xref_repository/RaidInstancePersonCharacterXrefRepositoryImpl.java @@ -0,0 +1,9 @@ +package com.mattrixwv.raidbuilder.repository.raid_instance_person_character_xref_repository; + + +import org.springframework.stereotype.Repository; + + +@Repository +public class RaidInstancePersonCharacterXrefRepositoryImpl implements RaidInstancePersonCharacterXrefCustomRepository{ +} diff --git a/src/main/java/com/mattrixwv/raidbuilder/service/PersonCharacterService.java b/src/main/java/com/mattrixwv/raidbuilder/service/PersonCharacterService.java index cc73be4..955bffb 100644 --- a/src/main/java/com/mattrixwv/raidbuilder/service/PersonCharacterService.java +++ b/src/main/java/com/mattrixwv/raidbuilder/service/PersonCharacterService.java @@ -58,6 +58,10 @@ public class PersonCharacterService{ return personCharacterRepository.findAllByPersonIdAndCharacterNameContainingIgnoreCase(personId, searchTerm, PageRequest.of(page, pageSize, Sort.by("characterName").ascending())); } + public List getPersonCharactersByRaidGroupId(UUID raidGroupId){ + return personCharacterRepository.findAllByRaidGroupId(raidGroupId); + } + public long getCountByPersonId(UUID personId){ return personCharacterRepository.countByPersonId(personId); } diff --git a/src/main/java/com/mattrixwv/raidbuilder/service/RaidInstancePersonCharacterXrefService.java b/src/main/java/com/mattrixwv/raidbuilder/service/RaidInstancePersonCharacterXrefService.java new file mode 100644 index 0000000..16b8ad5 --- /dev/null +++ b/src/main/java/com/mattrixwv/raidbuilder/service/RaidInstancePersonCharacterXrefService.java @@ -0,0 +1,61 @@ +package com.mattrixwv.raidbuilder.service; + + +import java.util.List; +import java.util.UUID; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.mattrixwv.raidbuilder.entity.RaidInstancePersonCharacterXref; +import com.mattrixwv.raidbuilder.repository.raid_instance_person_character_xref_repository.RaidInstancePersonCharacterXrefRepository; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + + +@Slf4j +@Service +@Transactional(rollbackFor = Exception.class) +@RequiredArgsConstructor +public class RaidInstancePersonCharacterXrefService{ + private final RaidInstancePersonCharacterXrefRepository raidInstancePersonCharacterXrefRepository; + + + //Write + public List create(Iterable xrefs){ + return raidInstancePersonCharacterXrefRepository.saveAll(xrefs); + } + + public List update(Iterable xrefs, Iterable xrefsToDelete){ + raidInstancePersonCharacterXrefRepository.deleteAll(xrefsToDelete); + + return raidInstancePersonCharacterXrefRepository.saveAll(xrefs); + } + + public void deleteByRaidInstanceId(UUID raidInstanceId){ + raidInstancePersonCharacterXrefRepository.deleteAllByRaidInstanceId(raidInstanceId); + } + + public void deleteByRaidInstanceIds(Iterable raidInstanceIds){ + raidInstancePersonCharacterXrefRepository.deleteAllByRaidInstanceIdIn(raidInstanceIds); + } + + public void deleteByPersonCharacterId(UUID personCharacterId){ + List xrefs = raidInstancePersonCharacterXrefRepository.findAllByPersonCharacterId(personCharacterId); + xrefs.forEach(xref -> xref.setPersonCharacterId(null)); + raidInstancePersonCharacterXrefRepository.saveAll(xrefs); + } + + public void deleteByPersonCharacterIds(Iterable personCharacterIds){ + List xrefs = raidInstancePersonCharacterXrefRepository.findAllByPersonCharacterIdIn(personCharacterIds); + xrefs.forEach(xref -> xref.setPersonCharacterId(null)); + raidInstancePersonCharacterXrefRepository.saveAll(xrefs); + } + + + //Read + public List getByRaidInstanceId(UUID raidInstanceId){ + return raidInstancePersonCharacterXrefRepository.findAllByRaidInstanceId(raidInstanceId); + } +}