Organization_Management #142

Merged
ashutosh.nehete merged 92 commits from Organization_Management into main 2025-09-30 09:05:14 +00:00
2 changed files with 31 additions and 23 deletions
Showing only changes of commit 2f052174aa - Show all commits

View File

@ -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; }
}
}

View File

@ -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<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);
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.
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);
return ApiResponse<object>.SuccessResponse(resultDto, "Project created successfully.", 200);
return ApiResponse<object>.SuccessResponse(projectVM, "Project created successfully.", 200);
}
/// <summary>
/// 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<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);
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) ---
// 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
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<object>.SuccessResponse(projectDto, "Project updated successfully.", 200);
return ApiResponse<object>.SuccessResponse(projectVM, "Project updated successfully.", 200);
}
catch (Exception ex)
{