Removes response after uploading a photo, and preps things for get photo info endpoint

This commit is contained in:
2026-05-14 11:40:59 -05:00
parent 1dd904055c
commit 1585b6eb7d
4 changed files with 12 additions and 16 deletions

View File

@@ -70,7 +70,7 @@ class TeamController(private val teamService: TeamService, private val photoServ
@PathVariable teamId: TeamId, @PathVariable teamId: TeamId,
@PathVariable itemId: ItemId, @PathVariable itemId: ItemId,
@PathVariable photoId: PhotoId): ResponseEntity<PhotoResponse> { @PathVariable photoId: PhotoId): ResponseEntity<PhotoResponse> {
TODO("Get photo information for the specified Team, Hunt, Item, and Photo") TODO("Get photo information for the specified Team, Hunt, Item, and Photo. Join on the Hunter table to get the Hunter name. Also verify that the requesting user is either an admin or is on the same Hunt and Team as the Hunter who submitted the Photo")
} }
@GetMapping("/{teamId}/item/{itemId}/photo/{photoId}/file") @GetMapping("/{teamId}/item/{itemId}/photo/{photoId}/file")
@@ -88,8 +88,8 @@ class TeamController(private val teamService: TeamService, private val photoServ
@PathVariable teamId: TeamId, @PathVariable teamId: TeamId,
@PathVariable itemId: ItemId, @PathVariable itemId: ItemId,
authentication: Authentication, authentication: Authentication,
@RequestParam file: MultipartFile): ResponseEntity<PhotoResponse> { @RequestParam file: MultipartFile) {
return ResponseEntity.ok(photoService.submitPhoto(huntId, itemId, authentication.name, file).toResponse()) photoService.submitPhoto(huntId, itemId, authentication.name, file)
} }
} }

View File

@@ -1,5 +1,6 @@
package net.halfbinary.scavengerhuntapi.model.converter package net.halfbinary.scavengerhuntapi.model.converter
import net.halfbinary.scavengerhuntapi.model.domain.Hunter
import net.halfbinary.scavengerhuntapi.model.domain.Photo import net.halfbinary.scavengerhuntapi.model.domain.Photo
import net.halfbinary.scavengerhuntapi.model.record.PhotoRecord import net.halfbinary.scavengerhuntapi.model.record.PhotoRecord
import net.halfbinary.scavengerhuntapi.model.response.PhotoResponse import net.halfbinary.scavengerhuntapi.model.response.PhotoResponse
@@ -14,9 +15,9 @@ fun Photo.toRecord() = PhotoRecord(
statusChangeDateTime = statusChangeDateTime statusChangeDateTime = statusChangeDateTime
) )
fun Photo.toResponse() = PhotoResponse( fun Photo.toResponse(hunter: Hunter) = PhotoResponse(
id = id, id = id,
hunterId = hunterId, hunterName = hunter.name,
photoUploadDateTime = foundDateTime, photoUploadDateTime = foundDateTime,
photoStatus = status, photoStatus = status,
photoStatusChangeDateTime = statusChangeDateTime photoStatusChangeDateTime = statusChangeDateTime

View File

@@ -1,13 +1,12 @@
package net.halfbinary.scavengerhuntapi.model.response package net.halfbinary.scavengerhuntapi.model.response
import net.halfbinary.scavengerhuntapi.model.HunterId
import net.halfbinary.scavengerhuntapi.model.PhotoId import net.halfbinary.scavengerhuntapi.model.PhotoId
import net.halfbinary.scavengerhuntapi.model.PhotoStatus import net.halfbinary.scavengerhuntapi.model.PhotoStatus
import java.time.LocalDateTime import java.time.LocalDateTime
data class PhotoResponse( data class PhotoResponse(
val id: PhotoId, val id: PhotoId,
val hunterId: HunterId, val hunterName: String,
val photoUploadDateTime: LocalDateTime, val photoUploadDateTime: LocalDateTime,
val photoStatus: PhotoStatus, val photoStatus: PhotoStatus,
val photoStatusChangeDateTime: LocalDateTime, val photoStatusChangeDateTime: LocalDateTime,

View File

@@ -23,7 +23,7 @@ class PhotoService(
private val s3StorageService: S3StorageService, private val s3StorageService: S3StorageService,
private val fileProbeService: FileProbeService private val fileProbeService: FileProbeService
) { ) {
fun submitPhoto(huntId: HuntId, itemId: ItemId, email: String, file: MultipartFile): Photo { fun submitPhoto(huntId: HuntId, itemId: ItemId, email: String, file: MultipartFile) {
val originalBytes = file.bytes val originalBytes = file.bytes
val fileType = fileProbeService.getFileType(originalBytes) val fileType = fileProbeService.getFileType(originalBytes)
@@ -48,14 +48,10 @@ class PhotoService(
val savedRecord = photoRepository.save(photo.toRecord()) val savedRecord = photoRepository.save(photo.toRecord())
val baseName = savedRecord.id.toString() val baseName = savedRecord.id.toString()
s3StorageService.upload("$baseName${fileProbeService.getFileExtension(fileType)}", originalBytes, fileType)
s3StorageService.upload("${baseName}_large.jpg", originalAsJpeg, MediaType.IMAGE_JPEG_VALUE)
s3StorageService.upload("$baseName${fileProbeService.getFileExtension(fileType)}", originalBytes, fileType) s3StorageService.upload("${baseName}_medium.jpg", resize(originalBytes, 800), MediaType.IMAGE_JPEG_VALUE)
s3StorageService.upload("${baseName}_large.jpg", originalAsJpeg, MediaType.IMAGE_JPEG_VALUE) s3StorageService.upload("${baseName}_small.jpg", resize(originalBytes, 200), MediaType.IMAGE_JPEG_VALUE)
s3StorageService.upload("${baseName}_medium.jpg", resize(originalBytes, 800), MediaType.IMAGE_JPEG_VALUE)
s3StorageService.upload("${baseName}_small.jpg", resize(originalBytes, 200), MediaType.IMAGE_JPEG_VALUE)
return photo
} }
private fun toJpeg(bytes: ByteArray): ByteArray { private fun toJpeg(bytes: ByteArray): ByteArray {