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()); }
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")); }