aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/FSE/Tango.FSE.BL
diff options
context:
space:
mode:
authorRoy Ben Shabat <Roy.mail.net@gmail.com>2024-05-18 20:05:10 +0300
committerRoy Ben Shabat <Roy.mail.net@gmail.com>2024-05-18 20:05:10 +0300
commitd91db45c47a1d2d1d050fdafe8f4eb44951a883f (patch)
tree1437e1f0f7ea91dae53e59f7f605a3e603ea3926 /Software/Visual_Studio/FSE/Tango.FSE.BL
parentfd061c7cb7f243d562913d496223830bcf83b7a9 (diff)
downloadTango-d91db45c47a1d2d1d050fdafe8f4eb44951a883f.tar.gz
Tango-d91db45c47a1d2d1d050fdafe8f4eb44951a883f.zip
FSE/RSM MachineService Provides full capability.
Diffstat (limited to 'Software/Visual_Studio/FSE/Tango.FSE.BL')
-rw-r--r--Software/Visual_Studio/FSE/Tango.FSE.BL/DataResolver.cs38
-rw-r--r--Software/Visual_Studio/FSE/Tango.FSE.BL/DataResolverNode.cs1
-rw-r--r--Software/Visual_Studio/FSE/Tango.FSE.BL/EntityRepositoryBase.cs90
-rw-r--r--Software/Visual_Studio/FSE/Tango.FSE.BL/Services/MachineEventsService.cs41
-rw-r--r--Software/Visual_Studio/FSE/Tango.FSE.BL/Services/MachinesService.cs84
-rw-r--r--Software/Visual_Studio/FSE/Tango.FSE.BL/Services/PublishedProcedureProjectsService.cs37
-rw-r--r--Software/Visual_Studio/FSE/Tango.FSE.BL/Services/TangoVersionsService.cs36
-rw-r--r--Software/Visual_Studio/FSE/Tango.FSE.BL/Services/TechComponentsService.cs8
-rw-r--r--Software/Visual_Studio/FSE/Tango.FSE.BL/Services/UsersService.cs26
-rw-r--r--Software/Visual_Studio/FSE/Tango.FSE.BL/Web/FSEWebClientBase.cs54
10 files changed, 408 insertions, 7 deletions
diff --git a/Software/Visual_Studio/FSE/Tango.FSE.BL/DataResolver.cs b/Software/Visual_Studio/FSE/Tango.FSE.BL/DataResolver.cs
index 984a2e8ea..9504ae0af 100644
--- a/Software/Visual_Studio/FSE/Tango.FSE.BL/DataResolver.cs
+++ b/Software/Visual_Studio/FSE/Tango.FSE.BL/DataResolver.cs
@@ -21,6 +21,7 @@ namespace Tango.FSE.BL
private static object diskLock = new object();
private static IConnectivityProvider _connectivity;
private Func<DataResolverContext, T> _onlineAction;
+ private Func<DataResolverContext, T> _webAction;
private Func<DataResolverContext, T> _diskCacheAction;
private Func<DataResolverContext, T> _memoryCacheAction;
private Action<Exception> _onError;
@@ -73,7 +74,21 @@ namespace Tango.FSE.BL
fallingBackText = $" Falling back to {nodes[nodes.IndexOf(node) + 1]}...";
}
- if (node == DataResolverNode.Online)
+ if (node == DataResolverNode.Web)
+ {
+ try
+ {
+ if (_enableLogs) LogManager.Log($"Trying {_callingName} via web...");
+ result = ExecuteWebAction(context);
+ break;
+ }
+ catch (Exception ex)
+ {
+ if (_enableLogs) LogManager.Log($"{_callingName} via web failed with exception: {ex.FlattenMessage()}{fallingBackText}", LogCategory.Warning);
+ context.LastError = ex;
+ }
+ }
+ else if (node == DataResolverNode.Online)
{
try
{
@@ -159,6 +174,16 @@ namespace Tango.FSE.BL
return _onlineAction.Invoke(context);
}
+ private T ExecuteWebAction(DataResolverContext context)
+ {
+ if (!_connectivity.CheckOnline())
+ {
+ throw new InternetConnectionException();
+ }
+
+ return _webAction.Invoke(context);
+ }
+
#region Context
/// <summary>
@@ -235,6 +260,17 @@ namespace Tango.FSE.BL
}
/// <summary>
+ /// Specify the method for the web client node.
+ /// </summary>
+ /// <param name="func">The method.</param>
+ /// <returns></returns>
+ public Builder Web(Func<DataResolverContext, T> func)
+ {
+ _resolver._webAction = func;
+ return this;
+ }
+
+ /// <summary>
/// Specify the method for the disk cache node.
/// </summary>
/// <param name="func">The method.</param>
diff --git a/Software/Visual_Studio/FSE/Tango.FSE.BL/DataResolverNode.cs b/Software/Visual_Studio/FSE/Tango.FSE.BL/DataResolverNode.cs
index 4c5643e2b..d95e3a745 100644
--- a/Software/Visual_Studio/FSE/Tango.FSE.BL/DataResolverNode.cs
+++ b/Software/Visual_Studio/FSE/Tango.FSE.BL/DataResolverNode.cs
@@ -12,6 +12,7 @@ namespace Tango.FSE.BL
public enum DataResolverNode
{
Online,
+ Web,
DiskCache,
InMemoryCache
}
diff --git a/Software/Visual_Studio/FSE/Tango.FSE.BL/EntityRepositoryBase.cs b/Software/Visual_Studio/FSE/Tango.FSE.BL/EntityRepositoryBase.cs
index 3bc183d11..06bd67c08 100644
--- a/Software/Visual_Studio/FSE/Tango.FSE.BL/EntityRepositoryBase.cs
+++ b/Software/Visual_Studio/FSE/Tango.FSE.BL/EntityRepositoryBase.cs
@@ -8,6 +8,8 @@ using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Tango.BL;
+using Tango.BL.Entities;
+using Tango.FSE.Web.Messages;
namespace Tango.FSE.BL
{
@@ -40,6 +42,94 @@ namespace Tango.FSE.BL
.Select(x => ConvertToEntity(x))
.ToList();
})
+ .Web((context) =>
+ {
+ List<TEntity> entities = new List<TEntity>();
+
+ if (typeof(TEntity) == typeof(TechMonitor))
+ {
+ entities = WebClient.GetTechComponents(new GetTechComponentsRequest() { Monitors = true }).GetAwaiter().GetResult()
+ .Monitors.Select(x => x.ToObservable())
+ .Cast<TEntity>().ToList();
+ }
+ else if (typeof(TEntity) == typeof(TechIo))
+ {
+ entities = WebClient.GetTechComponents(new GetTechComponentsRequest() { IOs = true }).GetAwaiter().GetResult()
+ .IOs.Select(x => x.ToObservable())
+ .Cast<TEntity>().ToList();
+ }
+ else if (typeof(TEntity) == typeof(TechDispenser))
+ {
+ entities = WebClient.GetTechComponents(new GetTechComponentsRequest() { Dispensers = true }).GetAwaiter().GetResult()
+ .Dispensers.Select(x => x.ToObservable())
+ .Cast<TEntity>().ToList();
+ }
+ else if (typeof(TEntity) == typeof(TechController))
+ {
+ entities = WebClient.GetTechComponents(new GetTechComponentsRequest() { Controllers = true }).GetAwaiter().GetResult()
+ .Controllers.Select(x => x.ToObservable())
+ .Cast<TEntity>().ToList();
+ }
+ else if (typeof(TEntity) == typeof(TechHeater))
+ {
+ entities = WebClient.GetTechComponents(new GetTechComponentsRequest() { Heaters = true }).GetAwaiter().GetResult()
+ .Heaters.Select(x => x.ToObservable())
+ .Cast<TEntity>().ToList();
+ }
+ else if (typeof(TEntity) == typeof(TechValve))
+ {
+ entities = WebClient.GetTechComponents(new GetTechComponentsRequest() { Valves = true }).GetAwaiter().GetResult()
+ .Valves.Select(x => x.ToObservable())
+ .Cast<TEntity>().ToList();
+ }
+ else if (typeof(TEntity) == typeof(HardwareMotorType))
+ {
+ entities = WebClient.GetTechComponents(new GetTechComponentsRequest() { Motors = true }).GetAwaiter().GetResult()
+ .Motors.Select(x => x.ToObservable())
+ .Cast<TEntity>().ToList();
+ }
+ else if (typeof(TEntity) == typeof(HardwareBlowerType))
+ {
+ entities = WebClient.GetTechComponents(new GetTechComponentsRequest() { Blowers = true }).GetAwaiter().GetResult()
+ .Blowers.Select(x => x.ToObservable())
+ .Cast<TEntity>().ToList();
+ }
+
+ List<TCachedEntity> cachedEntities = new List<TCachedEntity>();
+
+ try
+ {
+ foreach (var entity in entities)
+ {
+ var cachedEntity = ConvertToCached(entity);
+ cachedEntities.Add(cachedEntity);
+ _memoryCache.Put(entity.Guid, cachedEntity);
+ }
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, $"Error occurred while trying to cache entities of type '{typeof(TEntity).Name}' to memory.");
+ }
+
+ try
+ {
+ using (var cache = DiskCache.CreateContext())
+ {
+ var collection = cache.Database.GetCollection<TCachedEntity>();
+
+ foreach (var cachedEntity in cachedEntities)
+ {
+ collection.Upsert(cachedEntity);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, $"Error occurred while trying to cache entities of type '{typeof(TEntity).Name}' to disk.");
+ }
+
+ return entities;
+ })
.Online((context) =>
{
using (ObservablesContext db = ObservablesContext.CreateDefault())
diff --git a/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/MachineEventsService.cs b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/MachineEventsService.cs
index 4b2609a94..2c74ad8de 100644
--- a/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/MachineEventsService.cs
+++ b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/MachineEventsService.cs
@@ -6,6 +6,7 @@ using System.Threading.Tasks;
using Tango.BL;
using Tango.BL.Entities;
using Tango.FSE.BL.CacheEntities;
+using Tango.FSE.Web.Messages;
namespace Tango.FSE.BL.Services
{
@@ -22,7 +23,7 @@ namespace Tango.FSE.BL.Services
public Task<List<EventType>> GetAllEventTypes()
{
return DataResolver<List<EventType>>.Builder.New()
- .ConfigureCascade(DataResolverNode.InMemoryCache, DataResolverNode.Online, DataResolverNode.DiskCache)
+ .ConfigureCascade(DataResolverNode.InMemoryCache, DataResolverNode.Web, DataResolverNode.Online, DataResolverNode.DiskCache)
.InMemoryCache((context) =>
{
var eventTypes = _eventTypesCache
@@ -37,6 +38,44 @@ namespace Tango.FSE.BL.Services
return eventTypes;
})
+ .Web((context) =>
+ {
+ var eventTypes = WebClient.GetEventTypes(new GetEventTypesRequest()).GetAwaiter().GetResult().EventTypes.Select(x => x.ToObservable()).ToList();
+
+ List<CachedEventType> cachedEventTypes = new List<CachedEventType>();
+
+ try
+ {
+ foreach (var eventType in eventTypes)
+ {
+ var cachedEventType = CachedEventType.FromObservable<CachedEventType>(eventType);
+ _eventTypesCache.Put(cachedEventType.Guid, cachedEventType);
+ }
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, "Error caching event types on memory.");
+ }
+
+ try
+ {
+ using (var cache = DiskCache.CreateContext())
+ {
+ var collection = cache.Database.GetCollection<CachedEventType>(EVENT_TYPES_COLLECTION);
+
+ foreach (var cachedEventType in cachedEventTypes)
+ {
+ collection.Upsert(cachedEventType);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, "Error caching event types to disk.");
+ }
+
+ return eventTypes;
+ })
.Online((context) =>
{
using (ObservablesContext db = ObservablesContext.CreateDefault())
diff --git a/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/MachinesService.cs b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/MachinesService.cs
index db1965397..5ad99f692 100644
--- a/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/MachinesService.cs
+++ b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/MachinesService.cs
@@ -15,6 +15,7 @@ using Z.EntityFramework.Plus;
using Z.EntityFramework.Extensions;
using Tango.BL.Enumerations;
using Tango.Settings;
+using Tango.FSE.Web.Messages;
namespace Tango.FSE.BL.Services
{
@@ -54,11 +55,49 @@ namespace Tango.FSE.BL.Services
bool allowAll = CurrentUser.HasPermission(Permissions.FSE_ConnectAnyMachine);
return DataResolver<Machine>.Builder.New()
- .ConfigureCascade(DataResolverNode.InMemoryCache, DataResolverNode.Online, DataResolverNode.DiskCache)
+ .ConfigureCascade(DataResolverNode.InMemoryCache, DataResolverNode.Web, DataResolverNode.Online, DataResolverNode.DiskCache)
.InMemoryCache((context) =>
{
return _machinesCache.Get(serialNumber).ToObservable();
})
+ .Web((context) =>
+ {
+ var response = WebClient.GetMachine(new GetMachineRequest()
+ {
+ AllowAllMachines = allowAll,
+ OrganizationGuid = CurrentUser.OrganizationGuid,
+ SerialNumber = serialNumber
+ }).GetAwaiter().GetResult();
+
+ if (response.Machine != null)
+ {
+ var machine = response.Machine.ToObservable();
+
+ LogManager.Log("Machine retrieved successfully. Caching machine...");
+
+ var cachedMachine = CachedMachine.FromObservable<CachedMachine>(machine);
+
+ //Store in memory cache.
+ _machinesCache.Put(serialNumber, cachedMachine);
+
+ //Store disk cache.
+ try
+ {
+ using (var cache = DiskCache.CreateContext())
+ {
+ cache.Database.GetCollection<CachedMachine>(MACHINES_COLLECTION).Upsert(cachedMachine);
+ }
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, "Error caching machine on disk.");
+ }
+
+ return machine;
+ }
+
+ throw new ArgumentOutOfRangeException($"Could not locate machine with serial number '{serialNumber}' using the remote server.");
+ })
.Online((context) =>
{
using (ObservablesContext db = ObservablesContext.CreateDefault())
@@ -132,11 +171,52 @@ namespace Tango.FSE.BL.Services
return DataResolver<Machine>.Builder.New()
.EnableLogs(enableLogs)
- .ConfigureCascade(DataResolverNode.InMemoryCache, DataResolverNode.Online, DataResolverNode.DiskCache)
+ .ConfigureCascade(DataResolverNode.InMemoryCache, DataResolverNode.Web, DataResolverNode.Online, DataResolverNode.DiskCache)
.InMemoryCache((context) =>
{
return _machinesCacheFull.Get(serialNumber).ToObservable();
})
+ .Web((context) =>
+ {
+ var response = WebClient.GetMachine(new GetMachineRequest()
+ {
+ AllowAllMachines = allowAll,
+ OrganizationGuid = CurrentUser.OrganizationGuid,
+ SerialNumber = serialNumber,
+ GetExtendedInfo = true
+ }).GetAwaiter().GetResult();
+
+ if (response.Machine != null)
+ {
+ var machine = response.Machine.ToObservable();
+
+ if (enableLogs) LogManager.Log("Machine retrieved successfully. Caching machine on disk and in memory...");
+
+ var cachedMachine = CachedMachine.FromObservable<CachedMachine>(machine);
+
+ //Store in memory cache.
+ _machinesCacheFull.Put(serialNumber, cachedMachine);
+
+ //Store disk cache.
+ try
+ {
+ using (var cache = DiskCache.CreateContext())
+ {
+ cache.Database.GetCollection<CachedMachine>(FULL_MACHINES_COLLECTION).Upsert(cachedMachine);
+ }
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, $"Error caching machine '{serialNumber}' on disk.");
+ }
+
+ return machine;
+ }
+ else
+ {
+ throw new ArgumentOutOfRangeException($"Could not locate machine with serial number '{serialNumber}' on the remote database.");
+ }
+ })
.Online((context) =>
{
using (ObservablesContext db = ObservablesContext.CreateDefault())
diff --git a/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/PublishedProcedureProjectsService.cs b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/PublishedProcedureProjectsService.cs
index 9416fd0e4..c34b2eb86 100644
--- a/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/PublishedProcedureProjectsService.cs
+++ b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/PublishedProcedureProjectsService.cs
@@ -8,6 +8,7 @@ using Tango.BL;
using Tango.BL.Entities;
using Tango.BL.Enumerations;
using Tango.FSE.BL.CacheEntities;
+using Tango.FSE.Web.Messages;
using Z.EntityFramework.Plus;
namespace Tango.FSE.BL.Services
@@ -26,7 +27,7 @@ namespace Tango.FSE.BL.Services
public Task<List<PublishedProcedureProject>> GetPublishedProcedureProjects(bool visibleOnly = true)
{
return DataResolver<List<PublishedProcedureProject>>.Builder.New()
- .ConfigureCascade(DataResolverNode.InMemoryCache, DataResolverNode.Online, DataResolverNode.DiskCache)
+ .ConfigureCascade(DataResolverNode.InMemoryCache, DataResolverNode.Web, DataResolverNode.Online, DataResolverNode.DiskCache)
.InMemoryCache((context) =>
{
var projects = _projectsCache.ToList().Where(x => x.IsVisible || !visibleOnly).Select(x => x.ToObservable()).ToList();
@@ -43,6 +44,40 @@ namespace Tango.FSE.BL.Services
return projects.OrderBy(x => x.SortingIndex).ToList();
})
+ .Web((context) =>
+ {
+ var response = WebClient.GetProcedures(new GetProceduresRequest() { GetOnlyVisible = visibleOnly }).GetAwaiter().GetResult();
+
+ var projects = response.Projects.Select(x => x.ToObservable()).ToList();
+
+ if (!CurrentUser.HasPermission(Permissions.FSE_ViewInternalPublishedProcedures))
+ {
+ projects.RemoveAll(x => x.ProjectVisibility == PublishedProcedureProjectVisibilities.Internal);
+ }
+
+ try
+ {
+ using (var cache = DiskCache.CreateContext())
+ {
+ var collection = cache.Database.GetCollection<CachedPublishedProcedureProject>(PUBLISHED_Procedure_PROJECTS_COLLECTION);
+
+ foreach (var project in projects)
+ {
+ var cachedProject = CachedPublishedProcedureProject.FromObservable<CachedPublishedProcedureProject>(project);
+ _projectsCache.Put(cachedProject.Guid, cachedProject);
+
+ collection.Upsert(cachedProject);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, "Error caching published procedure projects.");
+ }
+
+
+ return projects.OrderBy(x => x.SortingIndex).ToList();
+ })
.Online((context) =>
{
using (ObservablesContext db = ObservablesContext.CreateDefault())
diff --git a/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/TangoVersionsService.cs b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/TangoVersionsService.cs
index 32c7b5b04..40783a989 100644
--- a/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/TangoVersionsService.cs
+++ b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/TangoVersionsService.cs
@@ -9,6 +9,7 @@ using Tango.BL;
using Tango.BL.DTO;
using Tango.BL.Entities;
using Tango.FSE.BL.CacheEntities;
+using Tango.FSE.Web.Messages;
namespace Tango.FSE.BL.Services
{
@@ -29,7 +30,7 @@ namespace Tango.FSE.BL.Services
public Task<List<TangoVersion>> GetAllTangoVersions()
{
return DataResolver<List<TangoVersion>>.Builder.New()
- .ConfigureCascade(DataResolverNode.InMemoryCache, DataResolverNode.Online, DataResolverNode.DiskCache)
+ .ConfigureCascade(DataResolverNode.InMemoryCache, DataResolverNode.Web, DataResolverNode.Online, DataResolverNode.DiskCache)
.InMemoryCache((context) =>
{
var tangoVersions = _tangoVersionsCache
@@ -46,6 +47,39 @@ namespace Tango.FSE.BL.Services
return tangoVersions;
})
+ .Web((context) =>
+ {
+ var tangoVersions = WebClient.GetTangoVersions(new GetTangoVersionsRequest()).GetAwaiter().GetResult()
+ .Versions
+ .Select(x => x.ToObservable())
+ .ToList();
+
+ using (var cache = DiskCache.CreateContext())
+ {
+ var collection = cache.Database.GetCollection<CachedTangoVersion>(TANGO_VERSIONS_COLLECTION);
+
+ foreach (var tangoVersion in tangoVersions)
+ {
+ try
+ {
+ var tangoVersionDTO = TangoVersionDTO.FromObservable(tangoVersion);
+ CachedTangoVersion cachedTangoVersion = new CachedTangoVersion();
+ cachedTangoVersion.EnvironmentID = Authentication.CurrentEnvironment.ID;
+ cachedTangoVersion.TangoVersion = tangoVersionDTO;
+
+ _tangoVersionsCache.Put(tangoVersion.Version, Authentication.CurrentEnvironment.ID, cachedTangoVersion);
+
+ collection.Upsert(cachedTangoVersion);
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, $"Error caching Tango version '{tangoVersion.Version}' on disk.");
+ }
+ }
+ }
+
+ return tangoVersions;
+ })
.Online((context) =>
{
using (ObservablesContext db = ObservablesContext.CreateDefault())
diff --git a/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/TechComponentsService.cs b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/TechComponentsService.cs
index 418c03409..5277b5539 100644
--- a/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/TechComponentsService.cs
+++ b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/TechComponentsService.cs
@@ -28,6 +28,7 @@ namespace Tango.FSE.BL.Services
x => x.ToObservable(),
x => TechMonitorDTO.FromObservable(x),
DataResolverNode.InMemoryCache,
+ DataResolverNode.Web,
DataResolverNode.Online,
DataResolverNode.DiskCache);
@@ -35,6 +36,7 @@ namespace Tango.FSE.BL.Services
x => x.ToObservable(),
x => TechIoDTO.FromObservable(x),
DataResolverNode.InMemoryCache,
+ DataResolverNode.Web,
DataResolverNode.Online,
DataResolverNode.DiskCache);
@@ -42,6 +44,7 @@ namespace Tango.FSE.BL.Services
x => x.ToObservable(),
x => TechDispenserDTO.FromObservable(x),
DataResolverNode.InMemoryCache,
+ DataResolverNode.Web,
DataResolverNode.Online,
DataResolverNode.DiskCache);
@@ -49,6 +52,7 @@ namespace Tango.FSE.BL.Services
x => x.ToObservable(),
x => TechControllerDTO.FromObservable(x),
DataResolverNode.InMemoryCache,
+ DataResolverNode.Web,
DataResolverNode.Online,
DataResolverNode.DiskCache);
@@ -56,6 +60,7 @@ namespace Tango.FSE.BL.Services
x => x.ToObservable(),
x => TechHeaterDTO.FromObservable(x),
DataResolverNode.InMemoryCache,
+ DataResolverNode.Web,
DataResolverNode.Online,
DataResolverNode.DiskCache);
@@ -63,6 +68,7 @@ namespace Tango.FSE.BL.Services
x => x.ToObservable(),
x => TechValveDTO.FromObservable(x),
DataResolverNode.InMemoryCache,
+ DataResolverNode.Web,
DataResolverNode.Online,
DataResolverNode.DiskCache);
@@ -70,6 +76,7 @@ namespace Tango.FSE.BL.Services
x => x.ToObservable(),
x => HardwareMotorTypeDTO.FromObservable(x),
DataResolverNode.InMemoryCache,
+ DataResolverNode.Web,
DataResolverNode.Online,
DataResolverNode.DiskCache);
@@ -77,6 +84,7 @@ namespace Tango.FSE.BL.Services
x => x.ToObservable(),
x => HardwareBlowerTypeDTO.FromObservable(x),
DataResolverNode.InMemoryCache,
+ DataResolverNode.Web,
DataResolverNode.Online,
DataResolverNode.DiskCache);
}
diff --git a/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/UsersService.cs b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/UsersService.cs
index 93a8c1548..36c249084 100644
--- a/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/UsersService.cs
+++ b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/UsersService.cs
@@ -10,6 +10,7 @@ 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
{
@@ -30,7 +31,30 @@ namespace Tango.FSE.BL.Services
public Task<User> GetUserFull(String email)
{
return DataResolver<User>.Builder.New()
- .ConfigureCascade(DataResolverNode.Online, DataResolverNode.DiskCache)
+ .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) =>
{
diff --git a/Software/Visual_Studio/FSE/Tango.FSE.BL/Web/FSEWebClientBase.cs b/Software/Visual_Studio/FSE/Tango.FSE.BL/Web/FSEWebClientBase.cs
index 3cb9bc170..12a2b543b 100644
--- a/Software/Visual_Studio/FSE/Tango.FSE.BL/Web/FSEWebClientBase.cs
+++ b/Software/Visual_Studio/FSE/Tango.FSE.BL/Web/FSEWebClientBase.cs
@@ -50,6 +50,60 @@ namespace Tango.FSE.BL.Web
}
/// <summary>
+ /// Executes the GetUser action and returns Tango.FSE.Web.Messages.GetUserResponse.
+ /// </summary>
+ /// <returns></returns>
+ public Task<Tango.FSE.Web.Messages.GetUserResponse> GetUser(Tango.FSE.Web.Messages.GetUserRequest request)
+ {
+ return Post<Tango.FSE.Web.Messages.GetUserRequest, Tango.FSE.Web.Messages.GetUserResponse>("GetUser", request);
+ }
+
+ /// <summary>
+ /// Executes the GetMachine action and returns Tango.FSE.Web.Messages.GetMachineResponse.
+ /// </summary>
+ /// <returns></returns>
+ public Task<Tango.FSE.Web.Messages.GetMachineResponse> GetMachine(Tango.FSE.Web.Messages.GetMachineRequest request)
+ {
+ return Post<Tango.FSE.Web.Messages.GetMachineRequest, Tango.FSE.Web.Messages.GetMachineResponse>("GetMachine", request);
+ }
+
+ /// <summary>
+ /// Executes the GetEventTypes action and returns Tango.FSE.Web.Messages.GetEventTypesResponse.
+ /// </summary>
+ /// <returns></returns>
+ public Task<Tango.FSE.Web.Messages.GetEventTypesResponse> GetEventTypes(Tango.FSE.Web.Messages.GetEventTypesRequest request)
+ {
+ return Post<Tango.FSE.Web.Messages.GetEventTypesRequest, Tango.FSE.Web.Messages.GetEventTypesResponse>("GetEventTypes", request);
+ }
+
+ /// <summary>
+ /// Executes the GetProcedures action and returns Tango.FSE.Web.Messages.GetProceduresResponse.
+ /// </summary>
+ /// <returns></returns>
+ public Task<Tango.FSE.Web.Messages.GetProceduresResponse> GetProcedures(Tango.FSE.Web.Messages.GetProceduresRequest request)
+ {
+ return Post<Tango.FSE.Web.Messages.GetProceduresRequest, Tango.FSE.Web.Messages.GetProceduresResponse>("GetProcedures", request);
+ }
+
+ /// <summary>
+ /// Executes the GetTangoVersions action and returns Tango.FSE.Web.Messages.GetTangoVersionsResponse.
+ /// </summary>
+ /// <returns></returns>
+ public Task<Tango.FSE.Web.Messages.GetTangoVersionsResponse> GetTangoVersions(Tango.FSE.Web.Messages.GetTangoVersionsRequest request)
+ {
+ return Post<Tango.FSE.Web.Messages.GetTangoVersionsRequest, Tango.FSE.Web.Messages.GetTangoVersionsResponse>("GetTangoVersions", request);
+ }
+
+ /// <summary>
+ /// Executes the GetTechComponents action and returns Tango.FSE.Web.Messages.GetTechComponentsResponse.
+ /// </summary>
+ /// <returns></returns>
+ public Task<Tango.FSE.Web.Messages.GetTechComponentsResponse> GetTechComponents(Tango.FSE.Web.Messages.GetTechComponentsRequest request)
+ {
+ return Post<Tango.FSE.Web.Messages.GetTechComponentsRequest, Tango.FSE.Web.Messages.GetTechComponentsResponse>("GetTechComponents", request);
+ }
+
+ /// <summary>
/// Executes the GetBugReportInfo action and returns Tango.FSE.Web.Messages.BugReportingInfoResponse.
/// </summary>
/// <returns></returns>