Add PermissionViewSql; refactoring, improvements, etc...

This commit is contained in:
jozsef.b@aycode.com 2023-12-13 02:26:21 +01:00
parent c896cf8a5c
commit 231119963e
14 changed files with 158 additions and 83 deletions

View File

@ -2,5 +2,7 @@
public enum ProductType : byte
{
NotDefined = 0,
Transfer = 5,
Hotel = 10,
}

View File

@ -8,6 +8,7 @@ using AyCode.Database.DataLayers.Users;
using TIAM.Database.DataLayers.ServiceProviders;
using TIAM.Database.DataLayers.Users;
using TIAM.Database.DbContexts.ServiceProviders;
using TIAM.Database.DbSets.Permissions;
namespace TIAM.Database.Test
{
@ -24,15 +25,52 @@ namespace TIAM.Database.Test
{ }
[TestMethod]
[DataRow("540271F6-C604-4C16-8160-D5A7CAFEDF00")]
public async Task GetPermissionContextMappingByContext_ReturnsPermissionContextMapping_WhenPermissionContextMappingExists(string contextIdString)
[DataRow("42968456-6EF3-4D9C-8BC4-0569A129AC05")]
public void GetPermissionViewBySubjectId_ReturnsPermissionContextMapping_WhenPermissionContextMappingExists(string subjectIdString)
{
var contextId = Guid.Parse(contextIdString);
var subjectId= Guid.Parse(subjectIdString);
var permMapping = await Dal.GetPermissionContextMappingByContextIdAsync(contextId);
//var permMapping = Dal.GetPermissionByContextId(contextId);
var permMapping = Dal.GetPermissionContextsViewBySubjectId(subjectId).ToList();
Assert.IsNotNull(permMapping, "Result is null");
Assert.IsTrue(permMapping.Count > 0, "Result count: 0");
}
[TestMethod]
[DataRow("814b5495-c2e9-4f1d-a73f-37cd5d353078")]
public void GetPermissionViewByContextId_ReturnsPermissionContextMapping_WhenPermissionContextMappingExists(string contextIdString)
{
var contextId = Guid.Parse(contextIdString);
//var permMapping = Dal.GetPermissionByContextId(contextId);
var permMapping = Dal.GetPermissionContextsViewByContextId(contextId).ToList();
Assert.IsNotNull(permMapping, "Result is null");
Assert.IsTrue(permMapping.Count > 0, "Result count: 0");
}
[TestMethod]
[DataRow("814b5495-c2e9-4f1d-a73f-37cd5d353078")]
public async Task GetPermissionContextMappingByContextIdAsync_ReturnsPermissionContextMapping_WhenPermissionContextMappingExists(string contextIdString)
{
var contextId = Guid.Parse(contextIdString);
var permMapping = await Dal.GetPermissionContextsViewByContextIdAsync(contextId);
Assert.IsNotNull(permMapping, "Result is null");
Assert.IsTrue(permMapping.Count > 0, "Result count: 0");
}
[TestMethod]
[DataRow("814B5495-C2E9-4F1D-A73F-37CD5D353078")]
public void GetProductById_ReturnsProduct_WhenProductExists(string productIdString)
{
var productId = Guid.Parse(productIdString);
var product = Dal.GetProductById(productId);
Assert.IsNotNull(product, "Result is null");
}
}
}

View File

@ -14,6 +14,7 @@ using TIAM.Database.DbContexts.ServiceProviders;
using TIAM.Database.DbSets.Permissions;
using TIAM.Database.DbSets.Users;
using AyCode.Database.DataLayers;
using TIAM.Database.DbSets.Products;
namespace TIAM.Database.DataLayers.ServiceProviders
@ -78,7 +79,7 @@ namespace TIAM.Database.DataLayers.ServiceProviders
if (dbServiceProvider != null)
{
//get products for this provider
var products = Context.Products.Where(x => x.OwnerId == id).ToList();
var products = Context.Products.Where(x => x.ServiceProviderId == id).ToList();
/*foreach (var productItem in products)
{
@ -192,8 +193,17 @@ namespace TIAM.Database.DataLayers.ServiceProviders
#region PermissionMappings
public Task<List<PermissionContextMapping>> GetPermissionContextMappingByContextIdAsync(Guid contextId)
=> SessionAsync(x => x.GetPermissionContextMappingByContextId(contextId).ToList());
public List<PermissionContextMapping> GetPermissionContextsView(Guid subjectId, Guid contextId)
=> Session(x => x.GetPermissionContextsView(subjectId, contextId).ToList());
public List<PermissionContextMapping> GetPermissionContextsViewBySubjectId(Guid contextId)
=> Session(x => x.GetPermissionContextsViewBySubjectId(contextId).ToList());
public List<PermissionContextMapping> GetPermissionContextsViewByContextId(Guid contextId)
=> Session(x => x.GetPermissionContextsViewByContextId(contextId).ToList());
public Task<List<PermissionContextMapping>> GetPermissionContextsViewByContextIdAsync(Guid contextId)
=> SessionAsync(x => x.GetPermissionContextsViewByContextId(contextId).ToList());
//3. (IPermissionService) get permissions of assigned users and groups
public Task<List<AssignedPermissionModel>> GetPermissionsOfUserProductMappingsAndGroupsAsyncByContextId(Guid contextId)
@ -358,21 +368,24 @@ namespace TIAM.Database.DataLayers.ServiceProviders
#region Products
public Product? GetProductById(Guid contextId)
=> Session(x => x.GetProductById(contextId));
//* 19. (IServiceProviderDataService) Create product
public bool CreateProductAsync(TiamProduct product)
public bool CreateProductAsync(Product product)
{
Context.CreateProduct(product);
Console.WriteLine($"Saving product to db {product.Id}, {product.Name}, {product.OwnerId}");
Console.WriteLine($"Saving product to db {product.Id}, {product.Name}, {product.ServiceProviderId}");
var _result = Context.SaveChangesAsync();
return _result.Result > 0;
}
//* 20. (IServiceProviderDataService) Update product
public TiamProduct UpdateProduct(TiamProduct product)
public Product UpdateProduct(Product product)
{
var prod = Context.UpdateProduct(product);
Console.WriteLine($"Saving product to db {product.Id}, {product.Name}, {product.OwnerId}");
Console.WriteLine($"Saving product to db {product.Id}, {product.Name}, {product.ServiceProviderId}");
Context.SaveChanges();
return prod;
}

View File

@ -1,8 +1,11 @@
using AyCode.Database.DataLayers.Users;
using AyCode.Models.Enums;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using TIAM.Database.DbContexts;
using TIAM.Database.DbContexts.ServiceProviders;
using TIAM.Database.DbSets.Permissions;
using TIAM.Database.DbSets.Products;
using TIAM.Database.DbSets.Users;
using TIAM.Entities.Permissions;
using TIAM.Entities.Products;
@ -13,7 +16,7 @@ namespace TIAM.Database.DataLayers.ServiceProviders;
public static class ServiceProviderDalExtension
{
public static IQueryable<UserProductMapping> GetUserProductMappingsByPermissionGroupId(this ServiceProviderDbContext ctx, Guid permissionGroupId)
public static IQueryable<UserProductMapping> GetUserProductMappingsByPermissionGroupId(this IServiceProviderDbContext ctx, Guid permissionGroupId)
{
return ctx.UserProductMappings
.Where(user => ctx.PermissionGroupUserMappings
@ -22,16 +25,6 @@ public static class ServiceProviderDalExtension
.Contains(user.Id));
}
public static IQueryable<PermissionContextMapping> 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<UserProductMapping> userProductMappings)
{
foreach (var userProductMapping in userProductMappings)
@ -81,20 +74,20 @@ public static class ServiceProviderDalExtension
}
public static bool CreateProduct(this IServiceProviderDbContext ctx, TiamProduct myproduct)
public static bool CreateProduct(this IServiceProviderDbContext ctx, Product myproduct)
{
if (myproduct == null) return false;
//Automatically add assigneduser for owner
TiamServiceProvider? productOwner = ctx.ServiceProviders.FirstOrDefault(x => x.Id == myproduct.OwnerId);
TiamServiceProvider? productOwner = ctx.ServiceProviders.FirstOrDefault(x => x.Id == myproduct.ServiceProviderId);
if(productOwner == null) return false;
var userProductMapping = new UserProductMapping(myproduct.Id, productOwner.OwnerId);
ctx.CreateAssignedUser(userProductMapping);
ctx.Products.Add(myproduct);
ctx.AddProduct(myproduct);
return true;
}
public static TiamProduct UpdateProduct(this IServiceProviderDbContext ctx, TiamProduct product)
public static Product UpdateProduct(this IServiceProviderDbContext ctx, Product product)
{
if (product == null) return null;
@ -102,7 +95,7 @@ public static class ServiceProviderDalExtension
if (existingProduct == null) return null;
existingProduct.Name = product.Name;
existingProduct.OwnerId = product.OwnerId;
existingProduct.ServiceProviderId = product.ServiceProviderId;
existingProduct.Description = product.Description;
existingProduct.Price = product.Price;
existingProduct.JsonDetails = product.JsonDetails;

View File

@ -5,6 +5,6 @@ using TIAM.Database.DbSets.Users;
namespace TIAM.Database.DbContexts.ServiceProviders;
public interface IServiceProviderDbContext : IServiceProviderDbSet, ITiamProductDbSet, IAssignedUserDbSet, IPermissionsDbSetContext
public interface IServiceProviderDbContext : IServiceProviderDbSet, IProductDbSet, IAssignedUserDbSet, IPermissionsDbSetContext
{
}

View File

@ -18,7 +18,7 @@ namespace TIAM.Database.DbContexts.ServiceProviders
public class ServiceProviderDbContext : DbContextBase, IServiceProviderDbContext
{
public DbSet<TiamServiceProvider> ServiceProviders { get; set; }
public DbSet<TiamProduct> Products { get; set; }
public DbSet<Product> Products { get; set; }
public DbSet<UserProductMapping> UserProductMappings { get; set; }
public DbSet<PermissionsType> PermissionsTypes { get; set; }

View File

@ -1,6 +1,11 @@
using TIAM.Database.DbContexts.ServiceProviders;
using AyCode.Database;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using TIAM.Database.DbContexts;
using TIAM.Database.DbContexts.ServiceProviders;
using TIAM.Database.DbSets.Users;
using TIAM.Entities.Permissions;
using TIAM.Entities.Products;
namespace TIAM.Database.DbSets.Permissions;
@ -22,6 +27,16 @@ public static class PermissionsDbSetExtensions
// return ctx.GetPermissionContextMappingsBySubjectIds(subjectIds);
//}
public static IQueryable<PermissionContextMapping> GetPermissionContextsViewBySubjectId(this IPermissionContextMappingDbSet ctx, Guid subjectId)
=> ctx.PermissionContextMappings.FromSqlRaw(PermissionSqls.PermissionViewSql).Where(x => x.SubjectId == subjectId);
public static IQueryable<PermissionContextMapping> GetPermissionContextsViewByContextId(this IPermissionContextMappingDbSet ctx, Guid contextId)
=> ctx.PermissionContextMappings.FromSqlRaw(PermissionSqls.PermissionViewSql).Where(x => x.ContextId == contextId);
public static IQueryable<PermissionContextMapping> GetPermissionContextsView(this IPermissionContextMappingDbSet ctx, Guid subjectId, Guid contextId)
=> ctx.PermissionContextMappings.FromSqlRaw(PermissionSqls.PermissionViewSql).Where(x => x.SubjectId == subjectId && x.ContextId == contextId);
public static IQueryable<PermissionContextMapping> GetPermissionContextMappingsBySubjectIds(this IPermissionsDbSetContext ctx, IEnumerable<Guid> subjectIds)
=> ctx.PermissionContextMappings.Where(x => subjectIds.Contains(x.SubjectId));

View File

@ -3,7 +3,7 @@ using TIAM.Entities.Products;
namespace TIAM.Database.DbSets.Products;
public interface ITiamProductDbSet
public interface IProductDbSet
{
public DbSet<TiamProduct> Products { get; }
public DbSet<Product> Products { get; }
}

View File

@ -0,0 +1,15 @@
using Microsoft.EntityFrameworkCore;
using TIAM.Entities.Products;
namespace TIAM.Database.DbSets.Products;
public static class ProductDbSetExtensins
{
#region Add, Update, Remove
public static bool AddProduct(this IProductDbSet ctx, Product product)
=> ctx.Products.Add(product).State == EntityState.Added;
#endregion Add, Update, Remove
public static Product? GetProductById(this IProductDbSet ctx, Guid productId)
=> ctx.Products.FirstOrDefault(x => x.Id == productId);
}

View File

@ -17,7 +17,6 @@
<Folder Include="DataLayers\Permissions\" />
<Folder Include="DataLayers\Products\" />
<Folder Include="DbSets\ServiceProvider\" />
<Folder Include="DbSets\Products\" />
<Folder Include="Extensions\" />
</ItemGroup>

View File

@ -6,33 +6,16 @@ using TIAM.Core;
namespace TIAM.Entities.Products;
public class Product : IEntityGuid, ITimeStampInfo
[Table("Products")]
public class Product : ProductBase
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public Guid Id { get; set; }
public Guid ServiceProviderId { get; set; }
public ProductType ProductType { get; set; }
public Guid UserMediaId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public float Price { get; set; }
public string JsonDetails { get; set; }
public Product(){}
public DateTime Created { get; set; }
public DateTime Modified { get; set; }
public Product(Guid id, ProductType type, Guid userMediaId, string name, string description, float price, string jsonDetails)
public Product(Guid ownerId, ProductType productType, Guid userMediaId, string name, string description, float price, string jsonDetails) : this(Guid.NewGuid(), ownerId, productType, userMediaId, name, description, price, jsonDetails) { }
public Product(Guid id, Guid serviceProviderId, ProductType productType, Guid userMediaId, string name, string description, float price, string jsonDetails) : base(id, productType, userMediaId, name, description, price, jsonDetails)
{
Id = id;
ProductType = type;
UserMediaId = userMediaId;
Name = name;
Description = description;
Price = price;
JsonDetails = jsonDetails;
Created = DateTime.Now;
Modified = DateTime.Now;
ServiceProviderId = serviceProviderId;
}
}

View File

@ -0,0 +1,40 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using AyCode.Interfaces.Entities;
using AyCode.Interfaces.TimeStampInfo;
using TIAM.Core;
namespace TIAM.Entities.Products;
public abstract class ProductBase : IEntityGuid, ITimeStampInfo
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public Guid Id { get; set; }
public ProductType ProductType { get; set; }
public Guid? UserMediaId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public float Price { get; set; }
public string? JsonDetails { get; set; }
public DateTime Created { get; set; }
public DateTime Modified { get; set; }
protected ProductBase(){}
protected ProductBase(Guid id, ProductType type, Guid userMediaId, string name, string description, float price, string jsonDetails)
{
Id = id;
ProductType = type;
UserMediaId = userMediaId;
Name = name;
Description = description;
Price = price;
JsonDetails = jsonDetails;
Created = DateTime.Now;
Modified = DateTime.Now;
}
}

View File

@ -1,24 +0,0 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using AyCode.Interfaces.Entities;
using AyCode.Interfaces.TimeStampInfo;
using TIAM.Core;
namespace TIAM.Entities.Products;
[Table("Products")]
public class TiamProduct : Product
{
public Guid OwnerId { get; set; }
public TiamProduct(Guid ownerId, ProductType productType, Guid userMediaId, string name, string description, float price, string jsonDetails) : this(Guid.NewGuid(), ownerId, productType, userMediaId, name, description, price, jsonDetails) { }
public TiamProduct(Guid id, Guid ownerId, ProductType productType, Guid userMediaId, string name, string description, float price, string jsonDetails) : base(id, productType, userMediaId, name, description, price, jsonDetails)
{
OwnerId = ownerId;
}
}

View File

@ -8,6 +8,7 @@ using TIAM.Entities.Products;
using TIAM.Entities.ServiceProviders;
using TIAM.Entities.Users;
using TIAMWebApp.Shared.Application.Models;
using Product = TIAM.Entities.Products.Product;
namespace TIAMWebApp.Server.Controllers
{
@ -167,7 +168,7 @@ namespace TIAMWebApp.Server.Controllers
[HttpPost]
[Route("CreateProduct")]
[Tags("In-Progress", "Product")]
public async Task<IActionResult> CreateProduct([FromBody] TiamProduct product)
public async Task<IActionResult> CreateProduct([FromBody] Product product)
{
Console.WriteLine("CreateProduct called");
if (product == null)