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.ToList();
if (versions.Count == 0)
{
return new LatestVersionResponse()
{
Version = "0.0.0.0",
};
}
var machine_versions = versions.Where(x => x.MachineVersionGuid == request.MachineVersionGuid).ToList();
if (machine_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.");
}
}
}
}