using System.ComponentModel.DataAnnotations; using DoliMiddlewareApi.Dtos.command; using DoliMiddlewareApi.Dtos.query; using DoliMiddlewareApi.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace DoliMiddlewareApi.Controllers; [ApiController] [Route("api/[controller]")] [Authorize] public class ContactsController(ContactService contactService) : ControllerBase { [HttpGet] [ProducesResponseType(typeof(List), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status401Unauthorized)] public async Task>> GetContacts( [FromQuery] int limit = 50, [FromQuery][Range(1, int.MaxValue)] int page = 1, [FromQuery] string? thirdpartyIds = null) { var contacts = await contactService.GetContactsAsync(limit, page, thirdpartyIds); return Ok(contacts); } [HttpGet("{id:int}")] [ProducesResponseType(typeof(ContactDetailDto), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status401Unauthorized)] public async Task> GetContact([Range(1, int.MaxValue)] int id) { var contact = await contactService.GetContactAsync(id); return Ok(contact); } [HttpGet("email/{email}")] [ProducesResponseType(typeof(ContactDetailDto), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status401Unauthorized)] public async Task> GetContactByEmail(string email) { var contact = await contactService.GetContactByEmailAsync(email); return Ok(contact); } [HttpPost] [ProducesResponseType(typeof(int), StatusCodes.Status201Created)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status401Unauthorized)] public async Task> CreateContact([FromBody] CreateContactDto dto) { var contactId = await contactService.CreateContactAsync(dto); return CreatedAtAction(nameof(GetContact), new { id = contactId }, contactId); } [HttpPut("{id:int}")] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status401Unauthorized)] public async Task UpdateContact([Range(1, int.MaxValue)] int id, [FromBody] UpdateContactDto dto) { await contactService.UpdateContactAsync(id, dto); return NoContent(); } [HttpDelete("{id:int}")] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status401Unauthorized)] public async Task DeleteContact([Range(1, int.MaxValue)] int id) { await contactService.DeleteContactAsync(id); return NoContent(); } }