Я занимаюсь разработкой веб-сервиса, в котором все промежуточные изменения должны быть версионированы (Черновики), и пользователи могут публиковать (Жить свои изменения). Чтобы пользователи продолжали ссылаться на более старые версии (например, по причинам совместимости), пользователи также должны иметь возможность получать более старые состояния.
Вот как выглядит мой текущий дизайн
+------------------+-------------------------------------------+--------------------------------------------------------------+-------------------------------------------------+
| action | request | response | state of resource |
+------------------+-------------------------------------------+--------------------------------------------------------------+-------------------------------------------------+
| create a post | post | status=201 id=123 and version=v1 | resource created with version v1 |
| update the post | put with id=123 and version=v1 | status=200 id=123 and version=v2 | new version of resource created with version=v2 |
| update the post | put with id=123 and version=v2 | status=200 id=123 and version=v3 | new version of resource created with version=v3 |
| update the post | put with id=123 version=v1 | status=409 and body indicating user is editing stale version | |
| publish the post | put with id=123 version=v2 action=publish | status=200 id=123 version=p1 (p indicating published) | new version created with version=p1 |
| get all versions | get list with id=123 status=all | status=200 and v1,v2,p1 in the body | no change |
+------------------+-------------------------------------------+--------------------------------------------------------------+-------------------------------------------------+
Соответствует ли вышесказанное архитектуре покоя?
Я беспокоюсь о следующих проблемах:
Здесь Put не идемпотентен, так как он создает новую версию каждый раз, когда мы делаем это.
Пользователь должен знать о действии = Опубликовать для публикации статьи. нормально ли иметь эту информацию в IMO на стороне клиента в теле ответа put / get / post, мы должны сообщить всем поддерживаемым операциям что-то вроде этого
{
"body": {...}
"actions": [
{
"type": "publish",
"uri": "/order/123/publish"
},
{
"type": "save",
"uri": "/order/123/save"
},
{
"type": "archive",
"uri": "/order/123/archive"
}
]
}
- Есть ли что-то, чего мне не хватает
Не слишком ли педантичен к деталям?