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 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 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 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 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 GetPermissionContextMappingsBySubjectIds(this ServiceProviderDbContext ctx, IEnumerable 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 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 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 GetAssignedUsersByContextId(this ServiceProviderDbContext ctx, Guid contextId) => ctx.AssignedUsers.Where(x => x.ContextId == contextId); }