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 : JsonController { 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 _pendingUploads; static VersionUpdateController() { _pendingUploads = new List(); } [HttpPost] public LatestVersionResponse GetLatestVersion(LatestVersionRequest request) { 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 { throw new ArgumentException("The specified machine version was not found!"); } } return response; } [HttpPost] public UploadVersionResponse UploadVersion(UploadVersionRequest request) { UploadVersionResponse response = new UploadVersionResponse(); using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { //Load relations 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 new ArgumentException("New version must be greater than latest version."); } } else { throw new AuthenticationException("Invalid user credentials."); } } return response; } [HttpPost] public UploadCompletedResponse NotifyUploadCompleted(UploadCompletedRequest request) { 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 new AuthenticationException("Invalid upload token."); } } } }