using NetAdmin.Application.Repositories; using NetAdmin.Application.Services; using NetAdmin.Domain.Dto.Dependency; using NetAdmin.Domain.Dto.Sys.Role; using NetAdmin.SysComponent.Application.Services.Sys.Dependency; namespace NetAdmin.SysComponent.Application.Services.Sys; /// public sealed class RoleService(BasicRepository rpo) // : RepositoryService(rpo), IRoleService { /// public async Task BulkDeleteAsync(BulkReq req) { req.ThrowIfInvalid(); var ret = 0; // ReSharper disable once LoopCanBeConvertedToQuery foreach (var item in req.Items) { ret += await DeleteAsync(item).ConfigureAwait(false); } return ret; } /// public Task CountAsync(QueryReq req) { req.ThrowIfInvalid(); return QueryInternal(req) #if DBTYPE_SQLSERVER .WithLock(SqlServerLock.NoLock | SqlServerLock.NoWait) #endif .CountAsync(); } /// public async Task CreateAsync(CreateRoleReq req) { req.ThrowIfInvalid(); var entity = req.Adapt(); var ret = await Rpo.InsertAsync(entity).ConfigureAwait(false); await Rpo.SaveManyAsync(entity, nameof(entity.Depts)).ConfigureAwait(false); await Rpo.SaveManyAsync(entity, nameof(entity.Menus)).ConfigureAwait(false); await Rpo.SaveManyAsync(entity, nameof(entity.Apis)).ConfigureAwait(false); entity = entity with { Id = ret.Id }; return entity.Adapt(); } /// /// Users_exist_under_this_role_and_deletion_is_not_allowed public async Task DeleteAsync(DelReq req) { req.ThrowIfInvalid(); return await Rpo.Orm.Select().ForUpdate().AnyAsync(a => a.RoleId == req.Id).ConfigureAwait(false) ? throw new NetAdminInvalidOperationException(Ln.该角色下存在用户) : await Rpo.DeleteAsync(a => a.Id == req.Id).ConfigureAwait(false); } /// public async Task EditAsync(EditRoleReq req) { req.ThrowIfInvalid(); var entity = req.Adapt(); _ = await Rpo.UpdateAsync(entity).ConfigureAwait(false); await Rpo.SaveManyAsync(entity, nameof(entity.Depts)).ConfigureAwait(false); await Rpo.SaveManyAsync(entity, nameof(entity.Menus)).ConfigureAwait(false); await Rpo.SaveManyAsync(entity, nameof(entity.Apis)).ConfigureAwait(false); return (await QueryAsync(new QueryReq { Filter = new QueryRoleReq { Id = req.Id } }) .ConfigureAwait(false)).First(); } /// public Task ExistAsync(QueryReq req) { req.ThrowIfInvalid(); return QueryInternal(req) #if DBTYPE_SQLSERVER .WithLock(SqlServerLock.NoLock | SqlServerLock.NoWait) #endif .AnyAsync(); } /// public Task ExportAsync(QueryReq req) { req.ThrowIfInvalid(); return ExportAsync(QueryInternal, req, Ln.角色导出); } /// public async Task GetAsync(QueryRoleReq req) { req.ThrowIfInvalid(); var ret = await QueryInternal(new QueryReq { Filter = req }).ToOneAsync().ConfigureAwait(false); return ret.Adapt(); } /// public async Task> PagedQueryAsync(PagedQueryReq req) { req.ThrowIfInvalid(); var list = await QueryInternal(req) .Page(req.Page, req.PageSize) #if DBTYPE_SQLSERVER .WithLock(SqlServerLock.NoLock | SqlServerLock.NoWait) #endif .Count(out var total) .ToListAsync() .ConfigureAwait(false); return new PagedQueryRsp(req.Page, req.PageSize, total, list.Adapt>()); } /// public async Task> QueryAsync(QueryReq req) { req.ThrowIfInvalid(); var ret = await QueryInternal(req) #if DBTYPE_SQLSERVER .WithLock(SqlServerLock.NoLock | SqlServerLock.NoWait) #endif .ToListAsync() .ConfigureAwait(false); return ret.Adapt>(); } /// public Task SetDisplayDashboardAsync(SetDisplayDashboardReq req) { req.ThrowIfInvalid(); return UpdateAsync(req, [nameof(req.DisplayDashboard)]); } /// public Task SetEnabledAsync(SetRoleEnabledReq req) { req.ThrowIfInvalid(); return UpdateAsync(req, [nameof(req.Enabled)]); } /// public Task SetIgnorePermissionControlAsync(SetIgnorePermissionControlReq req) { req.ThrowIfInvalid(); return UpdateAsync(req, [nameof(req.IgnorePermissionControl)]); } private ISelect QueryInternal(QueryReq req) { var ret = Rpo.Select.IncludeMany(a => a.Depts.Select(b => new Sys_Dept { Id = b.Id })) .IncludeMany(a => a.Menus.Select(b => new Sys_Menu { Id = b.Id })) .IncludeMany(a => a.Apis.Select(b => new Sys_Api { Id = b.Id })) .WhereDynamicFilter(req.DynamicFilter) .WhereDynamic(req.Filter) .WhereIf( // req.Keywords?.Length > 0 , a => a.Id == req.Keywords.Int64Try(0) || a.Name.Contains(req.Keywords) || a.Summary.Contains(req.Keywords)); switch (req.Order) { case Orders.None: return ret; case Orders.Random: return ret.OrderByRandom(); } ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending); if (!req.Prop?.Equals(nameof(req.Filter.Sort), StringComparison.OrdinalIgnoreCase) ?? true) { ret = ret.OrderByDescending(a => a.Sort); } if (!req.Prop?.Equals(nameof(req.Filter.CreatedTime), StringComparison.OrdinalIgnoreCase) ?? true) { ret = ret.OrderByDescending(a => a.CreatedTime); } return ret; } }