{"openapi":"3.0.0","info":{"title":"SmartDelivery API","version":"1.0.0","description":"API для системы управления заказами и графиками доставки. Документация всех доступных endpoints с описанием параметров, схем данных и примеров ответов.","contact":{"name":"SmartDelivery Support"}},"servers":[{"url":"http://localhost:3001","description":"Локальный сервер разработки"},{"url":"https://api.smartdelivery.com","description":"Продакшн сервер"}],"tags":[{"name":"Dashboard","description":"Endpoints для получения статистики и аналитики"},{"name":"Orders","description":"Работа с заказами"},{"name":"Settings","description":"Настройки зон доставки и мощности кухни"},{"name":"Sync","description":"Синхронизация данных с Posterix"},{"name":"Auth","description":"Аутентификация и авторизация"},{"name":"Admin","description":"Административные функции"},{"name":"System","description":"Системные endpoints"}],"components":{"securitySchemes":{"restaurantIdHeader":{"type":"apiKey","in":"header","name":"x-restaurant-id","description":"ID ресторана для аутентификации"}},"schemas":{"Order":{"type":"object","properties":{"id":{"type":"integer","description":"Внутренний ID заказа"},"posterixId":{"type":"string","description":"ID заказа в Posterix"},"shiftOrderNumber":{"type":"integer","nullable":true,"description":"Номер заказа в смене"},"status":{"type":"string","enum":["Новый","Принят","Готовится","Готов","Доставляется","Доставлен","Отменен"],"description":"Статус заказа"},"vendorStatus":{"type":"string","nullable":true,"description":"Расширенный статус из Posterix"},"totalAmount":{"type":"number","description":"Общая сумма заказа"},"deliveryPrice":{"type":"number","nullable":true,"description":"Стоимость доставки"},"deliveryZone":{"type":"string","nullable":true,"description":"Зона доставки"},"address":{"type":"string","nullable":true,"description":"Адрес доставки"},"clientName":{"type":"string","nullable":true,"description":"Имя клиента"},"clientPhone":{"type":"string","nullable":true,"description":"Телефон клиента"},"orderType":{"type":"string","nullable":true,"enum":["delivery","pickup","inside"],"description":"Тип заказа"},"createdAt":{"type":"string","format":"date-time","description":"Дата создания заказа"},"updatedAt":{"type":"string","format":"date-time","description":"Дата последнего обновления"},"deliveryTime":{"type":"string","format":"date-time","nullable":true,"description":"Время доставки"},"preorderTime":{"type":"string","format":"date-time","nullable":true,"description":"Время предзаказа"},"courierId":{"type":"integer","nullable":true,"description":"ID курьера"},"courierStatus":{"type":"integer","nullable":true,"description":"Статус курьера"},"courierTime":{"type":"string","format":"date-time","nullable":true,"description":"Время назначения курьера"}}},"OrderStats":{"type":"object","properties":{"deliveryZone":{"type":"string","nullable":true,"description":"Зона доставки"},"status":{"type":"string","description":"Статус заказа"},"_count":{"type":"object","properties":{"_all":{"type":"integer","description":"Количество заказов"}}},"_sum":{"type":"object","properties":{"totalAmount":{"type":"number","nullable":true,"description":"Сумма заказов"}}}}},"ZoneSettings":{"type":"object","properties":{"id":{"type":"integer"},"restaurantId":{"type":"integer","nullable":true},"companyId":{"type":"string"},"zoneName":{"type":"string","description":"Название зоны"},"color":{"type":"string","description":"Цвет зоны (hex)"},"deliveryTime":{"type":"integer","description":"Время доставки в минутах"},"courierTypes":{"type":"string","nullable":true},"usePriorityDeliveryBuffer":{"type":"boolean","description":"Использовать приоритетный буфер сборки для доставки вместо общего"},"priorityDeliveryBuffer":{"type":"integer","description":"Приоритетный буфер на доставку (мин), если переключатель включён"},"isActive":{"type":"boolean","description":"Включена ли зона. false — скрывается из виджетов доступности и аналитических сводок, но сохраняется в настройках"}}},"KitchenSettings":{"type":"object","properties":{"id":{"type":"integer"},"restaurantId":{"type":"integer","nullable":true},"companyId":{"type":"string"},"intervals":{"type":"array","items":{"$ref":"#/components/schemas/CapacityInterval"}}}},"CapacityInterval":{"type":"object","properties":{"id":{"type":"integer","nullable":true},"startTime":{"type":"string","description":"Время начала интервала (HH:mm)"},"endTime":{"type":"string","description":"Время окончания интервала (HH:mm)"},"kitchenLimit":{"type":"number","description":"Лимит мощности кухни (в валюте)"},"courierLimit":{"type":"number","description":"Лимит количества курьеров"}}},"DeliveryTimeStats":{"type":"object","properties":{"zone":{"type":"string","description":"Название зоны"},"avgTime":{"type":"number","description":"Среднее время доставки в минутах"},"eta":{"type":"string","description":"Ожидаемое время доставки (ETA)"}}},"Error":{"type":"object","properties":{"error":{"type":"string","description":"Сообщение об ошибке"},"message":{"type":"string","nullable":true,"description":"Дополнительное описание ошибки"}}}}},"security":[{"restaurantIdHeader":[]}],"paths":{"/api/dashboard/stats":{"get":{"summary":"Получить статистику заказов по зонам и статусам","tags":["Dashboard"],"security":[{"restaurantIdHeader":[]}],"parameters":[{"in":"query","name":"date","schema":{"type":"string","format":"date","example":"2026-01-30"},"description":"Дата для фильтрации заказов (формат YYYY-MM-DD). Если не указана, используется текущая дата."}],"responses":{"200":{"description":"Статистика по зонам и статусам","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrderStats"}}}},"headers":{"X-Restaurant-Currency":{"schema":{"type":"string"},"description":"Валюта ресторана (RUB, BYN, USD и т.д.)"}}},"400":{"description":"Отсутствует Restaurant ID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Внутренняя ошибка сервера","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/dashboard/delivery-times":{"get":{"summary":"Получить среднее время доставки по зонам","tags":["Dashboard"],"security":[{"restaurantIdHeader":[]}],"parameters":[{"in":"query","name":"date","schema":{"type":"string","format":"date","example":"2026-01-30"},"description":"Дата для расчета статистики (формат YYYY-MM-DD)"}],"responses":{"200":{"description":"Статистика времени доставки по зонам","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DeliveryTimeStats"}}}}},"400":{"description":"Отсутствует Restaurant ID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Внутренняя ошибка сервера"}}}},"/api/orders":{"get":{"summary":"Получить список заказов","tags":["Orders"],"security":[{"restaurantIdHeader":[]}],"parameters":[{"in":"query","name":"date","schema":{"type":"string","format":"date","example":"2026-01-30"},"description":"Дата для фильтрации заказов (формат YYYY-MM-DD). Фильтрует по времени доставки или создания."}],"responses":{"200":{"description":"Список заказов","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Order"}}}},"headers":{"X-Restaurant-Timezone":{"schema":{"type":"string"},"description":"Часовой пояс ресторана"},"X-Restaurant-Currency":{"schema":{"type":"string"},"description":"Валюта ресторана"}}},"500":{"description":"Внутренняя ошибка сервера"}}}},"/api/orders/{id}":{"get":{"summary":"Получить полную информацию об одном заказе","tags":["Orders"],"security":[{"restaurantIdHeader":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Информация о заказе"},"404":{"description":"Заказ не найден"}}}},"/api/orders/{id}/comment":{"put":{"summary":"Обновить внутренний комментарий кухни","tags":["Orders"],"security":[{"restaurantIdHeader":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kitchenComment":{"type":"string"}}}}}},"responses":{"200":{"description":"Комментарий обновлен"}}}},"/api/poster/products":{"get":{"summary":"Получить список всех продуктов из Poster","tags":["Poster"],"security":[{"restaurantIdHeader":[]}],"responses":{"200":{"description":"Список продуктов из Poster"}}}},"/api/stations/{id}/products":{"post":{"summary":"Массовая привязка продуктов к цеху","tags":["Stations"],"security":[{"restaurantIdHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["products"],"properties":{"products":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"price":{"type":"number"}}}}}}}}},"responses":{"200":{"description":"Продукты привязаны"}}}},"/api/settings/zones":{"get":{"summary":"Получить настройки зон доставки","tags":["Settings"],"security":[{"restaurantIdHeader":[]}],"parameters":[{"in":"query","name":"restaurantId","schema":{"type":"integer"},"description":"ID ресторана (опционально, для админа)"},{"in":"query","name":"companyId","schema":{"type":"string"},"description":"Posterix ID компании (legacy параметр)"}],"responses":{"200":{"description":"Список настроек зон","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ZoneSettings"}}}}},"400":{"description":"Отсутствует Restaurant ID"}}},"post":{"summary":"Сохранить настройки зоны доставки","tags":["Settings"],"security":[{"restaurantIdHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["zoneName","color","deliveryTime"],"properties":{"zoneName":{"type":"string","description":"Название зоны"},"color":{"type":"string","description":"Цвет зоны (hex формат)","example":"#FF5733"},"deliveryTime":{"type":"integer","description":"Время доставки в минутах","example":60},"isActive":{"type":"boolean","description":"Включена ли зона. false — зона скрывается из виджетов и аналитики, но остаётся в настройках","example":true},"restaurantId":{"type":"integer","description":"ID ресторана (опционально)"}}}}}},"responses":{"200":{"description":"Настройки зоны сохранены","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneSettings"}}}},"400":{"description":"Неверные параметры запроса"},"500":{"description":"Ошибка сохранения настроек"}}}},"/api/settings/kitchen":{"get":{"summary":"Получить настройки мощности кухни","tags":["Settings"],"security":[{"restaurantIdHeader":[]}],"parameters":[{"in":"query","name":"restaurantId","schema":{"type":"integer"},"description":"ID ресторана (опционально)"},{"in":"query","name":"companyId","schema":{"type":"string"},"description":"Posterix ID компании (legacy параметр)"},{"in":"query","name":"date","schema":{"type":"string"},"description":"Дата в формате YYYY-MM-DD для получения специфичных настроек"}],"responses":{"200":{"description":"Настройки мощности кухни","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KitchenSettings"}}}},"400":{"description":"Отсутствует Restaurant ID"}}},"post":{"summary":"Сохранить настройки мощности кухни","tags":["Settings"],"security":[{"restaurantIdHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["intervals"],"properties":{"intervals":{"type":"array","description":"Массив интервалов мощности","items":{"$ref":"#/components/schemas/CapacityInterval"}},"restaurantId":{"type":"integer","description":"ID ресторана (опционально)"},"date":{"type":"string","description":"Дата YYYY-MM-DD для специфичных настроек (null для дефолтных)"}}}}}},"responses":{"200":{"description":"Настройки сохранены","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KitchenSettings"}}}},"400":{"description":"Неверные параметры запроса"},"500":{"description":"Ошибка сохранения настроек"}}}},"/api/settings/delivery":{"get":{"summary":"Получить настройки буферов доставки","tags":["Settings"]},"post":{"summary":"Сохранить настройки буферов доставки","tags":["Settings"]}},"/api/settings/users":{"get":{"summary":"Получить список пользователей (ADMIN) для текущего ресторана","tags":["Settings","Users"],"security":[{"restaurantIdHeader":[]}],"responses":{"200":{"description":"Список пользователей"},"400":{"description":"Отсутствует Restaurant ID"}}},"post":{"summary":"Создать нового пользователя (ADMIN) для текущего ресторана","tags":["Settings","Users"],"security":[{"restaurantIdHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["username","password"],"properties":{"username":{"type":"string"},"password":{"type":"string"},"role":{"type":"string"},"permissions":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"Пользователь создан"},"400":{"description":"Ошибка валидации"}}}},"/api/settings/users/{id}":{"delete":{"summary":"Удалить пользователя","tags":["Settings","Users"],"security":[{"restaurantIdHeader":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Пользователь удален"}}},"put":{"summary":"Редактировать пользователя (имя, пароль, должность, настройки)","tags":["Settings","Users"],"security":[{"restaurantIdHeader":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string"},"password":{"type":"string"},"role":{"type":"string"},"permissions":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"Пользователь обновлен"}}}},"/api/admin/restaurants":{"get":{"summary":"Получить список всех ресторанов (только для SUPERADMIN)","tags":["Admin"],"responses":{"200":{"description":"Список ресторанов","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"posterixId":{"type":"string","nullable":true},"timezone":{"type":"string"},"currency":{"type":"string"},"isActive":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}}}}}}},"500":{"description":"Ошибка сервера"}}},"post":{"summary":"Создать новый ресторан и администратора (только для SUPERADMIN)","tags":["Admin"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Название ресторана (Филиала)"},"networkId":{"type":"integer","description":"ID сети, к которой принадлежит филиал"},"adminLogin":{"type":"string","description":"Логин администратора (опционально)"},"adminPassword":{"type":"string","description":"Пароль администратора (опционально)"}}}}}},"responses":{"200":{"description":"Ресторан создан"},"400":{"description":"Ошибка валидации (например, username уже существует)"},"500":{"description":"Ошибка создания ресторана"}}}},"/api/admin/restaurants/{id}":{"put":{"summary":"Обновить ресторан (Филиал)","tags":["Admin"],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"networkId":{"type":"integer"}}}}}},"responses":{"200":{"description":"Ресторан обновлен"},"500":{"description":"Ошибка сервера"}}}},"/api/admin/restaurants/{id}/toggle":{"post":{"summary":"Изменить статус активности ресторана (только для SUPERADMIN)","tags":["Admin"],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"},"description":"ID ресторана"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["isActive"],"properties":{"isActive":{"type":"boolean","description":"Новый статус активности"}}}}}},"responses":{"200":{"description":"Статус обновлен"},"500":{"description":"Ошибка обновления статуса"}}}},"/api/auth/login":{"post":{"summary":"Авторизация пользователя","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["username","password"],"properties":{"username":{"type":"string","description":"Имя пользователя"},"password":{"type":"string","description":"Пароль"}}}}}},"responses":{"200":{"description":"Успешная авторизация","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer"},"username":{"type":"string"},"role":{"type":"string","enum":["OWNER","SUPERADMIN","ADMIN"]},"restaurantId":{"type":"integer","nullable":true}}}}}},"400":{"description":"Не указаны username или password"},"401":{"description":"Неверные учетные данные"},"500":{"description":"Ошибка сервера"}}}},"/api/auth/me":{"get":{"summary":"Получить информацию о текущем пользователе","tags":["Auth"],"parameters":[{"in":"query","name":"username","required":true,"schema":{"type":"string"},"description":"Имя пользователя"}],"responses":{"200":{"description":"Информация о пользователе","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer"},"username":{"type":"string"},"role":{"type":"string"},"restaurantId":{"type":"integer","nullable":true},"restaurantName":{"type":"string","nullable":true}}}}}},"400":{"description":"Не указан username"},"404":{"description":"Пользователь не найден"}}}},"/api/health":{"get":{"summary":"Проверка работоспособности API","tags":["System"],"responses":{"200":{"description":"Сервер работает","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"timestamp":{"type":"string","format":"date-time"}}}}}}}}},"/api/sync/orders":{"post":{"summary":"Запустить ручную синхронизацию заказов из Posterix","tags":["Sync"],"security":[{"restaurantIdHeader":[]}],"responses":{"200":{"description":"Синхронизация успешно запущена","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"syncedCount":{"type":"integer","description":"Количество синхронизированных заказов"},"restaurantName":{"type":"string"}}}}}},"400":{"description":"Отсутствует Restaurant ID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Ошибка синхронизации","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/logs":{"get":{"summary":"Получить системные логи","tags":["Admin"],"security":[{"restaurantIdHeader":[]}],"parameters":[{"in":"query","name":"page","schema":{"type":"integer","default":1},"description":"Номер страницы"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Количество записей на страницу"},{"in":"query","name":"type","schema":{"type":"string"},"description":"Тип лога (API_REQ, API_RES, ERROR и т.д.)"},{"in":"query","name":"level","schema":{"type":"string"},"description":"Уровень лога (INFO, ERROR, WARN, DEBUG)"}],"responses":{"200":{"description":"Список логов"}}}},"/api/2gis-stats":{"get":{"summary":"Агрегированная статистика по запросам к 2GIS Routing API за период","description":"Возвращает количество запросов к 2GIS для текущего ресторана за указанный диапазон дат.\nИспользуется для контроля расхода квоты ключа 2GIS на странице \"Аудит и Трекинг\" → 2GIS.\n","tags":["Admin"],"security":[{"restaurantIdHeader":[]}],"parameters":[{"in":"query","name":"startDate","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"endDate","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"{ total, successful, failed, byTransport: { driving, bicycle, pedestrian },\n  byDay: [{ date, total, ok, fail }], avgDurationMs }\n"}}}},"/api/kitchen/orders":{"get":{"summary":"Получить заказы для кухонного терминала","tags":["Kitchen"],"parameters":[{"in":"query","name":"mode","schema":{"type":"string"},"description":"Режим терминала ('kitchen' или 'assembly'). По умолчанию 'kitchen'."}],"responses":{"200":{"description":"Список активных заказов кухни"}}}},"/api/kitchen/orders/history":{"get":{"summary":"Получить историю приготовленных заказов (за сегодня)","tags":["Kitchen"],"security":[{"restaurantIdHeader":[]}],"parameters":[{"in":"query","name":"mode","schema":{"type":"string"},"description":"Режим терминала ('kitchen' или 'assembly'). По умолчанию 'kitchen'."}],"responses":{"200":{"description":"Список приготовленных заказов"}}}},"/api/kitchen/orders/{id}/status":{"post":{"summary":"Изменить статус заказа кухни","tags":["Kitchen"],"security":[{"restaurantIdHeader":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"}},{"in":"body","name":"status","required":true,"schema":{"type":"object","properties":{"status":{"type":"string","enum":["PENDING","COOKING","COOKED","ASSEMBLED"]}}}}],"responses":{"200":{"description":"Статус обновлен"}}}},"/api/kitchen/orders/{id}/delivery-method":{"post":{"summary":"Обновить способ доставки","tags":["Kitchen"],"security":[{"restaurantIdHeader":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string"}}}}}},"responses":{"200":{"description":"Успешно"}}}},"/api/kitchen/orders/reorder":{"post":{"summary":"Изменить порядок заказов (Drag and Drop)","tags":["Kitchen"],"security":[{"restaurantIdHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["orderedIds"],"properties":{"orderedIds":{"type":"array","items":{"type":"integer"}}}}}}},"responses":{"200":{"description":"Порядок обновлен"}}}},"/api/kitchen/orders/{id}/comment":{"post":{"summary":"Добавить/обновить комментарий кухни","tags":["Kitchen"],"security":[{"restaurantIdHeader":[]}],"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["comment"],"properties":{"comment":{"type":"string"}}}}}},"responses":{"200":{"description":"Комментарий обновлен"}}}},"/api/stations":{"get":{"summary":"Получить список цехов (станций)","tags":["Stations"],"security":[{"restaurantIdHeader":[]}],"parameters":[{"in":"query","name":"restaurantId","schema":{"type":"integer"},"description":"ID ресторана (опционально)"}],"responses":{"200":{"description":"Список цехов"}}},"post":{"summary":"Создать новый цех","tags":["Stations"],"security":[{"restaurantIdHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"}}}}}},"responses":{"200":{"description":"Цех создан"}}}},"/api/stations/{id}":{"delete":{"summary":"Удалить цех","tags":["Stations"],"security":[{"restaurantIdHeader":[]}],"responses":{"200":{"description":"Цех удален"}}}},"/api/reports/detailed":{"get":{"summary":"Get detailed report similar to the Google Sheet","tags":["Reports"],"parameters":[{"in":"query","name":"startDate","schema":{"type":"string"},"description":"YYYY-MM-DD"},{"in":"query","name":"endDate","schema":{"type":"string"},"description":"YYYY-MM-DD"}],"responses":{"200":{"description":"Report data"}}}},"/api/products":{"get":{"summary":"Получить список локальных продуктов","tags":["Products"],"security":[{"restaurantIdHeader":[]}],"parameters":[{"in":"query","name":"restaurantId","schema":{"type":"integer"},"description":"ID ресторана (опционально)"}],"responses":{"200":{"description":"Список продуктов"}}},"post":{"summary":"Создать или обновить продукт","tags":["Products"],"security":[{"restaurantIdHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["posterId","name","price"],"properties":{"posterId":{"type":"string"},"name":{"type":"string"},"price":{"type":"number"},"isHidden":{"type":"boolean"},"category":{"type":"string"}}}}}},"responses":{"200":{"description":"Продукт сохранен"}}}},"/api/products/{id}":{"delete":{"summary":"Удалить продукт","tags":["Products"],"security":[{"restaurantIdHeader":[]}],"responses":{"200":{"description":"Продукт удален"}}}}}}