TourIAm/TIAM.Database/DataLayers/ServiceProviders/ServiceProviderDalExtension.cs

109 lines
4.9 KiB
C#

using AyCode.Database.DataLayers.Users;
using AyCode.Models.Enums;
using TIAM.Database.DbContexts;
using TIAM.Entities.Permissions;
using TIAM.Entities.Users;
namespace TIAM.Database.DataLayers.ServiceProviders;
public static class ServiceProviderDalExtension
{
public static IQueryable<AssignedUser> GetAssignedUsersByPermissionGroupId(this ServiceProviderDbContext ctx, Guid permissionGroupId)
{
return ctx.AssignedUsers
.Where(user => ctx.PermissionGroupUserMappings
.Where(x => x.PermissionGroupId == permissionGroupId)
.Select(x => x.AssignedUserId)
.Contains(user.Id));
}
//public static IQueryable<PermissionGroup> GetPermissionGroupByContextMapping(this ServiceProviderDbContext ctx, PermissionContextMapping permissionContextMapping)
//{
// if (permissionContextMapping.SubjectType == PermissionContextMappingSubjectType.Group)
// return ctx.PermissionGroups.Where(x => x.Id == permissionContextMapping.SubjectId);
// else if (permissionContextMapping.SubjectType == PermissionContextMappingSubjectType.User)
// return ctx.PermissionGroups.Where(x => x.Id == permissionContextMapping.SubjectId);
//}
public static IQueryable<PermissionContextMapping> GetPermissionContextMappingByContextId(this ServiceProviderDbContext ctx, Guid contextId)
{
var subjectIds = ctx.GetAssignedUsersByContextId(contextId).Select(x => x.Id).
Concat(ctx.PermissionGroups.Where(x => x.ContextId == contextId).Select(x => x.Id)).ToHashSet();
return ctx.GetPermissionContextMappingsBySubjectIds(subjectIds);
}
//public static IQueryable<PermissionContextMapping> GetPermissionContextMappingByAssignedUserId(this ServiceProviderDbContext ctx, Guid assignedUserId)
//{
// var subjectIds = ctx.GetAssignedUsersByContextId(assignedUserId).Select(x => x.Id).
// Concat(ctx.PermissionGroupUserMappings.Where(x => x.AssignedUserId == assignedUserId).Select(x => x.)).ToHashSet();
// return ctx.GetPermissionContextMappingsBySubjectIds(subjectIds);
//}
public static IQueryable<PermissionContextMapping> GetPermissionContextMappingsBySubjectIds(this ServiceProviderDbContext ctx, IEnumerable<Guid> subjectIds)
=> ctx.PermissionContextMappings.Where(x => subjectIds.Contains(x.SubjectId));
public static PermissionContextMapping? GetPermissionContextMappingBySubjectId(this ServiceProviderDbContext ctx, Guid subjectId)
=> ctx.PermissionContextMappings.FirstOrDefault(x => x.SubjectId == subjectId);
public static void RemoveContextMappingBySubjectId(this ServiceProviderDbContext ctx, Guid subjectId)
{
var contextMapping = ctx.GetPermissionContextMappingBySubjectId(subjectId);
if (contextMapping == null) return;
ctx.PermissionContextMappings.Remove(contextMapping);
}
public static IQueryable<PermissionGroupUserMapping> GetAllPermissionGroupsByAssignedUserId(this ServiceProviderDbContext ctx, Guid assignedUserId)
=> ctx.PermissionGroupUserMappings.Where(x => x.AssignedUserId == assignedUserId);
public static void DeleteProductById(this ServiceProviderDbContext ctx, Guid productId)
{
var product = ctx.Products.FirstOrDefault(u => u.Id == productId);
if (product == null) return;
ctx.RemoveAssignedUsers(ctx.GetAssignedUsersByContextId(productId));
ctx.Products.Remove(product);
}
public static void RemoveAssingedUserFromPermissionGroups(this ServiceProviderDbContext ctx, Guid assignedUserId)
{
ctx.PermissionGroupUserMappings.RemoveRange(ctx.GetAllPermissionGroupsByAssignedUserId(assignedUserId));
}
public static void RemoveAssignedUsers(this ServiceProviderDbContext ctx, IEnumerable<AssignedUser> assignedUsers)
{
foreach (var assignedUser in assignedUsers)
{
ctx.CleanUpAndRemoveAssignedUser(assignedUser);
}
}
public static void CleanUpAndRemoveAssignedUser(this ServiceProviderDbContext ctx, AssignedUser assignedUser)
{
ctx.RemoveContextMappingBySubjectId(assignedUser.Id);
ctx.RemoveAssingedUserFromPermissionGroups(assignedUser.Id);
ctx.AssignedUsers.Remove(assignedUser);
}
public static bool RemoveAssignedUserById(this ServiceProviderDbContext ctx, Guid assignedUserId)
{
var assignedUser = ctx.GetAssignedUserById(assignedUserId);
if (assignedUser == null) return false;
ctx.CleanUpAndRemoveAssignedUser(assignedUser);
return true;
}
public static AssignedUser? GetAssignedUserById(this ServiceProviderDbContext ctx, Guid assignedUserId)
=> ctx.AssignedUsers.FirstOrDefault(x => x.Id == assignedUserId);
public static IQueryable<AssignedUser> GetAssignedUsersByContextId(this ServiceProviderDbContext ctx, Guid contextId)
=> ctx.AssignedUsers.Where(x => x.ContextId == contextId);
}