# API для разработчиков: параметры пользователя

Документ описывает операции для записи и чтения пользовательских параметров.

Текущие операции:

- `UpsertUserParam`
- `GetUserParam`
- `ListUserParams`

## 1. `UpsertUserParam`

### Запрос

```json
{
  "op": "UpsertUserParam",
  "requestId": "param-upsert-001",
  "payload": {
    "login": "alice",
    "param": "display_name",
    "time_ms": 1774700000123,
    "value": "Alice",
    "device_key": "BASE64_DEVICE_PUBLIC_KEY",
    "signature": "BASE64_SIGNATURE"
  }
}
```

### Успешный ответ

```json
{
  "op": "UpsertUserParam",
  "requestId": "param-upsert-001",
  "status": 200,
  "ok": true,
  "payload": {
  }
}
```

### Типовые ошибки

- `400 / BAD_FIELDS` — некорректные обязательные поля.
- `422 / BAD_SIGNATURE` — подпись не прошла проверку.
- `501 / DB_ERROR` — ошибка БД.

---

## 2. `GetUserParam`

### Запрос

```json
{
  "op": "GetUserParam",
  "requestId": "param-get-001",
  "payload": {
    "login": "alice",
    "param": "display_name"
  }
}
```

### Успешный ответ

```json
{
  "op": "GetUserParam",
  "requestId": "param-get-001",
  "status": 200,
  "ok": true,
  "payload": {
    "login": "alice",
    "param": "display_name",
    "time_ms": 1774700000123,
    "value": "Alice",
    "device_key": "BASE64_DEVICE_PUBLIC_KEY",
    "signature": "BASE64_SIGNATURE"
  }
}
```

Если параметр не найден, сервер возвращает `404` с пустым `payload`; отдельный прикладной код ошибки текущий handler не задаёт.

---

## 3. `ListUserParams`

### Запрос

```json
{
  "op": "ListUserParams",
  "requestId": "param-list-001",
  "payload": {
    "login": "alice"
  }
}
```

### Успешный ответ

```json
{
  "op": "ListUserParams",
  "requestId": "param-list-001",
  "status": 200,
  "ok": true,
  "payload": {
    "login": "alice",
    "params": [
      {
        "login": "alice",
        "param": "display_name",
        "time_ms": 1774700000123,
        "value": "Alice",
        "device_key": "BASE64_DEVICE_PUBLIC_KEY",
        "signature": "BASE64_SIGNATURE"
      }
    ]
  }
}
```

## Примечание

Имена JSON-полей `time_ms` и `device_key` сейчас соответствуют Java-модели ответа/запроса и должны передаваться именно в таком виде.
