В моем проекте используется методология DDD.
В проекте есть сводная (юридическая) сделка. Этот агрегат имеет много вариантов использования.
Для этого агрегата мне нужно создать rest api.
Со стандартом: создавать и удалять без проблем.
1) CreateDealUseCase (имя, цена и многие другие параметры);
POST /rest/{version}/deals/
{
'name': 'deal123',
'price': 1234;
'etc': 'etc'
}
2) DeleteDealUseCase (id)
DELETE /rest/{version}/deals/{id}
Но что делать с остальными вариантами использования?
- HoldDealUseCase (id, причина);
- UnholdDealUseCase (ID);
- CompleteDealUseCase (id и многие другие параметры);
- CancelDealUseCase (id, amercement, reason);
- ChangePriceUseCase (id, newPrice, причина);
- ChangeCompletionDateUseCase (id, newDate, amercement, whyChanged);
- и т.д. (всего 20 случаев использования)...
Каковы решения?
1) Использовать глаголы:
PUT /rest/{version}/deals/{id}/hold
{
'reason': 'test'
}
Но! Глаголы не могут использоваться в URL-адресе (в теории REST).
2) Использовать завершенное состояние (которое будет после варианта использования):
PUT /rest/{version}/deals/{id}/holded
{
'reason': 'test'
}
Лично для меня это выглядит уродливо. Может быть, я ошибаюсь?
3) Используйте 1 запрос PUT для всех операций:
PUT /rest/{version}/deals/{id}
{
'action': 'HoldDeal',
'params': {'reason': 'test'}
}
PUT /rest/{version}/deals/{id}
{
'action': 'UnholdDeal',
'params': {}
}
Сложно обращаться в бэкэнд. Кроме того, трудно документировать. Поскольку 1 действие имеет много разных вариантов запросов, из которых уже зависит от конкретных ответов.
Все решения имеют существенные недостатки.
Я прочитал много статей о REST в Интернете. Везде только теория, как быть здесь с моей конкретной проблемой?