diff --git a/Marco.Pms.Services/Controllers/OrganizationController.cs b/Marco.Pms.Services/Controllers/OrganizationController.cs index 796e1ee..af98d12 100644 --- a/Marco.Pms.Services/Controllers/OrganizationController.cs +++ b/Marco.Pms.Services/Controllers/OrganizationController.cs @@ -12,6 +12,7 @@ using Marco.Pms.Model.ViewModels.Projects; using Marco.Pms.Services.Service; using MarcoBMS.Services.Helpers; using MarcoBMS.Services.Service; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; @@ -21,6 +22,7 @@ namespace Marco.Pms.Services.Controllers { [Route("api/[controller]")] [ApiController] + [Authorize] public class OrganizationController : ControllerBase { private readonly IDbContextFactory _dbContextFactory; @@ -109,7 +111,7 @@ namespace Marco.Pms.Services.Controllers #region =================================================================== Post Functions =================================================================== [HttpPost("create")] - public async Task CreateServiceProviderAsync([FromBody] CreateOrganizationDto model) + public async Task CreateOrganizationAsync([FromBody] CreateOrganizationDto model) { await using var _context = await _dbContextFactory.CreateDbContextAsync(); using var scope = _serviceScope.CreateScope(); @@ -238,7 +240,7 @@ namespace Marco.Pms.Services.Controllers } [HttpPost("assign/project")] - public async Task AssignServiceProviderToProjectAsync([FromBody] AssignOrganizationDto model) + public async Task AssignOrganizationToProjectAsync([FromBody] AssignOrganizationDto model) { await using var _context = await _dbContextFactory.CreateDbContextAsync(); using var scope = _serviceScope.CreateScope(); @@ -426,6 +428,70 @@ namespace Marco.Pms.Services.Controllers return StatusCode(500, ApiResponse.ErrorResponse("Internal error", "An internal exception has been occured", 500)); } } + + [HttpPost("assign/tenant/{organizationId}")] + public async Task AssignOrganizationToTenantAsync(Guid organizationId) + { + await using var _context = await _dbContextFactory.CreateDbContextAsync(); + using var scope = _serviceScope.CreateScope(); + await using var transaction = await _context.Database.BeginTransactionAsync(); + try + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + var serviceProviderTenantMappingTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.TenantOrgMappings + .FirstOrDefaultAsync(spt => spt.OrganizationId == organizationId && spt.TenantId == tenantId && spt.IsActive); + }); + + var organizationTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.Organizations + .FirstOrDefaultAsync(o => o.Id == organizationId); + }); + + await Task.WhenAll(serviceProviderTenantMappingTask, organizationTask); + + var serviceProviderTenantMapping = serviceProviderTenantMappingTask.Result; + var organization = organizationTask.Result; + + if (organization == null) + { + return NotFound(ApiResponse.ErrorResponse("Organization not found", "Organization not found in database", 404)); + } + + if (serviceProviderTenantMapping == null) + { + var newServiceProviderTenantMapping = new TenantOrgMapping + { + OrganizationId = organization.Id, + SPRID = organization.SPRID, + AssignedDate = DateTime.UtcNow, + IsActive = true, + TenantId = tenantId + }; + _context.TenantOrgMappings.Add(newServiceProviderTenantMapping); + await _context.SaveChangesAsync(); + } + var response = _mapper.Map(organization); + return Ok(ApiResponse.SuccessResponse(response, "Organization has been assigned to tenant", 200)); + } + catch (DbUpdateException dbEx) + { + await transaction.RollbackAsync(); + + _logger.LogError(dbEx, "Database Exception has been occured, While assigning the organization to project"); + return StatusCode(500, ApiResponse.ErrorResponse("Internal error", "An database exception has been occured", 500)); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception has been occured, While assigned the organizatio to project"); + return StatusCode(500, ApiResponse.ErrorResponse("Internal error", "An internal exception has been occured", 500)); + } + } #endregion #region =================================================================== Put Functions ===================================================================