private void MarkdownArgument(StringBuilder code, ApiActionInfo api) { if (!api.HaseArgument) { return; } code.AppendLine($@" **参数:** |参数名|必选|类型|示例|说明| |:----|:---|:-----|:-----|-----|"); if (!api.Arguments.Values.First().IsBaseType) { MarkdownArgument(code, new HashSet <TypeDocument>(), api.Arguments.Values.First(), ""); } else { foreach (var field in api.Arguments.Values) { code.AppendLine($"|{field.DocName}|{(field.CanNull ? "否" : "是")}|{field.TypeName}|{(field.DocExample)}|{field.DocDesc}|"); } } code.AppendLine($@" **参数示例** ```json {api.ArgumentJson()} ``` "); }
public void CSharpType() { ApiActionInfo apiAction = _smartApp.Api?.FirstOrDefault().Actions?.FirstOrDefault(); string result = apiAction.CSharpType(); Assert.NotNull(result); }
private void TransformControllerApiParameters(SmartAppInfo manifest, ApiActionInfo action) { bool result = true; foreach (var param in action.Parameters.AsEnumerable()) { if (!result) { break; } Dictionary <string, string> entityTypes = GetAllReferencedTypes(param); if (param.DataModel != null) { var dataTemplate = new ViewModelTemplate(param.DataModel, manifest.Id, Constants.ViewModelNamespace, entityTypes); try { result = _writingService.WriteFile(Path.Combine(_context.BasePath, dataTemplate.OutputPath, param.DataModel.Id + ".g.cs"), dataTemplate.TransformText()); } catch (Exception ex) { result = false; } } } }
/// <summary> /// Transform a Mobioos request type to a C# request type. /// </summary> /// <param name="apiAction">An ApiActionInfo object.</param> /// <returns>A request type in string.</returns> public static string CSharpType(this ApiActionInfo apiAction) { if (!apiAction.IsValid()) { return(null); } switch (apiAction.Type.ToLower()) { case "datalist": case "dataget": return("HttpGet"); case "datacreate": return("HttpPost"); case "dataupdate": return("HttpPut"); case "datadelete": return("HttpDelete"); default: return(apiAction.Type); } }
/// <summary> /// Retrieve direct references from api action parameters and return type. /// </summary> /// <param name="apiAction">An ApiActionInfo object.</param> /// <returns>A list of EntityInfo.</returns> public static List <EntityInfo> GetApiActionDirectReferences(this ApiActionInfo apiAction) { var directReferences = new List <EntityInfo>(); if (!apiAction.IsValid()) { return(directReferences); } var entityComparer = new EntityInfoComparer(); if (apiAction.Parameters != null) { directReferences = directReferences .Union( apiAction.Parameters.GetApiParametersDirectReferences(), entityComparer) .ToList(); } if (apiAction.ReturnType.IsValid() && apiAction.ReturnType.References != null) { directReferences = directReferences .Union( apiAction.ReturnType.GetEntityDirectReferences(), entityComparer) .ToList(); } return(directReferences); }
/// <summary> /// Retrieve ViewModels from an api action for a specific layout action. /// </summary> /// <param name="apiAction">An ApiActionInfo object.</param> /// <param name="layoutAction">A layout name.</param> /// <returns>A list of EntityInfo.</returns> public static List <EntityInfo> GetApiActionViewModelsEntities( this ApiActionInfo apiAction, string layoutAction) { var viewModels = new List <EntityInfo>(); if (!apiAction.IsValid() || !layoutAction.IsValid()) { return(viewModels); } var entityComparer = new EntityInfoComparer(); if (apiAction.Id.ToLower().Equals(layoutAction.ToLower()) && apiAction.Parameters != null) { if (apiAction.ReturnType.IsValid() && !viewModels.Any(item => entityComparer.Equals( item, apiAction.ReturnType))) { viewModels.Add(apiAction.ReturnType); } viewModels = viewModels .Union( apiAction.Parameters.GetApiParametersViewModelsEntities(), entityComparer) .ToList(); } return(viewModels); }
/// <summary> /// Retrieve ViewModels from an api action for a specific layout action. /// </summary> /// <param name="apiAction">An ApiActionInfo object.</param> /// <param name="layoutAction">A layout name.</param> /// <returns>A list of ViewModels id.</returns> public static List <string> GetApiActionViewModelsId( this ApiActionInfo apiAction, string layoutAction) { var viewModels = new List <string>(); if (!apiAction.IsValid() || !layoutAction.IsValid()) { return(viewModels); } if (apiAction.Id.ToLower().Equals(layoutAction.ToLower()) && apiAction.Parameters != null) { if (apiAction.ReturnType.IsValid() && !viewModels.Any(item => item == apiAction.ReturnType.Id.ToPascalCase())) { viewModels.Add(apiAction.ReturnType.Id.ToPascalCase()); } viewModels = viewModels .Union(apiAction.Parameters.GetApiParametersViewModelsId()) .ToList(); } return(viewModels); }
private void TransformControllerApiReturnTypes(SmartAppInfo manifest, ApiActionInfo action) { if (action.ReturnType != null) { Dictionary <string, string> entityTypes = GetAllReferencedTypes(action.ReturnType); var dataTemplate = new ViewModelTemplate(action.ReturnType, manifest.Id, Constants.ViewModelNamespace, entityTypes); _writingService.WriteFile(Path.Combine(_context.BasePath, dataTemplate.OutputPath, action.ReturnType.Id + ".g.cs"), dataTemplate.TransformText()); } }
public static bool IsValid(this ApiActionInfo apiAction) { if (apiAction == null || !apiAction.Id.IsValid() || !apiAction.Type.IsValid()) { return(false); } return(true); }
public AllModel() { Info = new ApiActionInfo(); EnvironmentResources = new List <EnvironmentResource>(); RequestPathParameters = new List <ParameterInfo>(); RequestBodyParameters = new List <ParameterInfo>(); RequestQueryParameters = new List <ParameterInfo>(); Responses = new List <ResponseInfo>(); Definitions = new List <DefinitionInfo>(); Example = new ExampleInfo(); }
private void ApiDoc(ServiceInfo serviceInfo, StringBuilder code, ApiActionInfo api) { code.AppendLine($@" ## {(api.Caption ?? api.Name)} **简要描述:** {(api.Description ?? api.Caption)} **请求URL:** ` http://xx.com/{serviceInfo.Name}/{api.Route}` **请求方式:** - POST - GET "); MarkdownArgument(code, api); MarkdownResult(code, api); }
public ApiPutTemplate(ApiActionInfo model) : base(model) { }
public ExecutionResult <ApiActionInfo> HandleRequest(string requestUri, JObject body, HttpVerbs verb, bool useDots = true) { var result = new ApiActionInfo(); string tags = requestUri; var edmObject = new JObject(); var currentNode = edmObject; ModelElementObjectBase currentElement = null; PivotDefinition pivot = null; bool isProperty = false; bool isId = false; foreach (var tag in tags.Split(new [] { '/' }, StringSplitOptions.RemoveEmptyEntries)) { Guid id; if (Guid.TryParse(tag, out id)) { isProperty = false; isId = true; currentNode.Add(ObjectHelper.IdPropName, id); } else { if (result.PathItems.Any() == false) { currentElement = this.modelElementStorage.GetModelElementTree(tag); if (currentElement == null) { return(ExecutionResult.ErrorResultFor(result, "404", $"Uri must starts from {currentElement.DisplayText}, but {tag} found.")); } result.PathItems.Add(currentElement.DisplayText); } else { //parent tag if (pivot.Type != PivotType.BusinessProcess && pivot.IsIntent && isProperty) { return(ExecutionResult.ErrorResultFor(result, "404", $"Must be id after {currentElement.DisplayText}, found {tag}.")); } currentElement = currentElement.FindByPath(tag, useDots); if (currentElement == null) { return(ExecutionResult.ErrorResultFor(result, "404", $"There no property {tag}.")); } result.PathItems.Add(currentElement.DisplayText); } isProperty = true; isId = false; pivot = ParserHelper.GetPivot(ParserHelper.TreeNodeTypeToPivot[currentElement.ModelElementType]); if (pivot.IsCollection) { var newNode = new JObject(); currentNode.Add(currentElement.DisplayText, new JArray(newNode)); currentNode = newNode; } else { var newNode = new JObject(); currentNode.Add(currentElement.DisplayText, newNode); currentNode = newNode; } } } if (pivot.Type == PivotType.Value && isProperty) { return(ExecutionResult.ErrorResultFor(result, "404", $"Must have id after {currentElement.DisplayText}, found.")); } result.EdmObject = edmObject; result.EventAction = DynamicApiHelper.GetEventAction(verb, pivot.Type, isId); if ((result.EventAction == EventAction.Add || result.EventAction == EventAction.Initiate || result.EventAction == EventAction.Set) && body == null) { return(ExecutionResult.ErrorResultFor(result, "404", $"Request body must not be null for {result.EventAction}.")); } if (body != null) { foreach (var property in body.Properties()) { currentNode.Add(property.Name, property.Value); } if (DynamicApiHelper.MustHaveOperationInEdm(result.EventAction)) { currentNode.Add("$operation", result.EventAction.ToString().ToLowerInvariant()); } } result.PlaceForBody = currentNode; return(ExecutionResult.SuccessResult(result)); }
private static void HeadDoc(ServiceInfo serviceInfo, ApiActionInfo api, StringBuilder code) { code.AppendLine($@"# {(api.ControllerCaption ?? api.ControllerName)} --- "); }
private void MarkdownResult(StringBuilder code, ApiActionInfo api) { if (api.ResultInfo == null || api.ResultType == typeof(Task) || api.ResultType == typeof(void)) { code.AppendLine($@" 无返回"); return; } var reType = api.ResultType; if (reType.IsGenericType && reType.GetGenericTypeDefinition().IsSupperInterface(typeof(Task <>))) { reType = reType.GenericTypeArguments[0]; } string json; if (reType.IsBaseType()) { code.AppendLine($@" **返回参数说明** |类型|说明| |-|-| |{reType.GetTypeName()}|{api.ResultInfo.Description}| **返回示例** ``` {api.ResultInfo.DocExample} ``` "); return; } code.AppendLine($@" **返回参数说明** "); var doc = api.ResultInfo; if (reType.IsSupperInterface(typeof(IApiResult))) { if (!reType.IsGenericType) { code.AppendLine(@" 标准API返回格式,请参考[返回值通用说明] **返回示例** ```json { 'success': true, 'code': 0, 'msg': '操作成功' } ``` "); return; } var gbase = reType.GetGenericTypeDefinition(); if (!gbase.IsSupperInterface(typeof(IApiResult <>))) { code.AppendLine(@" 标准API返回格式,请参考[返回值通用说明] **返回示例** ```json { 'success': true, 'code': 0, 'msg': '操作成功' } ``` "); return; } code.AppendLine($@" 标准API返回格式,请参考[返回值通用说明]"); reType = reType.GenericTypeArguments[0]; if (reType.IsBaseType()) { code.AppendLine($@" **data格式说明** - 类型:{reType.GetTypeName()} - 说明: {api.ResultInfo.Description} **返回示例** ```json {{ 'success': true, 'code': 0, 'msg': '操作成功', 'data': '{api.ResultInfo.DocExample}' }} ``` "); return; } doc = XmlDocumentDiscover.ReadEntity(reType, "result"); if (doc == null) { code.AppendLine(@" **data格式说明** [未找到对应类型说明,请手工写入] **返回示例** ```json { 'success': true, 'code': 0, 'msg': '操作成功', 'data': {} } ``` "); return; } json = $@"{{ 'success': true, 'code': 0, 'msg': '操作成功', 'data': {doc.JsonExample(false).Trim()} }}"; code.AppendLine($@" **data格式说明** "); } else { json = doc.JsonExample(); } code.AppendLine($@" |参数名|类型|说明| |:----- |:-----|----- |"); MarkdownResult(code, new HashSet <TypeDocument>(), doc, ""); code.AppendLine($@" **返回示例** ```json {json} ``` "); }
public ApiGetAllTemplate(ApiActionInfo model, IDictionary <string, string> entities) : base(model) { Entities = entities; }
public ApiDeleteTemplate(ApiActionInfo model) : base(model) { }