From 22e2e1b0921db0d2752234f14080c75b54356568 Mon Sep 17 00:00:00 2001 From: JJ-8 <34778827+JJ-8@users.noreply.github.com> Date: Sat, 6 Nov 2021 11:21:52 +0100 Subject: [PATCH 1/5] Add releases directory to gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ce84871d..a1c443f6 100644 --- a/.gitignore +++ b/.gitignore @@ -41,7 +41,7 @@ config/local.js database.json - +releases From a49dece3cd03f2b945485484bfdcd184593e46d4 Mon Sep 17 00:00:00 2001 From: JJ-8 <34778827+JJ-8@users.noreply.github.com> Date: Sat, 6 Nov 2021 11:22:50 +0100 Subject: [PATCH 2/5] Add platform detection and optional filename The user can now specify custom file extensions to serve as latest release. --- api/controllers/AssetController.js | 11 ++++++----- config/routes.js | 8 ++++---- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/api/controllers/AssetController.js b/api/controllers/AssetController.js index 317fb88a..5fdd6c27 100644 --- a/api/controllers/AssetController.js +++ b/api/controllers/AssetController.js @@ -9,6 +9,7 @@ var _ = require('lodash'); var path = require('path'); var actionUtil = require('sails/lib/hooks/blueprints/actionUtil'); var Promise = require('bluebird'); +const PlatformService = require('../services/PlatformService'); module.exports = { @@ -19,12 +20,12 @@ module.exports = { * This is because Squirrel.Windows does a poor job of parsing the filename, * and so we must fake the filenames of x32 and x64 versions to be the same. * - * (GET /download/latest/:platform?': 'AssetController.download') + * (GET /download/latest/:platform?/:filename?': 'AssetController.download') * (GET /download/:version/:platform?/:filename?': 'AssetController.download') - * (GET /download/channel/:channel/:platform?': 'AssetController.download') - * (GET /download/flavor/:flavor/latest/:platform?': 'AssetController.download') + * (GET /download/channel/:channel/:platform?/:filename?': 'AssetController.download') + * (GET /download/flavor/:flavor/latest/:platform?/:filename?': 'AssetController.download') * (GET /download/flavor/:flavor/:version/:platform?/:filename?': 'AssetController.download') - * (GET /download/flavor/:flavor/channel/:channel/:platform?': 'AssetController.download') + * (GET /download/flavor/:flavor/channel/:channel/:platform?/:filename?': 'AssetController.download') */ download: function(req, res) { var channel = req.params.channel; @@ -37,7 +38,7 @@ module.exports = { var platforms; var platform = req.param('platform'); if (platform) { - platforms = [platform]; + platforms = PlatformService.detect(platform, true); } // Normalize filetype by prepending with period diff --git a/config/routes.js b/config/routes.js index 3ee96148..81e18189 100644 --- a/config/routes.js +++ b/config/routes.js @@ -31,16 +31,16 @@ module.exports.routes = { 'PUT /version/availability/:version/:timestamp': 'VersionController.availability', - 'GET /download/latest/:platform?': 'AssetController.download', - 'GET /download/channel/:channel/:platform?': 'AssetController.download', + 'GET /download/latest/:platform?/:filename?': 'AssetController.download', + 'GET /download/channel/:channel/:platform?/:filename?': 'AssetController.download', 'GET /download/:version/:platform?/:filename?': { controller: 'AssetController', action: 'download', // This is important since it allows matching with filenames. skipAssets: false }, - 'GET /download/flavor/:flavor/latest/:platform?': 'AssetController.download', - 'GET /download/flavor/:flavor/channel/:channel/:platform?': 'AssetController.download', + 'GET /download/flavor/:flavor/latest/:platform?/:filename?': 'AssetController.download', + 'GET /download/flavor/:flavor/channel/:channel/:platform?/:filename?': 'AssetController.download', 'GET /download/flavor/:flavor/:version/:platform?/:filename?': { controller: 'AssetController', action: 'download', From 435dc2762a32822ecb48287999c7cd9028f8d0ba Mon Sep 17 00:00:00 2001 From: JJ-8 <34778827+JJ-8@users.noreply.github.com> Date: Sat, 6 Nov 2021 11:35:28 +0100 Subject: [PATCH 3/5] Add latest flavor-channel option Now the user can get the latest version of a custom channel and custom flavor --- config/routes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/routes.js b/config/routes.js index 81e18189..b14b57ad 100644 --- a/config/routes.js +++ b/config/routes.js @@ -41,13 +41,13 @@ module.exports.routes = { }, 'GET /download/flavor/:flavor/latest/:platform?/:filename?': 'AssetController.download', 'GET /download/flavor/:flavor/channel/:channel/:platform?/:filename?': 'AssetController.download', + 'GET /download/flavor/:flavor/latest/channel/:channel/:platform?/:filename?': 'AssetController.download', 'GET /download/flavor/:flavor/:version/:platform?/:filename?': { controller: 'AssetController', action: 'download', // This is important since it allows matching with filenames. skipAssets: false }, - 'GET /update': 'VersionController.redirect', 'GET /update/:platform/latest-mac.yml': 'VersionController.electronUpdaterMac', 'GET /update/:platform/:channel-mac.yml': 'VersionController.electronUpdaterMac', From 266072e7ca029067b81fe0969d70dce51677d7fb Mon Sep 17 00:00:00 2001 From: JJ-8 <34778827+JJ-8@users.noreply.github.com> Date: Sat, 6 Nov 2021 11:41:29 +0100 Subject: [PATCH 4/5] Update documentation with new URLs --- README.md | 6 ++++++ docs/urls.md | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/README.md b/README.md index 65b57af2..153543c2 100644 --- a/README.md +++ b/README.md @@ -26,13 +26,19 @@ If you host your project on your Github **and** do not need a UI for your app, t - :sparkles: Simple but powerful download urls (**NOTE:** when no assets are uploaded, server returns `404` by default): - `/download/latest` - `/download/latest/:platform` + - `/download/latest/:platform/:filename` - `/download/:version` - `/download/:version/:platform` - `/download/:version/:platform/:filename` - `/download/channel/:channel` - `/download/channel/:channel/:platform` + - `/download/channel/:channel/:platform/:filename` - `/download/flavor/:flavor/latest` - `/download/flavor/:flavor/latest/:platform` + - `/download/flavor/:flavor/latest/:platform/:filename` + - `/download/flavor/:flavor/latest/channel/:channel/` + - `/download/flavor/:flavor/latest/channel/:channel/:platform` + - `/download/flavor/:flavor/latest/channel/:channel/:platform/:filename` - `/download/flavor/:flavor/:version` - `/download/flavor/:flavor/:version/:platform` - `/download/flavor/:flavor/:version/:platform/:filename` diff --git a/docs/urls.md b/docs/urls.md index 108aa3d7..531876a0 100644 --- a/docs/urls.md +++ b/docs/urls.md @@ -8,6 +8,10 @@ Electron Release Server provides a variety of urls to access release assets. #### Latest version for specific platform: - `http://download.myapp.com/download/latest/osx` - `http://download.myapp.com/download/flavor/default/latest/osx` +#### Latest version for specific platform and file extension +- `http://download.myapp.com/download/latest/osx/update.zip` +- `http://download.myapp.com/download/flavor/default/latest/osx/update.dmg` +- `http://download.myapp.com/download/flavor/default/latest/channel/stable/osx/update.dmg` #### Specific version for detected platform: - `http://download.myapp.com/download/1.1.0` - `http://download.myapp.com/download/flavor/default/1.1.0` From da2efece8240b08168df1ff5826f953ed5128b73 Mon Sep 17 00:00:00 2001 From: JJ-8 <34778827+JJ-8@users.noreply.github.com> Date: Thu, 16 Feb 2023 11:29:24 +0100 Subject: [PATCH 5/5] Fix file matching for routes This makes it again possible to define arbitrary names with file extensions and based on the file extension the correct file will be downloaded. --- config/routes.js | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/config/routes.js b/config/routes.js index b14b57ad..d5de43d5 100644 --- a/config/routes.js +++ b/config/routes.js @@ -30,18 +30,42 @@ module.exports.routes = { '/auth/logout': { view: 'homepage' }, 'PUT /version/availability/:version/:timestamp': 'VersionController.availability', - - 'GET /download/latest/:platform?/:filename?': 'AssetController.download', - 'GET /download/channel/:channel/:platform?/:filename?': 'AssetController.download', + 'GET /download/latest/:platform?/:filename?': { + controller: 'AssetController', + action: 'download', + // This is important since it allows matching with filenames. + skipAssets: false + }, + 'GET /download/channel/:channel/:platform?/:filename?': { + controller: 'AssetController', + action: 'download', + // This is important since it allows matching with filenames. + skipAssets: false + }, 'GET /download/:version/:platform?/:filename?': { controller: 'AssetController', action: 'download', // This is important since it allows matching with filenames. skipAssets: false }, - 'GET /download/flavor/:flavor/latest/:platform?/:filename?': 'AssetController.download', - 'GET /download/flavor/:flavor/channel/:channel/:platform?/:filename?': 'AssetController.download', - 'GET /download/flavor/:flavor/latest/channel/:channel/:platform?/:filename?': 'AssetController.download', + 'GET /download/flavor/:flavor/latest/:platform?/:filename?': { + controller: 'AssetController', + action: 'download', + // This is important since it allows matching with filenames. + skipAssets: false + }, + 'GET /download/flavor/:flavor/channel/:channel/:platform?/:filename?': { + controller: 'AssetController', + action: 'download', + // This is important since it allows matching with filenames. + skipAssets: false + }, + 'GET /download/flavor/:flavor/latest/channel/:channel/:platform?/:filename?': { + controller: 'AssetController', + action: 'download', + // This is important since it allows matching with filenames. + skipAssets: false + }, 'GET /download/flavor/:flavor/:version/:platform?/:filename?': { controller: 'AssetController', action: 'download',