using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using LeanCloud.Storage.Internal; namespace LeanCloud.Storage.Internal { public class AVUserController : IAVUserController { private readonly IAVCommandRunner commandRunner; public AVUserController(IAVCommandRunner commandRunner) { this.commandRunner = commandRunner; } public Task SignUpAsync(IObjectState state, IDictionary operations, CancellationToken cancellationToken) { var objectJSON = AVObject.ToJSONObjectForSaving(operations); var command = new AVCommand("classes/_User", method: "POST", data: objectJSON); return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(t => { var serverState = AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance); serverState = serverState.MutatedClone(mutableClone => { mutableClone.IsNew = true; }); return serverState; }); } public Task LogInAsync(string username, string email, string password, CancellationToken cancellationToken) { var data = new Dictionary{ { "password", password} }; if (username != null) { data.Add("username", username); } if (email != null) { data.Add("email", email); } var command = new AVCommand("login", method: "POST", data: data); return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(t => { var serverState = AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance); serverState = serverState.MutatedClone(mutableClone => { mutableClone.IsNew = t.Result.Item1 == System.Net.HttpStatusCode.Created; }); return serverState; }); } public Task LogInAsync(string authType, IDictionary data, bool failOnNotExist, CancellationToken cancellationToken) { var authData = new Dictionary(); authData[authType] = data; var path = failOnNotExist ? "users?failOnNotExist=true" : "users"; var command = new AVCommand(path, method: "POST", data: new Dictionary { { "authData", authData} }); return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(t => { var serverState = AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance); serverState = serverState.MutatedClone(mutableClone => { mutableClone.IsNew = t.Result.Item1 == System.Net.HttpStatusCode.Created; }); return serverState; }); } public Task GetUserAsync(string sessionToken, CancellationToken cancellationToken) { var command = new AVCommand("users/me", method: "GET", sessionToken: sessionToken, data: null); return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(t => { return AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance); }); } public Task RequestPasswordResetAsync(string email, CancellationToken cancellationToken) { var command = new AVCommand("requestPasswordReset", method: "POST", data: new Dictionary { { "email", email} }); return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken); } public Task LogInWithParametersAsync(string relativeUrl, IDictionary data, CancellationToken cancellationToken) { var command = new AVCommand(string.Format("{0}", relativeUrl), method: "POST", data: data); return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(t => { var serverState = AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance); serverState = serverState.MutatedClone(mutableClone => { mutableClone.IsNew = t.Result.Item1 == System.Net.HttpStatusCode.Created; }); return serverState; }); } public Task UpdatePasswordAsync(string userId, string sessionToken, string oldPassword, string newPassword, CancellationToken cancellationToken) { var command = new AVCommand(String.Format("users/{0}/updatePassword", userId), method: "PUT", sessionToken: sessionToken, data: new Dictionary { {"old_password", oldPassword}, {"new_password", newPassword}, }); return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken); } public Task RefreshSessionTokenAsync(string userId, string sessionToken, CancellationToken cancellationToken) { var command = new AVCommand(String.Format("users/{0}/refreshSessionToken", userId), method: "PUT", sessionToken: sessionToken, data: null); return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).OnSuccess(t => { var serverState = AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance); return serverState; }); } } }