POST /entities/items/{item_id}/aliases/{language_code}
request payload
```
{
"aliases": [ "ALIAS_TEXT", ... ]
...
}
```
**Acceptance criteria:**
- The respective successful responses should present the list of aliases in a given language -- similar to the responses of GET /entities/items/{item_id}/aliases/{language_code}.
- If there was no aliases in the given language before the successful request the response should use 201 code, otherwise 200.- input alias is "appended" to the aliases list in a given language
**Error cases to consider**
<table>
<tr>
<th>
</th>
<th>HTTP response code</th>
<th>response payload</th>
</tr>
<tr>
<td>Invalid item ID </td>
<td>400</td>
<td>
`"code": "invalid-item-id"`
`"message": "Not a valid item ID: {item_id}"`
`"context": { "item": "{item-id}" }`
</td>
</tr>
<tr>
<td>Invalid language code </td>
<td>400</td>
<td>
`"code": "invalid-language-code"`
`"message": "Not a valid language code: {language_code}"`
</td>
</tr>
<tr>
<td>Alias is empty </td>
<td>400</td>
<td>
`"code": "alias-empty"`
`"message": "Alias must not be empty"`
</td>
</tr>
<tr>
<td>Alias list is empty </td>
<td>400</td>
<td>
`"code": "alias-list-empty"`
`"message": "Alias list must not be empty"`
</td>
</tr>
<tr>
<td>Alias too long </td>
<td>400</td>
<td>
`"code": "alias-too-long"`
`"message": "Alias must be no more than {limit} characters long"`
`"context": {`
` "value": "{alias}",`
` "character-limit": "{limit}"`
`}`
</td>
</tr>
<tr>
<td>Alias contains invalid characters</td>
<td>400</td>
<td>
`"code": "invalid-alias"`
`"message": "Not a valid alias: '{alias}'"`
`"context": { "alias": "{alias}" }`
</td>
</tr>
<tr>
<td>Alias duplicate </td>
<td>400</td>
<td>
`"code": "duplicate-alias"`
`"message": "Alias list contains a duplicate alias: '{alias}'"`
`"context": { "alias": "{alias}" }`
</td>
</tr>
<tr>
<td>Invalid edit tag</td>
<td>400</td>
<td>
`"code": "invalid-edit-tag"`
`"message": "Invalid MediaWiki tag: {tag}"`
</td>
</tr>
<tr>
<td>Comment too long</td>
<td>400</td>
<td>
`"code": "comment-too-long"`
`"message": "Comment must not be longer than {limit} characters"`
</td>
</tr>
<tr>
<td>Item does not exist </td>
<td>404</td>
<td>
`"code": "item-not-found"`
`"message": "Could not find an item with the ID: {item_id}"`
</td>
</tr>
<tr>
<td>Item redirect </td>
<td>409</td>
<td>
`"code": "redirected-item"`
`"message": "Item {item_id} has been merged into {other_id}"`
</td>
</tr>
</table>
**Notes**
- Edit summaries should be in the format: `/* wbsetaliases-add:{number-of-new-aliases}|{language-code} */ {new-aliases-comma-separated}, {user-comment}`
- client can provide additional edit metadata: mediawiki tags, edit summary text to append to the automated summary, and a bot edit flag, like in GET /entities/items/{item_id}/alias/{language_code}
- Handle HTTP conditional request headers as in PUT /entities/items/{item_id}/(labels or descriptions) /{language_code}
- Handle user authentication/authorization like in PUT /entities/items/{item_id}/(labels or descriptions)/{language_code}
**Task breakdown notes**:
[x] Add the new route to OAS.
[x] happy path (with empty edit summary)
- directly use the `AliasesDeserializer` for deserialization
- ETag and Last-Modified
- include difference between 200 OK and 201 CREATED cases
[x] Create use case validation/deserialization
[x] Create edit summary
[x] Respond 404/409 if item not found/redirect
[x] Authorization
[x] Use the usual middlewares and add the route handler to RouteHandlersTest
[x] Add spec tests.
- Mark as production ready.