Ejemplo n.º 1
0
        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()}
```
");
        }
Ejemplo n.º 2
0
        public void CSharpType()
        {
            ApiActionInfo apiAction = _smartApp.Api?.FirstOrDefault().Actions?.FirstOrDefault();
            string        result    = apiAction.CSharpType();

            Assert.NotNull(result);
        }
Ejemplo n.º 3
0
        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;
                    }
                }
            }
        }
Ejemplo n.º 4
0
        /// <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);
            }
        }
Ejemplo n.º 5
0
        /// <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);
        }
Ejemplo n.º 6
0
        /// <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);
        }
Ejemplo n.º 7
0
        /// <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);
        }
Ejemplo n.º 8
0
        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());
            }
        }
Ejemplo n.º 9
0
        public static bool IsValid(this ApiActionInfo apiAction)
        {
            if (apiAction == null ||
                !apiAction.Id.IsValid() ||
                !apiAction.Type.IsValid())
            {
                return(false);
            }

            return(true);
        }
Ejemplo n.º 10
0
 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();
 }
Ejemplo n.º 11
0
        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);
        }
Ejemplo n.º 12
0
 public ApiPutTemplate(ApiActionInfo model) :
     base(model)
 {
 }
Ejemplo n.º 13
0
        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));
        }
Ejemplo n.º 14
0
        private static void HeadDoc(ServiceInfo serviceInfo, ApiActionInfo api, StringBuilder code)
        {
            code.AppendLine($@"# {(api.ControllerCaption ?? api.ControllerName)} 
---
");
        }
Ejemplo n.º 15
0
        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}
```
");
        }
Ejemplo n.º 16
0
 public ApiGetAllTemplate(ApiActionInfo model, IDictionary <string, string> entities) :
     base(model)
 {
     Entities = entities;
 }
 public ApiDeleteTemplate(ApiActionInfo model) :
     base(model)
 {
 }