public static Cloud SetHooks(this Cloud cloud) { cloud.BeforeSave("Todo", todo => { var title = todo.Get<string>("title"); // reset value for title if (!string.IsNullOrEmpty(title)) if (title.Length > 20) todo["title"] = title.Substring(0, 20); // returning any value will be ok. return Task.FromResult(true); }).BeforeSave("Review", review => { var comment = review.Get<string>("comment"); if (comment.Length > 140) review["comment"] = comment.Substring(0, 137) + "..."; return Task.FromResult(comment); }).AfterSave("Review", async review => { var post = review.Get<AVObject>("post"); await post.FetchAsync(); post.Increment("comments"); await post.SaveAsync(); }).AfterSave("_User", async user => { if (user is AVUser avUser) { avUser.Set("from", "LeanCloud"); await avUser.SaveAsync(); } }).BeforeUpdate("Review", (EngineObjectHookContext context) => { if (context.UpdatedKeys.Contains("comment")) { var comment = context.TheObject.Get<string>("comment"); if (comment.Length > 140) throw new EngineException(400, "comment 长度不得超过 140 字符"); } return Task.FromResult(true); }).AfterSave("Article", article => { Console.WriteLine(article.ObjectId); return Task.FromResult(true); }).BeforeDelete("Album", async album => { AVQuery<AVObject> query = new AVQuery<AVObject>("Photo"); query.WhereEqualTo("album", album); int count = await query.CountAsync(); if (count > 0) { throw new Exception("无法删除非空相簿"); } else { Console.WriteLine("deleted."); } }).AfterDelete("Album", async album => { AVQuery<AVObject> query = new AVQuery<AVObject>("Photo"); query.WhereEqualTo("album", album); var result = await query.FindAsync(); if (result != null && result.Count() != 0) { await AVObject.DeleteAllAsync(result); } }).OnVerifiedSMS((AVUser user) => { Console.WriteLine("user verified by sms"); return Task.FromResult(true); }).OnLogIn((AVUser user) => { Console.WriteLine("user logged in."); return Task.FromResult(true); }); return cloud; }
public static void UseLambda(this Cloud cloud) { // case 1. use EngineObjectHookContext cloud.UseHook("Todo", EngineHookType.BeforeSave, (context) => { var todo = context.TheObject; var by = context.By; return(Task.FromResult(context.TheObject)); }); cloud.BeforeSave("Todo", (context) => { return(Task.FromResult(context.TheObject)); }); // case 2. use TheObject cloud.UseHook("Todo", EngineHookType.BeforeSave, (AVObject todoObj) => { return(Task.FromResult(todoObj)); }); cloud.BeforeSave("Todo", (AVObject todoObj) => { return(Task.FromResult(todoObj)); }); // case 3. use TheObject and user cloud.UseHook("Todo", EngineHookType.BeforeSave, (AVObject todoObj, AVUser by) => { return(Task.FromResult(todoObj)); }); cloud.BeforeSave("Todo", (AVObject todoObj, AVUser by) => { return(Task.FromResult(todoObj)); }); // case 3. use sub-class AVObject.RegisterSubclass <Todo>(); cloud.UseHook <Todo>(EngineHookType.BeforeSave, (Todo theTodoObj) => { // theTodoObj is an Todo instance. return(Task.FromResult(theTodoObj)); }); cloud.UseHook <Todo>(EngineHookType.BeforeSave, (Todo theTodoObj, AVUser by) => { return(Task.FromResult(theTodoObj)); }); cloud.BeforeSave <Todo>((todo) => { // todo is an Todo instance. return(Task.FromResult(todo)); }); cloud.BeforeSave <Todo>((todo, by) => { // todo is an Todo instance. return(Task.FromResult(todo)); }); cloud.BeforeUpdate("Todo", review => { var updatedKeys = review.GetUpdatedKeys(); if (updatedKeys.Contains("comment")) { var comment = review.Get <string>("comment"); if (comment.Length > 140) { throw new EngineException(400, "comment 长度不得超过 140 字符"); } } return(Task.FromResult(true)); }); EngineHookDelegateSynchronous afterPostHook = (post) => { }; cloud.AfterSave("Post", (EngineObjectHookDeltegateSynchronous)(async post => { // 直接修改并保存对象不会再次触发 after update hook 函数 post["foo"] = "bar"; await post.SaveAsync(); // 如果有 FetchAsync 操作,则需要在新获得的对象上调用相关的 disable 方法 // 来确保不会再次触发 Hook 函数 await post.FetchAsync(); post.DisableAfterHook(); post["foo"] = "bar"; // 如果是其他方式构建对象,则需要在新构建的对象上调用相关的 disable 方法 // 来确保不会再次触发 Hook 函数 post = AVObject.CreateWithoutData <AVObject>(post.ObjectId); post.DisableAfterHook(); await post.SaveAsync(); })); }
public static Cloud SetHooks(this Cloud cloud) { cloud.BeforeSave("Todo", SampleHooks.Singleton.CheckTitle); cloud.UseHookClass <TodoHook>(); return(cloud); }