using Asp.Versioning;
using MediatR;
using Microsoft.AspNetCore.Mvc;
using MissionService.API.Application.Commands;
using MissionService.API.Application.Queries;
namespace MissionService.API.Controllers;
///
/// EN: Controller for Sample CRUD operations using CQRS pattern.
/// VI: Controller cho các thao tác CRUD Sample sử dụng pattern CQRS.
///
[ApiController]
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]")]
[Produces("application/json")]
public class SamplesController : ControllerBase
{
private readonly IMediator _mediator;
private readonly ILogger _logger;
public SamplesController(IMediator mediator, ILogger logger)
{
_mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
///
/// EN: Get all samples.
/// VI: Lấy tất cả samples.
///
/// EN: List of samples / VI: Danh sách samples
[HttpGet]
[ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)]
public async Task GetSamples()
{
var samples = await _mediator.Send(new GetSamplesQuery());
return Ok(new { success = true, data = samples });
}
///
/// EN: Get a sample by ID.
/// VI: Lấy một sample theo ID.
///
/// EN: Sample ID / VI: ID sample
/// EN: Sample details / VI: Chi tiết sample
[HttpGet("{id:guid}")]
[ProducesResponseType(typeof(SampleViewModel), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task GetSample(Guid id)
{
var sample = await _mediator.Send(new GetSampleQuery(id));
if (sample is null)
{
return NotFound(new
{
success = false,
error = new
{
code = "SAMPLE_NOT_FOUND",
message = $"Sample with ID {id} not found / Sample với ID {id} không tìm thấy"
}
});
}
return Ok(new { success = true, data = sample });
}
///
/// EN: Create a new sample.
/// VI: Tạo một sample mới.
///
/// EN: Create request / VI: Request tạo
/// EN: Created sample ID / VI: ID sample đã tạo
[HttpPost]
[ProducesResponseType(typeof(CreateSampleCommandResult), StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task CreateSample([FromBody] CreateSampleRequest request)
{
var command = new CreateSampleCommand(request.Name, request.Description);
var result = await _mediator.Send(command);
return CreatedAtAction(
nameof(GetSample),
new { id = result.Id },
new { success = true, data = result });
}
///
/// EN: Update an existing sample.
/// VI: Cập nhật một sample đã tồn tại.
///
/// EN: Sample ID / VI: ID sample
/// EN: Update request / VI: Request cập nhật
/// EN: Success status / VI: Trạng thái thành công
[HttpPut("{id:guid}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task UpdateSample(Guid id, [FromBody] UpdateSampleRequest request)
{
var command = new UpdateSampleCommand(id, request.Name, request.Description);
var result = await _mediator.Send(command);
if (!result)
{
return NotFound(new
{
success = false,
error = new
{
code = "SAMPLE_NOT_FOUND",
message = $"Sample with ID {id} not found / Sample với ID {id} không tìm thấy"
}
});
}
return Ok(new { success = true, message = "Sample updated successfully / Sample đã cập nhật thành công" });
}
///
/// EN: Delete a sample.
/// VI: Xóa một sample.
///
/// EN: Sample ID / VI: ID sample
/// EN: Success status / VI: Trạng thái thành công
[HttpDelete("{id:guid}")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task DeleteSample(Guid id)
{
var command = new DeleteSampleCommand(id);
var result = await _mediator.Send(command);
if (!result)
{
return NotFound(new
{
success = false,
error = new
{
code = "SAMPLE_NOT_FOUND",
message = $"Sample with ID {id} not found / Sample với ID {id} không tìm thấy"
}
});
}
return NoContent();
}
///
/// EN: Change sample status.
/// VI: Thay đổi trạng thái sample.
///
/// EN: Sample ID / VI: ID sample
/// EN: Status change request / VI: Request thay đổi trạng thái
/// EN: Success status / VI: Trạng thái thành công
[HttpPatch("{id:guid}/status")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task ChangeSampleStatus(Guid id, [FromBody] ChangeStatusRequest request)
{
var command = new ChangeSampleStatusCommand(id, request.Status);
var result = await _mediator.Send(command);
if (!result)
{
return BadRequest(new
{
success = false,
error = new
{
code = "STATUS_CHANGE_FAILED",
message = "Failed to change sample status / Thay đổi trạng thái sample thất bại"
}
});
}
return Ok(new { success = true, message = "Sample status changed successfully / Trạng thái sample đã thay đổi thành công" });
}
}
///
/// EN: Request model for creating a sample.
/// VI: Model request để tạo sample.
///
public record CreateSampleRequest(string Name, string? Description);
///
/// EN: Request model for updating a sample.
/// VI: Model request để cập nhật sample.
///
public record UpdateSampleRequest(string Name, string? Description);
///
/// EN: Request model for changing sample status.
/// VI: Model request để thay đổi trạng thái sample.
///
public record ChangeStatusRequest(string Status);