// package hotel_room_busy -- сущность состояния номера в отеле package hotel_room_busy import ( "fmt" "sync" "adt/pkg/alias" ) // HotelRoomBusy -- сущность состояния номера в отеле type HotelRoomBusy struct { Id_ alias.BusyId `json:"id"` // ID бронирования номера в отеле в формате "hotel_id.room_id.date" HotelId_ alias.HotelId `json:"hotel_id"` // ID отеля RoomId_ alias.RoomId `json:"room_id"` // ID номера в отеле Date_ alias.Date `json:"date"` // Дата бронирования IsBusy_ bool `json:"is_busy"` // Состояние бронирования block sync.RWMutex // Блокировка на признак занятости } // NewHotelRoomBusy -- возвращает новую сущность состояния номера в отеле func NewHotelRoomBusy( hotelId alias.HotelId, roomId alias.RoomId, date alias.Date, isBusy bool) (*HotelRoomBusy, error) { { // Предусловия if hotelId == "" { return nil, fmt.Errorf("hotel_room_busy.NewHotelRoomBusy(): hotelId is empty") } if roomId == "" { return nil, fmt.Errorf("hotel_room_busy.NewHotelRoomBusy(): roomId is empty") } if date == "" { return nil, fmt.Errorf("hotel_room_busy.NewHotelRoomBusy(): date is empty") } } sf := &HotelRoomBusy{ Id_: alias.BusyId(fmt.Sprintf("%s.%s.%s", hotelId, roomId, date)), HotelId_: hotelId, RoomId_: roomId, Date_: date, IsBusy_: isBusy, } return sf, nil } // Id -- возвращает ID бронирования func (sf *HotelRoomBusy) Id() alias.BusyId { return sf.Id_ } // SetBusy -- устанавливает состояние бронирования func (sf *HotelRoomBusy) SetBusy() { sf.block.Lock() defer sf.block.Unlock() sf.IsBusy_ = true } // RoomId -- возвращает ID номера func (sf *HotelRoomBusy) RoomId() alias.RoomId { return sf.RoomId_ } // IsBusy -- возвращает состояние бронирования func (sf *HotelRoomBusy) IsBusy() bool { sf.block.RLock() defer sf.block.RUnlock() return sf.IsBusy_ } // HotelId -- возвращает ID отеля func (sf *HotelRoomBusy) HotelId() alias.HotelId { return sf.HotelId_ } // Date -- возвращает дату бронирования func (sf *HotelRoomBusy) Date() alias.Date { return sf.Date_ }