diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/RoomImages.kt b/src/main/kotlin/com/android/trisolarisserver/controller/RoomImages.kt index c2ec4f4..c62c74f 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/RoomImages.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/RoomImages.kt @@ -14,6 +14,7 @@ import org.springframework.http.HttpStatus import org.springframework.http.MediaType import org.springframework.http.ResponseEntity import org.springframework.security.core.annotation.AuthenticationPrincipal +import org.springframework.transaction.annotation.Transactional import org.springframework.web.bind.annotation.DeleteMapping import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PathVariable @@ -100,6 +101,7 @@ class RoomImages( @DeleteMapping("/{imageId}") @ResponseStatus(HttpStatus.NO_CONTENT) + @Transactional fun delete( @PathVariable propertyId: UUID, @PathVariable roomId: UUID, @@ -113,6 +115,7 @@ class RoomImages( val image = roomImageRepo.findByIdAndRoomIdAndPropertyId(imageId, roomId, propertyId) ?: throw ResponseStatusException(HttpStatus.NOT_FOUND, "Image not found") + val roomTypeCode = image.roomTypeCode try { Files.deleteIfExists(Paths.get(image.originalPath)) Files.deleteIfExists(Paths.get(image.thumbnailPath)) @@ -120,6 +123,34 @@ class RoomImages( throw ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Failed to delete image files") } roomImageRepo.delete(image) + + // Reorder room-specific sequence + val roomImages = roomImageRepo.findByRoomIdForReorder(roomId) + if (roomImages.isNotEmpty()) { + var order = 1 + for (img in roomImages) { + if (img.roomSortOrder != order) { + img.roomSortOrder = order + } + order++ + } + roomImageRepo.saveAll(roomImages) + } + + // Reorder room-type sequence + if (!roomTypeCode.isNullOrBlank()) { + val roomTypeImages = roomImageRepo.findByRoomTypeCodeForReorder(roomTypeCode) + if (roomTypeImages.isNotEmpty()) { + var order = 1 + for (img in roomTypeImages) { + if (img.roomTypeSortOrder != order) { + img.roomTypeSortOrder = order + } + order++ + } + roomImageRepo.saveAll(roomTypeImages) + } + } } @GetMapping("/{imageId}/file") diff --git a/src/main/kotlin/com/android/trisolarisserver/repo/RoomImageRepo.kt b/src/main/kotlin/com/android/trisolarisserver/repo/RoomImageRepo.kt index 6912525..2a99069 100644 --- a/src/main/kotlin/com/android/trisolarisserver/repo/RoomImageRepo.kt +++ b/src/main/kotlin/com/android/trisolarisserver/repo/RoomImageRepo.kt @@ -16,6 +16,26 @@ interface RoomImageRepo : JpaRepository { """ ) fun findByRoomIdOrdered(@Param("roomId") roomId: UUID): List + + @Query( + """ + select ri + from RoomImage ri + where ri.room.id = :roomId + order by ri.roomSortOrder asc, ri.createdAt desc + """ + ) + fun findByRoomIdForReorder(@Param("roomId") roomId: UUID): List + + @Query( + """ + select ri + from RoomImage ri + where ri.roomTypeCode = :roomTypeCode + order by ri.roomTypeSortOrder asc, ri.createdAt desc + """ + ) + fun findByRoomTypeCodeForReorder(@Param("roomTypeCode") roomTypeCode: String): List fun findByIdAndRoomIdAndPropertyId(id: UUID, roomId: UUID, propertyId: UUID): RoomImage? fun existsByRoomIdAndContentHash(roomId: UUID, contentHash: String): Boolean