diff --git a/Marco.Pms.Services/Controllers/ProjectController.cs b/Marco.Pms.Services/Controllers/ProjectController.cs index 18a790b..9f6d083 100644 --- a/Marco.Pms.Services/Controllers/ProjectController.cs +++ b/Marco.Pms.Services/Controllers/ProjectController.cs @@ -13,7 +13,6 @@ using MarcoBMS.Services.Service; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Logging; namespace MarcoBMS.Services.Controllers { @@ -59,9 +58,9 @@ namespace MarcoBMS.Services.Controllers return Unauthorized(ApiResponse.ErrorResponse("Employee not found.", null, 401)); } - - List projects = await _projectsHelper.GetMyProjects(tenantId, LoggedInEmployee); - + + List projects = await _projectsHelper.GetMyProjects(tenantId, LoggedInEmployee); + // 4. Project projection to ProjectInfoVM // This part is already quite efficient. @@ -84,7 +83,7 @@ namespace MarcoBMS.Services.Controllers return Ok(ApiResponse.SuccessResponse(response, "Success.", 200)); } - + [HttpGet("list")] public async Task GetAll() @@ -573,45 +572,65 @@ namespace MarcoBMS.Services.Controllers } [HttpPost("task")] - public async Task CreateProjectTask(List workItemDot) + public async Task CreateProjectTask(List workItemDtos) { - Guid tenantId = GetTenantId(); - List workItems = new List { }; - string responseMessage = ""; - if (workItemDot != null) - { - foreach (var item in workItemDot) - { - WorkItem workItem = item.ToWorkItemFromWorkItemDto(tenantId); + _logger.LogInfo("CreateProjectTask called with {Count} items", workItemDtos?.Count ?? 0); - if (item.Id != null) - { - //update - _context.WorkItems.Update(workItem); - await _context.SaveChangesAsync(); - responseMessage = "Task Added Successfully"; - } - else - { - //create - _context.WorkItems.Add(workItem); - await _context.SaveChangesAsync(); - responseMessage = "Task Updated Successfully"; - } - var result = new WorkItemVM - { - WorkItemId = workItem.Id, - WorkItem = workItem - }; - workItems.Add(result); - } - var activity = await _context.ActivityMasters.ToListAsync(); - var category = await _context.WorkCategoryMasters.ToListAsync(); - return Ok(ApiResponse.SuccessResponse(workItems, responseMessage, 200)); + // Validate request + if (workItemDtos == null || !workItemDtos.Any()) + { + _logger.LogWarning("No work items provided in the request."); + return BadRequest(ApiResponse.ErrorResponse("Invalid details.", "Work Item details are not valid.", 400)); } - return BadRequest(ApiResponse.ErrorResponse("Invalid details.", "Work Item Details are not valid.", 400)); + Guid tenantId = GetTenantId(); + var workItemsToCreate = new List(); + var workItemsToUpdate = new List(); + var responseList = new List(); + foreach (var itemDto in workItemDtos) + { + var workItem = itemDto.ToWorkItemFromWorkItemDto(tenantId); + + if (itemDto.Id != null && itemDto.Id != Guid.Empty) + { + // Update existing + workItemsToUpdate.Add(workItem); + } + else + { + // Create new + workItem.Id = Guid.NewGuid(); + workItemsToCreate.Add(workItem); + } + + responseList.Add(new WorkItemVM + { + WorkItemId = workItem.Id, + WorkItem = workItem + }); + } + + // Apply DB changes + if (workItemsToCreate.Any()) + { + _logger.LogInfo("Adding {Count} new work items", workItemsToCreate.Count); + await _context.WorkItems.AddRangeAsync(workItemsToCreate); + } + + if (workItemsToUpdate.Any()) + { + _logger.LogInfo("Updating {Count} existing work items", workItemsToUpdate.Count); + _context.WorkItems.UpdateRange(workItemsToUpdate); + } + + await _context.SaveChangesAsync(); + + _logger.LogInfo("CreateProjectTask completed successfully. Created: {Created}, Updated: {Updated}", workItemsToCreate.Count, workItemsToUpdate.Count); + + string responseMessage = $"{(workItemsToCreate.Any() ? "Task(s) created" : "")}{(workItemsToUpdate.Any() ? (workItemsToCreate.Any() ? " and " : "") + "updated" : "")} successfully."; + + return Ok(ApiResponse.SuccessResponse(responseList, responseMessage, 200)); } [HttpDelete("task/{id}")]