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 HasStoreScopeAsync(Guid userId, Guid storeId) => await _context.UserStoreScopes.AnyAsync(s => s.FK_UserId == userId && s.FK_StoreId == storeId && s.IsActive); public async Task HasRouteScopeAsync(Guid userId, Guid routeId) => await _context.UserRouteScopes.AnyAsync(s => s.FK_UserId == userId && s.FK_RouteId == routeId && s.IsActive); public async Task HasRegionScopeAsync(Guid userId, Guid regionId) => await _context.UserRegionScopes.AnyAsync(s => s.FK_UserId == userId && s.FK_RegionId == regionId && s.IsActive); public async Task> 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(); } } }