Raid Instance Creator working

This commit is contained in:
2025-03-15 12:20:09 -04:00
parent f2f05f5adf
commit 8eb3c424c3
14 changed files with 287 additions and 0 deletions

View File

@@ -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;

View File

@@ -99,6 +99,7 @@ public class ClassGroupController{
return classGroupService.getClassGroupsByRaidLayoutId(raidLayoutId);
}
@PostMapping
@AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER})
@RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN, RaidGroupPermissionType.LEADER})

View File

@@ -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<PersonCharacter> getPersonCharactersByRaidGroup(@PathVariable("raidGroupId") UUID raidGroupId){
log.info("Getting person characters for raid group {}", raidGroupId);
List<PersonCharacter> personCharacters = personCharacterService.getPersonCharactersByRaidGroupId(raidGroupId);
return personCharacters;
}
}

View File

@@ -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})

View File

@@ -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<RaidInstancePersonCharacterXref> 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<RaidInstancePersonCharacterXref> xrefs){
log.info("Creating xrefs for raid instance {} for raid group {}", raidInstanceId, raidGroupId);
xrefs.forEach(xref -> xref.setRaidInstanceId(raidInstanceId));
List<RaidInstancePersonCharacterXref> existingXrefs = ripcXrefService.getByRaidInstanceId(raidInstanceId);
List<RaidInstancePersonCharacterXref> 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;
}
}

View File

@@ -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})

View File

@@ -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;
}

View File

@@ -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<PersonCharacter> findAllByRaidGroupId(UUID raidGroupId);
}

View File

@@ -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<PersonCharacter> 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();
}
}

View File

@@ -0,0 +1,5 @@
package com.mattrixwv.raidbuilder.repository.raid_instance_person_character_xref_repository;
public interface RaidInstancePersonCharacterXrefCustomRepository{
}

View File

@@ -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<RaidInstancePersonCharacterXref, UUID>{
public void deleteAllByRaidInstanceId(UUID raidInstanceId);
public void deleteAllByRaidInstanceIdIn(Iterable<UUID> raidInstanceIds);
public List<RaidInstancePersonCharacterXref> findAllByPersonCharacterId(UUID personCharacterId);
public List<RaidInstancePersonCharacterXref> findAllByPersonCharacterIdIn(Iterable<UUID> personCharacterIds);
public List<RaidInstancePersonCharacterXref> findAllByRaidInstanceId(UUID raidInstanceId);
}

View File

@@ -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{
}

View File

@@ -58,6 +58,10 @@ public class PersonCharacterService{
return personCharacterRepository.findAllByPersonIdAndCharacterNameContainingIgnoreCase(personId, searchTerm, PageRequest.of(page, pageSize, Sort.by("characterName").ascending()));
}
public List<PersonCharacter> getPersonCharactersByRaidGroupId(UUID raidGroupId){
return personCharacterRepository.findAllByRaidGroupId(raidGroupId);
}
public long getCountByPersonId(UUID personId){
return personCharacterRepository.countByPersonId(personId);
}

View File

@@ -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<RaidInstancePersonCharacterXref> create(Iterable<RaidInstancePersonCharacterXref> xrefs){
return raidInstancePersonCharacterXrefRepository.saveAll(xrefs);
}
public List<RaidInstancePersonCharacterXref> update(Iterable<RaidInstancePersonCharacterXref> xrefs, Iterable<RaidInstancePersonCharacterXref> xrefsToDelete){
raidInstancePersonCharacterXrefRepository.deleteAll(xrefsToDelete);
return raidInstancePersonCharacterXrefRepository.saveAll(xrefs);
}
public void deleteByRaidInstanceId(UUID raidInstanceId){
raidInstancePersonCharacterXrefRepository.deleteAllByRaidInstanceId(raidInstanceId);
}
public void deleteByRaidInstanceIds(Iterable<UUID> raidInstanceIds){
raidInstancePersonCharacterXrefRepository.deleteAllByRaidInstanceIdIn(raidInstanceIds);
}
public void deleteByPersonCharacterId(UUID personCharacterId){
List<RaidInstancePersonCharacterXref> xrefs = raidInstancePersonCharacterXrefRepository.findAllByPersonCharacterId(personCharacterId);
xrefs.forEach(xref -> xref.setPersonCharacterId(null));
raidInstancePersonCharacterXrefRepository.saveAll(xrefs);
}
public void deleteByPersonCharacterIds(Iterable<UUID> personCharacterIds){
List<RaidInstancePersonCharacterXref> xrefs = raidInstancePersonCharacterXrefRepository.findAllByPersonCharacterIdIn(personCharacterIds);
xrefs.forEach(xref -> xref.setPersonCharacterId(null));
raidInstancePersonCharacterXrefRepository.saveAll(xrefs);
}
//Read
public List<RaidInstancePersonCharacterXref> getByRaidInstanceId(UUID raidInstanceId){
return raidInstancePersonCharacterXrefRepository.findAllByRaidInstanceId(raidInstanceId);
}
}