blob: 36c249084f5bbbec6d55ad9916c218ddb2ce49c4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Security.Authentication;
using System.Text;
using System.Threading.Tasks;
using Tango.BL;
using Tango.BL.Builders;
using Tango.BL.DTO;
using Tango.BL.Entities;
using Tango.FSE.BL.CacheEntities;
using Tango.FSE.Web.Messages;
namespace Tango.FSE.BL.Services
{
/// <summary>
/// Represents a users service used for retrieving/updating users.
/// </summary>
/// <seealso cref="Tango.FSE.BL.FSEServiceBase" />
public class UsersService : FSEServiceBase
{
private const string FULL_USERS_COLLECTION = "Users_Full";
/// <summary>
/// Gets a user by the specified email along with all its organization, roles and permissions.
/// Once a user is retrieved, it will be cached on disk.
/// </summary>
/// <param name="email">The email.</param>
/// <returns></returns>
public Task<User> GetUserFull(String email)
{
return DataResolver<User>.Builder.New()
.ConfigureCascade(DataResolverNode.Web, DataResolverNode.Online, DataResolverNode.DiskCache)
.Web((context) =>
{
var response = WebClient.GetUser(new GetUserRequest() { Email = email }).GetAwaiter().GetResult();
var user = response.User.ToObservable();
LogManager.Log($"User '{email}' successfully retrieved. Caching user on disk...");
try
{
using (var cache = DiskCache.CreateContext())
{
var cachedUser = CachedUser.FromObservable<CachedUser>(user);
cache.Database.GetCollection<CachedUser>(FULL_USERS_COLLECTION).Upsert(cachedUser);
}
}
catch (Exception ex)
{
LogManager.Log(ex, "Error caching user on disk.");
}
return user;
})
.Online((context) =>
{
using (ObservablesContext db = ObservablesContext.CreateDefault())
{
var user = new UserBuilder(db).Set(x => !x.Deleted && x.Email.ToLower() == email.ToLower())
.WithOrganization()
.WithRolesAndPermissions()
.Build();
LogManager.Log($"User '{email}' successfully retrieved. Caching user on disk...");
try
{
using (var cache = DiskCache.CreateContext())
{
var cachedUser = CachedUser.FromObservable<CachedUser>(user);
cache.Database.GetCollection<CachedUser>(FULL_USERS_COLLECTION).Upsert(cachedUser);
}
}
catch (Exception ex)
{
LogManager.Log(ex, "Error caching user on disk.");
}
return user;
}
})
.DiskCache((context) =>
{
using (var cache = DiskCache.CreateContext())
{
var cachedUser = cache.Database.GetCollection<CachedUser>(FULL_USERS_COLLECTION).FindOne(x => x.Email.ToLower() == email.ToLower());
if (cachedUser != null)
{
return cachedUser.ToObservable();
}
throw new AuthenticationException("User not found online or in disk cache.");
}
}).BuildExecuteAsync();
}
}
}
|