Exemple #1
0
 public object Encode()
 {
     return(new Dictionary <string, object> {
         { "__op", "AddUnique" },
         { "objects", LCEncoder.Encode(values.ToList()) }
     });
 }
Exemple #2
0
        /// <summary>
        /// Deletes this status.
        /// </summary>
        /// <returns></returns>
        public new async Task Delete()
        {
            LCUser user = await LCUser.GetCurrent();

            if (user == null)
            {
                throw new ArgumentNullException("current user");
            }

            LCUser source = (Data[SourceKey] ?? this[SourceKey]) as LCUser;

            if (source != null && source.ObjectId == user.ObjectId)
            {
                await LCCore.HttpClient.Delete($"statuses/{ObjectId}");
            }
            else
            {
                Dictionary <string, object> data = new Dictionary <string, object> {
                    { OwnerKey, JsonConvert.SerializeObject(LCEncoder.Encode(user)) },
                    { InboxTypeKey, InboxType },
                    { MessageIdKey, MessageId }
                };
                await LCCore.HttpClient.Delete("subscribe/statuses/inbox", queryParams : data);
            }
        }
Exemple #3
0
 public object Encode()
 {
     return(new Dictionary <string, object> {
         { "__op", "Remove" },
         { "objects", LCEncoder.Encode(valueList) }
     });
 }
Exemple #4
0
 object ILCOperation.Encode()
 {
     return(new Dictionary <string, object> {
         { "__op", "Add" },
         { "objects", LCEncoder.Encode(valueList) }
     });
 }
Exemple #5
0
        /// <summary>
        /// Gets the count of the status with inboxType.
        /// </summary>
        /// <param name="inboxType"></param>
        /// <returns></returns>
        public static async Task <LCStatusCount> GetCount(string inboxType)
        {
            LCUser user = await LCUser.GetCurrent();

            if (user == null)
            {
                throw new ArgumentNullException("current user");
            }

            Dictionary <string, object> queryParams = new Dictionary <string, object> {
                { OwnerKey, JsonConvert.SerializeObject(LCEncoder.Encode(user)) }
            };

            if (!string.IsNullOrEmpty(inboxType))
            {
                queryParams[InboxTypeKey] = inboxType;
            }
            Dictionary <string, object> response = await LCCore.HttpClient.Get <Dictionary <string, object> >("subscribe/statuses/count",
                                                                                                              queryParams : queryParams);

            LCStatusCount statusCount = new LCStatusCount {
                Total  = (int)response["total"],
                Unread = (int)response["unread"]
            };

            return(statusCount);
        }
Exemple #6
0
        static async Task SaveBatches(Stack <LCBatch> batches)
        {
            while (batches.Count > 0)
            {
                LCBatch batch = batches.Pop();

                // 特殊处理 File 依赖
                IEnumerable <LCFile> dirtyFiles = batch.objects.Where(item => (item is LCFile) && item.IsDirty)
                                                  .Cast <LCFile>();
                foreach (LCFile file in dirtyFiles)
                {
                    await file.Save();
                }

                List <LCObject> dirtyObjects = batch.objects.Where(item => item.IsDirty)
                                               .ToList();
                if (dirtyObjects.Count == 0)
                {
                    continue;
                }

                List <Dictionary <string, object> > requestList = dirtyObjects.Select(item => {
                    string path = item.ObjectId == null ?
                                  $"/1.1/classes/{item.ClassName}" :
                                  $"/1.1/classes/{item.ClassName}/{item.ClassName}";
                    string method = item.ObjectId == null ? "POST" : "PUT";
                    Dictionary <string, object> body = LCEncoder.Encode(item.operationDict) as Dictionary <string, object>;
                    return(new Dictionary <string, object> {
                        { "path", path },
                        { "method", method },
                        { "body", body }
                    });
                }).ToList();

                Dictionary <string, object> data = new Dictionary <string, object> {
                    { "requests", LCEncoder.Encode(requestList) }
                };

                List <Dictionary <string, object> > results = await LCCore.HttpClient.Post <List <Dictionary <string, object> > >("batch", data : data);

                List <LCObjectData> resultList = results.Select(item => {
                    if (item.TryGetValue("error", out object error))
                    {
                        Dictionary <string, object> err = error as Dictionary <string, object>;
                        int code       = (int)err["code"];
                        string message = (string)err["error"];
                        throw new LCException(code, message as string);
                    }
                    return(LCObjectData.Decode(item["success"] as IDictionary));
                }).ToList();

                for (int i = 0; i < dirtyObjects.Count; i++)
                {
                    LCObject     obj     = dirtyObjects[i];
                    LCObjectData objData = resultList[i];
                    obj.Merge(objData);
                }
            }
        }
Exemple #7
0
 public Dictionary <string, object> Encode()
 {
     return(new Dictionary <string, object> {
         { key, new Dictionary <string, object> {
               { op, LCEncoder.Encode(value) }
           } }
     });
 }
 public Dictionary <string, object> Encode()
 {
     return(new Dictionary <string, object> {
         { "$relatedTo", new Dictionary <string, object> {
               { "object", LCEncoder.Encode(parent) },
               { "key", key }
           } }
     });
 }
Exemple #9
0
        /// <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 ?? new Dictionary <string, object>());
            Dictionary <string, object> response = await LCCore.HttpClient.Post <Dictionary <string, object> >(path,
                                                                                                               headers : headers,
                                                                                                               data : encodeParams);

            return(response);
        }
 public Dictionary <string, object> Encode()
 {
     if (conditionList == null || conditionList.Count == 0)
     {
         return(null);
     }
     if (conditionList.Count == 1)
     {
         ILCQueryCondition cond = conditionList[0];
         return(cond.Encode());
     }
     return(new Dictionary <string, object> {
         { composition, LCEncoder.Encode(conditionList) }
     });
 }
Exemple #11
0
        async Task <Dictionary <string, object> > GetUploadToken()
        {
            Dictionary <string, object> data = new Dictionary <string, object> {
                { "name", Name },
                { "__type", "File" },
                { "mime_type", MimeType },
                { "metaData", MetaData }
            };

            if (ACL != null)
            {
                data["ACL"] = LCEncoder.EncodeACL(ACL);
            }
            return(await LCCore.HttpClient.Post <Dictionary <string, object> >("fileTokens", data : data));
        }
Exemple #12
0
 /// <summary>
 /// Deletes each object in the provided list.
 /// </summary>
 /// <param name="objects"></param>
 /// <returns></returns>
 public static async Task DeleteAll(IEnumerable <LCObject> objects)
 {
     if (objects == null || objects.Count() == 0)
     {
         throw new ArgumentNullException(nameof(objects));
     }
     HashSet <LCObject> objectSet = new HashSet <LCObject>(objects.Where(item => item.ObjectId != null));
     List <Dictionary <string, object> > requestList = objectSet.Select(item => {
         string path = $"/{LCCore.APIVersion}/classes/{item.ClassName}/{item.ObjectId}";
         return(new Dictionary <string, object> {
             { "path", path },
             { "method", "DELETE" }
         });
     }).ToList();
     Dictionary <string, object> data = new Dictionary <string, object> {
         { "requests", LCEncoder.Encode(requestList) }
     };
     await LCCore.HttpClient.Post <List <object> >("batch", data : data);
 }
Exemple #13
0
        /// <summary>
        /// Fetches all of the objects in the provided list.
        /// </summary>
        /// <param name="objects">The objects for fetching.</param>
        /// <returns></returns>
        public static async Task <IEnumerable <LCObject> > FetchAll(IEnumerable <LCObject> objects)
        {
            if (objects == null || objects.Count() == 0)
            {
                throw new ArgumentNullException(nameof(objects));
            }

            IEnumerable <LCObject> uniqueObjects            = objects.Where(item => item.ObjectId != null);
            List <Dictionary <string, object> > requestList = uniqueObjects.Select(item => {
                string path = $"/{LCCore.APIVersion}/classes/{item.ClassName}/{item.ObjectId}";
                return(new Dictionary <string, object> {
                    { "path", path },
                    { "method", "GET" }
                });
            }).ToList();

            Dictionary <string, object> data = new Dictionary <string, object> {
                { "requests", LCEncoder.Encode(requestList) }
            };
            List <Dictionary <string, object> > results = await LCCore.HttpClient.Post <List <Dictionary <string, object> > >("batch",
                                                                                                                              data : data);

            Dictionary <string, LCObjectData> dict = new Dictionary <string, LCObjectData>();

            foreach (Dictionary <string, object> item in results)
            {
                if (item.TryGetValue("error", out object error))
                {
                    int    code    = (int)error;
                    string message = item["error"] as string;
                    throw new LCException(code, message);
                }
                Dictionary <string, object> d = item["success"] as Dictionary <string, object>;
                string objectId = d["objectId"] as string;
                dict[objectId] = LCObjectData.Decode(d);
            }
            foreach (LCObject obj in objects)
            {
                LCObjectData objData = dict[obj.ObjectId];
                obj.Merge(objData);
            }
            return(objects);
        }
Exemple #14
0
        /// <summary>
        /// Sends this status.
        /// </summary>
        /// <returns></returns>
        public async Task <LCStatus> Send()
        {
            LCUser user = await LCUser.GetCurrent();

            if (user == null)
            {
                throw new ArgumentNullException("current user");
            }

            Dictionary <string, object> formData = new Dictionary <string, object> {
                { InboxTypeKey, InboxType }
            };

            if (Data != null)
            {
                formData["data"] = LCEncoder.Encode(Data);
            }
            if (query != null)
            {
                Dictionary <string, object> queryData = new Dictionary <string, object> {
                    { "className", query.ClassName }
                };
                Dictionary <string, object> ps = query.BuildParams();
                if (ps.TryGetValue("where", out object whereObj) &&
                    whereObj is string where)
                {
                    queryData["where"] = JsonConvert.DeserializeObject(where);
                }
                if (ps.TryGetValue("keys", out object keys))
                {
                    queryData["keys"] = keys;
                }
                formData["query"] = queryData;
            }
            Dictionary <string, object> response = await LCCore.HttpClient.Post <Dictionary <string, object> >("statuses",
                                                                                                               data : formData);

            LCObjectData objectData = LCObjectData.Decode(response);

            Merge(objectData);

            return(this);
        }
Exemple #15
0
        /// <summary>
        /// Resets the count of the status to be zero.
        /// </summary>
        /// <param name="inboxType"></param>
        /// <returns></returns>
        public static async Task ResetUnreadCount(string inboxType = null)
        {
            LCUser user = await LCUser.GetCurrent();

            if (user == null)
            {
                throw new ArgumentNullException("current user");
            }

            Dictionary <string, object> queryParams = new Dictionary <string, object> {
                { OwnerKey, JsonConvert.SerializeObject(LCEncoder.Encode(user)) }
            };

            if (!string.IsNullOrEmpty(inboxType))
            {
                queryParams[InboxTypeKey] = inboxType;
            }
            await LCCore.HttpClient.Post <Dictionary <string, object> >("subscribe/statuses/resetUnreadCount",
                                                                        queryParams : queryParams);
        }
Exemple #16
0
        /// <summary>
        /// Requests to add a friend.
        /// </summary>
        /// <param name="userId">The user id to add.</param>
        /// <param name="attributes">The additional attributes for the friendship.</param>
        /// <returns></returns>
        public static async Task Request(string userId, Dictionary <string, object> attributes = null)
        {
            LCUser user = await LCUser.GetCurrent();

            if (user == null)
            {
                throw new ArgumentNullException("current user");
            }
            string   path   = "users/friendshipRequests";
            LCObject friend = LCObject.CreateWithoutData("_User", userId);
            Dictionary <string, object> data = new Dictionary <string, object> {
                { "user", LCEncoder.EncodeLCObject(user) },
                { "friend", LCEncoder.EncodeLCObject(friend) },
            };

            if (attributes != null)
            {
                data["friendship"] = attributes;
            }
            await LCCore.HttpClient.Post <Dictionary <string, object> >(path, data : data);
        }
Exemple #17
0
        internal static Dictionary <string, object> Encode(LCObjectData objectData)
        {
            if (objectData == null)
            {
                return(null);
            }
            Dictionary <string, object> dict = new Dictionary <string, object> {
                { "className", objectData.ClassName },
                { "objectId", objectData.ObjectId },
                { "createdAt", objectData.CreatedAt },
                { "updatedAt", objectData.UpdatedAt },
            };

            if (objectData.CustomPropertyDict != null)
            {
                foreach (KeyValuePair <string, object> kv in objectData.CustomPropertyDict)
                {
                    string key   = kv.Key;
                    object value = kv.Value;
                    dict[key] = LCEncoder.Encode(value);
                }
            }
            return(dict);
        }
Exemple #18
0
        /// <summary>
        /// Retrieves a list of LCStatus that satisfy the query from the cloud.
        /// </summary>
        /// <returns></returns>
        public new async Task <ReadOnlyCollection <LCStatus> > Find()
        {
            LCUser user = await LCUser.GetCurrent();

            if (user == null)
            {
                throw new ArgumentNullException("current user");
            }

            Dictionary <string, object> queryParams = new Dictionary <string, object> {
                { LCStatus.OwnerKey, JsonConvert.SerializeObject(LCEncoder.Encode(user)) },
                { LCStatus.InboxTypeKey, InboxType },
                { "where", BuildWhere() },
                { "sinceId", SinceId },
                { "maxId", MaxId },
                { "limit", Condition.Limit }
            };
            Dictionary <string, object> response = await LCCore.HttpClient.Get <Dictionary <string, object> >("subscribe/statuses",
                                                                                                              queryParams : queryParams);

            List <object>   results  = response["results"] as List <object>;
            List <LCStatus> statuses = new List <LCStatus>();

            foreach (object item in results)
            {
                LCObjectData objectData = LCObjectData.Decode(item as IDictionary);
                LCStatus     status     = new LCStatus();
                status.Merge(objectData);
                status.MessageId = (int)objectData.CustomPropertyDict[LCStatus.MessageIdKey];
                status.Data      = objectData.CustomPropertyDict;
                status.InboxType = objectData.CustomPropertyDict[LCStatus.InboxTypeKey] as string;
                statuses.Add(status);
            }

            return(statuses.AsReadOnly());
        }
Exemple #19
0
        internal async Task <LCIMConversation> CreateConv(
            IEnumerable <string> members = null,
            string name      = null,
            bool transient   = false,
            bool unique      = true,
            bool temporary   = false,
            int temporaryTtl = 86400,
            Dictionary <string, object> properties = null)
        {
            GenericCommand request = NewCommand(CommandType.Conv, OpType.Start);
            ConvCommand    conv    = new ConvCommand {
                Transient = transient,
                Unique    = unique,
            };

            if (members != null)
            {
                conv.M.AddRange(members);
            }
            if (temporary)
            {
                conv.TempConv    = temporary;
                conv.TempConvTTL = temporaryTtl;
            }
            Dictionary <string, object> attrs = new Dictionary <string, object>();

            if (!string.IsNullOrEmpty(name))
            {
                attrs["name"] = name;
            }
            if (properties != null)
            {
                attrs = properties.Union(attrs.Where(kv => !properties.ContainsKey(kv.Key)))
                        .ToDictionary(k => k.Key, v => v.Value);
            }
            conv.Attr = new JsonObjectMessage {
                Data = JsonConvert.SerializeObject(LCEncoder.Encode(attrs))
            };
            if (Client.SignatureFactory != null)
            {
                LCIMSignature signature = await Client.SignatureFactory.CreateStartConversationSignature(Client.Id, members);

                conv.S = signature.Signature;
                conv.T = signature.Timestamp;
                conv.N = signature.Nonce;
            }
            request.ConvMessage = conv;
            GenericCommand response = await Connection.SendRequest(request);

            string convId = response.ConvMessage.Cid;

            if (!Client.ConversationDict.TryGetValue(convId, out LCIMConversation conversation))
            {
                if (transient)
                {
                    conversation = new LCIMChatRoom(Client);
                }
                else if (temporary)
                {
                    conversation = new LCIMTemporaryConversation(Client);
                }
                else if (properties != null && properties.ContainsKey("system"))
                {
                    conversation = new LCIMServiceConversation(Client);
                }
                else
                {
                    conversation = new LCIMConversation(Client);
                }
                Client.ConversationDict[convId] = conversation;
            }
            // 合并请求数据
            conversation.Id        = convId;
            conversation.Unique    = unique;
            conversation.UniqueId  = response.ConvMessage.UniqueId;
            conversation.Name      = name;
            conversation.CreatorId = Client.Id;
            conversation.ids       = members != null ?
                                     new HashSet <string>(members) : new HashSet <string>();
            // 将自己加入
            conversation.ids.Add(Client.Id);
            conversation.CreatedAt = DateTime.Parse(response.ConvMessage.Cdate);
            conversation.UpdatedAt = conversation.CreatedAt;
            return(conversation);
        }
Exemple #20
0
        /// <summary>
        /// Serializes this LCObject to a JSON string.
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            Dictionary <string, object> originalData = LCObjectData.Encode(data);
            Dictionary <string, object> currentData  = estimatedData.Union(originalData.Where(kv => !estimatedData.ContainsKey(kv.Key)))
                                                       .ToDictionary(k => k.Key, v => LCEncoder.Encode(v.Value));

            return(JsonConvert.SerializeObject(currentData));
        }
Exemple #21
0
        /// <summary>
        /// Saves this object to the cloud.
        /// </summary>
        /// <param name="fetchWhenSave">Whether or not fetch data when saved.</param>
        /// <param name="query">The condition for saving.</param>
        /// <returns></returns>
        public async Task <LCObject> Save(bool fetchWhenSave = false, LCQuery <LCObject> query = null)
        {
            if (LCBatch.HasCircleReference(this, new HashSet <LCObject>()))
            {
                throw new ArgumentException("Found a circle dependency when save.");
            }

            Stack <LCBatch> batches = LCBatch.BatchObjects(new List <LCObject> {
                this
            }, false);

            if (batches.Count > 0)
            {
                await SaveBatches(batches);
            }

            string path = ObjectId == null ? $"classes/{ClassName}" : $"classes/{ClassName}/{ObjectId}";
            Dictionary <string, object> queryParams = new Dictionary <string, object>();

            if (fetchWhenSave)
            {
                queryParams["fetchWhenSave"] = true;
            }
            if (query != null)
            {
                queryParams["where"] = query.BuildWhere();
            }
            Dictionary <string, object> response = ObjectId == null ?
                                                   await LCCore.HttpClient.Post <Dictionary <string, object> >(path, data : LCEncoder.Encode(operationDict) as Dictionary <string, object>, queryParams : queryParams) :
                                                   await LCCore.HttpClient.Put <Dictionary <string, object> >(path, data : LCEncoder.Encode(operationDict) as Dictionary <string, object>, queryParams : queryParams);

            LCObjectData data = LCObjectData.Decode(response);

            Merge(data);
            return(this);
        }
Exemple #22
0
 public object Encode()
 {
     return(LCEncoder.Encode(value));
 }