# OrbitDesk OD-API-1

Редакция QA Orbit. Все данные синтетические. Это спецификация, не действующий удалённый API.

Учебный контракт OrbitDesk OD-API-1. Это спецификация для упражнений, не действующий удалённый сервис.
Объект: {id, title, description, authorId, teamId, state: "draft" | "published"}.
POST /api/lab/tasks: нужна сессия. Тело: {title: string, description?: string}; description по умолчанию "". Title: 1–80 кодовых точек Unicode; description: 0–2000. Сохранение не обрезает пробелы. Сервер назначает authorId и teamId из сессии, state=draft. Поля authorId, teamId, state в клиентском теле отклоняются с 422. Успех: 201 и объект; ошибка типа или длины: 422.
GET /api/lab/tasks/{id}: без сессии — 401. Неизвестный объект, чужая команда или чужой draft — 404 без содержимого задачи. Собственный draft или published своей команды — 200 и объект. Editor не получает право читать чужой draft.
POST /api/lab/tasks/{id}/publish: пустое тело. Порядок проверки: 401 (нет сессии) → 404 (нет объекта или чужая команда) → 403 (не автор и не editor) → 409 (уже published) → 422 (title.trim() пуст) → 200. Роль editor разрешает отдельное действие publish для своей команды. Trim соответствует JavaScript String.prototype.trim. Успех меняет только state.
Ошибки: JSON {error:{code,message}}; code — машинный идентификатор, текст message может меняться. Любой отказ не изменяет существующие объекты и не создаёт новую задачу. Дублирование создания, редактирование, архивирование и повтор при потерянном ответе не специфицированы.

## Акторы

Анна: user, команда A, автор t1. Борис: user, команда A, неавтор t1. Вера: editor, команда A. Глеб: editor, команда B.

## Результат анализа

| ID | Актор | Объект и состояние | Запрос | Ожидаемый код | Тело и эффект | Основание | Фактический результат |
| --- | --- | --- | --- | --- | --- | --- | --- |
| API-01 | | | | | | | Not run |


## Граница проверки error.code

Контракт задаёт JSON-структуру ошибки, но не перечисляет конкретные значения code. Проверяйте наличие машинного идентификатора и его строковый тип; точный enum требует отдельного источника. HTTP-статус и error.code — разные поля.

Акторы OD-API-1: Анна — user, автор t1, команда A; Борис — user, не автор t1, команда A; Вера — editor, не автор t1, команда A; Глеб — editor, команда B. Если не сказано иное, t1 — draft с title="Проверить экспорт" и description="". Для независимого кейса исходное состояние восстанавливается. t1 — псевдоним фактического ID. Актора API-кейса нельзя автоматически отождествлять с автором задачи из отдельной SQL-фикстуры: OD-DATA-1 служит только упражнениям по данным.
