Refactor authorization folder structure

This commit is contained in:
2026-08-19 11:39:44 +05:30
parent 56cd93c341
commit 45f374133f
32 changed files with 378 additions and 290 deletions
@@ -0,0 +1,9 @@
namespace Distribution.Infra.Authorization;
public interface IScopeAccessService
{
Task<bool> HasStoreScopeAsync(Guid userId, Guid storeId);
Task<bool> HasRouteScopeAsync(Guid userId, Guid routeId);
Task<bool> HasRegionScopeAsync(Guid userId, Guid regionId);
Task<List<Guid>> GetAccessibleStoreIdsAsync(Guid userId);
}
@@ -0,0 +1,13 @@
namespace Distribution.Infra.Authorization;
public interface IScopeRepository
{
Task<bool> HasStoreScopeAsync(Guid userId, Guid storeId);
Task<bool> HasRouteScopeAsync(Guid userId, Guid routeId);
Task<bool> HasRegionScopeAsync(Guid userId, Guid regionId);
Task<List<Guid>> GetDirectStoreIdsAsync(Guid userId);
Task<List<Guid>> GetRouteIdsAsync(Guid userId);
Task<List<Guid>> GetRegionIdsAsync(Guid userId);
Task<List<Guid>> GetStoreIdsByRouteIdsAsync(List<Guid> routeIds);
Task<List<Guid>> GetRouteIdsByRegionIdsAsync(List<Guid> regionIds);
}
@@ -0,0 +1,30 @@
namespace Distribution.Infra.Authorization;
public class ScopeAccessService(IScopeRepository repo) : IScopeAccessService
{
public Task<bool> HasStoreScopeAsync(Guid userId, Guid storeId) =>
repo.HasStoreScopeAsync(userId, storeId);
public Task<bool> HasRouteScopeAsync(Guid userId, Guid routeId) =>
repo.HasRouteScopeAsync(userId, routeId);
public Task<bool> HasRegionScopeAsync(Guid userId, Guid regionId) =>
repo.HasRegionScopeAsync(userId, regionId);
public async Task<List<Guid>> GetAccessibleStoreIdsAsync(Guid userId)
{
var directStoreIds = await repo.GetDirectStoreIdsAsync(userId);
var routeIds = await repo.GetRouteIdsAsync(userId);
var regionIds = await repo.GetRegionIdsAsync(userId);
var storeIdsViaRoute = await repo.GetStoreIdsByRouteIdsAsync(routeIds);
var routeIdsViaRegion = await repo.GetRouteIdsByRegionIdsAsync(regionIds);
var storeIdsViaRegion = await repo.GetStoreIdsByRouteIdsAsync(routeIdsViaRegion);
return directStoreIds
.Concat(storeIdsViaRoute)
.Concat(storeIdsViaRegion)
.Distinct()
.ToList();
}
}
@@ -0,0 +1,46 @@
using Distribution.Data;
using Microsoft.EntityFrameworkCore;
namespace Distribution.Infra.Authorization;
public class ScopeRepository(AppDBContext context) : IScopeRepository
{
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>> GetDirectStoreIdsAsync(Guid userId) =>
await context.UserStoreScopes
.Where(s => s.FK_UserId == userId && s.IsActive)
.Select(s => s.FK_StoreId)
.ToListAsync();
public async Task<List<Guid>> GetRouteIdsAsync(Guid userId) =>
await context.UserRouteScopes
.Where(s => s.FK_UserId == userId && s.IsActive)
.Select(s => s.FK_RouteId)
.ToListAsync();
public async Task<List<Guid>> GetRegionIdsAsync(Guid userId) =>
await context.UserRegionScopes
.Where(s => s.FK_UserId == userId && s.IsActive)
.Select(s => s.FK_RegionId)
.ToListAsync();
public async Task<List<Guid>> GetStoreIdsByRouteIdsAsync(List<Guid> routeIds) =>
await context.Stores
.Where(s => routeIds.Contains(s.FK_RouteId) && s.IsActive)
.Select(s => s.Id)
.ToListAsync();
public async Task<List<Guid>> GetRouteIdsByRegionIdsAsync(List<Guid> regionIds) =>
await context.Routes
.Where(r => regionIds.Contains(r.FK_RegionId) && r.IsActive)
.Select(r => r.Id)
.ToListAsync();
}