csharp-sdk-upm/Storage/Source/Internal/User/Controller/AVCurrentUserController.cs

160 lines
4.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Globalization;
using System.Threading;
using System.Threading.Tasks;
using LeanCloud.Storage.Internal;
namespace LeanCloud.Storage.Internal
{
public class AVCurrentUserController : IAVCurrentUserController
{
private readonly object mutex = new object();
private readonly TaskQueue taskQueue = new TaskQueue();
private IStorageController storageController;
public AVCurrentUserController(IStorageController storageController)
{
this.storageController = storageController;
}
private AVUser currentUser;
public AVUser CurrentUser
{
get
{
lock (mutex)
{
return currentUser;
}
}
set
{
lock (mutex)
{
currentUser = value;
}
}
}
public Task SetAsync(AVUser user, CancellationToken cancellationToken)
{
Task saveTask = null;
if (user == null)
{
saveTask = storageController
.LoadAsync()
.OnSuccess(t => t.Result.RemoveAsync("CurrentUser"))
.Unwrap();
}
else
{
var data = user.ServerDataToJSONObjectForSerialization();
data["objectId"] = user.ObjectId;
if (user.CreatedAt != null)
{
data["createdAt"] = user.CreatedAt.Value.ToString(AVClient.DateFormatStrings.First(),
CultureInfo.InvariantCulture);
}
if (user.UpdatedAt != null)
{
data["updatedAt"] = user.UpdatedAt.Value.ToString(AVClient.DateFormatStrings.First(),
CultureInfo.InvariantCulture);
}
saveTask = storageController
.LoadAsync()
.OnSuccess(t => t.Result.AddAsync("CurrentUser", Json.Encode(data)))
.Unwrap();
}
CurrentUser = user;
return saveTask;
}
public Task<AVUser> GetAsync(CancellationToken cancellationToken)
{
AVUser cachedCurrent;
lock (mutex)
{
cachedCurrent = CurrentUser;
}
if (cachedCurrent != null)
{
return Task<AVUser>.FromResult(cachedCurrent);
}
return storageController.LoadAsync().OnSuccess(t =>
{
object temp;
t.Result.TryGetValue("CurrentUser", out temp);
var userDataString = temp as string;
AVUser user = null;
if (userDataString != null)
{
var userData = Json.Parse(userDataString) as IDictionary<string, object>;
var state = AVObjectCoder.Instance.Decode(userData, AVDecoder.Instance);
user = AVObject.FromState<AVUser>(state, "_User");
}
CurrentUser = user;
return user;
});
}
public Task<bool> ExistsAsync(CancellationToken cancellationToken)
{
if (CurrentUser != null)
{
return Task<bool>.FromResult(true);
}
return storageController.LoadAsync().OnSuccess(t => t.Result.ContainsKey("CurrentUser"));
}
public bool IsCurrent(AVUser user)
{
lock (mutex)
{
return CurrentUser == user;
}
}
public void ClearFromMemory()
{
CurrentUser = null;
}
public void ClearFromDisk()
{
lock (mutex)
{
ClearFromMemory();
storageController.LoadAsync().OnSuccess(t => t.Result.RemoveAsync("CurrentUser"));
}
}
public Task<string> GetCurrentSessionTokenAsync(CancellationToken cancellationToken)
{
return GetAsync(cancellationToken).OnSuccess(t =>
{
var user = t.Result;
return user == null ? null : user.SessionToken;
});
}
public Task LogOutAsync(CancellationToken cancellationToken)
{
return GetAsync(cancellationToken).OnSuccess(t =>
{
ClearFromDisk();
});
}
}
}