diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 0430289..2f999d2 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -390,9 +390,6 @@ namespace Marco.Pms.DataAccess.Migrations .IsRequired() .HasColumnType("longtext"); - b.Property("ProjectId") - .HasColumnType("char(36)"); - b.Property("TenantId") .HasColumnType("char(36)"); @@ -548,6 +545,32 @@ namespace Marco.Pms.DataAccess.Migrations b.ToTable("ContactsPhones"); }); + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactProjectMappings"); + }); + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => { b.Property("Id") @@ -2678,6 +2701,33 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("Contact"); }); + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + }); + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => { b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") diff --git a/Marco.Pms.Model/Directory/Contact.cs b/Marco.Pms.Model/Directory/Contact.cs index 87d7698..ecdd622 100644 --- a/Marco.Pms.Model/Directory/Contact.cs +++ b/Marco.Pms.Model/Directory/Contact.cs @@ -9,7 +9,7 @@ namespace Marco.Pms.Model.Directory public class Contact : TenantRelation { public Guid Id { get; set; } - public Guid? ProjectId { get; set; } + //public Guid? ProjectId { get; set; } public string Name { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; public string Organization { get; set; } = string.Empty; diff --git a/Marco.Pms.Model/Directory/ContactProjectMapping.cs b/Marco.Pms.Model/Directory/ContactProjectMapping.cs new file mode 100644 index 0000000..0f965fe --- /dev/null +++ b/Marco.Pms.Model/Directory/ContactProjectMapping.cs @@ -0,0 +1,20 @@ +using System.ComponentModel.DataAnnotations.Schema; +using Marco.Pms.Model.Projects; +using Marco.Pms.Model.Utilities; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; + +namespace Marco.Pms.Model.Directory +{ + public class ContactProjectMapping : TenantRelation + { + public Guid Id { get; set; } + public Guid ProjectId { get; set; } + [ValidateNever] + [ForeignKey("ProjectId")] + public Project? Project { get; set; } + public Guid ContactId { get; set; } + [ValidateNever] + [ForeignKey("ContactId")] + public Contact? Contact { get; set; } + } +} \ No newline at end of file diff --git a/Marco.Pms.Model/Dtos/Directory/CreateContactDto.cs b/Marco.Pms.Model/Dtos/Directory/CreateContactDto.cs index cadd7e2..577f405 100644 --- a/Marco.Pms.Model/Dtos/Directory/CreateContactDto.cs +++ b/Marco.Pms.Model/Dtos/Directory/CreateContactDto.cs @@ -2,7 +2,7 @@ { public class CreateContactDto { - public Guid? ProjectId { get; set; } + public List? ProjectIds { get; set; } public string? Name { get; set; } public List? ContactPhones { get; set; } public List? ContactEmails { get; set; } diff --git a/Marco.Pms.Model/Dtos/Directory/UpdateContactDto.cs b/Marco.Pms.Model/Dtos/Directory/UpdateContactDto.cs index ccf5345..c648db0 100644 --- a/Marco.Pms.Model/Dtos/Directory/UpdateContactDto.cs +++ b/Marco.Pms.Model/Dtos/Directory/UpdateContactDto.cs @@ -3,7 +3,7 @@ public class UpdateContactDto { public Guid Id { get; set; } - public Guid? ProjectId { get; set; } + public List? ProjectIds { get; set; } public string? Name { get; set; } public List? ContactPhones { get; set; } public List? ContactEmails { get; set; } diff --git a/Marco.Pms.Model/Mapper/DirectoryMapper.cs b/Marco.Pms.Model/Mapper/DirectoryMapper.cs index 358bf54..68ea44e 100644 --- a/Marco.Pms.Model/Mapper/DirectoryMapper.cs +++ b/Marco.Pms.Model/Mapper/DirectoryMapper.cs @@ -13,7 +13,6 @@ namespace Marco.Pms.Model.Mapper return new Contact { - ProjectId = createContactDto.ProjectId, Name = createContactDto.Name ?? string.Empty, ContactCategoryId = createContactDto.ContactCategoryId, Description = createContactDto.Description ?? string.Empty, @@ -30,7 +29,6 @@ namespace Marco.Pms.Model.Mapper return new Contact { Id = updateContactDto.Id, - ProjectId = updateContactDto.ProjectId, Name = updateContactDto.Name ?? string.Empty, ContactCategoryId = updateContactDto.ContactCategoryId, CreatedAt = contact.CreatedAt, @@ -46,7 +44,6 @@ namespace Marco.Pms.Model.Mapper return new ContactVM { Id = contact.Id, - ProjectId = contact.ProjectId, Name = contact.Name, ContactCategory = contact.ContactCategory != null ? contact.ContactCategory.ToContactCategoryVMFromContactCategoryMaster() : null, Description = contact.Description ?? string.Empty, diff --git a/Marco.Pms.Model/ViewModels/Directory/ContactVM.cs b/Marco.Pms.Model/ViewModels/Directory/ContactVM.cs index b1abb3b..d394f73 100644 --- a/Marco.Pms.Model/ViewModels/Directory/ContactVM.cs +++ b/Marco.Pms.Model/ViewModels/Directory/ContactVM.cs @@ -5,11 +5,12 @@ namespace Marco.Pms.Model.ViewModels.Directory public class ContactVM { public Guid Id { get; set; } - public Guid? ProjectId { get; set; } + public List? ProjectIds { get; set; } public string? Name { get; set; } public List? ContactPhones { get; set; } public List? ContactEmails { get; set; } public ContactCategoryVM? ContactCategory { get; set; } + public List? BucketIds { get; set; } public string? Description { get; set; } public string? Organization { get; set; } public string? Address { get; set; } diff --git a/Marco.Pms.Services/Helpers/DirectoryHelper.cs b/Marco.Pms.Services/Helpers/DirectoryHelper.cs index 145b73e..4fd7bd6 100644 --- a/Marco.Pms.Services/Helpers/DirectoryHelper.cs +++ b/Marco.Pms.Services/Helpers/DirectoryHelper.cs @@ -88,6 +88,7 @@ namespace Marco.Pms.Services.Helpers + var phoneNo = await _context.ContactsPhones.Where(p => contactIds.Contains(p.ContactId)).ToListAsync(); var Emails = await _context.ContactsEmails.Where(E => contactIds.Contains(E.ContactId)).ToListAsync(); var Tags = await _context.ContactTagMappings.Where(t => contactIds.Contains(t.ContactId)).ToListAsync(); @@ -122,6 +123,8 @@ namespace Marco.Pms.Services.Helpers var phones = phoneNo.Where(p => p.ContactId == contact.Id).ToList(); var emails = Emails.Where(e => e.ContactId == contact.Id).ToList(); var tagMappingss = Tags.Where(t => t.ContactId == contact.Id).ToList(); + 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) @@ -134,7 +137,7 @@ namespace Marco.Pms.Services.Helpers } } - if (phones != null) + if (phones != null && phones.Count > 0) { foreach (var phone in phones) { @@ -144,7 +147,7 @@ namespace Marco.Pms.Services.Helpers } } - if (tagMappingss != null) + if (tagMappingss != null && tagMappingss.Count > 0) { foreach (var tagMapping in tagMappingss) { @@ -157,9 +160,17 @@ namespace Marco.Pms.Services.Helpers } } - - contactVM = contact.ToContactVMFromContact(); + + if (projectMapping != null && projectMapping.Count > 0) + { + contactVM.ProjectIds = projectMapping.Select(p => p.ProjectId).ToList(); + } + if (bucketMapping != null && bucketMapping.Count > 0) + { + contactVM.BucketIds = bucketMapping.Select(p => p.BucketId).ToList(); + } + contactVM.ContactEmails = contactEmailVms; contactVM.ContactPhones = contactPhoneVms; contactVM.Tags = conatctTagVms; @@ -311,6 +322,8 @@ namespace Marco.Pms.Services.Helpers var tags = await _context.ContactTagMasters.Where(t => t.TenantId == tenantId).ToListAsync(); var tagNames = tags.Select(t => t.Name.ToLower()).ToList(); var buckets = await _context.Buckets.Where(b => b.TenantId == tenantId).Select(b => b.Id).ToListAsync(); + var projects = await _context.Projects.Where(p => p.TenantId == tenantId).Select(p => p.Id).ToListAsync(); + if (createContact.ContactPhones != null) { @@ -333,6 +346,7 @@ namespace Marco.Pms.Services.Helpers _context.ContactsEmails.AddRange(emails); _logger.LogInfo("{count} email addresses are saved in contact with ID {ContactId} by employee with ID {LoggedEmployeeId}", emails.Count, contact.Id, LoggedInEmployee.Id); } + if (createContact.BucketIds != null) { foreach (var bucket in createContact.BucketIds) @@ -348,8 +362,29 @@ namespace Marco.Pms.Services.Helpers } } _context.ContactBucketMappings.AddRange(contactBucketMappings); - _logger.LogInfo("Contact with ID {ContactId} added to {count} number of buckets by employee with ID {LoggedEmployeeId}", contact.Id, LoggedInEmployee.Id); + _logger.LogInfo("Contact with ID {ContactId} added to {count} number of buckets by employee with ID {LoggedEmployeeId}", contact.Id, contactBucketMappings.Count, LoggedInEmployee.Id); } + + if (createContact.ProjectIds != null) + { + List projectMappings = new List(); + foreach (var projectId in createContact.ProjectIds) + { + if (projects.Contains(projectId)) + { + ContactProjectMapping projectMapping = new ContactProjectMapping + { + ProjectId = projectId, + ContactId = contact.Id, + TenantId = tenantId + }; + projectMappings.Add(projectMapping); + } + } + _context.ContactProjectMappings.AddRange(projectMappings); + _logger.LogInfo("Contact with ID {ContactId} added to {count} number of project by employee with ID {LoggedEmployeeId}", contact.Id, projectMappings.Count, LoggedInEmployee.Id); + } + if (createContact.Tags != null) { foreach (var tag in createContact.Tags) @@ -1652,7 +1687,8 @@ namespace Marco.Pms.Services.Helpers { var newtag = new ContactTagMaster { - Name = tag.Name + Name = tag.Name, + TenantId = tenantId }; _context.ContactTagMasters.Add(newtag); ContactTagMapping tagMapping = new ContactTagMapping @@ -1663,7 +1699,9 @@ namespace Marco.Pms.Services.Helpers contactTagMappings.Add(tagMapping); } } + _context.ContactTagMappings.AddRange(contactTagMappings); + _logger.LogInfo("{count} number of tags added to Contact with ID {ContactId} by employee with ID {LoggedEmployeeId}", contactTagMappings.Count, contact.Id, LoggedInEmployee.Id); } await _context.SaveChangesAsync(); @@ -1700,6 +1738,8 @@ namespace Marco.Pms.Services.Helpers contactVM.ContactPhones = phoneVMs; contactVM.ContactEmails = emailVMs; contactVM.Tags = tagVMs; + contactVM.ProjectIds = contactProjects.Select(cp => cp.ProjectId).ToList(); + contactVM.BucketIds = bucketMappings.Select(cb => cb.BucketId).ToList(); return ApiResponse.SuccessResponse(contactVM, "Contact Created Successfully", 200); } @@ -1740,6 +1780,9 @@ namespace Marco.Pms.Services.Helpers var tagIds = contactTags.Select(t => t.ContactTagId).Distinct().ToList(); + List contactProjects = await _context.ContactProjectMappings.AsNoTracking().Where(m => m.ContactId == contact.Id).ToListAsync(); + var projectIds = contactProjects.Select(t => t.ProjectId).Distinct().ToList(); + List tags = await _context.ContactTagMasters.Where(t => tagIds.Contains(t.Id)).ToListAsync(); List allTags = await _context.ContactTagMasters.Where(t => t.TenantId == tenantId).ToListAsync(); var tagNames = allTags.Select(t => t.Name.ToLower()).ToList(); @@ -1879,7 +1922,8 @@ namespace Marco.Pms.Services.Helpers ContactTagMaster contactTag = new ContactTagMaster { Name = tag.Name, - Description = "" + Description = "", + TenantId = tenantId }; _context.ContactTagMasters.Add(contactTag);