# PUT /api/items/{id}/list_order

並び順の変更

指定した商品を、ショップの商品一覧の中で移動します。

移動先は `move_to` で指定できます。

- `first`：一覧の先頭
- `last`：一覧の末尾
- `before` / `after`：`neighbor_item_id` で指定した商品の直前 / 直後

1 回のリクエストで移動できるのは 1 商品です。
何番目かを表す数値での指定はできません。
`neighbor_item_id` には、移動する商品自身を指定できません。

並び替えで扱えるのは、表示順の先頭 10000 件までです。
それより後ろの商品を `neighbor_item_id` に指定すると、存在していても見つからない扱いになります。
10000 件を超える商品が並ぶショップでは、`last` を指定しても一覧の途中に移動する場合があります。

変更後の並び順は、`GET /api/items` に `order=list_order` を指定して確認することができます。

## 要求スコープ

- `items.read`
- `items.update`

## パラメータ

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | `string` | 必須 | 並び順を変更する商品の ID（1 以上の整数を文字列で表したもの） |

## リクエストボディ

`application/json`

`move_to` の値により分岐します。

- ItemListOrderEndInput の場合
  - `move_to` "first" | "last"（必須）: 移動先。`first`＝一覧の先頭、`last`＝一覧の末尾。基準の商品は指定しません。
- ItemListOrderRelativeInput の場合
  - `move_to` "before" | "after"（必須）: 移動先。`before`＝ `neighbor_item_id` の商品の直前、`after`＝ `neighbor_item_id` の商品の直後。
  - `neighbor_item_id` integer（必須 / ≥ 0 / ≤ 2147483647）: 移動先の基準にする商品の ID。並び順を変更する商品自身は指定できません。

## リクエスト例

```sh
curl -X PUT "https://apiv2.thebase.com/api/items/123/list_order" \
  -H "Authorization: Bearer <your-token>" \
  -H "Content-Type: application/json" \
  -d '{
  "move_to": "first"
}'
```

## レスポンス

| Status | Description |
| --- | --- |
| `204` | 変更成功。レスポンス body は持ちません。 |

## エラー

エラーは `application/problem+json` の Problem 形式で返します。認証・スコープ・予期しない内部エラーなど、すべてのエンドポイントに共通のエラーと構造・判別方法は [エラーレスポンス](/docs/errors.md) を参照してください。

このエンドポイントが返すその他のエラーは次のとおりです。

| Status | Type | Description |
| --- | --- | --- |
| `400` | `/errors/request/malformed-body` | リクエストボディをこのエンドポイントが要求する形式として解釈できない場合に返します。 |
| `400` | `/errors/request/invalid-params` | 1 つ以上のパスパラメータがエンドポイントのスキーマを満たさない場合に返します。 |
| `400` | `/errors/items/invalid-body` | リクエストボディがエンドポイントのスキーマを満たさない場合に返します。 |
| `404` | `/errors/items/not-found` | 指定した商品が存在しない、または呼び出し元から参照できない場合に返します。1 リクエストで複数の商品を指定するエンドポイント（並び順の変更など）では、そのいずれかが参照できない場合に返します。 |
| `413` | `/errors/request/body-too-large` | JSON リクエストボディが 1 MiB の上限を超える場合に返します。 |
| `415` | `/errors/request/unsupported-media-type` | JSON 形式のリクエストボディを要求するエンドポイントに、対応していない Content-Type が指定された、または Content-Type が指定されていない場合に返します。 |
| `422` | `/errors/items/invalid-list-order` | 並び順の変更の指定が成立しない場合に返します。移動する商品自身を移動先の基準（neighbor_item_id）に指定した場合が該当します。 |
| `422` | `/errors/items/write-rejected` | 商品の作成・編集・削除を業務ルールにより実行できない場合に返します (型整合性違反、種別不可変、ドメイン制約違反など)。細分化された Problem type に対応しない理由のときに返します。 |
| `502` | `/errors/internal/bad-gateway` | BASE API が処理を完了するために必要な内部処理で不整合が発生した場合に返します。 |
| `504` | `/errors/internal/gateway-timeout` | BASE API が処理を完了するために必要な内部処理が制限時間内に完了しなかった場合に返します。 |

