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.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; import tools.jackson.databind.ObjectMapper; import tools.jackson.databind.node.ObjectNode; @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; } }