Files
ERP_Distribution/Distribution/Infra/Auth/ScopeAccessService.cs
T

64 lines
2.4 KiB
C#

using Distribution.Data;
using Microsoft.EntityFrameworkCore;
namespace Distribution.Infra.Auth
{
public class ScopeAccessService : IScopeAccessService
{
private readonly AppDBContext _context;
public ScopeAccessService(AppDBContext context)
{
_context = context;
}
public async Task<bool> HasStoreScopeAsync(Guid userId, Guid storeId) =>
await _context.UserStoreScopes.AnyAsync(s => s.FK_UserId == userId && s.FK_StoreId == storeId && s.IsActive);
public async Task<bool> HasRouteScopeAsync(Guid userId, Guid routeId) =>
await _context.UserRouteScopes.AnyAsync(s => s.FK_UserId == userId && s.FK_RouteId == routeId && s.IsActive);
public async Task<bool> HasRegionScopeAsync(Guid userId, Guid regionId) =>
await _context.UserRegionScopes.AnyAsync(s => s.FK_UserId == userId && s.FK_RegionId == regionId && s.IsActive);
public async Task<List<Guid>> GetAccessibleStoreIdsAsync(Guid userId)
{
var directStoreIds = await _context.UserStoreScopes
.Where(s => s.FK_UserId == userId && s.IsActive)
.Select(s => s.FK_StoreId)
.ToListAsync();
var routeIds = await _context.UserRouteScopes
.Where(s => s.FK_UserId == userId && s.IsActive)
.Select(s => s.FK_RouteId)
.ToListAsync();
var regionIds = await _context.UserRegionScopes
.Where(s => s.FK_UserId == userId && s.IsActive)
.Select(s => s.FK_RegionId)
.ToListAsync();
var storeIdsViaRoute = await _context.Stores
.Where(s => routeIds.Contains(s.FK_RouteId) && s.IsActive)
.Select(s => s.Id)
.ToListAsync();
var routeIdsViaRegion = await _context.Routes
.Where(r => regionIds.Contains(r.FK_RegionId) && r.IsActive)
.Select(r => r.Id)
.ToListAsync();
var storeIdsViaRegion = await _context.Stores
.Where(s => routeIdsViaRegion.Contains(s.FK_RouteId) && s.IsActive)
.Select(s => s.Id)
.ToListAsync();
return directStoreIds
.Concat(storeIdsViaRoute)
.Concat(storeIdsViaRegion)
.Distinct()
.ToList();
}
}
}