using Asp.Versioning; using MediatR; using Microsoft.AspNetCore.Mvc; using FacebookService.API.Application.Commands; using FacebookService.API.Application.Queries; using FacebookService.API.Application.Dtos; namespace FacebookService.API.Controllers; /// /// EN: Controller for Customer management. /// VI: Controller quản lý Customer. /// [ApiController] [ApiVersion("1.0")] [Route("api/v{version:apiVersion}/customers")] [Produces("application/json")] public class CustomersController : ControllerBase { private readonly IMediator _mediator; private readonly ILogger _logger; public CustomersController(IMediator mediator, ILogger logger) { _mediator = mediator ?? throw new ArgumentNullException(nameof(mediator)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } /// /// EN: Get a customer by ID. /// VI: Lấy customer theo ID. /// [HttpGet("{id:guid}")] [ProducesResponseType(typeof(CustomerDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task GetCustomer(Guid id) { var customer = await _mediator.Send(new GetCustomerByIdQuery(id)); if (customer is null) { return NotFound(new { success = false, error = new { code = "CUSTOMER_NOT_FOUND", message = $"Customer with ID {id} not found" } }); } return Ok(new { success = true, data = customer }); } /// /// EN: Get a customer by Facebook User ID. /// VI: Lấy customer theo Facebook User ID. /// [HttpGet("facebook/{facebookUserId}")] [ProducesResponseType(typeof(CustomerDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task GetCustomerByFacebookId(string facebookUserId) { var customer = await _mediator.Send(new GetCustomerByFacebookIdQuery(facebookUserId)); if (customer is null) { return NotFound(new { success = false, error = new { code = "CUSTOMER_NOT_FOUND", message = $"Customer with Facebook ID {facebookUserId} not found" } }); } return Ok(new { success = true, data = customer }); } /// /// EN: Create or update a customer. /// VI: Tạo hoặc cập nhật customer. /// [HttpPost] [ProducesResponseType(typeof(CreateCustomerCommandResult), StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task CreateCustomer([FromBody] CreateCustomerRequest request) { var command = new CreateCustomerCommand( request.FacebookUserId, request.Name, request.Email, request.Phone, request.ProfilePicUrl, request.Locale, request.Timezone); var result = await _mediator.Send(command); return CreatedAtAction( nameof(GetCustomer), new { id = result.Id }, new { success = true, data = result }); } /// /// EN: Update customer tags and custom fields. /// VI: Cập nhật tags và custom fields của customer. /// [HttpPatch("{id:guid}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task UpdateCustomer(Guid id, [FromBody] UpdateCustomerRequest request) { var command = new UpdateCustomerCommand(id, request.Tags, request.CustomFields); var result = await _mediator.Send(command); if (!result.Success) { return NotFound(new { success = false, error = new { code = "CUSTOMER_NOT_FOUND", message = $"Customer with ID {id} not found" } }); } return Ok(new { success = true, message = "Customer updated successfully" }); } } #region Request Models public record CreateCustomerRequest( string FacebookUserId, string? Name = null, string? Email = null, string? Phone = null, string? ProfilePicUrl = null, string? Locale = null, string? Timezone = null ); public record UpdateCustomerRequest( IEnumerable? Tags = null, Dictionary? CustomFields = null ); #endregion