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.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.GameAuthorization; import com.mattrixwv.raidbuilder.annotation.RaidGroupAuthorization; import com.mattrixwv.raidbuilder.entity.GameCalendarEvent; import com.mattrixwv.raidbuilder.entity.RaidGroupCalendarEvent; import com.mattrixwv.raidbuilder.entity.RaidInstanceCalendarEvent; import com.mattrixwv.raidbuilder.service.GameCalendarEventService; import com.mattrixwv.raidbuilder.service.RaidGroupCalendarEventService; import com.mattrixwv.raidbuilder.service.RaidInstanceService; import com.mattrixwv.raidbuilder.util.DatabaseTypeUtil.AccountPermissionType; import com.mattrixwv.raidbuilder.util.DatabaseTypeUtil.GamePermissionType; import com.mattrixwv.raidbuilder.util.DatabaseTypeUtil.RaidGroupPermissionType; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @Slf4j @RestController @RequestMapping("/calendar") @RequiredArgsConstructor public class CalendarController{ private final ObjectMapper mapper; private final GameCalendarEventService gceService; private final RaidGroupCalendarEventService rgceService; private final RaidInstanceService raidInstanceService; //! Game @GetMapping("/game/{gameId}") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) public List getGameCalendarEvents(@PathVariable("gameId") UUID gameId){ log.info("Getting calendar events for game {}", gameId); return gceService.getByGameId(gameId); } @PostMapping("/game/{gameId}") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) @GameAuthorization(permissions = {GamePermissionType.ADMIN}) public ObjectNode createGameCalendarEvent(@PathVariable("gameId") UUID gameId, @RequestBody GameCalendarEvent gameCalendarEvent){ log.info("Creating calendar event for game {}", gameId); gameCalendarEvent.setGameId(gameId); gceService.createGameCalendarEvent(gameCalendarEvent); ObjectNode returnNode = mapper.createObjectNode(); returnNode.put("status", "success"); return returnNode; } @PutMapping("/game/{gameId}") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) @GameAuthorization(permissions = {GamePermissionType.ADMIN}) public ObjectNode updateGameCalendarEvent(@PathVariable("gameId") UUID gameId, @RequestBody GameCalendarEvent gameCalendarEvent){ log.info("Updating calendar event for game {}", gameId); gameCalendarEvent.setGameId(gameId); gceService.updateGameCalendarEvent(gameCalendarEvent); ObjectNode returnNode = mapper.createObjectNode(); returnNode.put("status", "success"); return returnNode; } @DeleteMapping("/game/{gameId}/{calendarEventId}") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) @GameAuthorization(permissions = {GamePermissionType.ADMIN}) public ObjectNode deleteGameCalendarEvent(@PathVariable("gameId") UUID gameId, @PathVariable("calendarEventId") UUID calendarEventId){ log.info("Deleting calendar event for game {}", gameId); gceService.deleteGameCalendarEvent(calendarEventId); ObjectNode returnNode = mapper.createObjectNode(); returnNode.put("status", "success"); return returnNode; } //! Raid Group @GetMapping("/raidGroup/{raidGroupId}") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN, RaidGroupPermissionType.LEADER, RaidGroupPermissionType.RAIDER}) public List getGameCalendarEventsByRaidGroup(@PathVariable("raidGroupId") UUID raidGroupId){ log.info("Getting calendar events for raid group {}", raidGroupId); return rgceService.getByRaidGroupId(raidGroupId); } @PostMapping("/raidGroup/{raidGroupId}") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN, RaidGroupPermissionType.LEADER}) public ObjectNode createRaidGroupCalendarEvent(@PathVariable("raidGroupId") UUID raidGroupId, @RequestBody RaidGroupCalendarEvent raidGroupCalendarEvent){ log.info("Creating calendar event for raid group {}", raidGroupId); raidGroupCalendarEvent.setRaidGroupId(raidGroupId); rgceService.createRaidGroupCalendarEvent(raidGroupCalendarEvent); ObjectNode returnNode = mapper.createObjectNode(); returnNode.put("status", "success"); return returnNode; } @PutMapping("/raidGroup/{raidGroupId}") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN, RaidGroupPermissionType.LEADER}) public ObjectNode updateRaidGroupCalendarEvent(@PathVariable("raidGroupId") UUID raidGroupId, @RequestBody RaidGroupCalendarEvent raidGroupCalendarEvent){ log.info("Updating calendar event for raid group {}", raidGroupId); raidGroupCalendarEvent.setRaidGroupId(raidGroupId); rgceService.updateRaidGroupCalendarEvent(raidGroupCalendarEvent); ObjectNode returnNode = mapper.createObjectNode(); returnNode.put("status", "success"); return returnNode; } @DeleteMapping("/raidGroup/{raidGroupId}/{calendarEventId}") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN, RaidGroupPermissionType.LEADER}) public ObjectNode deleteRaidGroupCalendarEvent(@PathVariable("raidGroupId") UUID raidGroupId, @PathVariable("calendarEventId") UUID calendarEventId){ log.info("Deleting calendar event for raid group {}", raidGroupId); rgceService.deleteRaidGroupCalendarEvent(calendarEventId); ObjectNode returnNode = mapper.createObjectNode(); returnNode.put("status", "success"); return returnNode; } //! Raid Instance @GetMapping("/raidGroup/{raidGroupId}/raidInstance") @AccountAuthorization(permissions = {AccountPermissionType.ADMIN, AccountPermissionType.USER}) @RaidGroupAuthorization(permissions = {RaidGroupPermissionType.ADMIN, RaidGroupPermissionType.LEADER, RaidGroupPermissionType.RAIDER}) public List getGameCalendarEventsByRaidInstance(@PathVariable("raidGroupId") UUID raidGroupId){ log.info("Getting calendar events for raid group {}", raidGroupId); return raidInstanceService.findAllByRaidGroupId(raidGroupId).stream().map(instance -> new RaidInstanceCalendarEvent(instance)).toList(); } }