Bookings

Разработчикам / REST API для BOOCO Meteor (v 1.x) / Общее API

В данном разделе описываются методы для работы с бронированиями.

Endpoints

Endpoint
Метод
Описание
Queries
Body (JSON)
Значение поля data
Права (ресурс)
Версия
GET

Получить список бронирований из коллекции bookings. ВАЖНО: рекомендуется использовать /bookings/get

limitskip...query

BookingEvent[]

read:any (booking)

POST

Добавляет новую запись в коллекцию. ВАЖНО: при использовании этого эндпоинта не делаются проверки, поэтому рекомендуется использовать /bookings/add

BookingEvent

create:any (booking)

GET

Получить бронирование из коллекции bookings по :eventId. ВАЖНО: необходимо указать параметр key=_id

key

BookingEvent

read:any (booking)

PUT

Обновить бронирование из коллекции bookings по :eventId. Возвращается обновленный элемент. ВАЖНО: (1) необходимо указать параметр key=_id, (2) при использовании этого эндпоинт не делаются проверки, поэтому рекомендуется использовать /bookings/update

key

BookingEvent (указываются поля, которые нужно обновить)

BookingEvent

update:any (booking)

DELETE

Удаляет бронирование из коллекции bookings с _id :eventId. ВАЖНО: необходимо указать параметр key=_id

key

delete:any (booking)

GET

Возвращает список бронирований из коллекции bookings, удовлетворяющие параметрам. ВАЖНО: В возвращаемый список не включаются удаленные бронирования (флаг removed) и события, у которых responseType - Tentative или Unknown

startendvenuevenueslimitskipsort...query

BookingEvent[]

read:any (booking)

GET

Возвращает все сегодняшние бронирования (и будущие, если указан параметр :days). Аналогично /booking/get.

limitskipdaysvenuevenuessort...query

BookingEvent[]

read:any (booking)

GET

Возвращает текущее (если есть) и будущие бронирования. Аналогично /booking/get.

venuevenuesdayslimitskipsort...query

BookingEvent[]

read:any (booking)

POST

Добавляет новое бронирование с проверкой правил бронирования (для избежания конфликтов и т.д.). Если указан duration (в миллисекундах), то используется он, а не end. При этом end определяется так, если следующее мероприятие раньше, чем start + duration, то end = nextStart. Если бронирование не удалось, то возвращается status: error. а причина указывается в message. Если установлен userId и не указа organizer, то берется email этого пользователя в качестве organizer. Возвращается _id нового события.

BookingEvent & { duration?: number, userId?: string }

_id: string

create:own (booking)create:any (booking)(см. замечание*)

1.36.3 - изменено, время end не меняется при бронировании, если есть конфликт со следующим событием, если указан userId, то берется email этого пользователя

PUT

Обновить бронирование из коллекции bookings по :eventId. Имеется особенность в проверке прав - если email пользователя совпадает с полем organizer, то используется проверка update:own иначе update:any

BookingEvent (указываются поля, которые нужно обновить)

update:own (booking)update:any (booking)(см. замечание*)

GET

Завершает текущее бронирование :eventId

update:own (booking)update:any (booking)(см. замечание*)

GET

Для регистрации (чекина) в событии. Устанавливает поле confirmation у события на текущее время и дату.

reason

GET

Удаляет бронирование :eventId

delete:own (booking)delete:any (booking)(см. замечание*)

GET

DEPRECATED. Возвращает бронирование :eventId с добавлением статусов, что может сделать пользователь. Рекомендуется использовать эндпонит /mobile/user/bookings/:eventId

read:own (booking)read:any (booking)(см. замечание*)

GET

Проверка прав для всех или выбранных (venueType, venueIds) помещений на выполнение действия :action

venueTypevenueIds

{[_id: string]: boolean}

read:own (permission)

1.36.3

GET

Проверка прав текущего пользователя может ли он выполнить действие :action в помещении :venueId

{[_id: string]: boolean}

read:own (permission)

1.36.3

GET

Проверка прав пользователя :userId может ли он выполнить действие :action в помещении :venueId

{[_id: string]: boolean}

read:any (permission)

1.36.3

* При проверке прав, если email пользователя = полю organizer события, то используется право *:own, иначе — *:any.

Параметры запроса (Queries)

Queries
Описание
Тип значения
Обязательный
Значение по умолчанию

Определяет по какому полю делается запрос.

string
нет

name

Начальная дата для поиска в коллекции bookings. Если задана, то к запросу добавляется условие { "end": { "$gt": start } }

TDateISO
нет

Конечная дата для поиска в коллекции bookings. Если задана, то к запросу добавляется условие { "start": { "$lt": end } }

TDateISO
нет

venueId помещения (не путать с _id). Если задан, то к запросу добавляется поиск по venues { "venueId": venue }, а потом к запросу в коллекции bookings добавляется уловие { “venueId”: <найденное _id> }

string
нет

Запрос в формате MongoDB для поиска помещений в коллекции venues. Например, {"_id":"qTGJeBbxQwr3Ek8pQ"}. Потом к запросу в коллекции bookings будет добавлено условие { "venueId": { "$in": <массив найденных _id>} }

json
нет

Количество дней вперед для эндпоинтов /bookings/today и /bookings/upcoming

number
нет

1

Можно указать дополнительные поля, которые будут указаны в формате запроса Mongo

нет

Максимальное число записей в выдаче

number
нет

1000

Первая запись с которой начинать выдачу

number
нет

Запрос на сортировку в формате JSON. Должен соответсвовать правилам Mongo

json
нет

Тип помещения (meeting-room, desk, …)

string
нет

Список id помещений (через запятую)

string
нет

Произвольная строка, которая обычно описывает, кто инициировал действие

string
нет

Параметры URL

Name
Описание
Тип значения

_id события в коллекции bookings

string

Тип действия ACLActionsFunc (см. ACL)

string

_id помещения в коллекции venues

string

Используемые типы

type RepeatType = 'none' | 'daily' | 'weekly' | 'monthly' | 'workdays' | 'holidays' | 'weekdays';

type RepeatWeekdays = {
  mondays?: boolean,
  tuesdays?: boolean,
  wednesdays?: boolean,
  thursdays?: boolean,
  fridays?: boolean,
  saturdays?: boolean,
  sundays?: boolean
};

type RepeatItem = {
  type?: RepeatType,
  id?: string,
  start?: TDateISO,
  end?: TDateISO,
  weekdays?: RepeatWeekdays
}

type EventStatus = 'error' | 'Tentative' | 'Unknown' | 'Decline' | 'NoResponseReceived' | 'Accept';

type SyncItem = {
  calendarSystemId: string,
  calendarId?: string,
  uniqueId?: string,
  changeKey?: string,
  status?: EventStatus,
  reason?: string
};

type BookingEvent = {
  _id?: string,
  createdAt?: string,
  venueId?: string,
  venueType?: string,
  venueName?: string,
  location?: string,
  start?: TDateISO,
  end?: TDateISO,
  subject?: string,
  attendees?: Attendee[],
  organizer?: string,
  organizerEmail?: string,
  organizerName?: string,
  confirmation?: string,
  userId?: string,
  fixed?: boolean,
  sync?: SyncItem[],
  origin?: string,
  repeat?: RepeatItem,
  removed?: boolean,
  vcsLocation?: string | null
};