Switch landing page to read template from S3 bucket

This change uses CORS to make the Angular template request to a defined S3 bucket, falling back to the compiled login template if the bucket is not available.

Fixes #1313
This commit is contained in:
Joseph Schorr 2016-11-29 18:19:06 -05:00
parent b7aac159ae
commit 66e09b2a95
4 changed files with 28 additions and 251 deletions

View file

@ -118,54 +118,41 @@ angular.module('quay').directive('quayClasses', function(Features, Config) {
});
/**
* Adds a quay-include attribtue that adds a template solely if the expression evaluates to true.
* Automatically adds the Features and Config services to the scope.
* Adds a quay-static-include attribute handles adding static marketing content from a defined
* S3 bucket. If running under QE, the local template is used.
*
Usage: quay-include="{'Features.BILLING': 'partials/landing-normal.html', '!Features.BILLING': 'partials/landing-login.html'}"
* Usage: quay-static-include="{'hosted': 'index.html', 'otherwise': 'partials/landing-login.html'}"
*/
angular.module('quay').directive('quayInclude', function($compile, $templateCache, $http, Features, Config) {
angular.module('quay').directive('quayStaticInclude', function($compile, $templateCache, $http, Features, Config) {
return {
priority: 595,
restrict: 'A',
link: function($scope, $element, $attr, ctrl) {
var getTemplate = function(templateName) {
var templateUrl = '/static/' + templateName;
return $http.get(templateUrl, {cache: $templateCache});
var getTemplate = function(hostedTemplateName, staticTemplateName) {
var staticTemplateUrl = '/static/' + staticTemplateName;
var templateUrl = staticTemplateUrl;
if (Features.BILLING && Config['STATIC_SITE_BUCKET']) {
templateUrl = Config['STATIC_SITE_BUCKET'] + hostedTemplateName;
}
return $http.get(templateUrl, {cache: $templateCache}).catch(function(resolve, reject) {
// Fallback to the static local URL if the hosted URL doesn't work.
return $http.get(staticTemplateUrl, {cache: $templateCache});
});
};
var result = $scope.$eval($attr.quayInclude);
var result = $scope.$eval($attr.quayStaticInclude);
if (!result) {
return;
}
var scopeVals = {
'Features': Features,
'Config': Config
};
var templatePath = null;
for (var expr in result) {
if (!result.hasOwnProperty(expr)) { continue; }
// Evaluate the expression with the entire features list added.
var value = $scope.$eval(expr, scopeVals);
if (value) {
templatePath = result[expr];
break;
}
}
if (!templatePath) {
return;
}
var promise = getTemplate(templatePath).success(function(html) {
$element.html(html);
}).then(function (response) {
$element.replaceWith($compile($element.html())($scope));
var promise = getTemplate(result['hosted'], result['otherwise']).then(function (response) {
$element.replaceWith($compile(response['data'])($scope));
if ($attr.onload) {
$scope.$eval($attr.onload);
}
}).catch(function(err) {
console.log(err)
});
}
};