Я смотрю на сценарий, в котором у нас есть один родитель resource
(настоящее имя удалено, чтобы защитить невинных). Как дочерний объект, у нас есть список prices
, упорядоченный поffectiveDate.
Preexisting CRUD on api/resource
New POST on api/resource/{code}/someRelationship/{relId}/prices
Через несколько месяцев go мы создали конечную точку POST prices
. Требуется список price
объектов. В настоящее время это добавляет новый prices
к уже существующему списку в базе данных. Там нет обработки дубликатов, когда мы потребляем эти prices
, кроме последнего в выигрыше, если действующие даты совпадают. Мы не открывали идентификатор и просто хотели связать некоторый prices
с родительским resource
объектом, заданным someRelationship.
{
"prices": [
{
"price": 0,
"effectiveDateTime": "2020-02-14T18:30:33.710Z"
}
]
}
Жизнь продолжалась. Все стало сложнее. Мы столкнулись с ситуацией, когда что-то может измениться в системе источника истины, когда эффективная дата сдвигается. Если это произойдет, мы считаем, что неправильно оставим после себя остаток prices
в системе, с которой мы синхронизируемся. Новые будут сдвинуты, но будут старые prices
, которые больше не верны. Кажется, что намного проще просто взять то, что дает нам система, которую мы синхронизируем, потому что это источник истины для prices
.
Опции:
- Опираться на
POST api/resource/{code}/someRelationship/{relId}/prices
- Можем ли мы продолжать обрабатывать объект
prices
как список, принадлежащий родительскому resource
, а не как объект первого класса, restful? - Измените POST logi c, чтобы стереть старые
prices
и сохранить новые, которые были переданы вызывающей системой, так как она знает обо всех prices
и может сохранить их в одном вызове. , - Мы можем поспорить, должно ли оно называться PUT или POST. Для меня это звучит как POST.
- Мне сказали, что это нарушает все, что свято, с условными обозначениями отдыха.
- Пришлось бы обновить api docs для передачи этой функциональности, потому что мы нарушили условные обозначения отдыха.
- продвигает объект
prices
в первоклассный, спокойный объект API. - Но это означает, что нам придется создавать полные конечные точки CRUD, выставляющие идентификатор
- или использовать эффективноеDateTime в качестве идентификатора, который кажется странным
- Рабочий процесс для вызывающего абонента жонглировать полным CRUD
prices
GET /api/resource/{code}/someRelationship/{relId}/prices
- , чтобы получить список, чтобы узнать, какие изменения в pu sh более
price
в обе стороны с одинаковым значением и действующей датой? Ничего не делать. POST /api/resource/{code}/someRelationship/{relId}/prices
price
отсутствует на стороне для синхронизации? ПОСТ это один за другим? Или мы можем добавить его в список и POST список? Что делать, если у нас есть 100 цен? 100 вызовов API?
PUT /api/resource/{code}/someRelationship/{relId}/prices/{id}
price
неправильно со стороны для синхронизации? Поместите его один за другим.
DELETE /api/resource/{code}/someRelationship/{relId}/prices/{id}
price
в сторону, которая будет синхронизирована, но отсутствует в источнике истины? Удалите его по одному.
- сравнительные логи c могут стать более запутанными, если мы продолжим добавлять поля к значению
price
(больше, чем цена andffectiveDate) - Пример: умножить на 12 месяцев несколько родителей
resources
. 12 месяцев * 100 price
API-вызовы * 5 resources
= 6000 вызовов?