using AyCode.Database.DataLayers.Users; using AyCode.Models.Enums; using Microsoft.EntityFrameworkCore.Diagnostics; using TIAM.Database.DbContexts.ServiceProviders; using TIAM.Database.DbSets.Permissions; using TIAM.Database.DbSets.Users; using TIAM.Entities.Permissions; using TIAM.Entities.Products; using TIAM.Entities.ServiceProviders; using TIAM.Entities.Users; namespace TIAM.Database.DataLayers.ServiceProviders; public static class ServiceProviderDalExtension { public static IQueryable GetUserProductMappingsByPermissionGroupId(this ServiceProviderDbContext ctx, Guid permissionGroupId) { return ctx.UserProductMappings .Where(user => ctx.PermissionGroupUserMappings .Where(x => x.PermissionGroupId == permissionGroupId) .Select(x => x.SubjectId) .Contains(user.Id)); } public static IQueryable GetPermissionContextMappingByContextId(this IServiceProviderDbContext ctx, Guid contextId) { var subjectIds = ctx.GetUserProductMappingsByProductId(contextId).Select(x => x.Id). Concat(ctx.PermissionGroups.Where(x => x.OwnerId == contextId).Select(x => x.Id)).ToHashSet(); return ctx.GetPermissionContextMappingsBySubjectIds(subjectIds); } public static void CleanUpAndRemoveUserProductMappings(this IServiceProviderDbContext ctx, IEnumerable userProductMappings) { foreach (var userProductMapping in userProductMappings) { ctx.CleanUpAndRemoveAssignedUser(userProductMapping); } } public static void CleanUpAndRemoveAssignedUser(this IServiceProviderDbContext ctx, UserProductMapping userProductMapping) { ctx.RemoveContextMappingBySubjectId(userProductMapping.Id); ctx.RemoveAssingedUserFromPermissionGroups(userProductMapping.Id); ctx.UserProductMappings.Remove(userProductMapping); } public static bool CleanUpAndRemoveUserProductMappings(this IServiceProviderDbContext ctx, Guid userProductMappingId) { var userProductMapping = ctx.GetUserProductMappingById(userProductMappingId); if (userProductMapping == null) return false; ctx.CleanUpAndRemoveAssignedUser(userProductMapping); return true; } public static bool CreateAssignedUser(this IServiceProviderDbContext ctx, UserProductMapping userProductMapping) { if (userProductMapping == null) return false; ctx.UserProductMappings.Add(userProductMapping); return true; } public static UserProductMapping UpdateUserProductMapping(this IServiceProviderDbContext context, UserProductMapping userProductMapping) { if(userProductMapping == null) return null; var existingUserProductMapping = context.UserProductMappings.FirstOrDefault(u => u.Id == userProductMapping.Id); if (existingUserProductMapping == null) return null; existingUserProductMapping.Id = userProductMapping.Id; existingUserProductMapping.UserId = userProductMapping.UserId; existingUserProductMapping.ProductId = userProductMapping.ProductId; return existingUserProductMapping; } public static bool CreateProduct(this IServiceProviderDbContext ctx, TiamProduct myproduct) { if (myproduct == null) return false; //Automatically add assigneduser for owner TiamServiceProvider? productOwner = ctx.ServiceProviders.FirstOrDefault(x => x.Id == myproduct.OwnerId); if(productOwner == null) return false; var userProductMapping = new UserProductMapping(myproduct.Id, productOwner.OwnerId); ctx.CreateAssignedUser(userProductMapping); ctx.Products.Add(myproduct); return true; } public static TiamProduct UpdateProduct(this IServiceProviderDbContext ctx, TiamProduct product) { if (product == null) return null; var existingProduct = ctx.Products.FirstOrDefault(u => u.Id == product.Id); if (existingProduct == null) return null; existingProduct.Name = product.Name; existingProduct.OwnerId = product.OwnerId; existingProduct.Description = product.Description; existingProduct.Price = product.Price; existingProduct.JsonDetails = product.JsonDetails; existingProduct.UserMediaId = product.UserMediaId; existingProduct.ProductType = product.ProductType; return existingProduct; } public static void DeleteProductById(this IServiceProviderDbContext ctx, Guid productId) { var product = ctx.Products.FirstOrDefault(u => u.Id == productId); if (product == null) return; ctx.CleanUpAndRemoveUserProductMappings(ctx.GetUserProductMappingsByProductId(productId)); ctx.Products.Remove(product); } public static bool CreatePermissionGroup(this IServiceProviderDbContext ctx, PermissionGroup permissionGroup) { if (permissionGroup == null) return false; ctx.PermissionGroups.Add(permissionGroup); return true; } public static bool CreatePermissionContextMapping(this IServiceProviderDbContext ctx, PermissionContextMapping permissionContextMapping) { if (permissionContextMapping == null) return false; ctx.PermissionContextMappings.Add(permissionContextMapping); return true; } public static bool CreatePermissionGroupUserMapping(this IServiceProviderDbContext ctx, PermissionGroupUserMapping permissionGroupUserMapping) { if (permissionGroupUserMapping == null) return false; ctx.PermissionGroupUserMappings.Add(permissionGroupUserMapping); return true; } public static bool CreatePermissionsType(this IServiceProviderDbContext ctx, PermissionsType permissionType) { if (permissionType == null) return false; ctx.PermissionsTypes.Add(permissionType); return true; } public static TiamServiceProvider CreateServiceProvider(this IServiceProviderDbContext ctx, TiamServiceProvider serviceProvider) { if (serviceProvider == null) return null; ctx.ServiceProviders.Add(serviceProvider); var userProductMapping = new UserProductMapping(serviceProvider.Id, serviceProvider.OwnerId); ctx.CreateAssignedUser(userProductMapping); return serviceProvider; } public static TiamServiceProvider UpdateServiceProvider(this IServiceProviderDbContext ctx, TiamServiceProvider serviceProvider) { if (serviceProvider == null) return null; var existingServiceProvider = ctx.ServiceProviders.FirstOrDefault(u => u.Id == serviceProvider.Id); if (existingServiceProvider == null) return null; existingServiceProvider.Name = serviceProvider.Name; existingServiceProvider.OwnerId = serviceProvider.OwnerId; return existingServiceProvider; } }