diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/Rooms.kt b/src/main/kotlin/com/android/trisolarisserver/controller/Rooms.kt index da0d42c..8a6284c 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/Rooms.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/Rooms.kt @@ -176,8 +176,7 @@ class Rooms( val property = propertyRepo.findById(propertyId).orElseThrow { ResponseStatusException(HttpStatus.NOT_FOUND, "Property not found") } - val roomType = roomTypeRepo.findByIdAndPropertyId(request.roomTypeId, propertyId) - ?: throw ResponseStatusException(HttpStatus.NOT_FOUND, "Room type not found") + val roomType = resolveRoomType(propertyId, request) val room = Room( property = property, @@ -212,8 +211,7 @@ class Rooms( throw ResponseStatusException(HttpStatus.CONFLICT, "Room number already exists for property") } - val roomType = roomTypeRepo.findByIdAndPropertyId(request.roomTypeId, propertyId) - ?: throw ResponseStatusException(HttpStatus.NOT_FOUND, "Room type not found") + val roomType = resolveRoomType(propertyId, request) room.roomNumber = request.roomNumber room.floor = request.floor @@ -247,6 +245,20 @@ class Rooms( throw ResponseStatusException(HttpStatus.BAD_REQUEST, "Invalid date format") } } + + private fun resolveRoomType(propertyId: UUID, request: RoomUpsertRequest): com.android.trisolarisserver.models.room.RoomType { + request.roomTypeId?.let { id -> + roomTypeRepo.findByIdAndPropertyId(id, propertyId)?.let { return it } + } + val code = request.roomTypeCode?.trim() + if (!code.isNullOrBlank()) { + roomTypeRepo.findByPropertyIdAndCodeIgnoreCase(propertyId, code)?.let { return it } + } + if (request.roomTypeId == null && code.isNullOrBlank()) { + throw ResponseStatusException(HttpStatus.BAD_REQUEST, "roomTypeId or roomTypeCode required") + } + throw ResponseStatusException(HttpStatus.NOT_FOUND, "Room type not found") + } } private fun Room.toRoomResponse(): RoomResponse { diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/dto/RoomDtos.kt b/src/main/kotlin/com/android/trisolarisserver/controller/dto/RoomDtos.kt index a30424d..16f7995 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/dto/RoomDtos.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/dto/RoomDtos.kt @@ -52,7 +52,8 @@ enum class RoomBoardStatus { data class RoomUpsertRequest( val roomNumber: Int, val floor: Int?, - val roomTypeId: UUID, + val roomTypeId: UUID? = null, + val roomTypeCode: String? = null, val hasNfc: Boolean, val active: Boolean, val maintenance: Boolean, diff --git a/src/main/kotlin/com/android/trisolarisserver/repo/RoomTypeRepo.kt b/src/main/kotlin/com/android/trisolarisserver/repo/RoomTypeRepo.kt index 1e4429c..6729b73 100644 --- a/src/main/kotlin/com/android/trisolarisserver/repo/RoomTypeRepo.kt +++ b/src/main/kotlin/com/android/trisolarisserver/repo/RoomTypeRepo.kt @@ -7,6 +7,7 @@ import java.util.UUID interface RoomTypeRepo : JpaRepository { fun findByIdAndPropertyId(id: UUID, propertyId: UUID): RoomType? + fun findByPropertyIdAndCodeIgnoreCase(propertyId: UUID, code: String): RoomType? @EntityGraph(attributePaths = ["property"]) fun findByPropertyIdOrderByCode(propertyId: UUID): List fun existsByPropertyIdAndCode(propertyId: UUID, code: String): Boolean