From 707b948e157dab7ff78d55979807b8763cd2ded0 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 22 May 2025 17:26:51 +0530 Subject: [PATCH] Implemented filtering functionality for Get Contact List API --- .../Dtos/Directory/ContactFilterDto.cs | 9 ++++ .../Controllers/DirectoryController.cs | 4 +- .../Controllers/MasterController.cs | 9 ++-- Marco.Pms.Services/Helpers/DirectoryHelper.cs | 41 +++++++++++++++++-- 4 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 Marco.Pms.Model/Dtos/Directory/ContactFilterDto.cs diff --git a/Marco.Pms.Model/Dtos/Directory/ContactFilterDto.cs b/Marco.Pms.Model/Dtos/Directory/ContactFilterDto.cs new file mode 100644 index 0000000..3f06388 --- /dev/null +++ b/Marco.Pms.Model/Dtos/Directory/ContactFilterDto.cs @@ -0,0 +1,9 @@ +namespace Marco.Pms.Model.Dtos.Directory +{ + public class ContactFilterDto + { + public List? BucketIds { get; set; } + public List? CategoryIds { get; set; } + + } +} diff --git a/Marco.Pms.Services/Controllers/DirectoryController.cs b/Marco.Pms.Services/Controllers/DirectoryController.cs index 843aacb..2e6db54 100644 --- a/Marco.Pms.Services/Controllers/DirectoryController.cs +++ b/Marco.Pms.Services/Controllers/DirectoryController.cs @@ -25,9 +25,9 @@ namespace Marco.Pms.Services.Controllers } [HttpGet] - public async Task GetContactList() + public async Task GetContactList([FromQuery] string? search, [FromBody] ContactFilterDto? filterDto, [FromQuery] bool active = true) { - var response = await _directoryHelper.GetListOfContacts(); + var response = await _directoryHelper.GetListOfContacts(search, active, filterDto); if (response.StatusCode == 200) diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 36a3ee8..dc4cd61 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -640,7 +640,8 @@ namespace Marco.Pms.Services.Controllers _logger.LogError("Work category master {WorkCategoryId} not found in database", workCategoryMasterDto.Id ?? Guid.Empty); return NotFound(ApiResponse.ErrorResponse("Work category master not found", "Work category master not found", 404)); } - + _logger.LogError("User sent empyt payload"); + return BadRequest(ApiResponse.ErrorResponse("User sent Empty payload", "User sent Empty payload", 400)); } [HttpDelete("work-category/{id}")] @@ -781,7 +782,7 @@ namespace Marco.Pms.Services.Controllers if (updateContactTagDto != null && updateContactTagDto.Id != id) { ContactTagMaster? contactTag = await _context.ContactTagMasters.AsNoTracking().FirstOrDefaultAsync(t => t.TenantId == tenantId && t.Id == updateContactTagDto.Id); - if(contactTag != null) + if (contactTag != null) { contactTag = updateContactTagDto.ToContactTagMasterFromUpdateContactTagDto(tenantId); _context.ContactTagMasters.Update(contactTag); @@ -796,8 +797,8 @@ namespace Marco.Pms.Services.Controllers ContactTagVM contactTagVm = contactTag.ToContactTagVMFromContactTagMaster(); - - + + _logger.LogInfo("Work category master {ConatctTagId} updated successfully from tenant {tenantId}", contactTagVm.Id, tenantId); return Ok(ApiResponse.SuccessResponse(contactTagVm, "Contact Tag master updated successfully", 200)); } diff --git a/Marco.Pms.Services/Helpers/DirectoryHelper.cs b/Marco.Pms.Services/Helpers/DirectoryHelper.cs index aacd71a..cebba78 100644 --- a/Marco.Pms.Services/Helpers/DirectoryHelper.cs +++ b/Marco.Pms.Services/Helpers/DirectoryHelper.cs @@ -29,17 +29,29 @@ namespace Marco.Pms.Services.Helpers - public async Task> GetListOfContacts() + public async Task> GetListOfContacts(string? search, bool active, ContactFilterDto? filterDto) { Guid tenantId = _userHelper.GetTenantId(); var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); List? employeeBuckets = await _context.EmployeeBucketMappings.Where(eb => eb.EmployeeId == LoggedInEmployee.Id).ToListAsync(); List bucketIds = employeeBuckets.Select(c => c.BucketId).ToList(); - + if (filterDto != null && filterDto.BucketIds != null && filterDto.BucketIds.Count > 0) + { + bucketIds = filterDto.BucketIds; + } List? contactBuckets = await _context.ContactBucketMappings.Where(cb => bucketIds.Contains(cb.BucketId)).ToListAsync(); List contactIds = contactBuckets.Select(cb => cb.ContactId).ToList(); - var contacts = await _context.Contacts.Include(c => c.ContactCategory).Where(c => contactIds.Contains(c.Id) && c.TenantId == tenantId && c.IsActive).ToListAsync(); + List contacts = new List(); + if (filterDto != null && filterDto.CategoryIds != null && filterDto.CategoryIds.Count > 0) + { + var categoryIds = filterDto.CategoryIds; + contacts = await _context.Contacts.Include(c => c.ContactCategory).Where(c => contactIds.Contains(c.Id) && categoryIds.Contains(c.ContactCategoryId ?? Guid.Empty) && c.TenantId == tenantId && c.IsActive == active).ToListAsync(); + } + else + { + contacts = await _context.Contacts.Include(c => c.ContactCategory).Where(c => contactIds.Contains(c.Id) && c.TenantId == tenantId && c.IsActive == active).ToListAsync(); + } var phoneNo = await _context.ContactsPhones.Where(p => contactIds.Contains(p.ContactId)).ToListAsync(); var Emails = await _context.ContactsEmails.Where(E => contactIds.Contains(E.ContactId)).ToListAsync(); @@ -50,6 +62,19 @@ namespace Marco.Pms.Services.Helpers var TagList = await _context.ContactTagMasters.Where(t => TagIds.Contains(t.Id)).ToListAsync(); + if (search != null && search != string.Empty) + { + List filteredContactIds = new List(); + phoneNo = phoneNo.Where(p => Compare(p.PhoneNumber, search)).ToList(); + filteredContactIds = phoneNo.Select(p => p.ContactId).ToList(); + + Emails = Emails.Where(e => Compare(e.EmailAddress, search)).ToList(); + filteredContactIds.AddRange(Emails.Select(e => e.ContactId).ToList()); + filteredContactIds = filteredContactIds.Distinct().ToList(); + + contacts = contacts.Where(c => Compare(c.Name, search) || Compare(c.Organization, search) || filteredContactIds.Contains(c.Id)).ToList(); + } + List list = new List(); foreach (var contact in contacts) @@ -66,6 +91,7 @@ namespace Marco.Pms.Services.Helpers var projectMapping = contactProjects.Where(p => p.ContactId == contact.Id).ToList(); var bucketMapping = contactBuckets.Where(b => b.ContactId == contact.Id).ToList(); + if (emails != null && emails.Count > 0) { foreach (var email in emails) @@ -1005,5 +1031,14 @@ namespace Marco.Pms.Services.Helpers return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); } + private bool Compare(string sentence, string search) + { + sentence = sentence.Trim().ToLower(); + search = search.Trim().ToLower(); + + // Check for exact substring + bool result = sentence.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0; + return result; + } } }