Solved the issue of project is not updating properly
This commit is contained in:
parent
73aa1d6181
commit
5369bbae29
@ -42,8 +42,8 @@ namespace Marco.Pms.CacheHelper
|
|||||||
Builders<ProjectMongoDB>.Update.Set(r => r.ShortName, project.ShortName),
|
Builders<ProjectMongoDB>.Update.Set(r => r.ShortName, project.ShortName),
|
||||||
Builders<ProjectMongoDB>.Update.Set(r => r.ProjectStatus, new StatusMasterMongoDB
|
Builders<ProjectMongoDB>.Update.Set(r => r.ProjectStatus, new StatusMasterMongoDB
|
||||||
{
|
{
|
||||||
Id = projectStatus?.Id.ToString(),
|
Id = projectStatus.Id.ToString(),
|
||||||
Status = projectStatus?.Status
|
Status = projectStatus.Status
|
||||||
}),
|
}),
|
||||||
Builders<ProjectMongoDB>.Update.Set(r => r.StartDate, project.StartDate),
|
Builders<ProjectMongoDB>.Update.Set(r => r.StartDate, project.StartDate),
|
||||||
Builders<ProjectMongoDB>.Update.Set(r => r.EndDate, project.EndDate),
|
Builders<ProjectMongoDB>.Update.Set(r => r.EndDate, project.EndDate),
|
||||||
|
@ -252,89 +252,28 @@ namespace MarcoBMS.Services.Controllers
|
|||||||
return StatusCode(response.StatusCode, response);
|
return StatusCode(response.StatusCode, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("allocation")]
|
//[HttpPost("allocation")]
|
||||||
public async Task<IActionResult> ManageAllocation(List<ProjectAllocationDot> projectAllocationDot)
|
//public async Task<IActionResult> ManageAllocation(List<ProjectAllocationDot> projectAllocationDot)
|
||||||
{
|
//{
|
||||||
if (projectAllocationDot != null)
|
// // --- Step 1: Input Validation ---
|
||||||
{
|
// if (!ModelState.IsValid)
|
||||||
var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
// {
|
||||||
|
// var errors = ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage).ToList();
|
||||||
|
// _logger.LogWarning("Update project called with invalid model state for ID {ProjectId}. Errors: {Errors}", id, string.Join(", ", errors));
|
||||||
|
// return BadRequest(ApiResponse<object>.ErrorResponse("Invalid request data provided.", errors, 400));
|
||||||
|
// }
|
||||||
|
|
||||||
List<object>? result = new List<object>();
|
// // --- Step 2: Prepare data without I/O ---
|
||||||
List<Guid> employeeIds = new List<Guid>();
|
// Employee loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
||||||
List<Guid> projectIds = new List<Guid>();
|
// var response = await _projectServices.UpdateProjectAsync(id, updateProjectDto, tenantId, loggedInEmployee);
|
||||||
|
// if (response.Success)
|
||||||
|
// {
|
||||||
|
// var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Assign_Project", ProjectIds = projectIds, EmployeeList = employeeIds };
|
||||||
|
// await _signalR.SendNotificationAsync(notification);
|
||||||
|
// }
|
||||||
|
// return StatusCode(response.StatusCode, response);
|
||||||
|
|
||||||
foreach (var item in projectAllocationDot)
|
//}
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ProjectAllocation projectAllocation = item.ToProjectAllocationFromProjectAllocationDto(tenantId);
|
|
||||||
ProjectAllocation? projectAllocationFromDb = await _context.ProjectAllocations.Where(c => c.EmployeeId == projectAllocation.EmployeeId
|
|
||||||
&& c.ProjectId == projectAllocation.ProjectId
|
|
||||||
&& c.ReAllocationDate == null
|
|
||||||
&& c.TenantId == tenantId).SingleOrDefaultAsync();
|
|
||||||
|
|
||||||
if (projectAllocationFromDb != null)
|
|
||||||
{
|
|
||||||
_context.ProjectAllocations.Attach(projectAllocationFromDb);
|
|
||||||
|
|
||||||
if (item.Status)
|
|
||||||
{
|
|
||||||
projectAllocationFromDb.JobRoleId = projectAllocation.JobRoleId; ;
|
|
||||||
projectAllocationFromDb.IsActive = true;
|
|
||||||
_context.Entry(projectAllocationFromDb).Property(e => e.JobRoleId).IsModified = true;
|
|
||||||
_context.Entry(projectAllocationFromDb).Property(e => e.IsActive).IsModified = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
projectAllocationFromDb.ReAllocationDate = DateTime.Now;
|
|
||||||
projectAllocationFromDb.IsActive = false;
|
|
||||||
_context.Entry(projectAllocationFromDb).Property(e => e.ReAllocationDate).IsModified = true;
|
|
||||||
_context.Entry(projectAllocationFromDb).Property(e => e.IsActive).IsModified = true;
|
|
||||||
|
|
||||||
employeeIds.Add(projectAllocation.EmployeeId);
|
|
||||||
projectIds.Add(projectAllocation.ProjectId);
|
|
||||||
}
|
|
||||||
await _context.SaveChangesAsync();
|
|
||||||
var result1 = new
|
|
||||||
{
|
|
||||||
Id = projectAllocationFromDb.Id,
|
|
||||||
EmployeeId = projectAllocation.EmployeeId,
|
|
||||||
JobRoleId = projectAllocation.JobRoleId,
|
|
||||||
IsActive = projectAllocation.IsActive,
|
|
||||||
ProjectId = projectAllocation.ProjectId,
|
|
||||||
AllocationDate = projectAllocation.AllocationDate,
|
|
||||||
ReAllocationDate = projectAllocation.ReAllocationDate,
|
|
||||||
TenantId = projectAllocation.TenantId
|
|
||||||
};
|
|
||||||
result.Add(result1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
projectAllocation.AllocationDate = DateTime.Now;
|
|
||||||
projectAllocation.IsActive = true;
|
|
||||||
_context.ProjectAllocations.Add(projectAllocation);
|
|
||||||
await _context.SaveChangesAsync();
|
|
||||||
|
|
||||||
employeeIds.Add(projectAllocation.EmployeeId);
|
|
||||||
projectIds.Add(projectAllocation.ProjectId);
|
|
||||||
}
|
|
||||||
await _cache.ClearAllProjectIds(item.EmpID);
|
|
||||||
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
return Ok(ApiResponse<object>.ErrorResponse(ex.Message, ex, 400));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var notification = new { LoggedInUserId = LoggedInEmployee.Id, Keyword = "Assign_Project", ProjectIds = projectIds, EmployeeList = employeeIds };
|
|
||||||
|
|
||||||
await _signalR.SendNotificationAsync(notification);
|
|
||||||
return Ok(ApiResponse<object>.SuccessResponse(result, "Data saved successfully", 200));
|
|
||||||
|
|
||||||
}
|
|
||||||
return BadRequest(ApiResponse<object>.ErrorResponse("Invalid details.", "Work Item Details are not valid.", 400));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpGet("assigned-projects/{employeeId}")]
|
[HttpGet("assigned-projects/{employeeId}")]
|
||||||
public async Task<IActionResult> GetProjectsByEmployee([FromRoute] Guid employeeId)
|
public async Task<IActionResult> GetProjectsByEmployee([FromRoute] Guid employeeId)
|
||||||
|
@ -443,21 +443,16 @@ namespace Marco.Pms.Services.Service
|
|||||||
return ApiResponse<object>.ErrorResponse("Conflict occurred.", "This project has been modified by someone else. Please refresh and try again.", 409);
|
return ApiResponse<object>.ErrorResponse("Conflict occurred.", "This project has been modified by someone else. Please refresh and try again.", 409);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Step 4: Perform Side-Effects in the Background (Fire and Forget) ---
|
// --- Step 4: Perform Side-Effects (Fire and Forget) ---
|
||||||
// The core database operation is done. Now, we perform non-blocking cache and notification updates.
|
|
||||||
_ = Task.Run(async () =>
|
|
||||||
{
|
|
||||||
// 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 projectDto = _mapper.Map<ProjectDto>(existingProject);
|
||||||
|
|
||||||
// 4a. Update Cache
|
// 4a. Update Cache
|
||||||
await UpdateCacheInBackground(existingProject);
|
await UpdateCacheInBackground(existingProject);
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
// --- 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(_mapper.Map<ProjectDto>(existingProject), "Project updated successfully.", 200);
|
return ApiResponse<object>.SuccessResponse(projectDto, "Project updated successfully.", 200);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@ -471,41 +466,6 @@ namespace Marco.Pms.Services.Service
|
|||||||
|
|
||||||
#region =================================================================== Project Allocation APIs ===================================================================
|
#region =================================================================== Project Allocation APIs ===================================================================
|
||||||
|
|
||||||
public async Task<ApiResponse<object>> GetEmployeeByProjectID(Guid? projectid, bool includeInactive, Guid tenantId, Employee loggedInEmployee)
|
|
||||||
{
|
|
||||||
if (projectid == null)
|
|
||||||
{
|
|
||||||
return ApiResponse<object>.ErrorResponse("Invalid Input Parameter", 404);
|
|
||||||
}
|
|
||||||
// Fetch assigned project
|
|
||||||
List<Employee> result = new List<Employee>();
|
|
||||||
|
|
||||||
var employeeQuery = _context.ProjectAllocations
|
|
||||||
.Include(pa => pa.Employee)
|
|
||||||
.Where(pa => pa.ProjectId == projectid && pa.TenantId == tenantId && pa.Employee != null);
|
|
||||||
|
|
||||||
if (includeInactive)
|
|
||||||
{
|
|
||||||
|
|
||||||
result = await employeeQuery.Select(pa => pa.Employee ?? new Employee()).ToListAsync();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
result = await employeeQuery
|
|
||||||
.Where(pa => pa.IsActive)
|
|
||||||
.Select(pa => pa.Employee ?? new Employee()).ToListAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
List<EmployeeVM> resultVM = new List<EmployeeVM>();
|
|
||||||
foreach (Employee employee in result)
|
|
||||||
{
|
|
||||||
EmployeeVM vm = _mapper.Map<EmployeeVM>(employee);
|
|
||||||
resultVM.Add(vm);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ApiResponse<object>.SuccessResponse(resultVM, "Successfully fetched the list of employees for seleted project", 200);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Retrieves a list of employees for a specific project.
|
/// Retrieves a list of employees for a specific project.
|
||||||
/// This method is optimized to perform all filtering and mapping on the database server.
|
/// This method is optimized to perform all filtering and mapping on the database server.
|
||||||
@ -578,28 +538,6 @@ namespace Marco.Pms.Services.Service
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ApiResponse<object>> GetProjectAllocation(Guid? projectId, Guid tenantId, Employee loggedInEmployee)
|
|
||||||
{
|
|
||||||
var employees = await _context.ProjectAllocations
|
|
||||||
.Where(c => c.TenantId == tenantId && c.ProjectId == projectId && c.Employee != null)
|
|
||||||
.Include(e => e.Employee)
|
|
||||||
.Select(e => new
|
|
||||||
{
|
|
||||||
ID = e.Id,
|
|
||||||
EmployeeId = e.EmployeeId,
|
|
||||||
ProjectId = e.ProjectId,
|
|
||||||
AllocationDate = e.AllocationDate,
|
|
||||||
ReAllocationDate = e.ReAllocationDate,
|
|
||||||
FirstName = e.Employee != null ? e.Employee.FirstName : string.Empty,
|
|
||||||
LastName = e.Employee != null ? e.Employee.LastName : string.Empty,
|
|
||||||
MiddleName = e.Employee != null ? e.Employee.MiddleName : string.Empty,
|
|
||||||
IsActive = e.IsActive,
|
|
||||||
JobRoleId = (e.JobRoleId != null ? e.JobRoleId : e.Employee != null ? e.Employee.JobRoleId : null)
|
|
||||||
}).ToListAsync();
|
|
||||||
|
|
||||||
return ApiResponse<object>.SuccessResponse(employees, "Success.", 200);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Retrieves project allocation details for a specific project.
|
/// Retrieves project allocation details for a specific project.
|
||||||
/// This method is optimized for performance and includes security checks.
|
/// This method is optimized for performance and includes security checks.
|
||||||
@ -670,6 +608,87 @@ namespace Marco.Pms.Services.Service
|
|||||||
return ApiResponse<object>.ErrorResponse("An internal server error occurred.", "Database query failed.", 500);
|
return ApiResponse<object>.ErrorResponse("An internal server error occurred.", "Database query failed.", 500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//public async Task<ApiResponse<object>> ManageAllocation(List<ProjectAllocationDot> projectAllocationDot, Guid tenantId, Employee loggedInEmployee)
|
||||||
|
//{
|
||||||
|
// if (projectAllocationDot != null)
|
||||||
|
// {
|
||||||
|
// List<object>? result = new List<object>();
|
||||||
|
// List<Guid> employeeIds = new List<Guid>();
|
||||||
|
// List<Guid> projectIds = new List<Guid>();
|
||||||
|
|
||||||
|
// foreach (var item in projectAllocationDot)
|
||||||
|
// {
|
||||||
|
// try
|
||||||
|
// {
|
||||||
|
// //ProjectAllocation projectAllocation = item.ToProjectAllocationFromProjectAllocationDto(tenantId);
|
||||||
|
// ProjectAllocation projectAllocation = item.ToProjectAllocationFromProjectAllocationDto(tenantId);
|
||||||
|
// ProjectAllocation? projectAllocationFromDb = await _context.ProjectAllocations.Where(c => c.EmployeeId == projectAllocation.EmployeeId
|
||||||
|
// && c.ProjectId == projectAllocation.ProjectId
|
||||||
|
// && c.ReAllocationDate == null
|
||||||
|
// && c.TenantId == tenantId).SingleOrDefaultAsync();
|
||||||
|
|
||||||
|
// if (projectAllocationFromDb != null)
|
||||||
|
// {
|
||||||
|
// _context.ProjectAllocations.Attach(projectAllocationFromDb);
|
||||||
|
|
||||||
|
// if (item.Status)
|
||||||
|
// {
|
||||||
|
// projectAllocationFromDb.JobRoleId = projectAllocation.JobRoleId; ;
|
||||||
|
// projectAllocationFromDb.IsActive = true;
|
||||||
|
// _context.Entry(projectAllocationFromDb).Property(e => e.JobRoleId).IsModified = true;
|
||||||
|
// _context.Entry(projectAllocationFromDb).Property(e => e.IsActive).IsModified = true;
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// projectAllocationFromDb.ReAllocationDate = DateTime.Now;
|
||||||
|
// projectAllocationFromDb.IsActive = false;
|
||||||
|
// _context.Entry(projectAllocationFromDb).Property(e => e.ReAllocationDate).IsModified = true;
|
||||||
|
// _context.Entry(projectAllocationFromDb).Property(e => e.IsActive).IsModified = true;
|
||||||
|
|
||||||
|
// employeeIds.Add(projectAllocation.EmployeeId);
|
||||||
|
// projectIds.Add(projectAllocation.ProjectId);
|
||||||
|
// }
|
||||||
|
// await _context.SaveChangesAsync();
|
||||||
|
// var result1 = new
|
||||||
|
// {
|
||||||
|
// Id = projectAllocationFromDb.Id,
|
||||||
|
// EmployeeId = projectAllocation.EmployeeId,
|
||||||
|
// JobRoleId = projectAllocation.JobRoleId,
|
||||||
|
// IsActive = projectAllocation.IsActive,
|
||||||
|
// ProjectId = projectAllocation.ProjectId,
|
||||||
|
// AllocationDate = projectAllocation.AllocationDate,
|
||||||
|
// ReAllocationDate = projectAllocation.ReAllocationDate,
|
||||||
|
// TenantId = projectAllocation.TenantId
|
||||||
|
// };
|
||||||
|
// result.Add(result1);
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// projectAllocation.AllocationDate = DateTime.Now;
|
||||||
|
// projectAllocation.IsActive = true;
|
||||||
|
// _context.ProjectAllocations.Add(projectAllocation);
|
||||||
|
// await _context.SaveChangesAsync();
|
||||||
|
|
||||||
|
// employeeIds.Add(projectAllocation.EmployeeId);
|
||||||
|
// projectIds.Add(projectAllocation.ProjectId);
|
||||||
|
// }
|
||||||
|
// await _cache.ClearAllProjectIds(item.EmpID);
|
||||||
|
|
||||||
|
// }
|
||||||
|
// catch (Exception ex)
|
||||||
|
// {
|
||||||
|
// return ApiResponse<object>.ErrorResponse(ex.Message, ex, 400);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return ApiResponse<object>.SuccessResponse(result, "Data saved successfully", 200);
|
||||||
|
|
||||||
|
// }
|
||||||
|
// return ApiResponse<object>.ErrorResponse("Invalid details.", "Work Item Details are not valid.", 400);
|
||||||
|
|
||||||
|
//}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region =================================================================== Helper Functions ===================================================================
|
#region =================================================================== Helper Functions ===================================================================
|
||||||
@ -881,7 +900,8 @@ namespace Marco.Pms.Services.Service
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// This logic can be more complex, but the idea is to update or add.
|
// This logic can be more complex, but the idea is to update or add.
|
||||||
if (!await _cache.UpdateProjectDetailsOnly(project))
|
var demo = await _cache.UpdateProjectDetailsOnly(project);
|
||||||
|
if (!demo)
|
||||||
{
|
{
|
||||||
await _cache.AddProjectDetails(project);
|
await _cache.AddProjectDetails(project);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user