using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Dtos.Organization; using Marco.Pms.Services.Service.ServiceInterfaces; using MarcoBMS.Services.Helpers; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace Marco.Pms.Services.Controllers { [Route("api/[controller]")] [ApiController] [Authorize] public class OrganizationController : ControllerBase { private readonly IDbContextFactory _dbContextFactory; private readonly IServiceScopeFactory _serviceScope; private readonly IOrganizationService _organizationService; private readonly UserHelper _userHelper; private readonly ISignalRService _signalR; private readonly Guid tenantId; private readonly Guid loggedOrganizationId; public OrganizationController(IDbContextFactory dbContextFactory, IServiceScopeFactory serviceScope, IOrganizationService organizationService, ISignalRService signalR, UserHelper userHelper) { _dbContextFactory = dbContextFactory ?? throw new ArgumentNullException(nameof(dbContextFactory)); _serviceScope = serviceScope ?? throw new ArgumentNullException(nameof(serviceScope)); _organizationService = organizationService ?? throw new ArgumentNullException(nameof(organizationService)); _signalR = signalR ?? throw new ArgumentNullException(nameof(signalR)); _userHelper = userHelper ?? throw new ArgumentNullException(nameof(userHelper)); loggedOrganizationId = _userHelper.GetCurrentOrganizationId(); tenantId = userHelper.GetTenantId(); } #region =================================================================== Get Functions =================================================================== [HttpGet("list")] public async Task GetOrganizarionList([FromQuery] string? searchString, [FromQuery] double? sprid, [FromQuery] bool active = true, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 20) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _organizationService.GetOrganizarionListAsync(searchString, sprid, active, pageNumber, pageSize, loggedInEmployee, tenantId, loggedOrganizationId); return StatusCode(response.StatusCode, response); } [HttpGet("details/{id}")] public async Task GetOrganizationDetails(Guid id) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _organizationService.GetOrganizationDetailsAsync(id, loggedInEmployee, tenantId, loggedOrganizationId); return StatusCode(response.StatusCode, response); } [HttpGet("hierarchy/list/{employeeId}")] public async Task GetOrganizationHierarchyList(Guid employeeId) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _organizationService.GetOrganizationHierarchyListAsync(employeeId, loggedInEmployee, tenantId, loggedOrganizationId); return StatusCode(response.StatusCode, response); } #endregion #region =================================================================== Post Functions =================================================================== [HttpPost("create")] public async Task CreateOrganization([FromBody] CreateOrganizationDto model) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _organizationService.CreateOrganizationAsync(model, loggedInEmployee, tenantId, loggedOrganizationId); if (response.Success) { var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Organization_Management", Response = response.Data }; await _signalR.SendNotificationAsync(notification); } return StatusCode(response.StatusCode, response); } [HttpPost("assign/project")] public async Task AssignOrganizationToProject([FromBody] AssignOrganizationDto model) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _organizationService.AssignOrganizationToProjectAsync(model, loggedInEmployee, tenantId, loggedOrganizationId); if (response.Success) { var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Organization_Management", Response = response.Data }; await _signalR.SendNotificationAsync(notification); } return StatusCode(response.StatusCode, response); } [HttpPost("assign/tenant/{organizationId}")] public async Task AssignOrganizationToTenantAsync(Guid organizationId) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _organizationService.AssignOrganizationToTenantAsync(organizationId, loggedInEmployee, tenantId, loggedOrganizationId); if (response.Success) { var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Organization_Management", Response = response.Data }; await _signalR.SendNotificationAsync(notification); } return StatusCode(response.StatusCode, response); } [HttpPost("hierarchy/manage/{employeeId}")] public async Task ManageOrganizationHierarchy(Guid employeeId, [FromBody] List model) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _organizationService.ManageOrganizationHierarchyAsync(employeeId, model, loggedInEmployee, tenantId, loggedOrganizationId); if (response.Success) { var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Organization_Hierarchy", Response = response.Data }; await _signalR.SendNotificationAsync(notification); } return StatusCode(response.StatusCode, response); } #endregion #region =================================================================== Put Functions =================================================================== [HttpPut("edit/{id}")] public async Task UpdateOrganiation(Guid id, [FromBody] UpdateOrganizationDto model) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _organizationService.UpdateOrganiationAsync(id, model, loggedInEmployee, tenantId, loggedOrganizationId); if (response.Success) { var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Organization_Management", Response = response.Data }; await _signalR.SendNotificationAsync(notification); } return StatusCode(response.StatusCode, response); } #endregion #region =================================================================== Delete Functions =================================================================== //[HttpDelete("delete/{id}")] //public async Task DeleteServiceProviderAsync(Guid id, [FromQuery] bool active) //{ // await using var _context = await _dbContextFactory.CreateDbContextAsync(); // using var scope = _serviceScope.CreateScope(); // var message = active ? "Restore" : "Delete"; // var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); // var client = await _context.Clients.FirstOrDefaultAsync(c => c.PrimaryEmployeeId == loggedInEmployee.Id && c.TenantId == tenantId); // if (!(loggedInEmployee.ApplicationUser?.IsRootUser ?? false) && !loggedInEmployee.IsPrimary && client == null) // { // return StatusCode(403, ApiResponse.ErrorResponse("Access Denied", $"You do not have permission to {message}d service provider.", 403)); // } // var serviceProvider = await _context.ServiceProviders.FirstOrDefaultAsync(sp => sp.Id == id); // if (serviceProvider == null) // { // return NotFound(ApiResponse.ErrorResponse("Service Provider not Found", "Service Provider not Found in database", 404)); // } // if (serviceProvider.IsActive == active) // { // return BadRequest(ApiResponse.ErrorResponse($"Service Provider is already {message}d", $"Service Provider is already {message}d", 400)); // } // var employeeIds = await _context.Employees.Where(e => e.ServiceProviderId == id).Select(e => e.Id).ToListAsync(); // var isPendingTask = await _context.TaskMembers.AnyAsync(tm => employeeIds.Contains(tm.EmployeeId)); // if (isPendingTask && !active) // { // return BadRequest(ApiResponse.ErrorResponse("There is an unfinshed task, Service provider cannot be deleted", "There is an unfinshed task, Service provider cannot be deleted", 400)); // } // serviceProvider.IsActive = active; // if (!active) // { // var servicePeroviderTenant = await _context.ServiceProviderTenantMappings.AsNoTracking().Where(spt => spt.ServiceProviderId == id && spt.IsActive).ToListAsync(); // var newServiceProviderTenant = servicePeroviderTenant.Select(spt => // { // spt.IsActive = false; // return spt; // }).ToList(); // _context.ServiceProviderTenantMappings.UpdateRange(newServiceProviderTenant); // } // await _context.SaveChangesAsync(); // return Ok(ApiResponse.SuccessResponse(new { }, $"Service Provider is {message}d", 200)); //} #endregion } }