aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Web/Tango.MachineService/Controllers/VersionUpdateController.cs
diff options
context:
space:
mode:
authorShlomo Hecht <shlomo@twine-s.com>2018-11-15 16:05:39 +0200
committerShlomo Hecht <shlomo@twine-s.com>2018-11-15 16:05:39 +0200
commita1f8844fe49ff35da98d8f0105e92ead3aa811dc (patch)
treeb8c73aae71ba5b8e38b93432d2b70222ed1a8b8b /Software/Visual_Studio/Web/Tango.MachineService/Controllers/VersionUpdateController.cs
parent5daf3604b73bae541cea080b8302ee28d76eb662 (diff)
parenta614e97ebbb2b6ce557b6c428e3501bb1bcad626 (diff)
downloadTango-a1f8844fe49ff35da98d8f0105e92ead3aa811dc.tar.gz
Tango-a1f8844fe49ff35da98d8f0105e92ead3aa811dc.zip
merge
Diffstat (limited to 'Software/Visual_Studio/Web/Tango.MachineService/Controllers/VersionUpdateController.cs')
-rw-r--r--Software/Visual_Studio/Web/Tango.MachineService/Controllers/VersionUpdateController.cs200
1 files changed, 200 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/VersionUpdateController.cs b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/VersionUpdateController.cs
new file mode 100644
index 000000000..953399530
--- /dev/null
+++ b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/VersionUpdateController.cs
@@ -0,0 +1,200 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Http;
+using System.Security.Authentication;
+using System.Web.Http;
+using Tango.BL;
+using Tango.BL.Entities;
+using Tango.BL.Enumerations;
+using Tango.Logging;
+using Tango.MachineService.Helpers;
+using Tango.PPC.Common.Update;
+
+namespace Tango.MachineService.Controllers
+{
+ public class VersionUpdateController : ApiController
+ {
+ private LogManager LogManager = LogManager.Default;
+
+ private class PendingUpload
+ {
+ public String Token { get; set; }
+
+ public String Version { get; set; }
+
+ public String UserGuid { get; set; }
+
+ public String Comments { get; set; }
+
+ public String MachineVersionGuid { get; set; }
+
+ public String BlobName { get; set; }
+ }
+
+ private static List<PendingUpload> _pendingUploads;
+
+ static VersionUpdateController()
+ {
+ _pendingUploads = new List<PendingUpload>();
+ }
+
+ [HttpPost]
+ public LatestVersionResponse GetLatestVersion(LatestVersionRequest request)
+ {
+ try
+ {
+ LatestVersionResponse response = new LatestVersionResponse();
+
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
+ {
+ var versions = db.TangoVersions.Where(x => x.MachineVersionGuid == request.MachineVersionGuid).ToList();
+
+ if (versions.Count > 0)
+ {
+ response.Version = db.TangoVersions.Where(x => x.MachineVersionGuid == request.MachineVersionGuid).ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault().Version;
+ }
+ else
+ {
+ return new LatestVersionResponse()
+ {
+ Version = "0.0.0.0"
+ };
+ }
+ }
+
+ return response;
+ }
+ catch (Exception ex)
+ {
+ throw CreateError(ex, HttpStatusCode.InternalServerError);
+ }
+ }
+
+ [HttpPost]
+ public UploadVersionResponse UploadVersion(UploadVersionRequest request)
+ {
+ try
+ {
+ UploadVersionResponse response = new UploadVersionResponse();
+
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
+ {
+ //Load relation first...
+ db.Roles.ToList();
+ db.Permissions.ToList();
+ db.UsersRoles.ToList();
+ db.RolesPermissions.ToList();
+
+ var user = db.Users.SingleOrDefault(x => x.Email.ToLower() == request.Email.ToLower() && x.Password == request.Password);
+
+ if (user != null && user.HasPermission(Permissions.PublishMachineStudioVersion))
+ {
+ var versions = db.TangoVersions.ToList().Where(x => x.MachineVersionGuid == request.MachineVersionGuid).OrderByDescending(x => Version.Parse(x.Version)).ToList();
+
+ TangoVersion latestVersion = new TangoVersion();
+ latestVersion.Version = "0.0.0.0";
+
+ if (versions.Count > 0)
+ {
+ latestVersion = versions.FirstOrDefault();
+ }
+
+ Version currentVersion = Version.Parse(request.Version);
+
+ if (currentVersion > Version.Parse(latestVersion.Version))
+ {
+ String newVersionFileName = "Tango Version" + " " + currentVersion.ToString() + ".zip";
+
+ var client = StorageHelper.GetStorageBlobClient();
+ var container = StorageHelper.GetTangoVersionsContainer(client);
+ var blob = StorageHelper.CreateEmptyBlob(container, newVersionFileName);
+
+ response.Token = Guid.NewGuid().ToString();
+ response.BlobAddress = StorageHelper.GenerateBlobWriteSignature(blob, TimeSpan.FromMinutes(30));
+
+ _pendingUploads.Add(new PendingUpload()
+ {
+ UserGuid = user.Guid,
+ Comments = request.Comments,
+ Token = response.Token,
+ Version = request.Version,
+ BlobName = blob.Name,
+ MachineVersionGuid = request.MachineVersionGuid,
+ });
+ }
+ else
+ {
+ throw CreateError(new ArgumentException("New version must be greater than latest version."), HttpStatusCode.BadRequest);
+ }
+ }
+ else
+ {
+ throw CreateError(new AuthenticationException("Invalid user credentials."), HttpStatusCode.Unauthorized);
+ }
+ }
+
+ return response;
+ }
+ catch (HttpResponseException ex)
+ {
+ throw ex;
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex);
+ throw CreateError(ex, HttpStatusCode.InternalServerError);
+ }
+ }
+
+ [HttpPost]
+ public UploadCompletedResponse NotifyUploadCompleted(UploadCompletedRequest request)
+ {
+ try
+ {
+ PendingUpload upload = _pendingUploads.FirstOrDefault(x => x.Token == request.Token);
+
+ if (upload != null)
+ {
+ _pendingUploads.RemoveAll(x => x.Token == upload.Token);
+
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
+ {
+ db.TangoVersions.Add(new TangoVersion()
+ {
+ Comments = upload.Comments,
+ BlobName = upload.BlobName,
+ UserGuid = upload.UserGuid,
+ Version = upload.Version,
+ MachineVersionGuid = upload.MachineVersionGuid
+ });
+
+ db.SaveChanges();
+ }
+
+ return new UploadCompletedResponse();
+ }
+ else
+ {
+ throw CreateError(new AuthenticationException("Invalid Token."), HttpStatusCode.Unauthorized);
+ }
+ }
+ catch (HttpRequestException ex)
+ {
+ throw ex;
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex);
+ throw CreateError(ex, HttpStatusCode.InternalServerError);
+ }
+ }
+
+ private Exception CreateError(Exception ex, HttpStatusCode code)
+ {
+ LogManager.Log(ex);
+ return new HttpResponseException(Request.CreateErrorResponse(code, ex.Message));
+ }
+ }
+}