API для получения истории бронирований
Требования к API:
- Юзкейс принимает только:
bookingType,startDateиendDate; - Эндпоинт
/api/external/v1/bookingsдоступен без авторизации; - Максимальный диапазон данных — 92 дня;
- Лимит частоты: 1 запрос / на клиента / раз в 2 сек → при превышении будет ответ
429 Too Many Requests; - Поведение контроллера:
- Без
bookingType→ 400 Bad Request. - Без
timeRange→ вернуть данные за последние 92 дня, включая текущую дату (today – 91 days → today). - Если диапазон
timeRange> 92 дней → 400 Bad Request. - Если переданы другие фильтры → 400 Bad Request.
- Без
Примеры запроса:
- GET /api/external/v1/bookings?bookingType=DESK&startDate=1767339466&endDate=1770017866
Пример запроса только с обязательным параметром:
- GET /api/external/v1/bookings?bookingType=DESK&startDate=1767339466&endDate=1770017866
Query-параметры:
bookingType— обязательный (DESK, PARKING, MEETING_ROOM)startDate,endDate— обязательный (timestamp)
Примеры запросов от внешней системы:
GET /api/external/v1/users?limit=100&offset=0
GET /api/external/v1/users?email=user@example.com&limit=100&offset=0
GET /api/external/v1/users?externalId=8f1c-...
GET /api/external/v1/users?employeeId=A-7788...
Query-параметры (все опциональны):
- email //строка, почта пользователя, ищем точное совпадение
- externalId //строка, значение внешнего ID
- employeeId //строка, табельный номер пользователя
- limit //int (по умолчанию 100, максимум 100)
- offset //int (по умолчанию 0)
Ответ (Response)
{
"message": "OK",
"body": {
"items": [
{
"firstName": "Иван",
"lastName": "Петров",
"position": "Разработчик",
"department": "Отдел разработки", //поле org_department_id в табл Users
"manager": "Сидоров Алексей", //fullName руководителя
"workSchedule": {
"workingHours": "09:00–18:00",
"assignedOffice": "Москва", //офис в user_settings
"workMode": "hybrid" //поле в user_settings
},
"contacts": {
"email": "ivan.petrov@example.com",
"phone": "+7 (900) 123-45-67",
"messenger": "Telegram: @ivanpetrov"
},
"assignedDesks": [
{
"name": "12, HS Liana", //в name: название стола, офиса
"days": ["We", "Th"]
}
],
"status": {
"inOfficeNow": true, //если статус "в офисе" true, иначе false
"schedule": { //расписание за сегодня
"todayStatus": "in office", //remote | not working | null
"extraStatus": null, //опционально, только для remote | not working
"placeName": "Рабочее место A-12", //опционально, только для booking
"startTime": "2025-10-16T09:00:00Z", //опционально, только для booking
"endTime": "2025-10-16T18:00:00Z" //опционально, только для booking
}
}
}
],
"limit": 100,
"offset": 0,
"totalRecords": 1
}
}
Коды ответов
200 OK — даже если список пуст, просто направляем пустой массив items: [].