Organization_Management #142
@ -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; }
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user