В отношении заказа места, < /p> Badrequest, выпуск «Размещение сообщения заказа», < /p> [code]using System.Linq; using System.Security.Claims; using AutoMapper; using AutoMapper.QueryableExtensions; using Mango.Services.OrderAPI.Data; using Mango.Services.OrderAPI.Models; using Mango.Services.OrderAPI.Models.Dto; using Mango.Services.OrderAPI.Utility; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore;
// Force mapping to the correct DTO namespace using DtoOrderHeader = Mango.Services.OrderAPI.Models.Dto.OrderHeaderDto;
namespace Mango.Services.OrderAPI.Controllers { [Route("api/order")] [ApiController] public class OrderAPIController : ControllerBase { private readonly AppDbContext _db; private readonly IMapper _mapper;
// USER: create an order — returns created order + latest orders so UI can refresh instantly [Authorize] [HttpPost("CreateOrder")] public async Task CreateOrder([FromBody] CartDto cartDto) { var response = new ResponseDto(); try { if (cartDto?.CartHeader == null || cartDto.CartDetails == null || !cartDto.CartDetails.Any()) { response.IsSuccess = false; response.Message = "Cart is empty or invalid."; return response; }
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); if (string.IsNullOrWhiteSpace(userId)) { response.IsSuccess = false; response.Message = "User not identified."; return response; }
// Map & persist new order var orderHeaderDto = _mapper.Map(cartDto.CartHeader); orderHeaderDto.UserId = userId; // ensure owner is set orderHeaderDto.OrderTime = DateTime.UtcNow; // use UTC for consistency orderHeaderDto.Status = SD.Status_Pending; orderHeaderDto.OrderDetails = _mapper.Map(cartDto.CartDetails);
var orderEntity = _mapper.Map(orderHeaderDto); await _db.OrderHeaders.AddAsync(orderEntity); await _db.SaveChangesAsync();
// set generated id back on DTO orderHeaderDto.OrderHeaderId = orderEntity.OrderHeaderId;
// fetch latest orders for this user so the client can immediately refresh its table var latestOrders = await _db.OrderHeaders .AsNoTracking() .Where(o => o.UserId == userId) .Include(o => o.OrderDetails) .OrderByDescending(o => o.OrderHeaderId) .ProjectTo(_mapper.ConfigurationProvider) .ToListAsync();
// USER/ADMIN: get a single order (non-admin must own it) [Authorize] [HttpGet("GetOrder/{orderId:int}")] [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] public async Task GetOrder(int orderId) { NoCache(); var response = new ResponseDto(); try { var orderHeader = await _db.OrderHeaders .AsNoTracking() .Include(o => o.OrderDetails) .FirstOrDefaultAsync(o => o.OrderHeaderId == orderId);
if (orderHeader == null) { response.IsSuccess = false; response.Message = "Order not found."; return response; }
var isAdmin = User.IsInRole(SD.RoleAdmin); var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); if (!isAdmin && !string.Equals(orderHeader.UserId, userId, StringComparison.Ordinal)) { response.IsSuccess = false; response.Message = "Forbidden."; return response; }