feat: replace static Swagger UI server selector with dynamic client-side detection
Build and Push Docker Image / build (push) Successful in 56s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m18s
CI / Security audit (push) Successful in 2m9s
CI / Swagger Validation & Coverage (push) Successful in 2m25s
CI / Tests & coverage (push) Successful in 2m44s

- Update openapi.yaml to use single placeholder server URL
- Add swagger-server-detection.js to auto-detect current server URL from window.location
- Configure protocol, host, and port detection based on browser connection
- Fallback to placeholder URL if detection fails
- Include detection script in both app.js and index.js Swagger UI configurations
- /api/swagger.json endpoint returns static placeholder for external consumers
This commit is contained in:
2026-05-21 14:52:04 +01:00
parent 4941b69924
commit 52a75fd8cb
4 changed files with 50 additions and 5 deletions
+45
View File
@@ -0,0 +1,45 @@
// Swagger UI server URL auto-detection
// Automatically sets the server URL to match the current instance
(function() {
window.addEventListener('load', function() {
// Wait for Swagger UI to initialize
setTimeout(function() {
try {
// Detect current URL from browser
const protocol = window.location.protocol;
const host = window.location.host;
const detectedUrl = `${protocol}//${host}`;
// Get Swagger UI instance
const ui = window.ui;
if (!ui) {
console.warn('Swagger UI not found, cannot set server URL');
return;
}
// Get the spec servers
const spec = ui.specSelectors.specJson();
const servers = spec.getIn(['servers']);
if (!servers || servers.size === 0) {
console.warn('No servers defined in OpenAPI spec');
return;
}
// Update the first server with the detected URL
const updatedServers = servers.setIn([0, 'url'], detectedUrl);
// Apply the updated servers to the spec
const updatedSpec = spec.set('servers', updatedServers);
ui.specActions.updateSpec(updatedSpec.toJS());
// Also set the selected server in Swagger UI state
ui.specActions.setSelectedServer(updatedServers.get(0).get('url'));
console.log('Swagger UI server URL set to:', detectedUrl);
} catch (error) {
console.error('Failed to auto-detect Swagger UI server URL:', error);
}
}, 100); // Small delay to ensure Swagger UI is initialized
});
})();
+2 -1
View File
@@ -185,7 +185,8 @@ function createApp({ skipRateLimits = false } = {}) {
customSiteTitle: 'sofarr API Documentation',
customCss: '.swagger-ui .topbar { display: none }',
customJs: [
'/swagger-auth-banner.js'
'/swagger-auth-banner.js',
'/swagger-server-detection.js'
]
}));
+2 -1
View File
@@ -300,7 +300,8 @@ app.use('/api/swagger', swaggerUi.serve, swaggerUi.setup(swaggerSpec, {
customSiteTitle: 'sofarr API Documentation',
customCss: '.swagger-ui .topbar { display: none }',
customJs: [
'/swagger-auth-banner.js'
'/swagger-auth-banner.js',
'/swagger-server-detection.js'
]
}));
+1 -3
View File
@@ -25,10 +25,8 @@ info:
name: MIT
servers:
- url: http://localhost:3001
description: Local development server
- url: https://sofarr.example.com
description: Production server
description: sofarr API (auto-detected from current URL)
tags:
- name: Health