示例#1
0
        public string Run(string appName, string button, [FromBody] JToken body, string blockName, [FromUri] int modelId = -1)
        {
            COREobject core    = COREobject.i;
            DBEntities context = core.Context;

            core.ModelId = modelId;
            var inputObject = body as JObject;

            if (inputObject != null)
            {
                foreach (var pair in inputObject)
                {
                    core.Data.Add(pair.Key, pair.Value.ToString());
                }
            }

            // RUN
            var tapestry   = new Modules.Tapestry2.Tapestry(core);
            var jsonResult = tapestry.jsonRun(blockName, button);

            return(jsonResult.ToString());
        }
示例#2
0
        public ActionResult Index(string path)
        {
            COREobject core          = COREobject.i;
            DBEntities masterContext = core.Context;
            JToken     response      = new JObject();

            (string appName, string apiName) = path.Split('/');
            core.Application = masterContext.Applications.SingleOrDefault(a => a.Name == appName);

            // authentication
            if (core.User == null && !TryBasicAuth())
            {
                Response.StatusCode = 401;
                Response.Headers.Remove("WWW-Authenticate");
                Response.Headers.Add("WWW-Authenticate", "Basic realm=\"Omnius\"");
                return(new EmptyResult());
            }

            // Zkusme najít vyhovující api
            API api = masterContext.APIs.Where(a => a.Name == apiName).FirstOrDefault();

            if (api == null)
            {
                Response.StatusCode = 404;
                return(new EmptyResult());
            }

            // Máme api - rozparsujeme definici
            Deserializer deserializer = new Deserializer();
            var          defYaml      = deserializer.Deserialize(new StringReader(api.Definition));
            JToken       def          = JToken.FromObject(defYaml);

            // sestavíme regulární výrazy pro cesty, pokud nejsou
            //if(!urlList.ContainsKey((int)api.Id)) {
            BuildUrlList((int)api.Id, def);
            //}

            // Vyhledáme správnou cestu
            if (!path.EndsWith("/"))
            {
                path += "/";
            }
            path = path.Substring(path.IndexOf('/'));

            bool isMatch = false;

            foreach (PathDef pd in urlList[(int)api.Id])
            {
                if (pd.rx.IsMatch(path))
                {
                    // Předáme proměnné do form collection
                    if (pd.vars.Count() > 0)
                    {
                        Match m = pd.rx.Match(path);

                        foreach (KeyValuePair <int, string> var in pd.vars)
                        {
                            core.Data.Add(var.Value, m.Groups[var.Key].Value);
                        }
                    }
                    isMatch = true;
                    break;
                }
            }

            if (!isMatch)
            {
                Response.StatusCode = 404;
                return(new EmptyResult());
            }

            // Zpracujeme GET proměnné
            foreach (string key in Request.QueryString.AllKeys)
            {
                core.Data.Add(key, Request.QueryString[key]);
            }

            // Zpracujeme POST proměnné
            foreach (string key in Request.Form)
            {
                core.Data.Add(key, Request.Form[key]);
            }

            // Zpracujeme body
            Stream req = Request.InputStream;

            req.Seek(0, SeekOrigin.Begin);
            string jsonString = new StreamReader(req).ReadToEnd();

            core.Data.Add("__RequestBody__", jsonString);

            // JSON-RPC?
            JToken rpc = null;

            if (!string.IsNullOrEmpty(jsonString))
            {
                try
                {
                    rpc = JToken.Parse(jsonString);
                    if (string.IsNullOrEmpty(rpc["jsonrpc"].ToObject <string>()))
                    {
                        rpc = null;
                    }
                }
                catch (Exception) { }
            }

            string wfName = Request.HttpMethod.ToUpper();

            if (rpc != null)
            {
                wfName += $"_{(string)rpc["method"]}";
            }

            try
            {
                var     tapestry = new Modules.Tapestry2.Tapestry(core);
                JObject result   = tapestry.jsonRun(apiName, wfName);

                if (rpc != null)
                {
                    response["jsonrpc"] = (string)rpc["jsonrpc"];
                    response["result"]  = result;
                    response["id"]      = (string)rpc["id"];
                }
                else
                {
                    response = result;
                }
            }
            catch (TapestryLoadOmniusException ex)
            {
                switch (ex.Target)
                {
                case TapestryLoadOmniusException.LoadTarget.Assembly:
                    Response.StatusCode = 404;
                    response            = BuildErrorResponse("Application not found", -32604, rpc);
                    break;

                case TapestryLoadOmniusException.LoadTarget.Block:
                    Response.StatusCode = 404;
                    response            = BuildErrorResponse("Api not found", -32601, rpc);
                    break;

                case TapestryLoadOmniusException.LoadTarget.Rule:
                    Response.StatusCode = 405;
                    response            = BuildErrorResponse("Method not found", -32601, rpc);
                    break;
                }
            }
            catch (TapestryAuthenticationOmniusException)
            {
                Response.StatusCode = 403;
                response            = BuildErrorResponse("You are not allowed to use this endpoint and method", -32600, rpc);
            }
            catch (TapestryRunOmniusException ex)
            {
                Response.StatusCode = 500;
                BuildErrorResponse(ex.Message, -32603, rpc);
            }

            return(Content(response.ToString(), "application/json"));
        }