104 lines
3.9 KiB
C#
104 lines
3.9 KiB
C#
using System.Threading.Tasks;
|
|
using System.Collections.Generic;
|
|
using LeanCloud.Storage.Internal.Codec;
|
|
using LeanCloud.Storage.Internal.Object;
|
|
|
|
namespace LeanCloud.Storage {
|
|
/// <summary>
|
|
/// LeanEngine
|
|
/// </summary>
|
|
public static class LCCloud {
|
|
private const string PRODUCTION_KEY = "X-LC-Prod";
|
|
|
|
/// <summary>
|
|
/// Whether using production environment (default) or staging environment.
|
|
/// </summary>
|
|
public static bool IsProduction {
|
|
get; set;
|
|
} = true;
|
|
|
|
/// <summary>
|
|
/// Invokes a cloud function.
|
|
/// </summary>
|
|
/// <param name="name">Cloud function name.</param>
|
|
/// <param name="parameters">Parameters of cloud function.</param>
|
|
/// <returns>Dictionary<string, object> or List<object>.</returns>
|
|
public static async Task<Dictionary<string, object>> Run(string name,
|
|
Dictionary<string, object> parameters = null) {
|
|
string path = $"functions/{name}";
|
|
Dictionary<string, object> headers = new Dictionary<string, object> {
|
|
{ PRODUCTION_KEY, IsProduction ? 1 : 0 }
|
|
};
|
|
object encodeParams = LCEncoder.Encode(parameters);
|
|
Dictionary<string, object> response = await LCInternalApplication.HttpClient.Post<Dictionary<string, object>>(path,
|
|
headers: headers,
|
|
data: encodeParams);
|
|
return response;
|
|
}
|
|
|
|
public static async Task<T> Run<T>(string name,
|
|
Dictionary<string, object> parameters = null) {
|
|
Dictionary<string, object> response = await Run(name, parameters);
|
|
if (response.TryGetValue("result", out object result)) {
|
|
return (T)result;
|
|
}
|
|
return default;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Invokes a cloud function as a remote procedure call.
|
|
/// </summary>
|
|
/// <param name="name">Cloud function name.</param>
|
|
/// <param name="parameters">Parameters of cloud function.</param>
|
|
/// <returns>LCObject, List<LCObject>, or Map<string, LCObject>.</returns>
|
|
public static async Task<object> RPC(string name, object parameters = null) {
|
|
string path = $"call/{name}";
|
|
Dictionary<string, object> headers = new Dictionary<string, object> {
|
|
{ PRODUCTION_KEY, IsProduction ? 1 : 0 }
|
|
};
|
|
object encodeParams = Encode(parameters);
|
|
Dictionary<string, object> response = await LCInternalApplication.HttpClient.Post<Dictionary<string, object>>(path,
|
|
headers: headers,
|
|
data: encodeParams);
|
|
return LCDecoder.Decode(response["result"]);
|
|
}
|
|
|
|
public static object Encode(object parameters) {
|
|
if (parameters == null) {
|
|
return new Dictionary<string, object>();
|
|
}
|
|
|
|
if (parameters is LCObject lcObj) {
|
|
return EncodeLCObject(lcObj);
|
|
}
|
|
|
|
if (parameters is IList<LCObject> list) {
|
|
List<object> l = new List<object>();
|
|
foreach (LCObject obj in list) {
|
|
l.Add(EncodeLCObject(obj));
|
|
}
|
|
return l;
|
|
}
|
|
|
|
if (parameters is IDictionary<string, LCObject> dict) {
|
|
Dictionary<string, object> d = new Dictionary<string, object>();
|
|
foreach (KeyValuePair<string, LCObject> item in dict) {
|
|
d[item.Key] = EncodeLCObject(item.Value);
|
|
}
|
|
return d;
|
|
}
|
|
|
|
return parameters;
|
|
}
|
|
|
|
static object EncodeLCObject(LCObject obj) {
|
|
Dictionary<string, object> dict = LCObjectData.Encode(obj.data);
|
|
dict["__type"] = "Object";
|
|
foreach (KeyValuePair<string, object> kv in obj.estimatedData) {
|
|
dict[kv.Key] = kv.Value;
|
|
}
|
|
return dict;
|
|
}
|
|
}
|
|
}
|