diff options
Diffstat (limited to 'Software/Visual_Studio/Web/Tango.MachineService/Controllers/VersionUpdateController.cs')
| -rw-r--r-- | Software/Visual_Studio/Web/Tango.MachineService/Controllers/VersionUpdateController.cs | 200 |
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)); + } + } +} |
