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); } } }