המוסכמה בעדכון רשומות היא שמעבירים את ה-id של הרשומה שרוצים לעדכן ב-URL ואת הרשומה עצמה המעודכנת ב-Body. האובייקט ב-id נמחק ובמקומו נכנס האובייקט החדש.
קובץ ProductsController.cs
[HttpPut("{id}")]
public async Task<ActionResult<Product>> UpdateProduct(int id, Product product) {
...
}
בדומה למה שהיה ב-delete 'ודם נראה שהאובייקט קיים. אם הוא קיים נפנה ל-repository ונעדכן את הרשומה.
[HttpPut("{id}")]
[ProducesResponseType(200, Type = typeof(Product))]
[ProducesResponseType(404)]
public async Task<ActionResult<Product>> UpdateProduct(int id, Product product) {
var result = await _productRepository.GetProductById(id);
if (result == null) {
return NotFound();
}
await _productRepository.UpdateProduct(id, product);
return Ok(result);
}
את הפונקציה נייצר ב-interface. היא תחזיר את המוצר המעודכן.
קובץ IProductsRepository.cs
public interface IProductsRepository
{
Task<List<Product>> GetAllProducts();
Task<Product?> GetProductById(int id);
Task DeleteProduct(int id);
Task<Product?> UpdateProduct(int id);
}
ונממש אותה. במימוש אנחנו יוצרים אובייקט עם הנתונים החדשים, ושמים אותו במקום זה שקיים בליסט, במציאות אנחנו נעבוד מול עדכון של ה-DB.
קובץ ProductsRepository.cs
public async Task<Product?> UpdateProduct(int id, Product product) {
await Task.Delay(500);
Product item = this._products.FirstOrDefault(x => x.id == id);
Product itemToUpdate = item with {
name = product.name,
description = product.description,
price = product.price,
amount = product.amount,
producer = product.producer
};
_products = _products.Select(x => {
if (x.id == id) {
return itemToUpdate;
}
else {
return x;
}
}).ToList();
return itemToUpdate;
}