From 00951ab92f9387a9c96fdfe998223b9b2c574b83 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 28 Apr 2025 17:47:24 +0530 Subject: [PATCH] Removed Possible null refreance warnings --- .../Initializer/DBInitializer.cs | 7 +- Marco.Pms.Model/Mapper/AttendanceMapper.cs | 7 +- Marco.Pms.Model/Mapper/ForumMapper.cs | 6 +- .../AttendanceVM/AttendanceLogVM.cs | 2 +- .../Controllers/AuthController.cs | 27 +-- .../Controllers/DashboardController.cs | 8 +- .../Controllers/EmployeeController.cs | 9 +- .../Controllers/FeatureController.cs | 14 +- .../Controllers/ForumController.cs | 166 ++++++++++-------- .../Controllers/ProjectController.cs | 87 ++++----- .../Controllers/TaskController.cs | 142 ++++++++------- Marco.Pms.Services/Helpers/EmployeeHelper.cs | 4 +- Marco.Pms.Services/Program.cs | 8 +- Marco.Pms.Services/Service/EmailSender.cs | 14 +- Marco.Pms.Services/Service/S3UploadService.cs | 8 +- 15 files changed, 274 insertions(+), 235 deletions(-) diff --git a/Marco.Pms.DataAccess/Initializer/DBInitializer.cs b/Marco.Pms.DataAccess/Initializer/DBInitializer.cs index 7b91925..9115703 100644 --- a/Marco.Pms.DataAccess/Initializer/DBInitializer.cs +++ b/Marco.Pms.DataAccess/Initializer/DBInitializer.cs @@ -34,7 +34,10 @@ namespace Marco.Pms.DataAccess.Initializer _db.Database.Migrate(); } } - catch (Exception ex) { } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + } // Create roes if not created @@ -64,7 +67,7 @@ namespace Marco.Pms.DataAccess.Initializer }, "User@123").GetAwaiter().GetResult(); - ApplicationUser user = _db.ApplicationUsers.FirstOrDefault(u => u.Email == "admin@marcobms.com"); + ApplicationUser user = _db.ApplicationUsers.FirstOrDefault(u => u.Email == "admin@marcobms.com") ?? new ApplicationUser(); _userManager.AddToRoleAsync(user, APP_ROLES.Admin.ToString()).GetAwaiter().GetResult(); Employee emp = new Employee() diff --git a/Marco.Pms.Model/Mapper/AttendanceMapper.cs b/Marco.Pms.Model/Mapper/AttendanceMapper.cs index b4de673..0130a43 100644 --- a/Marco.Pms.Model/Mapper/AttendanceMapper.cs +++ b/Marco.Pms.Model/Mapper/AttendanceMapper.cs @@ -1,4 +1,5 @@ using Marco.Pms.Model.AttendanceModule; +using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.AttendanceVM; namespace Marco.Pms.Model.Mapper @@ -11,15 +12,15 @@ namespace Marco.Pms.Model.Mapper { Id = attendanceLog.Id, Comment = attendanceLog.Comment, - Employee = attendanceLog.Employee.ToBasicEmployeeVMFromEmployee(), + Employee = attendanceLog.Employee != null ? attendanceLog.Employee.ToBasicEmployeeVMFromEmployee() : new BasicEmployeeVM(), ActivityTime = attendanceLog.ActivityTime, Activity = attendanceLog.Activity, Photo = attendanceLog.Photo, Latitude = attendanceLog.Latitude, Longitude = attendanceLog.Longitude, UpdatedOn = attendanceLog.UpdatedOn, - UpdatedByEmployee = attendanceLog.UpdatedByEmployee.ToBasicEmployeeVMFromEmployee(), - DocumentId = attendanceLog.Document.Id, + UpdatedByEmployee = attendanceLog.UpdatedByEmployee != null ? attendanceLog.UpdatedByEmployee.ToBasicEmployeeVMFromEmployee() : new BasicEmployeeVM(), + DocumentId = attendanceLog.Document != null ? attendanceLog.Document.Id : null, PreSignedUrl = preSignedUrl, ThumbPreSignedUrl = thumbPreSignedUrl, }; diff --git a/Marco.Pms.Model/Mapper/ForumMapper.cs b/Marco.Pms.Model/Mapper/ForumMapper.cs index 70913ef..a9f5d2c 100644 --- a/Marco.Pms.Model/Mapper/ForumMapper.cs +++ b/Marco.Pms.Model/Mapper/ForumMapper.cs @@ -126,9 +126,9 @@ namespace Marco.Pms.Model.Mapper CreatedAt = ticket.CreatedAt, LinkedProjectId = ticket.LinkedProjectId, LinkedActivityId = ticket.LinkedActivityId, - Status = ticket.TicketStatusMaster.ToTicketStatusVMFromTicketStatusMaster(), - Priority = ticket.Priority.ToTicketPriorityVMFromTicketPriorityMaster(), - Type = ticket.TicketTypeMaster.ToTicketTypeVMFromTicketTypeMaster(), + Status = ticket.TicketStatusMaster != null ? ticket.TicketStatusMaster.ToTicketStatusVMFromTicketStatusMaster() : new TicketStatusVM(), + Priority = ticket.Priority != null ? ticket.Priority.ToTicketPriorityVMFromTicketPriorityMaster() : new TicketPriorityVM(), + Type = ticket.TicketTypeMaster != null ? ticket.TicketTypeMaster.ToTicketTypeVMFromTicketTypeMaster() : new TicketTypeVM(), CreatedBy = employee.ToBasicEmployeeVMFromEmployee(), }; } diff --git a/Marco.Pms.Model/ViewModels/AttendanceVM/AttendanceLogVM.cs b/Marco.Pms.Model/ViewModels/AttendanceVM/AttendanceLogVM.cs index 0467ab5..fd2a9db 100644 --- a/Marco.Pms.Model/ViewModels/AttendanceVM/AttendanceLogVM.cs +++ b/Marco.Pms.Model/ViewModels/AttendanceVM/AttendanceLogVM.cs @@ -16,7 +16,7 @@ namespace Marco.Pms.Model.ViewModels.AttendanceVM public DateTime UpdatedOn { get; set; } public BasicEmployeeVM? UpdatedByEmployee { get; set; } - public Guid DocumentId { get; set; } + public Guid? DocumentId { get; set; } public string? PreSignedUrl { get; set; } public string? ThumbPreSignedUrl { get; set; } } diff --git a/Marco.Pms.Services/Controllers/AuthController.cs b/Marco.Pms.Services/Controllers/AuthController.cs index b1ea681..b50ed8f 100644 --- a/Marco.Pms.Services/Controllers/AuthController.cs +++ b/Marco.Pms.Services/Controllers/AuthController.cs @@ -1,4 +1,5 @@ -using Marco.Pms.DataAccess.Data; +using System.Net; +using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Authentication; using Marco.Pms.Model.Dtos; using Marco.Pms.Model.Dtos.Util; @@ -10,7 +11,6 @@ using MarcoBMS.Services.Service; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; -using System.Net; namespace MarcoBMS.Services.Controllers { @@ -43,7 +43,7 @@ namespace MarcoBMS.Services.Controllers { var user = await _context.ApplicationUsers.FirstOrDefaultAsync(u => u.Email == loginDto.Username || u.PhoneNumber == loginDto.Username); - if (user != null && await _userManager.CheckPasswordAsync(user, loginDto.Password)) + if (user != null && await _userManager.CheckPasswordAsync(user, loginDto.Password ?? string.Empty)) { if (!user.IsActive) { @@ -114,7 +114,7 @@ namespace MarcoBMS.Services.Controllers await _refreshTokenService.MarkRefreshTokenAsUsed(refreshToken); // Generate new JWT token and refresh token - var user = await _userManager.FindByIdAsync(refreshToken.UserId); + var user = await _userManager.FindByIdAsync(refreshToken.UserId ?? string.Empty); if (user == null) return BadRequest(ApiResponse.ErrorResponse("Invalid request.", "Invalid request.", 400)); @@ -150,7 +150,7 @@ namespace MarcoBMS.Services.Controllers [HttpPost("reset-password")] public async Task ResetPassword([FromBody] ResetPasswordDto model) { - var user = await _userManager.FindByEmailAsync(model.Email); + var user = await _userManager.FindByEmailAsync(model.Email ?? string.Empty); if (user == null) return BadRequest(ApiResponse.ErrorResponse("Invalid request.", "Invalid request.", 400)); @@ -182,7 +182,7 @@ namespace MarcoBMS.Services.Controllers } - var result = await _userManager.ResetPasswordAsync(user, token, model.NewPassword); + var result = await _userManager.ResetPasswordAsync(user, token, model.NewPassword ?? string.Empty); if (!result.Succeeded) { var errors = result.Errors.Select(e => e.Description).ToList(); @@ -192,25 +192,26 @@ namespace MarcoBMS.Services.Controllers try { Employee emp = await _employeeHelper.GetEmployeeByApplicationUserID(user.Id); - await _emailSender.SendResetPasswordSuccessEmail(user.Email, emp.FirstName + " " + emp.LastName); + await _emailSender.SendResetPasswordSuccessEmail(user.Email ?? string.Empty, emp.FirstName + " " + emp.LastName); } - catch (Exception ex) { - + catch (Exception ex) + { + return BadRequest(ApiResponse.ErrorResponse(ex.Message, ex.Message, 400)); } - + return Ok(ApiResponse.SuccessResponse(result.Succeeded, "Password reset successfully.", 200)); } - - + + [HttpPost("sendmail")] public async Task SendEmail([FromBody] EmailDot emailDot) { - var user = await _userManager.FindByEmailAsync(emailDot.ToEmail); + var user = await _userManager.FindByEmailAsync(emailDot.ToEmail ?? string.Empty); if (user == null) { return NotFound(ApiResponse.ErrorResponse("User not found.", "User not found.", 404)); diff --git a/Marco.Pms.Services/Controllers/DashboardController.cs b/Marco.Pms.Services/Controllers/DashboardController.cs index 042285f..446a36b 100644 --- a/Marco.Pms.Services/Controllers/DashboardController.cs +++ b/Marco.Pms.Services/Controllers/DashboardController.cs @@ -36,7 +36,7 @@ namespace Marco.Pms.Services.Controllers } var firstTask = await _context.TaskAllocations.Select(t => new { t.TenantId, t.AssignmentDate }).FirstOrDefaultAsync(t => t.TenantId == tenantId); if (FromDate == null) fromDate = DateTime.UtcNow.Date; - if (firstTask == null) firstTask = new{ TenantId = tenantId, AssignmentDate = DateTime.UtcNow}; + if (firstTask == null) firstTask = new { TenantId = tenantId, AssignmentDate = DateTime.UtcNow }; if (days >= 0) @@ -59,7 +59,7 @@ namespace Marco.Pms.Services.Controllers ProjectProgressionVM.ProjectId = projectId; ProjectProgressionVM.ProjectName = ""; var date = fromDate.AddDays(flagDays); - if (date >= firstTask.AssignmentDate.Date) + if (date >= (firstTask != null ? firstTask.AssignmentDate.Date : null)) { var todayTasks = tasks.Where(t => t.AssignmentDate.Date == date.Date).ToList(); double plannedTaks = 0; @@ -104,7 +104,7 @@ namespace Marco.Pms.Services.Controllers projectProgressionVM.ProjectId = projectId; projectProgressionVM.ProjectName = project.Name; var date = fromDate.AddDays(flagDays); - if (date >= firstTask.AssignmentDate.Date) + if (date >= (firstTask != null ? firstTask.AssignmentDate.Date : null)) { var todayTasks = tasks.Where(t => t.AssignmentDate.Date == date.Date).ToList(); double plannedTaks = 0; @@ -121,7 +121,7 @@ namespace Marco.Pms.Services.Controllers projectProgressionVMs.Add(projectProgressionVM); } - + flagDays -= 1; } } diff --git a/Marco.Pms.Services/Controllers/EmployeeController.cs b/Marco.Pms.Services/Controllers/EmployeeController.cs index d83a27e..978ec11 100644 --- a/Marco.Pms.Services/Controllers/EmployeeController.cs +++ b/Marco.Pms.Services/Controllers/EmployeeController.cs @@ -68,8 +68,8 @@ namespace MarcoBMS.Services.Controllers { Id = mapping.Id, EmployeeId = mapping.EmployeeId, - Name = mapping.Role.Role, - Description = mapping.Role.Description, + Name = mapping.Role != null ? mapping.Role.Role : null, + Description = mapping.Role != null ? mapping.Role.Description : null, IsEnabled = mapping.IsEnabled, RoleId = mapping.RoleId, }); @@ -107,7 +107,10 @@ namespace MarcoBMS.Services.Controllers if (existingItem == null) { - _context.EmployeeRoleMappings.Add(mapping); + if (role.IsEnabled == true) + { + _context.EmployeeRoleMappings.Add(mapping); + } } else if (role.IsEnabled == false) { diff --git a/Marco.Pms.Services/Controllers/FeatureController.cs b/Marco.Pms.Services/Controllers/FeatureController.cs index cfc3e29..755e8ed 100644 --- a/Marco.Pms.Services/Controllers/FeatureController.cs +++ b/Marco.Pms.Services/Controllers/FeatureController.cs @@ -11,7 +11,7 @@ namespace MarcoBMS.Services.Controllers { [Route("api/[controller]")] [ApiController] - // [Authorize] + // [Authorize] public class FeatureController : ControllerBase { private readonly ApplicationDbContext _context; @@ -27,12 +27,14 @@ namespace MarcoBMS.Services.Controllers private ICollection GetFeaturePermissionVMs(Feature model) { ICollection features = []; - foreach (FeaturePermission permission in model.FeaturePermissions) + if (model.FeaturePermissions != null) { - FeaturePermissionVM item = permission.ToFeaturePermissionVMFromFeaturePermission(); - features.Add(item); + foreach (FeaturePermission permission in model.FeaturePermissions) + { + FeaturePermissionVM item = permission.ToFeaturePermissionVMFromFeaturePermission(); + features.Add(item); + } } - return features; } @@ -48,7 +50,7 @@ namespace MarcoBMS.Services.Controllers Description = c.Description, FeaturePermissions = GetFeaturePermissionVMs(c), ModuleId = c.ModuleId, - ModuleName = c.Module.Name, + ModuleName = c.Module != null ? c.Module.Name : string.Empty, IsActive = c.IsActive }); return Ok(ApiResponse.SuccessResponse(rolesVM, "Success.", 200)); diff --git a/Marco.Pms.Services/Controllers/ForumController.cs b/Marco.Pms.Services/Controllers/ForumController.cs index 855260a..d587e03 100644 --- a/Marco.Pms.Services/Controllers/ForumController.cs +++ b/Marco.Pms.Services/Controllers/ForumController.cs @@ -47,8 +47,6 @@ namespace Marco.Pms.Services.Controllers return BadRequest(ApiResponse.ErrorResponse("Invalid data", errors, 400)); } int tenantId = _userHelper.GetTenantId(); - //if (tenantId == createTicketDto.TenantId) - //{ TicketForum ticketForum = createTicketDto.ToTicketForumFromCreateTicketDto(tenantId); _context.Tickets.Add(ticketForum); await _context.SaveChangesAsync(); @@ -108,7 +106,7 @@ namespace Marco.Pms.Services.Controllers Employee? employee = await _context.Employees.FirstOrDefaultAsync(e => e.Id == ticketForum.CreatedById); - ForumTicketVM ticketVM = ticket.ToForumTicketVMFromTicketForum(employee); + ForumTicketVM ticketVM = ticket != null && employee != null ? ticket.ToForumTicketVMFromTicketForum(employee) : new ForumTicketVM(); ticketVM.Tags = tagVMs; @@ -140,9 +138,6 @@ namespace Marco.Pms.Services.Controllers } _logger.LogInfo("Ticket created by Employee {EmployeeId} for project {ProjectId}", ticketForum.CreatedById, project.Id); return Ok(ApiResponse.SuccessResponse(ticketVM, "Ticket Created Successfully", 200)); - //} - //_logger.LogWarning("Employee {EmployeeId} tries to create ticket in different Tenant", createTicketDto.CreatedById); - // return Unauthorized(ApiResponse.ErrorResponse("Not Authorized", "Not Authorized", 401)); } [HttpPost("ticket/edit")] public async Task UpdateNewTicket([FromBody] UpdateTicketDto updateTicketDto) @@ -173,26 +168,30 @@ namespace Marco.Pms.Services.Controllers List existingAttachments = await _context.TicketAttachments.Where(a => a.TicketId == updateTicketDto.Id).ToListAsync(); var existingattachmentids = existingAttachments.Select(a => a.Id).ToList(); - var attachmentDtoids = updateTicketDto.Attachments.Select(a => a.Id).ToList(); - foreach (var attachmentDto in updateTicketDto.Attachments) + List attachmentDtoids = new List(); + if (updateTicketDto.Attachments != null) { - if (!existingattachmentids.Contains(attachmentDto.Id) && attachmentDto.TicketId != updateTicketDto.Id) + attachmentDtoids = updateTicketDto.Attachments.Select(a => a.Id).ToList(); + foreach (var attachmentDto in updateTicketDto.Attachments) { - var Image = attachmentDto; - if (string.IsNullOrEmpty(Image.Base64Data)) + if (!existingattachmentids.Contains(attachmentDto.Id) && attachmentDto.TicketId != updateTicketDto.Id) { - _logger.LogError("Base64 data is missing"); - return BadRequest(ApiResponse.ErrorResponse("Base64 data is missing", "Base64 data is missing", 400)); + var Image = attachmentDto; + if (string.IsNullOrEmpty(Image.Base64Data)) + { + _logger.LogError("Base64 data is missing"); + return BadRequest(ApiResponse.ErrorResponse("Base64 data is missing", "Base64 data is missing", 400)); + } + + var objectKey = await _s3Service.UploadFileAsync(Image.Base64Data, tenantId, "forum"); + + Document document = attachmentDto.ToDocumentFromUpdateAttachmentDto(objectKey, objectKey, updateTicketDto.CreatedAt, tenantId); + _context.Documents.Add(document); + await _context.SaveChangesAsync(); + + var attachment = attachmentDto.ToTicketAttachmentFromUpdateAttachmentDto(ticketForum.Id, document.Id); + attachments.Add(attachment); } - - var objectKey = await _s3Service.UploadFileAsync(Image.Base64Data, tenantId, "forum"); - - Document document = attachmentDto.ToDocumentFromUpdateAttachmentDto(objectKey, objectKey, updateTicketDto.CreatedAt, tenantId); - _context.Documents.Add(document); - await _context.SaveChangesAsync(); - - var attachment = attachmentDto.ToTicketAttachmentFromUpdateAttachmentDto(ticketForum.Id, document.Id); - attachments.Add(attachment); } } if (attachments.Count != 0) @@ -213,7 +212,7 @@ namespace Marco.Pms.Services.Controllers } List existingTicketTags = await _context.TicketTags.Where(t => t.TicketId == updateTicketDto.Id).ToListAsync(); - List? tagMasters = await _context.TicketTagMasters.Where(t => updateTicketDto.TagIds.Contains(t.Id)).ToListAsync(); + List? tagMasters = await _context.TicketTagMasters.Where(t => updateTicketDto.TagIds != null ? updateTicketDto.TagIds.Contains(t.Id) : false).ToListAsync(); var existingTicketTagIds = existingTicketTags.Select(t => t.TagId).ToList(); foreach (var ticketTag in tagMasters) @@ -237,7 +236,7 @@ namespace Marco.Pms.Services.Controllers { _context.TicketTags.AddRange(ticketTags); } - var deletedTicketTags = existingTicketTags.Where(t => !updateTicketDto.TagIds.Contains(t.TagId)).ToList(); + var deletedTicketTags = existingTicketTags.Where(t => updateTicketDto.TagIds != null ? !updateTicketDto.TagIds.Contains(t.TagId) : true).ToList(); if (deletedTicketTags.Count != 0) { _context.TicketTags.RemoveRange(deletedTicketTags); @@ -245,60 +244,66 @@ namespace Marco.Pms.Services.Controllers await _context.SaveChangesAsync(); var ticket = await _context.Tickets.Include(t => t.TicketTypeMaster).Include(t => t.TicketStatusMaster).Include(t => t.Priority).FirstOrDefaultAsync(t => t.Id == ticketForum.Id); - - List comments = await _context.TicketComments.Where(c => c.TicketId == ticket.Id).ToListAsync(); - var authorIds = comments.Select(c => c.AuthorId.ToString()).ToList(); - - List? employees = await _context.Employees.Where(e => e.Id == ticketForum.CreatedById || authorIds.Contains(e.ApplicationUserId ?? "")).ToListAsync(); - - Employee employee = employees.Find(e => e.Id == ticketForum.CreatedById); - ForumTicketVM ticketVM = ticket.ToForumTicketVMFromTicketForum(employee); - - ticketVM.Tags = tagVMs; - - List commentVMs = new List(); - foreach (var comment in comments) + ForumTicketVM ticketVM = new ForumTicketVM(); + if (ticket != null) { - employee = employees.Find(e => e.ApplicationUserId == comment.AuthorId.ToString()) ?? new Employee(); - commentVMs.Add(comment.ToTicketCommentVMFromTicketComment(employee)); - } + List comments = await _context.TicketComments.Where(c => c.TicketId == ticket.Id).ToListAsync(); + var authorIds = comments.Select(c => c.AuthorId.ToString()).ToList(); - attachments = await _context.TicketAttachments.Where(a => a.TicketId == updateTicketDto.Id).ToListAsync(); - var fileIds = attachments.Select(a => a.FileId).ToList(); - List documents = await _context.Documents.Where(d => fileIds.Contains(d.Id)).ToListAsync(); - List ticketAttachmentVMs = new List(); - foreach (var attachment in attachments) - { - var document = documents.Find(d => d.Id == attachment.FileId); - string preSignedUrl = string.Empty; - if (document != null) + List? employees = await _context.Employees.Where(e => e.Id == ticketForum.CreatedById || authorIds.Contains(e.ApplicationUserId ?? "")).ToListAsync(); + + Employee employee = employees.Find(e => e.Id == ticketForum.CreatedById) ?? new Employee(); + ticketVM = ticket.ToForumTicketVMFromTicketForum(employee); + + ticketVM.Tags = tagVMs; + + List commentVMs = new List(); + foreach (var comment in comments) { - preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(document.S3Key); + employee = employees.Find(e => e.ApplicationUserId == comment.AuthorId.ToString()) ?? new Employee(); + commentVMs.Add(comment.ToTicketCommentVMFromTicketComment(employee)); } - if (attachment.CommentId == null) + + attachments = await _context.TicketAttachments.Where(a => a.TicketId == updateTicketDto.Id).ToListAsync(); + var fileIds = attachments.Select(a => a.FileId).ToList(); + List documents = await _context.Documents.Where(d => fileIds.Contains(d.Id)).ToListAsync(); + List ticketAttachmentVMs = new List(); + foreach (var attachment in attachments) { - ticketAttachmentVMs.Add(attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl)); + var document = documents.Find(d => d.Id == attachment.FileId); + string preSignedUrl = string.Empty; + if (document != null) + { + preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(document.S3Key); + } + if (attachment.CommentId == null) + { + ticketAttachmentVMs.Add(attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl)); + } + else + { + var commentVM = commentVMs.Find(c => c.Id == attachment.CommentId); + if (commentVM != null && commentVM.Attachments != null) + { + commentVM.Attachments.Add(attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl)); + } + } } - else + ticketVM.Comments = commentVMs; + ticketVM.Attachments = ticketAttachmentVMs; + Project project = await _context.Projects.FirstOrDefaultAsync(p => p.Id == ticketForum.LinkedProjectId) ?? new Project(); + ticketVM.ProjectName = project.Name; + if (updateTicketDto.LinkedActivityId != null && updateTicketDto.LinkedActivityId != 0) { - var commentVM = commentVMs.Find(c => c.Id == attachment.CommentId); - commentVM.Attachments.Add(attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl)); - } - } - ticketVM.Comments = commentVMs; - ticketVM.Attachments = ticketAttachmentVMs; - Project project = await _context.Projects.FirstOrDefaultAsync(p => p.Id == ticketForum.LinkedProjectId) ?? new Project(); - ticketVM.ProjectName = project.Name; - if (updateTicketDto.LinkedActivityId != null && updateTicketDto.LinkedActivityId != 0) - { - WorkItem workItem = await _context.WorkItems.Include(w => w.ActivityMaster).FirstOrDefaultAsync(w => w.Id == ticketForum.LinkedActivityId) ?? new WorkItem(); - if (workItem.ActivityMaster != null) - { - ticketVM.ActivityName = workItem.ActivityMaster.ActivityName; - } - else - { - ticketVM.ActivityName = ""; + WorkItem workItem = await _context.WorkItems.Include(w => w.ActivityMaster).FirstOrDefaultAsync(w => w.Id == ticketForum.LinkedActivityId) ?? new WorkItem(); + if (workItem.ActivityMaster != null) + { + ticketVM.ActivityName = workItem.ActivityMaster.ActivityName; + } + else + { + ticketVM.ActivityName = ""; + } } } _logger.LogInfo("Ticket {TicketId} updated", updateTicketDto.Id); @@ -584,7 +589,10 @@ namespace Marco.Pms.Services.Controllers else { var commentVM = commentVMs.Find(c => c.Id == attachment.CommentId); - commentVM.Attachments.Add(attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl)); + if (commentVM != null && commentVM.Attachments != null) + { + commentVM.Attachments.Add(attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl)); + } } } ticketVM.Comments = commentVMs; @@ -603,7 +611,7 @@ namespace Marco.Pms.Services.Controllers ticketVM.ActivityName = ""; } } - _logger.LogInfo("Status of Ticket {TicketId} in project {ProjectId} is changes to {status}", id, ticket.LinkedProjectId, ticket.TicketStatusMaster.Name); + _logger.LogInfo("Status of Ticket {TicketId} in project {ProjectId} is changes to {status}", id, ticket.LinkedProjectId, ticket.TicketStatusMaster != null ? ticket.TicketStatusMaster.Name : string.Empty); return Ok(ApiResponse.SuccessResponse(ticketVM, "Ticket Fetched Successfully", 200)); } [HttpGet("ticket/{id}")] @@ -659,7 +667,10 @@ namespace Marco.Pms.Services.Controllers else { var commentVM = commentVMs.Find(c => c.Id == attachment.CommentId); - commentVM.Attachments.Add(attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl)); + if (commentVM != null && commentVM.Attachments != null) + { + commentVM.Attachments.Add(attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl)); + } } } ticketVM.Comments = commentVMs; @@ -695,7 +706,7 @@ namespace Marco.Pms.Services.Controllers List ticketComments = await _context.TicketComments.Where(c => ticketIds.Contains(c.TicketId)).ToListAsync(); var authorIds = ticketComments.Select(c => c.AuthorId.ToString()).ToList(); - List employees = await _context.Employees.Where(e => createdByIds.Contains(e.Id) || authorIds.Contains(e.ApplicationUserId)).ToListAsync(); + List employees = await _context.Employees.Where(e => createdByIds.Contains(e.Id) || (e.ApplicationUserId != null && authorIds.Contains(e.ApplicationUserId))).ToListAsync(); var ticketTags = await _context.TicketTags.Where(t => ticketIds.Contains(t.TicketId)).ToListAsync(); List tagIds = ticketTags.Select(t => t.TagId).ToList(); @@ -758,7 +769,10 @@ namespace Marco.Pms.Services.Controllers else { var commentVM = commentVMs.Find(c => c.Id == attachment.CommentId); - commentVM.Attachments.Add(attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl)); + if (commentVM != null && commentVM.Attachments != null) + { + commentVM.Attachments.Add(attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl)); + } } } ticketVM.Comments = commentVMs; diff --git a/Marco.Pms.Services/Controllers/ProjectController.cs b/Marco.Pms.Services/Controllers/ProjectController.cs index 2c21eae..beee9f2 100644 --- a/Marco.Pms.Services/Controllers/ProjectController.cs +++ b/Marco.Pms.Services/Controllers/ProjectController.cs @@ -1,6 +1,4 @@ -using System.ComponentModel.DataAnnotations.Schema; -using System.ComponentModel; -using Marco.Pms.DataAccess.Data; +using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Dtos.Project; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; @@ -12,7 +10,6 @@ using Marco.Pms.Model.ViewModels.Employee; using MarcoBMS.Services.Helpers; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; using Microsoft.EntityFrameworkCore; namespace MarcoBMS.Services.Controllers @@ -25,7 +22,7 @@ namespace MarcoBMS.Services.Controllers //private readonly IUnitOfWork _unitOfWork; private readonly ApplicationDbContext _context; //private ApplicationUser _applicationUser; - // private readonly IProjectRepository _projectrepo; + // private readonly IProjectRepository _projectrepo; //private readonly UserManager _userManager; private readonly UserHelper _userHelper; @@ -34,7 +31,7 @@ namespace MarcoBMS.Services.Controllers { //_unitOfWork = unitOfWork; _context = context; - //_projectrepo = projectrepo; + //_projectrepo = projectrepo; //_userManager = userManager; _userHelper = userHelper; } @@ -51,9 +48,9 @@ namespace MarcoBMS.Services.Controllers } var tenantId = _userHelper.GetTenantId(); - List projects = await _context.Projects.Where(c=>c.TenantId == _userHelper.GetTenantId()).ToListAsync(); + List projects = await _context.Projects.Where(c => c.TenantId == _userHelper.GetTenantId()).ToListAsync(); + - List response = new List(); foreach (var project in projects) { @@ -86,7 +83,7 @@ namespace MarcoBMS.Services.Controllers return Ok(ApiResponse.SuccessResponse(response, "Success.", 200)); } - + [HttpGet("get/{id:int}")] public async Task Get([FromRoute] int id) { @@ -120,7 +117,7 @@ namespace MarcoBMS.Services.Controllers } - var project = await _context.Projects.Where(c => c.TenantId == _userHelper.GetTenantId() && c.Id == id).Include(c=> c.ProjectStatus).SingleOrDefaultAsync(); // includeProperties: "ProjectStatus,Tenant"); //_context.Stock.FindAsync(id); + var project = await _context.Projects.Where(c => c.TenantId == _userHelper.GetTenantId() && c.Id == id).Include(c => c.ProjectStatus).SingleOrDefaultAsync(); // includeProperties: "ProjectStatus,Tenant"); //_context.Stock.FindAsync(id); if (project == null) { @@ -131,9 +128,10 @@ namespace MarcoBMS.Services.Controllers { //var project = projects.Where(c => c.Id == id).SingleOrDefault(); ProjectDetailsVM vm = await GetProjectViewModel(id, project); - + ProjectVM projectVM = new ProjectVM(); - if (vm.project != null) { + if (vm.project != null) + { projectVM.Id = vm.project.Id; projectVM.Name = vm.project.Name; projectVM.ProjectAddress = vm.project.ProjectAddress; @@ -143,7 +141,8 @@ namespace MarcoBMS.Services.Controllers projectVM.ProjectStatusId = vm.project.ProjectStatusId; } projectVM.Buildings = new List(); - if (vm.buildings != null) { + if (vm.buildings != null) + { foreach (Building build in vm.buildings) { BuildingVM buildVM = new BuildingVM() { Id = build.Id, Description = build.Description, Name = build.Name }; @@ -161,7 +160,7 @@ namespace MarcoBMS.Services.Controllers { WorkAreaVM workAreaVM = new WorkAreaVM() { Id = workAreaDto.Id, AreaName = workAreaDto.AreaName, WorkItems = new List() }; - if(vm.workItems != null) + if (vm.workItems != null) { foreach (WorkItem workItemDto in vm.workItems.Where(c => c.WorkAreaId == workAreaDto.Id).ToList()) { @@ -169,7 +168,10 @@ namespace MarcoBMS.Services.Controllers //workItemVM.WorkItem.WorkArea = null workItemVM.WorkItem.WorkArea = new WorkArea(); //workItemVM.WorkItem.ActivityMaster.Tenant = null; - workItemVM.WorkItem.ActivityMaster.Tenant = new Tenant(); + if (workItemVM.WorkItem.ActivityMaster != null) + { + workItemVM.WorkItem.ActivityMaster.Tenant = new Tenant(); + } //workItemVM.WorkItem.Tenant = null; workItemVM.WorkItem.Tenant = new Tenant(); @@ -183,16 +185,16 @@ namespace MarcoBMS.Services.Controllers } } - buildVM.Floors.Add(floorVM); + buildVM.Floors.Add(floorVM); } } - projectVM.Buildings.Add(buildVM); + projectVM.Buildings.Add(buildVM); } } return Ok(ApiResponse.SuccessResponse(projectVM, "Success.", 200)); } - + } private async Task GetProjectViewModel(int? id, Project project) @@ -210,8 +212,8 @@ namespace MarcoBMS.Services.Controllers List workAreas = await _context.WorkAreas.Where(c => idList.Contains(c.FloorId)).ToListAsync(); idList = workAreas.Select(o => o.Id).ToList(); - List workItems = await _context.WorkItems.Where(c => idList.Contains(c.WorkAreaId)).Include(c=>c.ActivityMaster).ToListAsync(); - // List workItems = _unitOfWork.WorkItem.GetAll(c => idList.Contains(c.WorkAreaId), includeProperties: "ActivityMaster").ToList(); + List workItems = await _context.WorkItems.Where(c => idList.Contains(c.WorkAreaId)).Include(c => c.ActivityMaster).ToListAsync(); + // List workItems = _unitOfWork.WorkItem.GetAll(c => idList.Contains(c.WorkAreaId), includeProperties: "ActivityMaster").ToList(); vm.project = project; vm.buildings = buildings; @@ -270,7 +272,7 @@ namespace MarcoBMS.Services.Controllers int TenantId = GetTenantId(); updateProjectDto.TenantId = TenantId; - Project project = updateProjectDto.ToProjectFromUpdateProjectDto(TenantId,id); + Project project = updateProjectDto.ToProjectFromUpdateProjectDto(TenantId, id); _context.Projects.Update(project); await _context.SaveChangesAsync(); @@ -357,7 +359,8 @@ namespace MarcoBMS.Services.Controllers join fp in _context.ProjectAllocations.Where(c => c.TenantId == TenantId && c.ProjectId == projectid) on rpm.Id equals fp.EmployeeId select rpm).ToListAsync(); - }else + } + else { result = await (from rpm in _context.Employees.Include(c => c.JobRole) join fp in _context.ProjectAllocations.Where(c => c.TenantId == TenantId && c.ProjectId == projectid && c.IsActive == true) @@ -398,19 +401,22 @@ namespace MarcoBMS.Services.Controllers int TenantId = GetTenantId(); - var employees = await _context.ProjectAllocations.Where(c => c.TenantId == TenantId && c.ProjectId == projectId).Include(e => e.Employee).Include(e => e.Employee.JobRole).Select(e => new - { - ID = e.Id, - EmployeeId = e.EmployeeId, - ProjectId = e.ProjectId, - AllocationDate = e.AllocationDate, - ReAllocationDate = e.ReAllocationDate, - FirstName = e.Employee.FirstName, - LastName = e.Employee.LastName, - MiddleName = e.Employee.MiddleName, - IsActive = e.IsActive, - JobRoleId = (e.JobRoleId != null ? e.JobRoleId : e.Employee.JobRoleId) - }).ToListAsync(); + var employees = await _context.ProjectAllocations + .Where(c => c.TenantId == TenantId && c.ProjectId == projectId && c.Employee != null) + .Include(e => e.Employee) + .Select(e => new + { + ID = e.Id, + EmployeeId = e.EmployeeId, + ProjectId = e.ProjectId, + AllocationDate = e.AllocationDate, + ReAllocationDate = e.ReAllocationDate, + FirstName = e.Employee != null ? e.Employee.FirstName : string.Empty, + LastName = e.Employee != null ? e.Employee.LastName : string.Empty, + MiddleName = e.Employee != null ? e.Employee.MiddleName : string.Empty, + IsActive = e.IsActive, + JobRoleId = (e.JobRoleId != null ? e.JobRoleId : e.Employee != null ? e.Employee.JobRoleId : null) + }).ToListAsync(); return Ok(ApiResponse.SuccessResponse(employees, "Success.", 200)); } @@ -474,15 +480,16 @@ namespace MarcoBMS.Services.Controllers } } - catch (Exception ex) { - return Ok(ApiResponse.ErrorResponse(ex.Message,ex, 400)); + catch (Exception ex) + { + return Ok(ApiResponse.ErrorResponse(ex.Message, ex, 400)); } } return Ok(ApiResponse.SuccessResponse(result, "Data saved successfully", 200)); } - return BadRequest(ApiResponse.ErrorResponse("Invalid details.", "Work Item Details are not valid." , 400)); + return BadRequest(ApiResponse.ErrorResponse("Invalid details.", "Work Item Details are not valid.", 400)); } @@ -501,7 +508,7 @@ namespace MarcoBMS.Services.Controllers { //update _context.WorkItems.Update(workItem); - await _context.SaveChangesAsync(); + await _context.SaveChangesAsync(); } else { @@ -526,7 +533,7 @@ namespace MarcoBMS.Services.Controllers [HttpPost("manage-infra")] public async Task ManageProjectInfra(List infraDots) { - var responseData = new InfraVM{ }; + var responseData = new InfraVM { }; if (infraDots != null) { foreach (var item in infraDots) diff --git a/Marco.Pms.Services/Controllers/TaskController.cs b/Marco.Pms.Services/Controllers/TaskController.cs index a1e904b..0f0482c 100644 --- a/Marco.Pms.Services/Controllers/TaskController.cs +++ b/Marco.Pms.Services/Controllers/TaskController.cs @@ -15,7 +15,7 @@ using Microsoft.EntityFrameworkCore; namespace MarcoBMS.Services.Controllers { - + [Route("api/[controller]")] [ApiController] [Authorize] @@ -28,7 +28,7 @@ namespace MarcoBMS.Services.Controllers public TaskController(ApplicationDbContext context, UserHelper userHelper) { _context = context; - _userHelper = userHelper; + _userHelper = userHelper; } private int GetTenantId() @@ -51,7 +51,7 @@ namespace MarcoBMS.Services.Controllers var tenantId = GetTenantId(); var Employee = await _userHelper.GetCurrentEmployeeAsync(); - var taskAllocation = assignTask.ToTaskAllocationFromAssignTaskDto(Employee.Id,tenantId); + var taskAllocation = assignTask.ToTaskAllocationFromAssignTaskDto(Employee.Id, tenantId); _context.TaskAllocations.Add(taskAllocation); await _context.SaveChangesAsync(); var response = taskAllocation.ToAssignTaskVMFromTaskAllocation(); @@ -74,9 +74,10 @@ namespace MarcoBMS.Services.Controllers await _context.SaveChangesAsync(); var idList = teamMembers.Select(m => m.EmployeeId); - List employees = await _context.Employees.Where(e=> idList.Contains(e.Id)).ToListAsync(); + List employees = await _context.Employees.Where(e => idList.Contains(e.Id)).ToListAsync(); List team = new List(); - foreach (var employee in employees) { + foreach (var employee in employees) + { team.Add(employee.ToEmployeeVMFromEmployee()); } response.teamMembers = team; @@ -85,7 +86,7 @@ namespace MarcoBMS.Services.Controllers [HttpPost("report")] - public async Task ReportTaskProgress([FromBody]ReportTaskDto reportTask) + public async Task ReportTaskProgress([FromBody] ReportTaskDto reportTask) { if (!ModelState.IsValid) { @@ -101,12 +102,13 @@ namespace MarcoBMS.Services.Controllers var taskAllocation = await _context.TaskAllocations.Include(t => t.WorkItem).FirstOrDefaultAsync(t => t.Id == reportTask.Id); - var checkListIds = reportTask.CheckList.Select(c => c.Id).ToList(); + var checkListIds = reportTask.CheckList != null ? reportTask.CheckList.Select(c => c.Id).ToList() : new List(); var checkList = await _context.ActivityCheckLists.Where(c => checkListIds.Contains(c.Id)).ToListAsync(); - if (taskAllocation == null) { + if (taskAllocation == null) + { return BadRequest(ApiResponse.ErrorResponse("No such task has been allocated.", "No such task has been allocated.", 400)); } - if(taskAllocation.WorkItem != null) + if (taskAllocation.WorkItem != null) { if (taskAllocation.CompletedTask != 0) { @@ -118,33 +120,36 @@ namespace MarcoBMS.Services.Controllers } List checkListMappings = new List(); List checkListVMs = new List(); - foreach (var checkDto in reportTask.CheckList) + if (reportTask.CheckList != null) { - checkListVMs.Add(checkDto.ToCheckListVMFromReportCheckListDto(taskAllocation.WorkItem.ActivityId)); - if (checkDto.IsChecked) + foreach (var checkDto in reportTask.CheckList) { - var check = checkList.Find(c => c.Id == checkDto.Id); - if (check != null) + checkListVMs.Add(checkDto.ToCheckListVMFromReportCheckListDto(taskAllocation.WorkItem != null ? taskAllocation.WorkItem.ActivityId : 0)); + if (checkDto.IsChecked) { - CheckListMappings checkListMapping = new CheckListMappings + var check = checkList.Find(c => c.Id == checkDto.Id); + if (check != null) { - CheckListId = check.Id, - TaskAllocationId = reportTask.Id - }; - checkListMappings.Add(checkListMapping); + CheckListMappings checkListMapping = new CheckListMappings + { + CheckListId = check.Id, + TaskAllocationId = reportTask.Id + }; + checkListMappings.Add(checkListMapping); + } } } } _context.CheckListMappings.AddRange(checkListMappings); - var comment = reportTask.ToCommentFromReportTaskDto(tenantId,Employee.Id); + var comment = reportTask.ToCommentFromReportTaskDto(tenantId, Employee.Id); _context.TaskComments.Add(comment); await _context.SaveChangesAsync(); var response = taskAllocation.ToReportTaskVMFromTaskAllocation(); - List < TaskComment > comments = await _context.TaskComments.Where(c => c.TaskAllocationId == taskAllocation.Id).ToListAsync(); - List < CommentVM > resultComments = new List { }; - foreach(var result in comments) + List comments = await _context.TaskComments.Where(c => c.TaskAllocationId == taskAllocation.Id).ToListAsync(); + List resultComments = new List { }; + foreach (var result in comments) { resultComments.Add(result.ToCommentVMFromTaskComment()); } @@ -154,7 +159,7 @@ namespace MarcoBMS.Services.Controllers } [HttpPost("comment")] - public async Task AddCommentForTask([FromBody]CreateCommentDto createComment ) + public async Task AddCommentForTask([FromBody] CreateCommentDto createComment) { var tenantId = GetTenantId(); var Employee = await _userHelper.GetCurrentEmployeeAsync(); @@ -202,7 +207,7 @@ namespace MarcoBMS.Services.Controllers idList = workItems.Select(i => i.Id).ToList(); var activityIdList = workItems.Select(i => i.ActivityId).ToList(); - List taskAllocations = await _context.TaskAllocations.Where(t => idList.Contains(t.WorkItemId) && t.AssignmentDate.Date >= fromDate.Date && t.AssignmentDate.Date <= toDate.Date && t.TenantId == tenantId).Include(t => t.WorkItem).Include(t=>t.Employee).ToListAsync(); + List taskAllocations = await _context.TaskAllocations.Where(t => idList.Contains(t.WorkItemId) && t.AssignmentDate.Date >= fromDate.Date && t.AssignmentDate.Date <= toDate.Date && t.TenantId == tenantId).Include(t => t.WorkItem).Include(t => t.Employee).ToListAsync(); var taskIdList = taskAllocations.Select(t => t.Id).ToList(); List teamMembers = await _context.TaskMembers.Where(t => taskIdList.Contains(t.TaskAllocationId)).ToListAsync(); @@ -213,48 +218,49 @@ namespace MarcoBMS.Services.Controllers List tasks = new List(); //foreach (var workItem in workItems) //{ - foreach (var taskAllocation in taskAllocations) + foreach (var taskAllocation in taskAllocations) + { + + var response = taskAllocation.ToListTaskVMFromTaskAllocation(); + + List comments = await _context.TaskComments.Where(c => c.TaskAllocationId == taskAllocation.Id).ToListAsync(); + List team = new List(); + List taskMembers = teamMembers.Where(m => m.TaskAllocationId == taskAllocation.Id).ToList(); + + foreach (var taskMember in taskMembers) { - - var response = taskAllocation.ToListTaskVMFromTaskAllocation(); - - List comments = await _context.TaskComments.Where(c => c.TaskAllocationId == taskAllocation.Id).ToListAsync(); - List team = new List(); - List taskMembers = teamMembers.Where(m => m.TaskAllocationId == taskAllocation.Id).ToList(); - - foreach (var taskMember in taskMembers) - { var teamMember = employees.Find(e => e.Id == taskMember.EmployeeId); - if(teamMember != null) - { - team.Add(teamMember.ToBasicEmployeeVMFromEmployee()); - } - } - List commentVM = new List { }; - foreach (var comment in comments) + if (teamMember != null) { - commentVM.Add(comment.ToCommentVMFromTaskComment()); + team.Add(teamMember.ToBasicEmployeeVMFromEmployee()); } - List checkLists = await _context.ActivityCheckLists.Where(x => x.ActivityId == taskAllocation.WorkItem.ActivityId).ToListAsync(); - List checkListMappings = await _context.CheckListMappings.Where(c => c.TaskAllocationId == taskAllocation.Id).ToListAsync(); - ListcheckList = new List(); - foreach (var check in checkLists) { - var checkListMapping = checkListMappings.Find(c => c.CheckListId == check.Id); - if(checkListMapping != null) - { - checkList.Add(check.ToCheckListVMFromActivityCheckList(check.ActivityId, true)); - } - else - { - checkList.Add(check.ToCheckListVMFromActivityCheckList(check.ActivityId, false)); - } - } - response.comments = commentVM; - response.teamMembers = team; - response.CheckList = checkList; - tasks.Add(response); } - + List commentVM = new List { }; + foreach (var comment in comments) + { + commentVM.Add(comment.ToCommentVMFromTaskComment()); + } + List checkLists = await _context.ActivityCheckLists.Where(x => x.ActivityId == (taskAllocation.WorkItem != null ? taskAllocation.WorkItem.ActivityId : 0)).ToListAsync(); + List checkListMappings = await _context.CheckListMappings.Where(c => c.TaskAllocationId == taskAllocation.Id).ToListAsync(); + List checkList = new List(); + foreach (var check in checkLists) + { + var checkListMapping = checkListMappings.Find(c => c.CheckListId == check.Id); + if (checkListMapping != null) + { + checkList.Add(check.ToCheckListVMFromActivityCheckList(check.ActivityId, true)); + } + else + { + checkList.Add(check.ToCheckListVMFromActivityCheckList(check.ActivityId, false)); + } + } + response.comments = commentVM; + response.teamMembers = team; + response.CheckList = checkList; + tasks.Add(response); + } + //} return Ok(ApiResponse.SuccessResponse(tasks, "Success", 200)); } @@ -269,16 +275,16 @@ namespace MarcoBMS.Services.Controllers { //var employee = await _context.Employees.FirstOrDefaultAsync(e => e.Id == taskAllocation.AssignedBy); string employeeName = System.String.Format("{0} {1}", taskAllocation.Employee.FirstName, taskAllocation.Employee.LastName); - string tenantName = taskAllocation.Tenant.ContactName; + string tenantName = taskAllocation.Tenant.ContactName ?? string.Empty; if (taskAllocation == null) return NotFound(ApiResponse.ErrorResponse("Task Not Found", "Task not found", 404)); - var taskVM = taskAllocation.TaskAllocationToTaskVM(employeeName,tenantName); + var taskVM = taskAllocation.TaskAllocationToTaskVM(employeeName, tenantName); var comments = await _context.TaskComments.Where(c => c.TaskAllocationId == taskAllocation.Id).ToListAsync(); var team = await _context.TaskMembers.Where(m => m.TaskAllocationId == taskAllocation.Id).Include(m => m.Employee).ToListAsync(); var teamMembers = new List { }; - foreach(var member in team) + foreach (var member in team) { - var result = member.Employee.ToEmployeeVMFromEmployee(); + var result = member.Employee != null ? member.Employee.ToEmployeeVMFromEmployee() : new EmployeeVM(); teamMembers.Add(result); } List Comments = new List { }; @@ -290,8 +296,8 @@ namespace MarcoBMS.Services.Controllers taskVM.TeamMembers = teamMembers; return Ok(ApiResponse.SuccessResponse(taskVM, "Success", 200)); } - - + + return NotFound(ApiResponse.ErrorResponse("Task Not Found", "Task not Found", 404)); } } diff --git a/Marco.Pms.Services/Helpers/EmployeeHelper.cs b/Marco.Pms.Services/Helpers/EmployeeHelper.cs index 9addf79..4b01bfc 100644 --- a/Marco.Pms.Services/Helpers/EmployeeHelper.cs +++ b/Marco.Pms.Services/Helpers/EmployeeHelper.cs @@ -49,7 +49,7 @@ namespace MarcoBMS.Services.Helpers result = await (from pa in _context.ProjectAllocations.Where(c => c.ProjectId == ProjectId) join em in _context.Employees.Where(c => c.TenantId == TenentId).Include(fp => fp.JobRole) // Include Feature on pa.EmployeeId equals em.Id - where em.FirstName.ToLower().Contains(searchString.ToLower()) || em.LastName.ToLower().Contains(searchString.ToLower()) + where (em.FirstName != null ? em.FirstName.ToLower().Contains(searchString.ToLower()) : false) || (em.LastName != null ? em.LastName.ToLower().Contains(searchString.ToLower()) : false) select em.ToEmployeeVMFromEmployee() ) .ToListAsync(); @@ -58,7 +58,7 @@ namespace MarcoBMS.Services.Helpers else { result = await _context.Employees.Where(c => c.TenantId == TenentId && - (c.FirstName.ToLower().Contains(searchString.ToLower()) || c.LastName.ToLower().Contains(searchString.ToLower()))).Include(fp => fp.JobRole) + ((c.FirstName != null ? c.FirstName.ToLower().Contains(searchString.ToLower()) : false) || (c.LastName != null ? c.LastName.ToLower().Contains(searchString.ToLower()) : false))).Include(fp => fp.JobRole) .Select(c => c.ToEmployeeVMFromEmployee()).ToListAsync(); } diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index 4eb53c3..e731948 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -26,7 +26,7 @@ builder.Host.UseSerilog((context, config) => { config.ReadFrom.Configuration(context.Configuration) // Taking all configuration from appsetting.json .WriteTo.MongoDB( - databaseUrl: mongoConn, + databaseUrl: mongoConn ?? string.Empty, collectionName: "api-logs", batchPostingLimit: 100, period: timeSpan @@ -133,7 +133,9 @@ builder.Services.AddSingleton(); builder.Services.AddHttpContextAccessor(); -var jwtSettings = builder.Configuration.GetSection("Jwt").Get(); +var jwtSettings = builder.Configuration.GetSection("Jwt").Get() + ?? throw new InvalidOperationException("JwtSettings section is missing or invalid."); + if (jwtSettings != null && jwtSettings.Key != null) { builder.Services.AddAuthentication(options => @@ -154,9 +156,9 @@ if (jwtSettings != null && jwtSettings.Key != null) IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.Key)) }; }); + builder.Services.AddSingleton(jwtSettings); } -builder.Services.AddSingleton(jwtSettings); builder.WebHost.ConfigureKestrel(options => { options.AddServerHeader = false; // Disable the "Server" header diff --git a/Marco.Pms.Services/Service/EmailSender.cs b/Marco.Pms.Services/Service/EmailSender.cs index 59f5a11..1ca68ba 100644 --- a/Marco.Pms.Services/Service/EmailSender.cs +++ b/Marco.Pms.Services/Service/EmailSender.cs @@ -95,13 +95,13 @@ namespace MarcoBMS.Services.Service var replacements = new Dictionary { { "MAIL_TITLE", "User Requested a Demo" }, - { "ORGANIZATION_NAME", demoEmailObject.OrganizatioinName }, - { "EMAIL", demoEmailObject.Email }, - { "ABOUT", demoEmailObject.About }, - { "ORGANIZATION_SIZE", demoEmailObject.OragnizationSize }, - { "INDUSTRY_NAME", demoEmailObject.IndustryName }, - { "CONTACT_NAME", demoEmailObject.ContactPerson }, - { "CONTACT_NUMBER", demoEmailObject.ContactNumber } + { "ORGANIZATION_NAME", demoEmailObject.OrganizatioinName ?? string.Empty }, + { "EMAIL", demoEmailObject.Email ?? string.Empty}, + { "ABOUT", demoEmailObject.About ?? string.Empty }, + { "ORGANIZATION_SIZE", demoEmailObject.OragnizationSize ?? string.Empty }, + { "INDUSTRY_NAME", demoEmailObject.IndustryName ?? string.Empty }, + { "CONTACT_NAME", demoEmailObject.ContactPerson ?? string.Empty }, + { "CONTACT_NUMBER", demoEmailObject.ContactNumber ?? string.Empty } }; string emailBody = await GetEmailTemplate("request-demo", replacements); diff --git a/Marco.Pms.Services/Service/S3UploadService.cs b/Marco.Pms.Services/Service/S3UploadService.cs index 6acfcc1..88599b6 100644 --- a/Marco.Pms.Services/Service/S3UploadService.cs +++ b/Marco.Pms.Services/Service/S3UploadService.cs @@ -221,14 +221,14 @@ namespace Marco.Pms.Services.Service catch (FormatException) { // Handle cases where the input string is not valid Base64 - Console.WriteLine("Error: Invalid Base64 string."); - return null; + _logger.LogError("Invalid Base64 string."); + return string.Empty; } catch (Exception ex) { // Handle other potential errors during decoding or inspection - Console.WriteLine($"An error occurred: {ex.Message}"); - return null; + _logger.LogError($"An error occurred: {ex.Message}"); + return string.Empty; } } }