Compare commits
2 Commits
main
...
Ashutosh_A
Author | SHA1 | Date | |
---|---|---|---|
2a25bbae82 | |||
2041f99ac5 |
@ -212,27 +212,6 @@ namespace Marco.Pms.Helpers.CacheHelper
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
public async Task<bool> ClearAllEmployeesFromCacheByOnlyEmployeeId(Guid employeeId)
|
|
||||||
{
|
|
||||||
var employeeIdString = employeeId.ToString();
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var filter = Builders<EmployeePermissionMongoDB>.Filter.Eq(e => e.Id, employeeIdString);
|
|
||||||
|
|
||||||
var result = await _collection.DeleteManyAsync(filter);
|
|
||||||
|
|
||||||
if (result.DeletedCount == 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogError(ex, "Error occured while deleting employee profile");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public async Task<bool> ClearAllEmployeesFromCacheByTenantId(Guid tenantId)
|
public async Task<bool> ClearAllEmployeesFromCacheByTenantId(Guid tenantId)
|
||||||
{
|
{
|
||||||
var tenantIdString = tenantId.ToString();
|
var tenantIdString = tenantId.ToString();
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
public class CreateWorkStatusMasterDto
|
public class CreateWorkStatusMasterDto
|
||||||
{
|
{
|
||||||
public required string Name { get; set; }
|
public string? Name { get; set; }
|
||||||
public required string Description { get; set; }
|
public string? Description { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
public class UpdateWorkStatusMasterDto
|
public class UpdateWorkStatusMasterDto
|
||||||
{
|
{
|
||||||
public Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
public required string Name { get; set; }
|
public string? Name { get; set; }
|
||||||
public required string Description { get; set; }
|
public string? Description { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
public class CreateContactCategoryDto
|
public class CreateContactCategoryDto
|
||||||
{
|
{
|
||||||
public required string Name { get; set; }
|
public string? Name { get; set; }
|
||||||
public required string Description { get; set; }
|
public string? Description { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
public class CreateContactTagDto
|
public class CreateContactTagDto
|
||||||
{
|
{
|
||||||
public required string Name { get; set; }
|
public string? Name { get; set; }
|
||||||
public required string Description { get; set; }
|
public string? Description { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
{
|
{
|
||||||
public class UpdateContactCategoryDto
|
public class UpdateContactCategoryDto
|
||||||
{
|
{
|
||||||
public required Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
public required string Name { get; set; }
|
public string? Name { get; set; }
|
||||||
public required string Description { get; set; }
|
public string? Description { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
public class UpdateContactTagDto
|
public class UpdateContactTagDto
|
||||||
{
|
{
|
||||||
public Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
public required string Name { get; set; }
|
public string? Name { get; set; }
|
||||||
public required string Description { get; set; }
|
public string? Description { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,6 @@ using Marco.Pms.Model.Employees;
|
|||||||
using Marco.Pms.Model.Entitlements;
|
using Marco.Pms.Model.Entitlements;
|
||||||
using Marco.Pms.Model.Utilities;
|
using Marco.Pms.Model.Utilities;
|
||||||
using Marco.Pms.Model.ViewModels.Tenant;
|
using Marco.Pms.Model.ViewModels.Tenant;
|
||||||
using Marco.Pms.Services.Helpers;
|
|
||||||
using MarcoBMS.Services.Helpers;
|
using MarcoBMS.Services.Helpers;
|
||||||
using MarcoBMS.Services.Service;
|
using MarcoBMS.Services.Service;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
@ -1470,9 +1469,6 @@ namespace MarcoBMS.Services.Controllers
|
|||||||
// Generate and store refresh token
|
// Generate and store refresh token
|
||||||
var refreshToken = await _refreshTokenService.CreateRefreshToken(loggedInEmployee.ApplicationUserId, tenantId.ToString(), loggedInEmployee.OrganizationId, _jwtSettings);
|
var refreshToken = await _refreshTokenService.CreateRefreshToken(loggedInEmployee.ApplicationUserId, tenantId.ToString(), loggedInEmployee.OrganizationId, _jwtSettings);
|
||||||
|
|
||||||
var _cache = scope.ServiceProvider.GetRequiredService<CacheUpdateHelper>();
|
|
||||||
await _cache.ClearAllEmployeesFromCacheByOnlyEmployeeId(loggedInEmployee.Id);
|
|
||||||
|
|
||||||
_logger.LogInfo("Tenant selected and tokens generated for TenantId: {TenantId} and Employee: {EmployeeEmail}", tenantId, loggedInEmployee.Email ?? string.Empty);
|
_logger.LogInfo("Tenant selected and tokens generated for TenantId: {TenantId} and Employee: {EmployeeEmail}", tenantId, loggedInEmployee.Email ?? string.Empty);
|
||||||
|
|
||||||
// Return success response including tokens
|
// Return success response including tokens
|
||||||
|
@ -560,13 +560,6 @@ namespace MarcoBMS.Services.Controllers
|
|||||||
var response = await _projectServices.GetAssignedOrganizationsToProjectAsync(projectId, tenantId, loggedInEmployee);
|
var response = await _projectServices.GetAssignedOrganizationsToProjectAsync(projectId, tenantId, loggedInEmployee);
|
||||||
return StatusCode(response.StatusCode, response);
|
return StatusCode(response.StatusCode, response);
|
||||||
}
|
}
|
||||||
[HttpGet("get/assigned/organization/dropdown/{projectId}")]
|
|
||||||
public async Task<IActionResult> GetAssignedOrganizationsToProjectForDropdownAsync(Guid projectId)
|
|
||||||
{
|
|
||||||
Employee loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
|
||||||
var response = await _projectServices.GetAssignedOrganizationsToProjectForDropdownAsync(projectId, tenantId, loggedInEmployee);
|
|
||||||
return StatusCode(response.StatusCode, response);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
@ -956,17 +956,6 @@ namespace Marco.Pms.Services.Helpers
|
|||||||
_logger.LogError(ex, "Error occured while deleting all employees from Cache");
|
_logger.LogError(ex, "Error occured while deleting all employees from Cache");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public async Task ClearAllEmployeesFromCacheByOnlyEmployeeId(Guid employeeId)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var response = await _employeeCache.ClearAllEmployeesFromCacheByOnlyEmployeeId(employeeId);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogError(ex, "Error occured while deleting all employees from Cache");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public async Task ClearAllEmployeesFromCacheByTenantId(Guid tenantId)
|
public async Task ClearAllEmployeesFromCacheByTenantId(Guid tenantId)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@ -379,27 +379,6 @@ namespace Marco.Pms.Services.MappingProfiles
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region ======================================================= Contact Category Master =======================================================
|
|
||||||
CreateMap<CreateContactCategoryDto, ContactCategoryMaster>();
|
|
||||||
CreateMap<UpdateContactCategoryDto, ContactCategoryMaster>();
|
|
||||||
CreateMap<ContactCategoryMaster, ContactCategoryVM>();
|
|
||||||
#endregion
|
|
||||||
#region ======================================================= Contact Tag Master =======================================================
|
|
||||||
CreateMap<CreateContactTagDto, ContactTagMaster>();
|
|
||||||
CreateMap<UpdateContactTagDto, ContactTagMaster>();
|
|
||||||
CreateMap<ContactTagMaster, ContactTagVM>();
|
|
||||||
#endregion
|
|
||||||
#region ======================================================= Expenses Status Master =======================================================
|
|
||||||
#endregion
|
|
||||||
#region ======================================================= Expenses Status Master =======================================================
|
|
||||||
#endregion
|
|
||||||
#region ======================================================= Expenses Status Master =======================================================
|
|
||||||
#endregion
|
|
||||||
#region ======================================================= Expenses Status Master =======================================================
|
|
||||||
#endregion
|
|
||||||
#region ======================================================= Expenses Status Master =======================================================
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region ======================================================= Document =======================================================
|
#region ======================================================= Document =======================================================
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
using Marco.Pms.CacheHelper;
|
|
||||||
using FirebaseAdmin;
|
using FirebaseAdmin;
|
||||||
using Google.Apis.Auth.OAuth2;
|
using Google.Apis.Auth.OAuth2;
|
||||||
|
using Marco.Pms.CacheHelper;
|
||||||
using Marco.Pms.DataAccess.Data;
|
using Marco.Pms.DataAccess.Data;
|
||||||
using Marco.Pms.Helpers;
|
using Marco.Pms.Helpers;
|
||||||
using Marco.Pms.Helpers.CacheHelper;
|
using Marco.Pms.Helpers.CacheHelper;
|
||||||
@ -65,7 +65,9 @@ builder.Services.AddCors(options =>
|
|||||||
{
|
{
|
||||||
policy.WithOrigins(allowedOrigins)
|
policy.WithOrigins(allowedOrigins)
|
||||||
.AllowAnyMethod()
|
.AllowAnyMethod()
|
||||||
.AllowAnyHeader();
|
.AllowAnyHeader()
|
||||||
|
.WithExposedHeaders("Authorization")
|
||||||
|
.AllowCredentials();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
#endregion
|
#endregion
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -2805,128 +2805,6 @@ namespace Marco.Pms.Services.Service
|
|||||||
return ApiResponse<object>.ErrorResponse("Internal error", "An internal exception occurred", 500);
|
return ApiResponse<object>.ErrorResponse("Internal error", "An internal exception occurred", 500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public async Task<ApiResponse<object>> GetAssignedOrganizationsToProjectForDropdownAsync(Guid projectId, Guid tenantId, Employee loggedInEmployee)
|
|
||||||
{
|
|
||||||
_logger.LogDebug("Started fetching assigned organizations for ProjectId: {ProjectId} and TenantId: {TenantId} by user {UserId}",
|
|
||||||
projectId, tenantId, loggedInEmployee.Id);
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// Create a scoped PermissionServices instance for permission checks
|
|
||||||
using var scope = _serviceScopeFactory.CreateScope();
|
|
||||||
var permissionService = scope.ServiceProvider.GetRequiredService<PermissionServices>();
|
|
||||||
|
|
||||||
// Retrieve the project by projectId and tenantId
|
|
||||||
var projectTask = Task.Run(async () =>
|
|
||||||
{
|
|
||||||
await using var context = await _dbContextFactory.CreateDbContextAsync();
|
|
||||||
return await context.Projects.AsNoTracking().Include(p => p.Promoter).Include(p => p.PMC).FirstOrDefaultAsync(p => p.Id == projectId && p.TenantId == tenantId);
|
|
||||||
});
|
|
||||||
|
|
||||||
var tenantTask = Task.Run(async () =>
|
|
||||||
{
|
|
||||||
await using var context = await _dbContextFactory.CreateDbContextAsync();
|
|
||||||
return await context.Tenants.AsNoTracking().Include(t => t.Organization).FirstOrDefaultAsync(t => t.Id == tenantId);
|
|
||||||
});
|
|
||||||
var projectServiceTask = Task.Run(async () =>
|
|
||||||
{
|
|
||||||
await using var context = await _dbContextFactory.CreateDbContextAsync();
|
|
||||||
return await context.ProjectServiceMappings
|
|
||||||
.AsNoTracking()
|
|
||||||
.Include(ps => ps!.Service)
|
|
||||||
.Where(ps => ps.ProjectId == projectId && ps.TenantId == tenantId).ToListAsync();
|
|
||||||
});
|
|
||||||
|
|
||||||
await Task.WhenAll(projectTask, tenantTask, projectServiceTask);
|
|
||||||
|
|
||||||
var project = projectTask.Result;
|
|
||||||
var tenant = tenantTask.Result;
|
|
||||||
var projectService = projectServiceTask.Result;
|
|
||||||
|
|
||||||
if (project == null || tenant == null)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("Project {ProjectId} not found in database for tenant {TenantId}", projectId, tenantId);
|
|
||||||
return ApiResponse<object>.ErrorResponse("Project not found", "Project not found", 404);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the logged in employee has permission to access the project
|
|
||||||
var hasPermission = await permissionService.HasProjectPermission(loggedInEmployee, projectId);
|
|
||||||
if (!hasPermission)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("Access denied for user {UserId} on project {ProjectId}", loggedInEmployee.Id, projectId);
|
|
||||||
return ApiResponse<object>.ErrorResponse("Access Denied", "You do not have permission to access this project.", 403);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fetch all project-organization mappings with related service and organization data
|
|
||||||
var projectOrgMappingsQuery = _context.ProjectOrgMappings
|
|
||||||
.AsNoTracking()
|
|
||||||
.Include(po => po.ProjectService)
|
|
||||||
.ThenInclude(ps => ps!.Service)
|
|
||||||
.Include(po => po.AssignedBy)
|
|
||||||
.Include(po => po.OrganizationType)
|
|
||||||
.Include(po => po.Organization)
|
|
||||||
.Where(po => po.ProjectService != null
|
|
||||||
&& po.ProjectService.ProjectId == projectId
|
|
||||||
&& po.TenantId == tenantId);
|
|
||||||
|
|
||||||
if (loggedInEmployee.OrganizationId != project.PMCId && loggedInEmployee.OrganizationId != project.PromoterId && loggedInEmployee.OrganizationId != tenant.OrganizationId)
|
|
||||||
{
|
|
||||||
projectOrgMappingsQuery = projectOrgMappingsQuery.Where(po => po.ParentOrganizationId == loggedInEmployee.OrganizationId || po.OrganizationId == loggedInEmployee.OrganizationId);
|
|
||||||
}
|
|
||||||
|
|
||||||
var projectOrgMappings = await projectOrgMappingsQuery
|
|
||||||
.Distinct()
|
|
||||||
.ToListAsync();
|
|
||||||
var organizations = projectOrgMappings.Select(po => po.Organization!).ToList();
|
|
||||||
|
|
||||||
if (loggedInEmployee.OrganizationId == project.PMCId || loggedInEmployee.OrganizationId == project.PromoterId || loggedInEmployee.OrganizationId == tenant.OrganizationId)
|
|
||||||
{
|
|
||||||
var pmc = project.PMC;
|
|
||||||
var promoter = project.Promoter;
|
|
||||||
var organization = tenant.Organization;
|
|
||||||
|
|
||||||
if (!organizations.Any(r => r.Id == project.PMCId) && pmc != null)
|
|
||||||
{
|
|
||||||
organizations.Add(pmc);
|
|
||||||
}
|
|
||||||
if (!organizations.Any(r => r.Id == project.PromoterId) && promoter != null)
|
|
||||||
{
|
|
||||||
organizations.Add(promoter);
|
|
||||||
}
|
|
||||||
if (!organizations.Any(r => r.Id == tenant.OrganizationId) && organization != null)
|
|
||||||
{
|
|
||||||
organizations.Add(organization);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
organizations = organizations.DistinctBy(o => o.Id).ToList();
|
|
||||||
|
|
||||||
// Filter and map the data to the desired view model
|
|
||||||
var response = organizations
|
|
||||||
.Select(o => new ProjectOrganizationVM
|
|
||||||
{
|
|
||||||
Id = o.Id,
|
|
||||||
Name = o.Name,
|
|
||||||
SPRID = 0
|
|
||||||
})
|
|
||||||
.ToList();
|
|
||||||
|
|
||||||
_logger.LogInfo("Fetched {Count} assigned organizations for ProjectId: {ProjectId}", response.Count, projectId);
|
|
||||||
|
|
||||||
return ApiResponse<object>.SuccessResponse(response, "Successfully fetched the list of organizations assigned to the project", 200);
|
|
||||||
}
|
|
||||||
catch (DbUpdateException dbEx)
|
|
||||||
{
|
|
||||||
_logger.LogError(dbEx, "Database exception while fetching assigned organizations for ProjectId: {ProjectId}", projectId);
|
|
||||||
return ApiResponse<object>.ErrorResponse("Internal error", "A database exception occurred", 500);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogError(ex, "Unhandled exception while fetching assigned organizations for ProjectId: {ProjectId}", projectId);
|
|
||||||
return ApiResponse<object>.ErrorResponse("Internal error", "An internal exception occurred", 500);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -49,7 +49,6 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces
|
|||||||
Task<ApiResponse<object>> DeassignServiceToProjectAsync(DeassignServiceDto model, Guid tenantId, Employee loggedInEmployee);
|
Task<ApiResponse<object>> DeassignServiceToProjectAsync(DeassignServiceDto model, Guid tenantId, Employee loggedInEmployee);
|
||||||
|
|
||||||
Task<ApiResponse<object>> GetAssignedOrganizationsToProjectAsync(Guid projectId, Guid tenantId, Employee loggedInEmployee);
|
Task<ApiResponse<object>> GetAssignedOrganizationsToProjectAsync(Guid projectId, Guid tenantId, Employee loggedInEmployee);
|
||||||
Task<ApiResponse<object>> GetAssignedOrganizationsToProjectForDropdownAsync(Guid projectId, Guid tenantId, Employee loggedInEmployee);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user