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.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.mattrixwv.raidbuilder.annotation.AccountAuthorization; import com.mattrixwv.raidbuilder.annotation.GameAuthorization; import com.mattrixwv.raidbuilder.entity.GameClass; import com.mattrixwv.raidbuilder.service.GameClassService; import com.mattrixwv.raidbuilder.util.DatabaseTypeUtil.AccountPermissionType; import com.mattrixwv.raidbuilder.util.DatabaseTypeUtil.GamePermissionType; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @Slf4j @RestController @RequestMapping("/gameClass") @RequiredArgsConstructor public class GameClassController{ private final ObjectMapper mapper; private final GameClassService gameClassService; @GetMapping("/game/{gameId}") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) public List getByGameId(@PathVariable("gameId") UUID gameId, @RequestParam("page") int page, @RequestParam("pageSize") int pageSize, @RequestParam(name = "searchTerm", required = false) String searchTerm){ log.info("Getting game classes for game {} with page {} of size {} with search term {}", gameId, page, pageSize, searchTerm); List gameClasses; if((searchTerm == null) || (searchTerm.isBlank())){ gameClasses = gameClassService.getByGameId(gameId, page, pageSize); } else{ gameClasses = gameClassService.getByGameId(gameId, page, pageSize, searchTerm); } return gameClasses; } @GetMapping("/game/{gameId}/count") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) public ObjectNode getByGameCount(@PathVariable("gameId") UUID gameId, @RequestParam(name = "searchTerm", required = false) String searchTerm){ log.info("Getting game classes count for game {} with search term {}", gameId, searchTerm); Long gameClassesCount; if((searchTerm == null) || (searchTerm.isBlank())){ gameClassesCount = gameClassService.countByGameId(gameId); } else{ gameClassesCount = gameClassService.countByGameId(gameId, searchTerm); } ObjectNode countNode = mapper.createObjectNode(); countNode.put("count", gameClassesCount); countNode.put("status", "success"); return countNode; } @GetMapping("/classGroup/{classGroupId}") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) public List getByClassGroupId(@PathVariable("classGroupId") UUID classGroupId){ log.info("Getting game classes for class group {}", classGroupId); return gameClassService.getByClassGroupId(classGroupId); } @PostMapping("/game/{gameId}") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) @GameAuthorization(permissions = {GamePermissionType.ADMIN}) public ObjectNode createGameClass(@PathVariable("gameId") UUID gameId, @RequestParam(value = "iconFile", required = false) MultipartFile file, @RequestParam("gameClassName") String gameClassName){ log.info("Creating game class {}", gameClassName); ObjectNode returnNode = mapper.createObjectNode(); GameClass gameClass = new GameClass(); gameClass.setGameId(gameId); gameClass.setGameClassName(gameClassName); gameClassService.createGameClass(gameClass, file); returnNode.put("gameClassId", gameClass.getGameClassId().toString()); returnNode.put("status", "success"); log.info("Successfully created game class: {}", gameClass.getGameClassId()); return returnNode; } @PutMapping("/{gameClassId}/game/{gameId}") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) @GameAuthorization(permissions = {GamePermissionType.ADMIN}) public ObjectNode updateGameClass(@PathVariable("gameClassId") UUID gameClassId, @PathVariable("gameId") UUID gameId, @RequestParam(value = "iconFile", required = false) MultipartFile file, @RequestParam("gameClassName") String gameClassName, @RequestParam(value = "gameClassIcon", required = false) String gameClassIcon){ log.info("Updating game class {}", gameClassName); ObjectNode returnNode = mapper.createObjectNode(); GameClass gameClass = new GameClass(); gameClass.setGameClassId(gameClassId); gameClass.setGameId(gameId); gameClass.setGameClassName(gameClassName); gameClass.setGameClassIcon(gameClassIcon); gameClassService.updateGameClass(gameClass, file); returnNode.put("gameClassId", gameClass.getGameClassId().toString()); returnNode.put("status", "success"); log.info("Successfully updated game class: {}", gameClass.getGameClassId()); return returnNode; } @DeleteMapping("/{gameClassId}/game/{gameId}") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) @GameAuthorization(permissions = {GamePermissionType.ADMIN}) public ObjectNode deleteGameClass(@PathVariable("gameClassId") UUID gameClassId, @PathVariable("gameId") UUID gameId){ log.info("Deleting game class {}", gameClassId); ObjectNode returnNode = mapper.createObjectNode(); gameClassService.deleteById(gameClassId); returnNode.put("status", "success"); log.info("Successfully deleted game class: {}", gameClassId); return returnNode; } }