Changed the VM when creating and updating project

This commit is contained in:
ashutosh.nehete 2025-09-25 12:37:57 +05:30
parent 2258771229
commit 2f052174aa
2 changed files with 31 additions and 23 deletions

View File

@ -1,4 +1,5 @@
using Marco.Pms.Model.Master; using Marco.Pms.Model.Master;
using Marco.Pms.Model.ViewModels.Organization;
namespace Marco.Pms.Model.ViewModels.Projects namespace Marco.Pms.Model.ViewModels.Projects
{ {
@ -12,6 +13,8 @@ namespace Marco.Pms.Model.ViewModels.Projects
public DateTime? StartDate { get; set; } public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; } public DateTime? EndDate { get; set; }
public StatusMaster? ProjectStatus { get; set; } public StatusMaster? ProjectStatus { get; set; }
public BasicOrganizationVm? Promoter { get; set; }
public BasicOrganizationVm? PMC { get; set; }
} }
} }

View File

@ -370,28 +370,28 @@ namespace Marco.Pms.Services.Service
// Step 2: Concurrent validation for Promoter and PMC organization existence. // Step 2: Concurrent validation for Promoter and PMC organization existence.
// Run database queries in parallel for better performance. // 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(); 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(); 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; var promoter = promoterTask.Result;
bool pmcExists = pmcExistsTask.Result; var pmc = pmcTask.Result;
if (!promoterExists) if (promoter == null)
{ {
_logger.LogWarning("Promoter check failed. PromoterId={PromoterId} not found.", model.PromoterId); _logger.LogWarning("Promoter check failed. PromoterId={PromoterId} not found.", model.PromoterId);
return ApiResponse<object>.ErrorResponse("Promoter not found", "Promoter not found in database.", 404); return ApiResponse<object>.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); _logger.LogWarning("PMC check failed. PMCId={PMCId} not found.", model.PMCId);
return ApiResponse<object>.ErrorResponse("PMC not found", "PMC not found in database.", 404); return ApiResponse<object>.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. // Step 7: Return success response as soon as critical operation is complete.
var resultDto = _mapper.Map<ProjectDto>(project);
var projectVM = _mapper.Map<ProjectVM>(project);
projectVM.Promoter = _mapper.Map<BasicOrganizationVm>(promoter);
projectVM.PMC = _mapper.Map<BasicOrganizationVm>(pmc);
_logger.LogInfo("Returning success response for ProjectId={ProjectId}.", project.Id); _logger.LogInfo("Returning success response for ProjectId={ProjectId}.", project.Id);
return ApiResponse<object>.SuccessResponse(resultDto, "Project created successfully.", 200); return ApiResponse<object>.SuccessResponse(projectVM, "Project created successfully.", 200);
} }
/// <summary> /// <summary>
/// Updates an existing project's details. /// Updates an existing project's details.
/// This endpoint is secure, handles concurrency, and performs non-essential tasks in the background. /// 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. // 1bb. Concurrent validation for Promoter and PMC organization existence.
// Run database queries in parallel for better performance. // 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(); 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(); 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; var promoter = promoterTask.Result;
bool pmcExists = pmcExistsTask.Result; var pmc = pmcTask.Result;
if (!promoterExists) if (promoter == null)
{ {
_logger.LogWarning("Promoter check failed. PromoterId={PromoterId} not found.", model.PromoterId); _logger.LogWarning("Promoter check failed. PromoterId={PromoterId} not found.", model.PromoterId);
return ApiResponse<object>.ErrorResponse("Promoter not found", "Promoter not found in database.", 404); return ApiResponse<object>.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); _logger.LogWarning("PMC check failed. PMCId={PMCId} not found.", model.PMCId);
return ApiResponse<object>.ErrorResponse("PMC not found", "PMC not found in database.", 404); return ApiResponse<object>.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) --- // --- Step 4: Perform Side-Effects (Fire and Forget) ---
// Create a DTO of the updated project to pass to background tasks. // Create a DTO of the updated project to pass to background tasks.
var projectDto = _mapper.Map<ProjectDto>(existingProject); var projectVM = _mapper.Map<ProjectVM>(existingProject);
projectVM.Promoter = _mapper.Map<BasicOrganizationVm>(promoter);
projectVM.PMC = _mapper.Map<BasicOrganizationVm>(pmc);
// 4a. Update Cache // 4a. Update Cache
await UpdateCacheInBackground(existingProject); await UpdateCacheInBackground(existingProject);
@ -572,7 +577,7 @@ namespace Marco.Pms.Services.Service
// --- Step 5: Return Success Response Immediately --- // --- Step 5: Return Success Response Immediately ---
// The client gets a fast response without waiting for caching or SignalR. // The client gets a fast response without waiting for caching or SignalR.
return ApiResponse<object>.SuccessResponse(projectDto, "Project updated successfully.", 200); return ApiResponse<object>.SuccessResponse(projectVM, "Project updated successfully.", 200);
} }
catch (Exception ex) catch (Exception ex)
{ {