Controllers – Update

המוסכמה בעדכון רשומות היא שמעבירים את ה-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;
    }