aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs
diff options
context:
space:
mode:
authorAvi Levkovich <avi@twine-s.com>2018-12-23 11:25:16 +0200
committerAvi Levkovich <avi@twine-s.com>2018-12-23 11:25:16 +0200
commit32b6e8d780c1fcadc78301a26a0f19d40a0dc270 (patch)
treebc4437c517ae41163938275b46bc4bf6ea45f092 /Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs
parent7ac67be021eff174dfcc740d56a2cb1ed7aa43bf (diff)
parent5cb09f7732429d15477321e7f748d010ef27c85d (diff)
downloadTango-32b6e8d780c1fcadc78301a26a0f19d40a0dc270.tar.gz
Tango-32b6e8d780c1fcadc78301a26a0f19d40a0dc270.zip
Merge branch 'master' of https://twinetfs.visualstudio.com/_git/Tango
Diffstat (limited to 'Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs')
-rw-r--r--Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs244
1 files changed, 244 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs
new file mode 100644
index 000000000..8225d75e1
--- /dev/null
+++ b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/MachineStudioController.cs
@@ -0,0 +1,244 @@
+using Microsoft.IdentityModel.Clients.ActiveDirectory;
+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.Builders;
+using Tango.BL.Entities;
+using Tango.BL.Enumerations;
+using Tango.Core.Cryptography;
+using Tango.MachineService.Helpers;
+using Tango.MachineService.Models;
+using Tango.MachineStudio.Common.Authentication;
+using Tango.MachineStudio.Common.Update;
+
+namespace Tango.MachineService.Controllers
+{
+ public class MachineStudioController : JsonController
+ {
+ private static List<MachineStudioPendingUpload> _pendingUploads;
+
+ static MachineStudioController()
+ {
+ _pendingUploads = new List<MachineStudioPendingUpload>();
+ }
+
+ #region Update
+
+ [HttpPost]
+ public CheckForUpdatesResponse CheckForUpdates(CheckForUpdatesRequest request)
+ {
+ LogManager.Log("Request received...");
+
+ CheckForUpdatesResponse response = new CheckForUpdatesResponse();
+
+ 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.RunMachineStudio) || (request.Email == "ForceUpdate"))
+ {
+ var versions = db.MachineStudioVersions.ToList();
+
+ MachineStudioVersion latestVersion = null;
+
+ if (request.AcceptBetaRelease)
+ {
+ latestVersion = versions.OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault();
+ }
+ else
+ {
+ latestVersion = versions.Where(x => x.Stable).OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault();
+ }
+
+ Version currentVersion = Version.Parse(request.Version);
+
+ bool isForcedUpdate = versions.Exists(x => x.ForceUpdate && Version.Parse(x.Version) > currentVersion);
+
+ 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)
+ {
+ var client = StorageHelper.GetStorageBlobClient();
+ var container = StorageHelper.GetMachineStudioVersionsContainer(client);
+ var blob = container.GetBlockBlobReference(latestVersion.BlobName);
+
+ response.BlobAddress = StorageHelper.GenerateBlobReadSignature(blob, TimeSpan.FromMinutes(60));
+
+ response.IsUpdateAvailable = true;
+ response.Version = latestVersion.Version;
+ response.Comments = latestVersion.Comments;
+ response.ForcedUpdate = isForcedUpdate;
+ response.IsStable = latestVersion.Stable;
+ }
+ }
+ else
+ {
+ throw new AuthenticationException("Invalid user credentials.");
+ }
+ }
+
+ return response;
+ }
+
+ [HttpPost]
+ public UploadVersionResponse UploadVersion(UploadVersionRequest request)
+ {
+ 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.PublishMachineStudioVersions))
+ {
+ var latestVersion = db.MachineStudioVersions.ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault();
+ Version currentVersion = Version.Parse(request.Version);
+
+ if (latestVersion == null || currentVersion > Version.Parse(latestVersion.Version))
+ {
+ String newVersionFileName = "Machine Studio Version" + " " + currentVersion.ToString() + ".zip";
+
+ var client = StorageHelper.GetStorageBlobClient();
+ var container = StorageHelper.GetMachineStudioVersionsContainer(client);
+ var blob = StorageHelper.CreateEmptyBlob(container, newVersionFileName);
+
+ response.Token = Guid.NewGuid().ToString();
+ response.BlobAddress = StorageHelper.GenerateBlobWriteSignature(blob, TimeSpan.FromMinutes(30));
+
+ _pendingUploads.Add(new MachineStudioPendingUpload()
+ {
+ UserGuid = user.Guid,
+ Comments = request.Comments,
+ ForcedUpdate = request.ForcedUpdate,
+ Token = response.Token,
+ Version = request.Version,
+ IsStable = request.IsStable,
+ BlobName = blob.Name,
+ });
+ }
+ 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)
+ {
+ MachineStudioPendingUpload upload = _pendingUploads.FirstOrDefault(x => x.Token == request.Token);
+
+ if (upload != null)
+ {
+ _pendingUploads.RemoveAll(x => x.Token == upload.Token);
+
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
+ {
+ db.MachineStudioVersions.Add(new MachineStudioVersion()
+ {
+ Comments = upload.Comments,
+ BlobName = upload.BlobName,
+ UserGuid = upload.UserGuid,
+ Version = upload.Version,
+ ForceUpdate = upload.ForcedUpdate,
+ Stable = upload.IsStable,
+ });
+
+ db.SaveChanges();
+ }
+
+ return new UploadCompletedResponse();
+ }
+ else
+ {
+ throw new ArgumentException("Invalid Token.");
+ }
+ }
+
+ [HttpPost]
+ public LatestVersionResponse GetLatestVersion(LatestVersionRequest request)
+ {
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
+ {
+ var version = db.MachineStudioVersions.ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault();
+ return new LatestVersionResponse() { Version = version != null ? version.Version : "0.0.0.0" };
+ }
+ }
+
+ #endregion
+
+ public LoginResponse Login(LoginRequest request)
+ {
+ var authContext = new AuthenticationContext("https://login.microsoftonline.com/2ebd63a5-bc2f-41dc-9066-4409ed5e5dd4");
+ UserCredential userCredential = new UserCredential(request.Email, request.Password);
+ AuthenticationResult authResult = authContext.AcquireToken("https://graph.windows.net/", "ec612854-7abc-457b-808a-5d0c5ba80c57", userCredential);
+
+ using (ObservablesContext db = ObservablesContextHelper.CreateContext())
+ {
+
+ 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)
+ {
+ //Than add the user !!
+
+ IHashGenerator g = new BasicHashGenerator();
+
+ BL.Entities.User new_user = new User();
+ new_user.Email = request.Email;
+ new_user.Password = g.Encrypt("Aa123456");
+ new_user.Organization = db.Organizations.Single(x => x.Name == "Twine");
+ new_user.Address = new Address() { };
+ new_user.Contact = new Contact()
+ {
+ FirstName = authResult.UserInfo.GivenName,
+ LastName = authResult.UserInfo.FamilyName,
+ };
+ new_user.Roles.Add(db.Roles.Single(x => (Roles)x.Code == Roles.User));
+ }
+ }
+
+ return new LoginResponse()
+ {
+ DataSource = new Core.DataSource()
+ {
+ Address = Config.DB_ADDRESS,
+ Catalog = Config.DB_CATALOG,
+ Type = Core.DataSourceType.Azure,
+ UserName = request.Email,
+ Password = request.Password,
+ }
+ };
+ }
+
+ }
+}