using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using SqlSugar; using System; using System.Linq; using System.Threading.Tasks; namespace ReZero.SuperAPI { /// /// Implementation of the ReZero API interface (IReZeroApi) to handle API-related operations. /// public class InternalApi : IInternalApi { /// /// Checks if the provided URL corresponds to a ReZero API endpoint. /// /// The URL to be checked. /// True if the URL is a ReZero API endpoint, otherwise false. public bool IsApi(string url) { return url.ToString().ToLower().TrimStart('/')?.StartsWith(NamingConventionsConst.ApiReZeroRoute.ToLower()) == true; } /// /// Writes the API response asynchronously to the specified HttpContext. /// /// The HttpContext representing the current request and response context. /// A Task representing the asynchronous operation. public async Task WriteAsync(HttpContext context) { var db = App.Db; var path = context.Request.Path.ToString()?.ToLower(); var interfaceInfos = db.Queryable().ToList(); var interInfo = interfaceInfos.Where(it => it.Url!.ToLower() == path).FirstOrDefault(); if (interInfo == null) { var message = TextHandler.GetCommonText($"未找到内置接口 {path} ,请在表ZeroInterfaceList中查询", $"No built-in interface {path} is found. Query in the table ZeroInterfaceList"); context.Response.StatusCode = 500; await context.Response.WriteAsync(message); } else { var systemInterfaceContext = new InterfaceContext() { InterfaceType = InterfaceType.SystemApi, HttpContext = context, InterfaceInfo = interInfo }; try { DataService dataService = new DataService(); interInfo!.DataModel!.ApiId = interInfo.Id; dataService.BindHttpParameters.Bind(interInfo.DataModel, context, path, !string.IsNullOrEmpty(interInfo.OriginalUrl), interInfo); var service = DependencyInjection.DependencyResolver.Provider; systemInterfaceContext.ServiceProvider = service; interInfo!.DataModel!.ServiceProvider = service; await SuperAPIModule._apiOptions!.InterfaceOptions!.SuperApiAop!.OnExecutingAsync(systemInterfaceContext); await InstanceManager.AuthorizationAsync(context, systemInterfaceContext); var data = await dataService.ExecuteAction(interInfo.DataModel ?? new DataModel() { }); SetDataToAop(systemInterfaceContext, data); await SuperAPIModule._apiOptions!.InterfaceOptions!.SuperApiAop!.OnExecutedAsync(systemInterfaceContext); var resultModel = interInfo.CustomResultModel ?? new ResultModel(); resultModel.OutPutData = interInfo.DataModel?.OutPutData; data = new ResultService().GetResult(data, resultModel); await Write(context, interInfo, data); } catch (Exception ex) { ReZero.DependencyInjection.DependencyResolver.GetLogger().LogInformation(ex.Message); context.Response.ContentType = PubConst.DataSource_ApplicationJson; await context.Response.WriteAsync(db.Utilities.SerializeObject(new { message = ex.Message })); systemInterfaceContext.Exception = ex; await SuperAPIModule._apiOptions!.InterfaceOptions!.SuperApiAop!.OnErrorAsync(systemInterfaceContext); ; } } } private static void SetDataToAop(InterfaceContext systemInterfaceContext, object data) { if (systemInterfaceContext.DataModel != null) systemInterfaceContext.DataModel.Data = data; } private static async Task Write(HttpContext context, ZeroInterfaceList interInfo, object data) { if (interInfo.CustomResultModel?.ResultType == ResultType.File) { await InstanceManager.WriteFileAsync(context, interInfo, data); } else { context.Response.ContentType = PubConst.DataSource_ApplicationJson; await context.Response.WriteAsync(JsonHelper.SerializeObject(data)); } } } }