using Application.Domain.Entities; using Infrastructure.Data; using Infrastructure.Extensions; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System; using System.ComponentModel.DataAnnotations; using System.Linq; namespace IoTCenter.Api.Controllers { [ApiVersion("1.0")] [Route("api/v{version:apiVersion}/[controller]/[action]")] [ApiController] public class ProductController : ControllerBase { private readonly IRepository _productRepo; private readonly IRepository _nodeRepo; private readonly IRepository _deviceRepo; public ProductController(IRepository productRepo, IRepository nodeRepo, IRepository deviceRepo) { this._productRepo = productRepo; this._nodeRepo = nodeRepo; this._deviceRepo = deviceRepo; } [HttpPost] public ActionResult GetProducts(string organNumber) { try { var model = this._productRepo.ReadOnlyTable() .OrderBy(o => o.DisplayOrder) .ThenBy(o => o.Name) .ToList() .Select(o => new { o.Id, o.Name, o.Number, o.Image, o.DisplayOrder, Count = _deviceRepo.ReadOnlyTable() .WhereIf(!string.IsNullOrWhiteSpace(organNumber), o => o.Node.OrganNodes.Any(o => o.Organ.Number == organNumber)) .Count(d => d.ProductId == o.Id) }); return Ok(model); } catch (Exception ex) { ex.PrintStack(); return Problem(ex.Message); } } [HttpPost] public ActionResult GetProduct([Required(ErrorMessage = nameof(RequiredAttribute))] string number, string organNumber) { try { var model = this._productRepo.ReadOnlyTable().Where(o => o.Number == number).FirstOrDefault(); model.Devices = this._deviceRepo.ReadOnlyTable() .Where(o => o.Product.Id == model.Id) .WhereIf(!string.IsNullOrWhiteSpace(organNumber), o => o.Node.OrganNodes.Any(o => o.Organ.Number == organNumber)) .Include(o => o.Node) .Include(o => o.Data) .ToList(); return Ok(model); } catch (Exception ex) { ex.PrintStack(); return Problem(ex.Message); } } } }