openapi: 3.0.3
info:
  title: Portal API
  version: 1.0.0
  description: REST API корпоративного портала Portal
servers:
  - url: http://localhost/api/v1
    description: Локальная разработка

components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
  schemas:
    ApiResponse:
      type: object
      properties:
        success:
          type: boolean
        data: {}
        meta:
          type: object
        error:
          type: object

security:
  - bearerAuth: []

paths:
  /auth/login:
    post:
      summary: Вход (local или domain)
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [login, password]
              properties:
                login: { type: string }
                password: { type: string }
                authType: { type: string, enum: [local, domain] }
      responses:
        '200':
          description: JWT токен

  /auth/me:
    get:
      summary: Текущий пользователь

  /nodes:
    get:
      summary: Дерево узлов
    post:
      summary: Создать узел

  /nodes/{id}:
    get:
      summary: Узел по ID
    patch:
      summary: Обновить узел
    delete:
      summary: Удалить узел

  /nodes/{nodeId}/menu:
    get:
      summary: Эффективное меню узла для текущего пользователя

  /nodes/{nodeId}/menu/manage:
    get:
      summary: Данные редактора меню (edit на узле)

  /nodes/{nodeId}/menu/settings:
    put:
      summary: Настройки наследования меню

  /nodes/{nodeId}/menu/items:
    post:
      summary: Добавить пункт меню

  /nodes/{nodeId}/menu/items/{itemId}:
    patch:
      summary: Обновить пункт меню
    delete:
      summary: Удалить пункт меню

  /nodes/{nodeId}/menu/items/{itemId}/move:
    post:
      summary: Переместить пункт (up/down/into/out)

  /permissions:
    get:
      summary: Права на ресурс
      parameters:
        - name: resourceType
          in: query
          required: true
          schema: { type: string }
        - name: resourceId
          in: query
          required: true
          schema: { type: string, format: uuid }
    post:
      summary: Добавить права

  /permissions/check:
    get:
      summary: Эффективный уровень прав текущего пользователя

  /lists:
    get:
      summary: Списки узла
      parameters:
        - name: nodeId
          in: query
          schema: { type: string, format: uuid }
    post:
      summary: Создать список

  /lists/{listId}/items:
    get:
      summary: Элементы списка
    post:
      summary: Создать элемент

  /event-receivers:
    get:
      summary: Event Receivers
      parameters:
        - name: listId
          in: query
          schema: { type: string, format: uuid }
    post:
      summary: Создать Event Receiver

  /services:
    get:
      summary: Службы портала

  /services/{key}/run:
    post:
      summary: Запустить службу вручную (ad-sync и др.)

  /admin/users:
    get:
      summary: Список пользователей (admin)
    post:
      summary: Создать локального пользователя (admin)

  /admin/users/{id}:
    patch:
      summary: Обновить пользователя (admin)

  /admin/users/{id}/reset-password:
    post:
      summary: Сброс пароля локального пользователя

  /admin/settings/smtp:
    get:
      summary: Настройки SMTP
    put:
      summary: Сохранить SMTP

  /admin/settings/smtp-status:
    get:
      summary: Проверка SMTP

  /admin/settings/smtp/test:
    post:
      summary: Тестовое письмо

  /mail/send:
    post:
      summary: Отправить письмо (очередь или синхронно) (admin)

  /admin/settings/ldap:
    get:
      summary: Настройки подключения LDAP (admin)
    put:
      summary: Сохранить подключение LDAP (admin)

  /admin/settings/ldap-sync:
    get:
      summary: Настройки синхронизации AD (admin)
    put:
      summary: Сохранить настройки синхронизации AD (admin)

  /admin/settings/ldap-status:
    get:
      summary: Статус подключения LDAP (admin)

  /directory/search:
    get:
      summary: Поиск в AD/LDAP (admin)
      parameters:
        - name: q
          in: query
          required: true
          schema: { type: string }
