-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHotelsService.kt
48 lines (40 loc) · 1.97 KB
/
HotelsService.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package pro.azhidkov.mariotte.core.hotels
import org.springframework.data.repository.findByIdOrNull
import org.springframework.stereotype.Service
import pro.azhidkov.mariotte.core.hotels.rooms.Room
import pro.azhidkov.mariotte.core.hotels.rooms.RoomType
import pro.azhidkov.mariotte.core.hotels.rooms.RoomsRepo
import pro.azhidkov.mariotte.core.hotels.root.Hotel
import pro.azhidkov.mariotte.core.hotels.root.HotelRef
import pro.azhidkov.mariotte.core.hotels.root.HotelsRepo
/**
* Контейнер сложного ресурса логического агрегата "Отели".
* * Слой в Функциональной архитектуре: императивная оболочка
* * Тип блока в структурном дизайне: эфферентные и афферентные
* * Слой в чистой архитектуре: н/а?, инфраструктура
* * Тип блока в Эргономичной архитектуре: контейнер сложного ресурса
*/
@Service
class HotelsService(
private val hotelsRepo: HotelsRepo,
private val roomsRepo: RoomsRepo
) {
fun addHotel(hotel: Hotel): Hotel =
hotelsRepo.save(hotel)
fun addRooms(rooms: Iterable<Room>) {
roomsRepo.saveAll(rooms)
}
/**
* Захватывает блокировку на номера определённого типа в отеле и возвращает
* общее количество имеющихся в отеле номеров этого типа.
* В случае отсутствия таких номеров возражает null.
*/
fun getCapacityForUpdate(hotel: HotelRef, roomType: RoomType): Int? {
roomsRepo.findTop1AndLockByHotelAndRoomType(hotel, roomType)
return roomsRepo.countRoomsByHotelAndRoomType(hotel, roomType)
.takeIf { it > 0 }
}
fun findById(hotelId: Int): Hotel? {
return hotelsRepo.findByIdOrNull(hotelId)
}
}