using Marco.Pms.Model.Dtos.Directory; using Marco.Pms.Model.Utilities; using Marco.Pms.Services.Service.ServiceInterfaces; using MarcoBMS.Services.Helpers; using MarcoBMS.Services.Service; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace Marco.Pms.Services.Controllers { [ApiController] [Route("api/[controller]")] [Authorize] public class DirectoryController : ControllerBase { private readonly IDirectoryService _directoryService; private readonly UserHelper _userHelper; private readonly ILoggingService _logger; private readonly Guid tenantId; public DirectoryController(IDirectoryService directoryHelper, UserHelper userHelper, ILoggingService logger) { _directoryService = directoryHelper; _userHelper = userHelper; _logger = logger; tenantId = userHelper.GetTenantId(); } #region =================================================================== Contact APIs =================================================================== #region =================================================================== Contact Get APIs =================================================================== [HttpGet("list")] public async Task GetContactList([FromQuery] string? search, [FromQuery] string? filter, [FromQuery] Guid? projectId, [FromQuery] bool active = true, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 20) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _directoryService.GetListOfContactsAsync(search: search, filter: filter, projectId: projectId, active: active, pageSize: pageSize, pageNumber: pageNumber, tenantId, loggedInEmployee); return StatusCode(response.StatusCode, response); } [HttpGet] public async Task GetContactList([FromQuery] string? search, [FromQuery] List? bucketIds, [FromQuery] List? categoryIds, [FromQuery] Guid? projectId, [FromQuery] bool active = true) { ContactFilterDto filterDto = new ContactFilterDto { BucketIds = bucketIds, CategoryIds = categoryIds }; var response = await _directoryService.GetListOfContactsOld(search, active, filterDto, projectId); if (response.StatusCode == 200) { return Ok(response); } else if (response.StatusCode == 401) { return Unauthorized(response); } else { return BadRequest(response); } } [HttpGet("contact-bucket/{bucketId}")] public async Task GetContactsListByBucketId(Guid bucketId) { var response = await _directoryService.GetContactsListByBucketId(bucketId); if (response.StatusCode == 200) { return Ok(response); } else if (response.StatusCode == 401) { return Unauthorized(response); } else { return BadRequest(response); } } [HttpGet("profile/{id}")] public async Task GetContactProfile(Guid id) { var response = await _directoryService.GetContactProfile(id); if (response.StatusCode == 200) { return Ok(response); } else if (response.StatusCode == 404) { return NotFound(response); } else { return BadRequest(response); } } [HttpGet("organization")] public async Task GetOrganizationList() { var response = await _directoryService.GetOrganizationList(); return Ok(response); } #endregion [HttpPost] public async Task CreateContact([FromBody] CreateContactDto createContact) { if (!ModelState.IsValid) { var errors = ModelState.Values .SelectMany(v => v.Errors) .Select(e => e.ErrorMessage) .ToList(); _logger.LogWarning("User sent Invalid Date while marking attendance"); return BadRequest(ApiResponse.ErrorResponse("Invalid data", errors, 400)); } var response = await _directoryService.CreateContact(createContact); if (response.StatusCode == 200) { return Ok(response); } else { return BadRequest(response); } } [HttpPut("{id}")] public async Task UpdateContact(Guid id, [FromBody] UpdateContactDto updateContact) { var response = await _directoryService.UpdateContact(id, updateContact); if (response.StatusCode == 200) { return Ok(response); } else if (response.StatusCode == 404) { return NotFound(response); } else if (response.StatusCode == 401) { return Unauthorized(response); } else { return BadRequest(response); } } [HttpDelete("{id}")] public async Task DeleteContact(Guid id, [FromQuery] bool? active) { var response = await _directoryService.DeleteContact(id, active ?? false); if (response.StatusCode == 200) { return Ok(response); } else if (response.StatusCode == 404) { return NotFound(response); } else { return BadRequest(response); } } #endregion // -------------------------------- Contact Notes -------------------------------- [HttpGet("notes")] public async Task GetListOFAllNotes([FromQuery] Guid? projectId, [FromQuery] int? pageSize, [FromQuery] int pageNumber) { var response = await _directoryService.GetListOFAllNotes(projectId, pageSize ?? 25, pageNumber); return StatusCode(response.StatusCode, response); } [HttpPost("note")] public async Task CreateContactNote([FromBody] CreateContactNoteDto noteDto) { var response = await _directoryService.CreateContactNote(noteDto); if (response.StatusCode == 200) { return Ok(response); } else if (response.StatusCode == 404) { return NotFound(response); } else { return BadRequest(response); } } [HttpGet("notes/{ContactId}")] public async Task GetNoteListByContactId(Guid contactId, [FromQuery] bool active = true) { var response = await _directoryService.GetNoteListByContactId(contactId, active); if (response.StatusCode == 200) { return Ok(response); } else if (response.StatusCode == 404) { return NotFound(response); } else { return BadRequest(response); } } [HttpPut("note/{id}")] public async Task UpdateContactNote(Guid id, [FromBody] UpdateContactNoteDto noteDto) { var response = await _directoryService.UpdateContactNote(id, noteDto); if (response.StatusCode == 200) { return Ok(response); } else if (response.StatusCode == 404) { return NotFound(response); } else { return BadRequest(response); } } [HttpDelete("note/{id}")] public async Task DeleteContactNote(Guid id, [FromQuery] bool? active) { var response = await _directoryService.DeleteContactNote(id, active ?? false); return Ok(response); } // -------------------------------- Bucket -------------------------------- [HttpGet("buckets")] public async Task GetBucketList() { var response = await _directoryService.GetBucketList(); if (response.StatusCode == 200) { return Ok(response); } else if (response.StatusCode == 401) { return Unauthorized(response); } else { return BadRequest(response); } } [HttpPost("bucket")] public async Task CreateBucket(CreateBucketDto bucketDto) { if (!ModelState.IsValid) { var errors = ModelState.Values .SelectMany(v => v.Errors) .Select(e => e.ErrorMessage) .ToList(); _logger.LogWarning("User sent Invalid Date while marking attendance"); return BadRequest(ApiResponse.ErrorResponse("Invalid data", errors, 400)); } var response = await _directoryService.CreateBucket(bucketDto); if (response.StatusCode == 200) { return Ok(response); } else if (response.StatusCode == 409) { return Conflict(response); } else if (response.StatusCode == 401) { return Unauthorized(response); } else { return BadRequest(response); } } [HttpPut("bucket/{id}")] public async Task UpdateBucket(Guid id, [FromBody] UpdateBucketDto bucketDto) { var response = await _directoryService.UpdateBucket(id, bucketDto); if (response.StatusCode == 200) { return Ok(response); } else if (response.StatusCode == 404) { return NotFound(response); } else if (response.StatusCode == 401) { return Unauthorized(response); } else { return BadRequest(response); } } [HttpPost("assign-bucket/{bucketId}")] public async Task AssignBucket(Guid bucketId, [FromBody] List assignBuckets) { var response = await _directoryService.AssignBucket(bucketId, assignBuckets); if (response.StatusCode == 200) { return Ok(response); } else if (response.StatusCode == 404) { return NotFound(response); } else if (response.StatusCode == 401) { return Unauthorized(response); } else { return BadRequest(response); } } [HttpDelete("bucket/{id}")] public async Task DeleteBucket(Guid id) { var response = await _directoryService.DeleteBucket(id); if (response.StatusCode == 200) { return Ok(response); } else if (response.StatusCode == 404) { return NotFound(response); } else if (response.StatusCode == 401) { return Unauthorized(response); } else { return BadRequest(response); } } } }