// ***********************************************************************
//
// Core.Inventory
//
// ***********************************************************************
using Asp.Versioning;
using Core.Adapters.Lib;
using Core.Blueprint.Logging;
using Core.Blueprint.Mongo;
using Core.Inventory.Domain.Contexts.Inventory.Request;
using Core.Inventory.Provider.Contracts;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace Core.Inventory.DAL.API.Controllers
{
///
/// Handles all requests for furniture variant CRUD operations.
///
[ApiVersion(MimeTypes.ApplicationVersion)]
[Route("api/v{api-version:apiVersion}/[controller]")]
[Produces(MimeTypes.ApplicationJson)]
[Consumes(MimeTypes.ApplicationJson)]
[ApiController]
[AllowAnonymous]
public class FurnitureVariantController(IFurnitureVariantProvider service) : ControllerBase
{
///
/// Gets all furniture variant records.
///
[HttpGet]
[ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)]
public async Task GetAllAsync(CancellationToken cancellationToken)
{
var result = await service.GetAllAsync(cancellationToken);
return Ok(result);
}
///
/// Gets all furniture variant records by ModelId.
///
[HttpGet]
[Route("ByModel/{modelId}")]
[ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)]
public async Task GetAllVariantsByModelIdAsync(string modelId, CancellationToken cancellationToken)
{
var result = await service.GetAllByModelIdAsync(modelId, cancellationToken).ConfigureAwait(false);
if (result is null || !result.Any())
{
return NotFound($"No variants found for base model with ID '{modelId}'.");
}
return Ok(result);
}
///
/// Gets a furniture variant record by ID.
///
[HttpGet]
[Route("{mongoId}")]
[ProducesResponseType(typeof(FurnitureVariant), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task GetByIdAsync([FromRoute] string mongoId, CancellationToken cancellationToken)
{
var result = await service.GetByIdAsync(mongoId, cancellationToken);
return result is not null ? Ok(result) : NotFound("Entity not found");
}
///
/// Gets multiple furniture variants by their identifiers.
///
/// List of variant IDs.
/// Cancellation token.
/// A list of .
[HttpPost("ByIds")]
[ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task GetVariantsByIdsAsync([FromBody] string[] ids, CancellationToken cancellationToken)
{
if (ids is null || ids.Length == 0)
return BadRequest("At least one variant ID must be provided.");
var result = await service.GetAllByIdsAsync(ids, cancellationToken);
if (result is null || !result.Any())
return NoContent();
return Ok(result);
}
///
/// Creates a new furniture variant.
///
[HttpPost]
[ProducesResponseType(typeof(FurnitureVariant), StatusCodes.Status201Created)]
public async Task CreateAsync([FromBody] FurnitureVariantRequest request, CancellationToken cancellationToken)
{
var result = await service.CreateAsync(request, cancellationToken);
return Created("CreatedWithIdAsync", result);
}
///
/// Updates a furniture variant record by ID.
///
[HttpPut]
[Route("{id}")]
[ProducesResponseType(typeof(FurnitureVariant), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task UpdateAsync([FromRoute] string id, [FromBody] FurnitureVariant entity, CancellationToken cancellationToken)
{
if (id != entity.Id?.ToString())
return BadRequest("Furniture Variant ID mismatch");
var result = await service.UpdateAsync(id, entity, cancellationToken);
return Ok(result);
}
///
/// Changes the status of a furniture variant record.
///
[HttpPatch]
[Route("{mongoId}/{newStatus}/ChangeStatus")]
[ProducesResponseType(typeof(FurnitureVariant), StatusCodes.Status200OK)]
public async Task ChangeStatusAsync([FromRoute] string mongoId, [FromRoute] StatusEnum newStatus, CancellationToken cancellationToken)
{
var result = await service.ChangeStatusAsync(mongoId, newStatus, cancellationToken);
return Ok(result);
}
}
}