using Asp.Versioning; using Core.Inventory.Application.UseCases.Inventory.Input.Variant; using Core.Inventory.Application.UseCases.Inventory.Ports; using Lib.Architecture.BuildingBlocks; using Microsoft.AspNetCore.Mvc; namespace Core.Inventory.Service.API.Controllers { [ApiVersion("1.0")] [Route("api/v{api-version:apiVersion}/[controller]")] [Produces("application/json")] [ApiController] public class FurnitureVariantController( IComponentHandler getByIdHandler, IComponentHandler getAllHandler, IComponentHandler createHandler, IComponentHandler updateHandler, IComponentHandler changeStatusHandler, IComponentHandler getByIdsHandler, IFurnitureVariantPort port) : ControllerBase { private readonly IComponentHandler _getByIdHandler = getByIdHandler; private readonly IComponentHandler _getAllHandler = getAllHandler; private readonly IComponentHandler _createHandler = createHandler; private readonly IComponentHandler _updateHandler = updateHandler; private readonly IComponentHandler _changeStatusHandler = changeStatusHandler; private readonly IComponentHandler _getByIdsHandler = getByIdsHandler; private readonly IFurnitureVariantPort _port = port; [HttpGet("GetAllByModelId")] public async Task GetAllAsync([FromQuery] string modelId, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(modelId)) return BadRequest("Model ID is required"); var request = new GetAllFurnitureVariantsByModelIdRequest { ModelId = modelId }; await _getAllHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); return _port.ViewModel; } [HttpPost("GetById")] public async Task GetByIdAsync([FromBody] GetFurnitureVariantByIdRequest request, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(request?.MongoId)) return BadRequest("Furniture variant identifier is required"); await _getByIdHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); return _port.ViewModel; } [HttpPost("GetByIds")] public async Task GetByIdsAsync([FromBody] GetFurnitureVariantsByIdsRequest request, CancellationToken cancellationToken) { if (request?.Ids is null || request.Ids.Length == 0) return BadRequest("At least one furniture variant ID must be provided."); await _getByIdsHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); return _port.ViewModel; } [HttpPost("Create")] public async Task CreateAsync([FromBody] CreateFurnitureVariantRequest request, CancellationToken cancellationToken) { await _createHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); return _port.ViewModel; } [HttpPut("Update")] public async Task UpdateAsync([FromBody] UpdateFurnitureVariantRequest request, CancellationToken cancellationToken) { await _updateHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); return _port.ViewModel; } [HttpPatch("ChangeStatus")] public async Task ChangeStatusAsync([FromBody] ChangeFurnitureVariantStatusRequest request, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(request?.MongoId)) return BadRequest("Furniture variant identifier is required"); await _changeStatusHandler.ExecuteAsync(request, cancellationToken).ConfigureAwait(false); return _port.ViewModel; } } }