diff --git a/lib/cartodb/models/resource-locator.js b/lib/cartodb/models/resource-locator.js index e12ef2b4..af777985 100644 --- a/lib/cartodb/models/resource-locator.js +++ b/lib/cartodb/models/resource-locator.js @@ -21,20 +21,36 @@ function ResourceLocator(environment) { module.exports = ResourceLocator; -ResourceLocator.prototype.getUrls = function(username, resource) { +ResourceLocator.prototype.getTileUrls = function(username, resourcePath) { if (this.resourcesUrlTemplates) { - return this.getUrlsFromTemplate(username, resource); - } - var cdnDomain = getCdnDomain(this.environment.serverMetadata, resource); - if (cdnDomain) { + const urls = this.getUrlsFromTemplate(username, new TileResource(resourcePath)); return { - http: 'http://' + cdnDomain.http + '/' + username + '/api/v1/map/' + resource, - https: 'https://' + cdnDomain.https + '/' + username + '/api/v1/map/' + resource + http: Array.isArray(urls.http) ? urls.http : [urls.http], + https: Array.isArray(urls.https) ? urls.https : [urls.https] }; + } + var cdnUrls = getCdnUrls(this.environment.serverMetadata, username, new TileResource(resourcePath)); + if (cdnUrls) { + return cdnUrls; } else { var port = this.environment.port; return { - http: 'http://' + username + '.' + 'localhost.lan:' + port + '/api/v1/map/' + resource + http: [`http://${username}.localhost.lan:${port}/api/v1/map/${resourcePath}`] + }; + } +}; + +ResourceLocator.prototype.getUrls = function(username, resourcePath) { + if (this.resourcesUrlTemplates) { + return this.getUrlsFromTemplate(username, new Resource(resourcePath)); + } + var cdnUrls = getCdnUrls(this.environment.serverMetadata, username, new Resource(resourcePath)); + if (cdnUrls) { + return cdnUrls; + } else { + var port = this.environment.port; + return { + http: `http://${username}.localhost.lan:${port}/api/v1/map/${resourcePath}` }; } }; @@ -45,45 +61,125 @@ ResourceLocator.prototype.getUrlsFromTemplate = function(username, resource) { var cdnDomain = getCdnDomain(this.environment.serverMetadata, resource) || {}; if (this.resourcesUrlTemplates.http) { - urls.http = this.resourcesUrlTemplates.http({ - cdn_url: cdnDomain.http, - user: username, - port: this.environment.port, - resource: resource - }); + if (Array.isArray(cdnDomain.http)) { + urls.http = cdnDomain.http.map(d => this.resourcesUrlTemplates.http({ + cdn_url: d, + user: username, + port: this.environment.port, + resource: resource.getPath() + })); + } else { + urls.http = this.resourcesUrlTemplates.http({ + cdn_url: cdnDomain.http, + user: username, + port: this.environment.port, + resource: resource.getPath() + }); + } } if (this.resourcesUrlTemplates.https) { - urls.https = this.resourcesUrlTemplates.https({ - cdn_url: cdnDomain.https, - user: username, - port: this.environment.port, - resource: resource - }); + if (Array.isArray(cdnDomain.https)) { + urls.https = cdnDomain.https.map(d => this.resourcesUrlTemplates.https({ + cdn_url: d, + user: username, + port: this.environment.port, + resource: resource.getPath() + })); + } else { + urls.https = this.resourcesUrlTemplates.https({ + cdn_url: cdnDomain.https, + user: username, + port: this.environment.port, + resource: resource.getPath() + }); + } } return urls; }; +class Resource { + constructor (resourcePath) { + this.resourcePath = resourcePath; + } + + getPath () { + return this.resourcePath; + } + + getDomain (domain, subdomains) { + return domain.replace('{s}', subdomain(subdomains, this.resourcePath)); + } + + getUrl (baseUrl, username, subdomains) { + let urls = getUrl(baseUrl, username, this.resourcePath); + if (subdomains) { + urls = urls.replace('{s}', subdomain(subdomains, this.resourcePath)); + } + return urls; + } +} + +class TileResource extends Resource { + constructor (resourcePath) { + super(resourcePath); + } + + getDomain (domain, subdomains) { + return subdomains.map(s => domain.replace('{s}', s)); + } + + getUrl (baseUrl, username, subdomains) { + if (!subdomains) { + return [super.getUrl(baseUrl, username)]; + } + return subdomains.map(subdomain => { + return getUrl(baseUrl, username, this.resourcePath) + .replace('{s}', subdomain); + }); + } +} + +function getUrl(baseUrl, username, path) { + return `${baseUrl}/${username}/api/v1/map/${path}`; +} + +function getCdnUrls(serverMetadata, username, resource) { + if (serverMetadata && serverMetadata.cdn_url) { + var cdnUrl = serverMetadata.cdn_url; + var httpUrls = resource.getUrl(`http://${cdnUrl.http}`, username); + var httpsUrls = resource.getUrl(`https://${cdnUrl.https}`, username); + if (cdnUrl.templates) { + var templates = cdnUrl.templates; + httpUrls = resource.getUrl(templates.http.url, username, templates.http.subdomains); + httpsUrls = resource.getUrl(templates.https.url, username, templates.https.subdomains); + } + return { + http: httpUrls, + https: httpsUrls, + }; + } + return null; +} + function getCdnDomain(serverMetadata, resource) { if (serverMetadata && serverMetadata.cdn_url) { var cdnUrl = serverMetadata.cdn_url; - var http = cdnUrl.http; - var https = cdnUrl.https; + var httpDomain = cdnUrl.http; + var httpsDomain = cdnUrl.https; if (cdnUrl.templates) { var templates = cdnUrl.templates; var httpUrlTemplate = templates.http.url; var httpsUrlTemplate = templates.https.url; - http = httpUrlTemplate - .replace(/^(http[s]*:\/\/)/, '') - .replace('{s}', subdomain(templates.http.subdomains, resource)); - https = httpsUrlTemplate - .replace(/^(http[s]*:\/\/)/, '') - .replace('{s}', subdomain(templates.https.subdomains, resource)); + httpDomain = httpUrlTemplate.replace(/^(http[s]*:\/\/)/, ''); + httpDomain = resource.getDomain(httpDomain, templates.http.subdomains); + httpsDomain = httpsUrlTemplate.replace(/^(http[s]*:\/\/)/, ''); + httpsDomain = resource.getDomain(httpsDomain, templates.https.subdomains); } return { - http: http, - https: https, + http: httpDomain, + https: httpsDomain, }; } return null;