Skip to content

Коды ошибок (V2 и ACP)

В V2 и ACP все ошибки возвращаются в формате:

json
{
  "time": 1700000000,
  "error": {
    "code": "string",
    "http_status": 400,
    "message": "string",
    "details": { "key": "value" }
  }
}
  • code: машинночитаемый код.
  • http_status: HTTP-статус ответа.
  • message: краткое описание.
  • details: опциональные детали (валидатор, поля и т.п.).

Источники:

  • интерфейс ошибок API: interfaces/api/apierrors/app_error.go
  • маппинг доменных ошибок: interfaces/api/apierrors/mapper.go
  • доменные коды: domain/errors/errors.go

Стандартные ошибки API (apierrors)

codehttp_statusmessage
auth.unauthorized401Unauthorized
auth.invalid_headers400Invalid headers
auth.invalid_token401Invalid token
auth.client_version_too_low400Client version too low
auth.banned403User is banned
auth.forbidden403Forbidden
validation.invalid_input422Invalid input
validation.conflict409Conflict
system.internal500Internal server error
system.try_again_later503Please try again later
db.select_failed500Database select failed
db.update_failed500Database update failed

Дополнительно при маппинге доменных ошибок:

codehttp_statusmessageисточник
resource.not_found404Not foundmapper
system.unsupported501Unsupportedmapper

Доменные коды (domain/errors)

Эти коды маппятся в AppError через mapper.go:

domain codeНазначениеМаппинг в API
unauthorizedнет авторизацииauth.unauthorized (401)
forbiddenзапрет доступаauth.forbidden (403)
not_foundресурс не найденresource.not_found (404)
invalidневерные данныеvalidation.invalid_input (422)
conflictконфликт состоянияvalidation.conflict (409)
unsupportedне поддерживаетсяsystem.unsupported (501)
internalвнутренняя ошибкаsystem.internal (500)

Примечание: точный HTTP‑статус выбирается маппером, исходя из доменного кода.

Ошибки version vector (vclock)

Version vector используется для оптимистичного контроля конкурентности при обновлении data пользователя. Ошибки возвращаются в стандартном формате AppError c HTTP 409/422 и details содержащим обе версии:

json
{
  "time": 1700000000,
  "error": {
    "code": "version.dominated",
    "http_status": 409,
    "message": "Version dominated by server",
    "details": {
      "server_version_vector": { "server": 2, "xxx-device": 3000 },
      "client_version_vector": { "xxx-device": 2999 }
    }
  }
}
codehttp_statusописание
version.dominated409Сервер имеет более новую версию (incoming ≤ server)
version.concurrent409Конфликт: часть полей новее, часть старше
version.server_key_update409Клиент пытается инкрементить ключ «server»
version.unparsable422Невалидный формат version_vector

V1 маппинг: в V1 API те же ошибки возвращаются через числовые статус-коды:

V1 statuscodeописание
3001ErrorVersionDominatedСервер доминирует
3002ErrorVersionConcurrentКонкурентный конфликт
3003ErrorVersionInvalidНевалидный вектор
3004ErrorVersionServerKeyUpdateПопытка инкремента ключа «server»
3005ErrorVersionUnparsableНевозможно распарсить