package com.mattrixwv.raidbuilder.controller; import java.util.List; import java.util.UUID; import org.springframework.web.bind.annotation.DeleteMapping; 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.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; 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.RaidLayout; import com.mattrixwv.raidbuilder.entity.RaidLayoutClassGroupXref; import com.mattrixwv.raidbuilder.service.RaidLayoutService; 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}/raidLayout") @RequiredArgsConstructor public class RaidLayoutController{ private final ObjectMapper mapper; private final RaidLayoutService raidLayoutService; @GetMapping @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN, RaidGroupPermissionType.LEADER, RaidGroupPermissionType.RAIDER}) public List getRaidLayouts(@PathVariable("raidGroupId") UUID raidGroupId, @RequestParam("page") int page, @RequestParam("pageSize") int pageSize, @RequestParam(name = "searchTerm", required = false) String searchTerm){ log.info("Getting Raid Layouts for Raid Group {} on page {} of size {} with search {}", raidGroupId, page, pageSize, searchTerm); List raidLayouts = searchTerm == null ? raidLayoutService.getRaidLayoutsByRaidGroupId(raidGroupId, page, pageSize) : raidLayoutService.getRaidLayoutsByRaidGroupId(raidGroupId, page, pageSize, searchTerm); return raidLayouts; } @GetMapping("/count") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN, RaidGroupPermissionType.LEADER, RaidGroupPermissionType.RAIDER}) public ObjectNode getRaidLayoutCount(@PathVariable("raidGroupId") UUID raidGroupId, @RequestParam(name = "searchTerm", required = false) String searchTerm){ log.info("Getting Raid Layout Count for Raid Group {} with search {}", raidGroupId, searchTerm); long count = searchTerm == null ? raidLayoutService.getRaidLayoutCountByRaidGroupId(raidGroupId) : raidLayoutService.getRaidLayoutCountByRaidGroupId(raidGroupId, searchTerm); ObjectNode returnNode = mapper.createObjectNode(); returnNode.put("count", count); returnNode.put("status", "success"); return returnNode; } @PostMapping @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN, RaidGroupPermissionType.LEADER}) public ObjectNode createRaidLayout(@PathVariable("raidGroupId") UUID raidGroupId, @RequestBody ObjectNode bodyNode){ log.info("Creating Raid Layout for Raid Group {}", raidGroupId); RaidLayout raidLayout = mapper.convertValue(bodyNode.get("raidLayout"), RaidLayout.class); raidLayout.setRaidGroupId(raidGroupId); RaidLayoutClassGroupXref[] xrefsArray = mapper.convertValue(bodyNode.get("raidLayoutClassGroupXrefs"), RaidLayoutClassGroupXref[].class); List xrefs = List.of(xrefsArray); raidLayout = raidLayoutService.createRaidLayout(raidLayout, xrefs); ObjectNode returnNode = mapper.createObjectNode(); returnNode.put("raidLayoutId", raidLayout.getRaidLayoutId().toString()); returnNode.put("status", "success"); return returnNode; } @PutMapping("/{raidLayoutId}") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN, RaidGroupPermissionType.LEADER}) public ObjectNode updateRaidLayout(@PathVariable("raidGroupId") UUID raidGroupId, @PathVariable("raidLayoutId") UUID raidLayoutId, @RequestBody ObjectNode bodyNode){ log.info("Updating Raid Layout {} for Raid Group {}", raidLayoutId, raidGroupId); RaidLayout raidLayout = mapper.convertValue(bodyNode.get("raidLayout"), RaidLayout.class); raidLayout.setRaidGroupId(raidGroupId); raidLayout.setRaidLayoutId(raidLayoutId); RaidLayoutClassGroupXref[] xrefsArray = mapper.convertValue(bodyNode.get("raidLayoutClassGroupXrefs"), RaidLayoutClassGroupXref[].class); List xrefs = List.of(xrefsArray); raidLayoutService.updateRaidLayout(raidLayout, xrefs); ObjectNode returnNode = mapper.createObjectNode(); returnNode.put("raidLayoutId", raidLayout.getRaidLayoutId().toString()); returnNode.put("status", "success"); return returnNode; } @DeleteMapping("/{raidLayoutId}") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN, RaidGroupPermissionType.LEADER}) public ObjectNode deleteRaidLayout(@PathVariable("raidGroupId") UUID raidGroupId, @PathVariable("raidLayoutId") UUID raidLayoutId){ log.info("Deleting Raid Layout {} for Raid Group {}", raidLayoutId, raidGroupId); raidLayoutService.deleteRaidLayout(raidLayoutId, raidGroupId); ObjectNode returnNode = mapper.createObjectNode(); returnNode.put("status", "success"); return returnNode; } }