package net.halfbinary.scavengerhuntapi.controller import io.swagger.v3.oas.annotations.Operation import io.swagger.v3.oas.annotations.tags.Tag import jakarta.validation.Valid import net.halfbinary.scavengerhuntapi.model.HuntId import net.halfbinary.scavengerhuntapi.model.HunterId import net.halfbinary.scavengerhuntapi.model.converter.toDomain import net.halfbinary.scavengerhuntapi.model.converter.toResponse import net.halfbinary.scavengerhuntapi.model.request.HuntCreateRequest import net.halfbinary.scavengerhuntapi.model.request.HuntStatus import net.halfbinary.scavengerhuntapi.model.response.HuntResponse import net.halfbinary.scavengerhuntapi.service.HuntService import org.springframework.http.ResponseEntity import org.springframework.security.access.prepost.PreAuthorize 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.RequestParam import org.springframework.web.bind.annotation.RestController @RestController @RequestMapping("hunt") class HuntController(private val huntService: HuntService) { @GetMapping("/{id}") @Operation(summary = "Gets the specified hunt information") fun getHunt(@PathVariable("id") huntId: HuntId): ResponseEntity { return ResponseEntity.ok(huntService.getHunt(huntId).toResponse()) } @PreAuthorize("hasRole('ADMIN')") @Tag(name = "Admin") @GetMapping @Operation(summary = "Gets all Hunts") fun getAllHunts(@RequestParam status: HuntStatus?): ResponseEntity> { return ResponseEntity.ok(huntService.getAllHunts(status).map { it.toResponse() }) } @GetMapping("/unstarted") @Operation(summary = "Gets list of all upcoming Hunts") fun getUnstartedHunts(): ResponseEntity> { return ResponseEntity.ok(huntService.getAllHunts(HuntStatus.UNSTARTED).map { it.toResponse() }) } @PreAuthorize("hasRole('ADMIN')") @Tag(name = "Admin") @PostMapping @Operation(summary = "Creates a new Hunt") fun createHunt(@Valid @RequestBody huntRequest: HuntCreateRequest): ResponseEntity { return ResponseEntity.ok(huntService.createHunt(huntRequest.toDomain()).toResponse()) } @PreAuthorize("hasRole('ADMIN')") @Tag(name = "Admin") @GetMapping("/hunter/{hunterId}") @Operation(summary = "Lists all Hunts for specified Hunter") fun getHuntsByHunter(@PathVariable hunterId: HunterId): ResponseEntity> { return ResponseEntity.ok(huntService.getHuntsByHunter(hunterId).map { it.toResponse() }) } }