aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/UsersService.cs
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();
        }
    }
}