using System; using System.Text.Json; using System.Threading.Tasks; using System.Collections.Generic; using System.Reflection; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Primitives; using Microsoft.AspNetCore.Cors; using LeanCloud.Storage.Internal.Codec; using LeanCloud.Storage; namespace LeanCloud.Engine { [ApiController] [Route("{1,1.1}")] [EnableCors(LCEngine.LCEngineCORS)] public class LCFunctionController : ControllerBase { private Dictionary Functions => LCEngine.Functions; [HttpGet("functions/_ops/metadatas")] public object GetFunctions() { try { return LCEngine.GetFunctions(Request); } catch (Exception e) { return StatusCode(500, e.Message); } } [HttpPost("functions/{funcName}")] public async Task Run(string funcName, JsonElement body) { try { LCLogger.Debug($"Run: {funcName}"); LCLogger.Debug(body.ToString()); if (Functions.TryGetValue(funcName, out MethodInfo mi)) { LCUser currentUser = null; if (Request.Headers.TryGetValue("x-lc-session", out StringValues session)) { currentUser = await LCUser.BecomeWithSessionToken(session); } LCCloudFunctionRequest req = new LCCloudFunctionRequest { Meta = new LCCloudFunctionRequestMeta { RemoteAddress = LCEngine.GetIP(Request) }, Params = LCEngine.Decode(body), SessionToken = session.ToString(), User = currentUser }; object result = await LCEngine.Invoke(mi, req); if (result != null) { return new Dictionary { { "result", result } }; } } return default; } catch (Exception e) { return StatusCode(500, e.Message); } } [HttpPost("call/{funcName}")] public async Task RPC(string funcName, JsonElement body) { try { LCLogger.Debug($"RPC: {funcName}"); LCLogger.Debug(body.ToString()); if (Functions.TryGetValue(funcName, out MethodInfo mi)) { LCUser currentUser = null; if (Request.Headers.TryGetValue("x-lc-session", out StringValues session)) { currentUser = await LCUser.BecomeWithSessionToken(session); } LCCloudRPCRequest req = new LCCloudRPCRequest { Meta = new LCCloudFunctionRequestMeta { RemoteAddress = LCEngine.GetIP(Request) }, Params = LCDecoder.Decode(LCEngine.Decode(body)), SessionToken = session.ToString(), User = currentUser }; object result = await LCEngine.Invoke(mi, req); if (result != null) { return new Dictionary { { "result", LCCloud.Encode(result) } }; } } return default; } catch (Exception e) { return StatusCode(500, e.Message); } } } }