From 2f052174aac867ba892e5cc1a4a304e7fc2053ff Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 25 Sep 2025 12:37:57 +0530 Subject: [PATCH] Changed the VM when creating and updating project --- .../ViewModels/Projects/ProjectVM.cs | 3 ++ Marco.Pms.Services/Service/ProjectServices.cs | 51 ++++++++++--------- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/Marco.Pms.Model/ViewModels/Projects/ProjectVM.cs b/Marco.Pms.Model/ViewModels/Projects/ProjectVM.cs index 240b35f..849769e 100644 --- a/Marco.Pms.Model/ViewModels/Projects/ProjectVM.cs +++ b/Marco.Pms.Model/ViewModels/Projects/ProjectVM.cs @@ -1,4 +1,5 @@ using Marco.Pms.Model.Master; +using Marco.Pms.Model.ViewModels.Organization; namespace Marco.Pms.Model.ViewModels.Projects { @@ -12,6 +13,8 @@ namespace Marco.Pms.Model.ViewModels.Projects public DateTime? StartDate { get; set; } public DateTime? EndDate { get; set; } public StatusMaster? ProjectStatus { get; set; } + public BasicOrganizationVm? Promoter { get; set; } + public BasicOrganizationVm? PMC { get; set; } } } diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index 692ef5e..d791543 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -370,28 +370,28 @@ namespace Marco.Pms.Services.Service // Step 2: Concurrent validation for Promoter and PMC organization existence. // Run database queries in parallel for better performance. - var promoterExistsTask = Task.Run(async () => + var promoterTask = Task.Run(async () => { await using var context = await _dbContextFactory.CreateDbContextAsync(); - return await context.Organizations.AnyAsync(o => o.Id == model.PromoterId); + return await context.Organizations.FirstOrDefaultAsync(o => o.Id == model.PromoterId); }); - var pmcExistsTask = Task.Run(async () => + var pmcTask = Task.Run(async () => { await using var context = await _dbContextFactory.CreateDbContextAsync(); - return await context.Organizations.AnyAsync(o => o.Id == model.PMCId); + return await context.Organizations.FirstOrDefaultAsync(o => o.Id == model.PMCId); }); - await Task.WhenAll(promoterExistsTask, pmcExistsTask); + await Task.WhenAll(promoterTask, pmcTask); - bool promoterExists = promoterExistsTask.Result; - bool pmcExists = pmcExistsTask.Result; + var promoter = promoterTask.Result; + var pmc = pmcTask.Result; - if (!promoterExists) + if (promoter == null) { _logger.LogWarning("Promoter check failed. PromoterId={PromoterId} not found.", model.PromoterId); return ApiResponse.ErrorResponse("Promoter not found", "Promoter not found in database.", 404); } - if (!pmcExists) + if (pmc == null) { _logger.LogWarning("PMC check failed. PMCId={PMCId} not found.", model.PMCId); return ApiResponse.ErrorResponse("PMC not found", "PMC not found in database.", 404); @@ -448,13 +448,16 @@ namespace Marco.Pms.Services.Service }); // Step 7: Return success response as soon as critical operation is complete. - var resultDto = _mapper.Map(project); + + var projectVM = _mapper.Map(project); + projectVM.Promoter = _mapper.Map(promoter); + projectVM.PMC = _mapper.Map(pmc); + _logger.LogInfo("Returning success response for ProjectId={ProjectId}.", project.Id); - return ApiResponse.SuccessResponse(resultDto, "Project created successfully.", 200); + return ApiResponse.SuccessResponse(projectVM, "Project created successfully.", 200); } - /// /// Updates an existing project's details. /// This endpoint is secure, handles concurrency, and performs non-essential tasks in the background. @@ -495,28 +498,28 @@ namespace Marco.Pms.Services.Service // 1bb. Concurrent validation for Promoter and PMC organization existence. // Run database queries in parallel for better performance. - var promoterExistsTask = Task.Run(async () => + var promoterTask = Task.Run(async () => { await using var context = await _dbContextFactory.CreateDbContextAsync(); - return await context.Organizations.AnyAsync(o => o.Id == model.PromoterId); + return await context.Organizations.FirstOrDefaultAsync(o => o.Id == model.PromoterId); }); - var pmcExistsTask = Task.Run(async () => + var pmcTask = Task.Run(async () => { await using var context = await _dbContextFactory.CreateDbContextAsync(); - return await context.Organizations.AnyAsync(o => o.Id == model.PMCId); + return await context.Organizations.FirstOrDefaultAsync(o => o.Id == model.PMCId); }); - await Task.WhenAll(promoterExistsTask, pmcExistsTask); + await Task.WhenAll(promoterTask, pmcTask); - bool promoterExists = promoterExistsTask.Result; - bool pmcExists = pmcExistsTask.Result; + var promoter = promoterTask.Result; + var pmc = pmcTask.Result; - if (!promoterExists) + if (promoter == null) { _logger.LogWarning("Promoter check failed. PromoterId={PromoterId} not found.", model.PromoterId); return ApiResponse.ErrorResponse("Promoter not found", "Promoter not found in database.", 404); } - if (!pmcExists) + if (pmc == null) { _logger.LogWarning("PMC check failed. PMCId={PMCId} not found.", model.PMCId); return ApiResponse.ErrorResponse("PMC not found", "PMC not found in database.", 404); @@ -553,7 +556,9 @@ namespace Marco.Pms.Services.Service // --- Step 4: Perform Side-Effects (Fire and Forget) --- // Create a DTO of the updated project to pass to background tasks. - var projectDto = _mapper.Map(existingProject); + var projectVM = _mapper.Map(existingProject); + projectVM.Promoter = _mapper.Map(promoter); + projectVM.PMC = _mapper.Map(pmc); // 4a. Update Cache await UpdateCacheInBackground(existingProject); @@ -572,7 +577,7 @@ namespace Marco.Pms.Services.Service // --- Step 5: Return Success Response Immediately --- // The client gets a fast response without waiting for caching or SignalR. - return ApiResponse.SuccessResponse(projectDto, "Project updated successfully.", 200); + return ApiResponse.SuccessResponse(projectVM, "Project updated successfully.", 200); } catch (Exception ex) {