using NetAdmin.Domain.Dto.Sys.Api; namespace NetAdmin.SysComponent.Application.Services.Sys; /// public sealed class ApiService( BasicRepository rpo // , XmlCommentReader xmlCommentReader // , IActionDescriptorCollectionProvider actionDescriptorCollectionProvider) // : RedisService(rpo), IApiService { /// public Task BulkDeleteAsync(BulkReq req) { req.ThrowIfInvalid(); throw new NotImplementedException(); } /// public Task CountAsync(QueryReq req) { req.ThrowIfInvalid(); return QueryInternal(req) #if DBTYPE_SQLSERVER .WithLock(SqlServerLock.NoLock | SqlServerLock.NoWait) #endif .CountAsync(); } /// public Task CreateAsync(CreateApiReq req) { req.ThrowIfInvalid(); throw new NotImplementedException(); } /// public Task DeleteAsync(DelReq req) { req.ThrowIfInvalid(); throw new NotImplementedException(); } /// 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 Task GetAsync(QueryApiReq req) { req.ThrowIfInvalid(); throw new NotImplementedException(); } /// public Task> PagedQueryAsync(PagedQueryReq req) { req.ThrowIfInvalid(); throw new NotImplementedException(); } /// public async Task> QueryAsync(QueryReq req) { req.ThrowIfInvalid(); var ret = await Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter).ToTreeListAsync().ConfigureAwait(false); return ret.Adapt>(); } /// public IEnumerable ReflectionList(bool excludeAnonymous = true) { var regex = new Regex(@"\.(\w+)$", RegexOptions.Compiled); var actionDescriptors // = actionDescriptorCollectionProvider.ActionDescriptors.Items.Cast(); if (excludeAnonymous) { actionDescriptors = actionDescriptors.Where(x => x.EndpointMetadata.All(y => y is AllowAnonymousAttribute)); } var actionGroup // = actionDescriptors.GroupBy(x => x.ControllerTypeInfo); return actionGroup.Select(SelectQueryApiRsp); QueryApiRsp SelectQueryApiRsp(IGrouping group) { var first = group.First()!; var id = Regex.Replace( // first.AttributeRouteInfo!.Template!, $"/{first.ActionName}$", string.Empty); return new QueryApiRsp { Summary = xmlCommentReader.GetComments(group.Key) , Name = first.ControllerName , Id = id , Children = GetChildren(group) , Namespace = regex.Match(group.Key.Namespace!).Groups[1].Value.ToLowerInvariant() , PathCrc32 = id.Crc32() }; } } /// public async Task SyncAsync() { await using var locker = await GetLockerOnceAsync(nameof(SyncAsync)).ConfigureAwait(false); _ = await Rpo.DeleteAsync(_ => true).ConfigureAwait(false); var list = ReflectionList(false); EnableCascadeSave = true; foreach (var item in list) { var entity = item.Adapt(); _ = await Rpo.InsertAsync(entity).ConfigureAwait(false); } } private IEnumerable GetChildren(IEnumerable actionDescriptors) { return actionDescriptors // .Select(x => { var id = x.AttributeRouteInfo!.Template; return new QueryApiRsp { Summary = xmlCommentReader.GetComments(x.MethodInfo) , Name = x.ActionName , Id = id , Method = x.ActionConstraints?.OfType().FirstOrDefault()?.HttpMethods.First() , PathCrc32 = id.Crc32() }; }); } private ISelect QueryInternal(QueryReq req) { var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter); // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault 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.CreatedTime), StringComparison.OrdinalIgnoreCase) ?? true) { ret = ret.OrderByDescending(a => a.CreatedTime); } return ret; } }