marco.pms.api/Marco.Pms.Services/Controllers/OrganizationController.cs

197 lines
10 KiB
C#

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<ApplicationDbContext> _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<ApplicationDbContext> 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<IActionResult> 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<IActionResult> 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<IActionResult> 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<IActionResult> 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<IActionResult> 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<IActionResult> 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<IActionResult> ManageOrganizationHierarchy(Guid employeeId, [FromBody] List<OrganizationHierarchyDto> 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<IActionResult> 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<IActionResult> 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<object>.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<object>.ErrorResponse("Service Provider not Found", "Service Provider not Found in database", 404));
// }
// if (serviceProvider.IsActive == active)
// {
// return BadRequest(ApiResponse<object>.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<object>.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<object>.SuccessResponse(new { }, $"Service Provider is {message}d", 200));
//}
#endregion
}
}