- Обновленный элемент
- Экземпляр OneOf.NotFound на случай, если обновление ранее не существовало
- Экземпляр OneOf.Error на случай, если возникла какая-либо другая проблема (например, ошибка проверки)
Код: Выделить всё
routes.MapPut(RouteBases.ShoppingList, async (IEnumerable itemsToUpdate, MariaDbContext dbContext) =>
{
var storedItems = new List();
var failedItems = new List();
var state = (storedItems, failedItems);
foreach (var item in itemsToUpdate)
{
var updateResult = await UpdateItem(item, dbContext);
state = updateResult.Match(
storedItem => (storedItems.Append(storedItem), failedItems),
notFound => (storedItems, failedItems.Append(item)),
error => { return Results.BadRequest(); }
);
}
await dbContext.SaveChangesAsync();
return Results.Ok(new BulkUpdateResult(storedItems, failedItems));
});
P.S.: Пока писал это, я задавался вопросом, правильно ли вернуться раньше, только в случае ошибки. Это было бы немного несовместимо со случаем, когда элемент не может быть найден. Вероятно, мне следует либо изменить код, чтобы он не возвращался раньше, а также агрегировать ошибки, либо также возвращать раньше в случае результата обновления NotFound. Для этого API я мог бы также выбрать возврат агрегированных значений. Тем не менее, мне было бы очень интересно узнать, как решить эту проблему, поскольку в других подобных случаях может потребоваться досрочный возврат (например, «затратные» вызовы в цикле).
Подробнее здесь: https://stackoverflow.com/questions/791 ... tch-switch