indexabout
No repositories found
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<PendingUpload> _pendingUploads;

        static VersionUpdateController()
        {
            _pendingUploads = new List<PendingUpload>();
        }

        [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.");
            }
        }
    }
}