aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Web/Tango.MachineService/Controllers
diff options
context:
space:
mode:
authorShlomo Hecht <shlomo@twine-s.com>2020-10-29 15:55:21 +0200
committerShlomo Hecht <shlomo@twine-s.com>2020-10-29 15:55:21 +0200
commit4b789f33eadfc5cc1d937a80ce03ea8425955ffe (patch)
tree7dbbd0529a24f9ca064cab688a0d6d2b8b762ea1 /Software/Visual_Studio/Web/Tango.MachineService/Controllers
parent8f3baa0d9097aa6ed800863a4680608e867c809a (diff)
parent11fb700fcbc4627162a9c3f84b03b5016248bd97 (diff)
downloadTango-4b789f33eadfc5cc1d937a80ce03ea8425955ffe.tar.gz
Tango-4b789f33eadfc5cc1d937a80ce03ea8425955ffe.zip
Merge branch 'master' of https://twinetfs.visualstudio.com/Tango/_git/Tango
Diffstat (limited to 'Software/Visual_Studio/Web/Tango.MachineService/Controllers')
-rw-r--r--Software/Visual_Studio/Web/Tango.MachineService/Controllers/FSEController.cs106
-rw-r--r--Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs129
2 files changed, 190 insertions, 45 deletions
diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/FSEController.cs b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/FSEController.cs
index e471ed20c..b9dacfcf9 100644
--- a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/FSEController.cs
+++ b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/FSEController.cs
@@ -25,11 +25,15 @@ using Tango.Web.SQLServer;
using Tango.Web.Storage;
using System.Data.Entity;
using static Tango.MachineService.Controllers.FSEController;
+using Tango.MachineService.Models;
+using Tango.BL.Enumerations;
namespace Tango.MachineService.Controllers
{
public class FSEController : TangoController<TokenObject>
{
+ private static List<FSEPendingUpload> _pendingUploads;
+
public class TokenObject
{
public String UserGuid { get; set; }
@@ -46,6 +50,7 @@ namespace Tango.MachineService.Controllers
static FSEController()
{
+ _pendingUploads = new List<FSEPendingUpload>();
PendingPasswordResets = new List<PasswordReset>();
}
@@ -195,7 +200,7 @@ namespace Tango.MachineService.Controllers
String comments = String.Join(Environment.NewLine, versions.OrderBy(x => Version.Parse(x.Version)).Where(x => Version.Parse(x.Version) > currentVersion).Select(x => x.Comments));
- if (latestVersion != null && Version.Parse(latestVersion.Version) != currentVersion)
+ if (latestVersion != null && Version.Parse(latestVersion.Version) > currentVersion)
{
var manager = new BlobStorageManager();
var container = manager.GetContainer(MachineServiceConfig.FSE_VERSIONS_CONTAINER);
@@ -323,5 +328,104 @@ namespace Tango.MachineService.Controllers
return new ForgotPasswordResponse();
}
+
+ #region Version Upload
+
+ [HttpPost]
+ public LatestVersionResponse GetLatestVersion(LatestVersionRequest request)
+ {
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
+ {
+ var version = db.FseVersions.ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault();
+ return new LatestVersionResponse() { Version = version != null ? version.Version : "0.0.0.0" };
+ }
+ }
+
+ [HttpPost]
+ [JwtTokenFilter]
+ public UploadVersionResponse UploadVersion(UploadVersionRequest request)
+ {
+ UploadVersionResponse response = new UploadVersionResponse();
+
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
+ {
+ String userID = RequestToken.Object.UserGuid;
+
+ var user = new UserBuilder(db).Set(userID).WithRolesAndPermissions().Build();
+
+ if (user != null && user.HasPermission(Permissions.PublishMachineStudioVersions))
+
+{
+ var latestVersion = db.FseVersions.ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault();
+ Version local_version = Version.Parse(request.Version);
+
+ if (latestVersion == null || local_version > Version.Parse(latestVersion.Version))
+ {
+ var manager = new BlobStorageManager();
+ var container = manager.GetContainer(MachineServiceConfig.FSE_VERSIONS_CONTAINER);
+ var installerBlob = container.CreateEmptyBlob(request.InstallerBlobName);
+
+ response.Token = Guid.NewGuid().ToString();
+ response.InstallerBlobAddress = installerBlob.GenerateWriteSignature(TimeSpan.FromMinutes(30));
+
+ FSEPendingUpload pending_upload = new FSEPendingUpload()
+ {
+ UserGuid = user.Guid,
+ Comments = request.Comments,
+ Token = response.Token,
+ Version = request.Version,
+ BlobName = "BLOB",
+ InstallerBlobName = installerBlob.Name
+ };
+
+ _pendingUploads.Add(pending_upload);
+ }
+ else
+ {
+ throw new ArgumentException("New version must be greater than latest version.");
+ }
+ }
+ else
+ {
+ throw new AuthenticationException("Invalid user credentials.");
+ }
+ }
+
+ return response;
+ }
+
+ [HttpPost]
+ [JwtTokenFilter]
+ public UploadCompletedResponse NotifyVersionUploadCompleted(UploadCompletedRequest request)
+ {
+ FSEPendingUpload upload = _pendingUploads.FirstOrDefault(x => x.Token == request.Token);
+
+ if (upload != null)
+ {
+ _pendingUploads.RemoveAll(x => x.Token == upload.Token);
+
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
+ {
+ db.FseVersions.Add(new FseVersion()
+ {
+ Comments = upload.Comments,
+ BlobName = upload.BlobName,
+ InstallerBlobName = upload.InstallerBlobName,
+ UserGuid = upload.UserGuid,
+ Version = upload.Version,
+ });
+
+ db.SaveChanges();
+ }
+
+ return new UploadCompletedResponse();
+ }
+ else
+ {
+ throw new ArgumentException("Invalid Token.");
+ }
+ }
+
+ #endregion
}
}
diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs
index 28acb3647..fbc4f8a0a 100644
--- a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs
+++ b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs
@@ -390,7 +390,11 @@ namespace Tango.MachineService.Controllers
if (hasDatabaseUpdates)
{
response.IsDatabaseUpdateAvailable = true;
- response.UpdateDBResponse = UpdateDB(new UpdateDBRequest() { SerialNumber = request.SerialNumber });
+ response.UpdateDBResponse = UpdateDB(new UpdateDBRequest()
+ {
+ ApplicationVersion = request.Version,
+ FirmwareVersion = request.FirmwareVersion
+ });
}
//Compare database
@@ -507,8 +511,6 @@ namespace Tango.MachineService.Controllers
});
}
- User machineUser = null;
-
try
{
using (ObservablesContext db = ObservablesContextHelper.CreateContext())
@@ -519,26 +521,6 @@ namespace Tango.MachineService.Controllers
{
throw new AuthenticationException("The specified machine could not be found.");
}
-
- machineUser = db.Users.Include(x => x.Contact).SingleOrDefault(x => x.Contact.FirstName == machine.Name);
-
- if (machineUser == null)
- {
- //No machine user then create one.
- machineUser = new User();
- machineUser.Email = machine.SerialNumber + "@twine-s.com";
- machineUser.Password = machine.SerialNumber;
- machineUser.OrganizationGuid = machine.OrganizationGuid;
- machineUser.Contact = new Contact();
- machineUser.Contact.Email = machineUser.Email;
- machineUser.Contact.FirstName = machine.Name;
- machineUser.Contact.LastName = machine.Name;
- machineUser.Contact.FullName = machine.Name;
- machineUser.Address = new Address();
-
- db.Users.Add(machineUser);
- db.SaveChanges();
- }
}
//Insert/Replace Jobs.
@@ -551,7 +533,6 @@ namespace Tango.MachineService.Controllers
var job = dto.ToObservable();
job.ID = 0;
- job.UserGuid = machineUser.Guid;
job.CustomerGuid = null;
job.IsSynchronized = true;
@@ -564,6 +545,7 @@ namespace Tango.MachineService.Controllers
}
else if (job.LastUpdated > existingJob.LastUpdated)
{
+ job.UserGuid = existingJob.UserGuid;
existingJob.Delete(db);
db.Jobs.Add(job);
db.SaveChanges();
@@ -580,26 +562,38 @@ namespace Tango.MachineService.Controllers
}
}
- //Insert JobRuns.
- foreach (var dto in request.JobRuns)
+ //Insert Update DataStore Items
+ foreach (var dto in request.DataStoreItems)
{
using (ObservablesContext db = ObservablesContextHelper.CreateContext())
{
try
{
- var run = dto.ToObservable();
- run.ID = 0;
- run.IsSynchronized = true;
+ var dataStoreItem = dto.ToObservable();
+ dataStoreItem.MachineGuid = RequestToken.Object.MachineGuid;
- if (db.JobRuns.SingleOrDefault(x => x.Guid == run.Guid) == null)
+ dataStoreItem.ID = 0;
+ dataStoreItem.IsSynchronized = true;
+
+ var existingItem = db.DataStoreItems.SingleOrDefault(x => x.Guid == dataStoreItem.Guid);
+
+ if (existingItem == null)
{
- db.JobRuns.Add(run);
+ db.DataStoreItems.Add(dataStoreItem);
+ db.SaveChanges();
+ }
+ else if (dataStoreItem.LastUpdated >= existingItem.LastUpdated)
+ {
+ existingItem.DataType = dataStoreItem.DataType;
+ existingItem.Value = dataStoreItem.Value;
+ existingItem.IsSynchronized = true;
+ existingItem.LastUpdated = dataStoreItem.LastUpdated;
db.SaveChanges();
}
}
catch (Exception ex)
{
- response.FailedJobRuns.Add(new SynchronizationFailedEntity()
+ response.FailedDataStoreItems.Add(new SynchronizationFailedEntity()
{
Guid = dto.Guid,
Reason = ex.FlattenMessage(),
@@ -608,27 +602,26 @@ namespace Tango.MachineService.Controllers
}
}
- //Insert MachineEvents.
- foreach (var dto in request.MachineEvents)
+ //Insert JobRuns.
+ foreach (var dto in request.JobRuns)
{
using (ObservablesContext db = ObservablesContextHelper.CreateContext())
{
try
{
- var ev = dto.ToObservable();
- ev.ID = 0;
- ev.UserGuid = machineUser.Guid;
- ev.IsSynchronized = true;
+ var run = dto.ToObservable();
+ run.ID = 0;
+ run.IsSynchronized = true;
- if (db.MachinesEvents.SingleOrDefault(x => x.Guid == ev.Guid) == null)
+ if (db.JobRuns.SingleOrDefault(x => x.Guid == run.Guid) == null)
{
- db.MachinesEvents.Add(ev);
+ db.JobRuns.Add(run);
db.SaveChanges();
}
}
catch (Exception ex)
{
- response.FailedMachineEvents.Add(new SynchronizationFailedEntity()
+ response.FailedJobRuns.Add(new SynchronizationFailedEntity()
{
Guid = dto.Guid,
Reason = ex.FlattenMessage(),
@@ -664,6 +657,34 @@ namespace Tango.MachineService.Controllers
}
}
}
+
+ //Insert MachineEvents.
+ foreach (var dto in request.MachineEvents)
+ {
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
+ {
+ try
+ {
+ var ev = dto.ToObservable();
+ ev.ID = 0;
+ ev.IsSynchronized = true;
+
+ if (db.MachinesEvents.SingleOrDefault(x => x.Guid == ev.Guid) == null)
+ {
+ db.MachinesEvents.Add(ev);
+ db.SaveChanges();
+ }
+ }
+ catch (Exception ex)
+ {
+ response.FailedMachineEvents.Add(new SynchronizationFailedEntity()
+ {
+ Guid = dto.Guid,
+ Reason = ex.FlattenMessage(),
+ });
+ }
+ }
+ }
}
catch (Exception ex)
{
@@ -730,6 +751,18 @@ namespace Tango.MachineService.Controllers
response.MachineEvents.Add(dto);
}
}
+
+ //Send DataStore Items
+ if (request.RequestDataStoreItems)
+ {
+ var dataStoreItems = db.DataStoreItems.Where(x => x.MachineGuid == machine.Guid && !x.IsSynchronized).Take(request.MaxDataStoreItems).OrderByDescending(x => x.LastUpdated).ToList();
+
+ foreach (var item in dataStoreItems)
+ {
+ DataStoreItemDTO dto = DataStoreItemDTO.FromObservable(item);
+ response.DataStoreItems.Add(dto);
+ }
+ }
}
return response;
@@ -764,6 +797,11 @@ namespace Tango.MachineService.Controllers
{
db.Database.ExecuteSqlCommand($"UPDATE MACHINES_EVENTS SET IS_SYNCHRONIZED = 1 WHERE GUID IN ({String.Join(",", request.SynchronizedMachineEvents.Select(x => "'" + x + "'"))});");
}
+
+ if (request.SynchronizedDataStoreItems.Count > 0)
+ {
+ db.Database.ExecuteSqlCommand($"UPDATE DATA_STORE_ITEMS SET IS_SYNCHRONIZED = 1 WHERE GUID IN ({String.Join(",", request.SynchronizedDataStoreItems.Select(x => "'" + x + "'"))});");
+ }
}
return response;
@@ -787,10 +825,13 @@ namespace Tango.MachineService.Controllers
return new LatestVersionResponse()
{
Version = "0.0.0.0",
+ FirmwareVersion = "0.0.0.0"
};
}
- response.Version = versions.OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault().Version;
+ var latestTangoVersion = versions.OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault();
+ response.Version = latestTangoVersion.Version;
+ response.FirmwareVersion = latestTangoVersion.FirmwareVersion;
}
return response;
@@ -955,11 +996,11 @@ namespace Tango.MachineService.Controllers
}
else if (request.Mode == LoginMode.Machine)
{
- var machine = db.Machines.SingleOrDefault(x => x.SerialNumber == request.SerialNumber);
+ var machine = db.Machines.SingleOrDefault(x => x.SerialNumber == request.SerialNumber || x.Guid == request.MachineGuid);
if (machine == null)
{
- throw new AuthenticationException("Invalid serial number.");
+ throw new AuthenticationException("Invalid machine serial number or id.");
}
response.AccessToken = WebToken<TokenObject>.CreateNew(MachineServiceConfig.JWT_TOKEN_SECRET, new TokenObject()