using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using InventoryService.Api.Models;
using InventoryService.Api.Services;
using Microsoft.AspNetCore.Mvc;
namespace InventoryService.Api.Controllers
{
[Route("api/inventory")]
[ApiController]
public class InventoryController : ControllerBase
{
private readonly InventoryManager inventoryManager;
public InventoryController(InventoryManager inventoryManager)
{
this.inventoryManager = inventoryManager ?? throw new ArgumentNullException(nameof(inventoryManager));
}
///
/// Retrieves one or more inventory items.
///
///
/// Inventory items
///
/// The list of comma-separated SKUs.
[HttpGet]
public async Task> GetAsync([FromQuery] string skus)
{
if (!string.IsNullOrEmpty(skus))
{
var splitSkus = skus.Split(',', StringSplitOptions.RemoveEmptyEntries);
return await inventoryManager.GetInventoryBySkus(splitSkus);
}
else
{
return new List();
}
}
///
/// Retrieves an inventory item (susceptible to SQL injection).
///
///
/// Inventory item
///
/// The product SKU.
[HttpGet("bad/{sku}")]
public async Task GetSingleBadAsync(string sku)
{
var result = await inventoryManager.GetInventoryBySkuBad(sku);
if (result != null)
{
return Ok(result);
}
else
{
return NotFound();
}
}
///
/// Retrieves an inventory item.
///
///
/// Inventory item
///
/// The product SKU.
[HttpGet("{sku}")]
public async Task GetSingleAsync(string sku)
{
return (await inventoryManager.GetInventoryBySkus(new string[] { sku })).FirstOrDefault();
}
///
/// Increments an inventory item quantity by one.
///
///
/// The updated inventory item
///
/// The product SKU.
[HttpPost("{sku}/increment")]
public Task IncrementAsync(string sku)
{
return inventoryManager.IncrementInventory(sku);
}
///
/// Decrements an inventory item quantity by one.
///
///
/// The updated inventory item
///
/// The product SKU.
[HttpPost("{sku}/decrement")]
public Task DecrementAsync(string sku)
{
return inventoryManager.DecrementInventory(sku);
}
}
}