Changed the VM when creating and updating project
This commit is contained in:
parent
2258771229
commit
2f052174aa
@ -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; }
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user