using AutoMapper; using DutchTreat.Data; using DutchTreat.Data.Entities; using DutchTreat.ViewModels; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DutchTreat.Controllers { [Route("api/[Controller]")] [Authorize(AuthenticationSchemes=JwtBearerDefaults.AuthenticationScheme)] public class OrdersController : Controller { private readonly IDutchRepository _repository; private readonly ILogger _logger; private readonly IMapper _mapper; private readonly UserManager _userManager; public OrdersController(IDutchRepository repository, ILogger logger, IMapper mapper, UserManager userManager) { _repository = repository; _logger = logger; _mapper = mapper; _userManager = userManager; } [HttpGet] public ActionResult> Get(bool includedItems = true) { try { var username = User.Identity.Name; var result = _repository.GetAllOrdersByUser(username, includedItems); return Ok(_mapper.Map>(result)); } catch (Exception ex) { _logger.LogError($"Failed to get orders: {ex}"); return BadRequest("Failed to get orders"); } } [HttpGet("{id:int}")] public ActionResult Get(int id) { try { var order = _repository.GetOrderById(User.Identity.Name, id); if (order != null) return Ok(_mapper.Map(order)); else return NotFound(); } catch (Exception ex) { _logger.LogError($"Failed to get orders: {ex}"); return BadRequest("Failed to get orders"); } } [HttpPost] public async Task Post([FromBody]OrderViewModel model) { try { if (ModelState.IsValid) { var newOrder = _mapper.Map(model); if (newOrder.OrderDate == DateTime.MinValue) { newOrder.OrderDate = DateTime.Now; } var currentUser = await _userManager.FindByNameAsync(User.Identity.Name); newOrder.User = currentUser; _repository.AddEntity(newOrder); if (_repository.SaveAll()) { return Created($"/api/order/{newOrder.Id}", _mapper.Map(newOrder)); } } else { return BadRequest(ModelState); } } catch (Exception ex) { _logger.LogError($"Failed to save a new order: {ex}"); } return BadRequest("Failed to save a new order"); } } }