v1.13.4: Standardize all route responses to use response helpers
Convert ~160 raw res.json()/res.status().json() calls across 32+ files to use centralized helpers from src/utils/responses.js (ok, errorResponse, successMessage, notFound, validationError, forbidden, unauthorized, conflict). No behavior changes — response shapes are identical. Future schema changes (e.g., requestId envelope) only need to update one module. Fix error vs errorResponse signature mismatch in routes/health.js CA cert endpoint where error(res, message, statusCode) was being called with errorResponse(res, statusCode, message, extras) argument order. Files changed: middleware.js, csrf-protection.js, error-handler.js, license-manager.js, src/app.js, and 27 route files. Test suite: 755 pass / 4 pre-existing failures (services credential tests).
This commit is contained in:
@@ -3,6 +3,7 @@ const fs = require('fs');
|
||||
const { TAILSCALE } = require('../constants');
|
||||
const { exists } = require('../fs-helpers');
|
||||
const { ValidationError, NotFoundError } = require('../errors');
|
||||
const { ok, successMessage, unauthorized } = require('../src/utils/responses');
|
||||
|
||||
/**
|
||||
* Tailscale route factory
|
||||
@@ -35,8 +36,7 @@ module.exports = function({
|
||||
const localIP = await tailscale.getLocalIP();
|
||||
|
||||
if (!status) {
|
||||
return res.json({
|
||||
success: true,
|
||||
return ok(res, {
|
||||
installed: false,
|
||||
connected: false,
|
||||
message: 'Tailscale not available or not running'
|
||||
@@ -58,8 +58,7 @@ module.exports = function({
|
||||
}
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
ok(res, {
|
||||
installed: true,
|
||||
connected: status.BackendState === 'Running',
|
||||
backendState: status.BackendState,
|
||||
@@ -85,8 +84,7 @@ module.exports = function({
|
||||
|
||||
await tailscale.save();
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
ok(res, {
|
||||
message: 'Tailscale configuration updated',
|
||||
config: tailscale.config
|
||||
});
|
||||
@@ -101,8 +99,7 @@ module.exports = function({
|
||||
const ipsToCheck = [clientIP, forwardedFor, realIP].filter(Boolean);
|
||||
const isTailscale = ipsToCheck.some(ip => tailscale.isTailscaleIP(ip.toString().split(',')[0].trim()));
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
ok(res, {
|
||||
isTailscale,
|
||||
clientIP,
|
||||
forwardedFor: forwardedFor || null,
|
||||
@@ -114,7 +111,7 @@ module.exports = function({
|
||||
router.get('/devices', asyncHandler(async (req, res) => {
|
||||
const status = await tailscale.getStatus();
|
||||
if (!status || !status.Peer) {
|
||||
return res.json({ success: true, devices: [] });
|
||||
return ok(res, { devices: [] });
|
||||
}
|
||||
|
||||
const devices = [];
|
||||
@@ -141,7 +138,7 @@ module.exports = function({
|
||||
});
|
||||
}
|
||||
|
||||
res.json({ success: true, devices });
|
||||
ok(res, { devices });
|
||||
}, 'tailscale-devices'));
|
||||
|
||||
// Toggle Tailscale-only mode for an existing service
|
||||
@@ -190,8 +187,7 @@ module.exports = function({
|
||||
});
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
ok(res, {
|
||||
message: `Service ${domain} is now ${tailscaleOnly !== false ? 'protected by' : 'no longer restricted to'} Tailscale`,
|
||||
tailscaleOnly: tailscaleOnly !== false
|
||||
});
|
||||
@@ -254,7 +250,7 @@ module.exports = function({
|
||||
log.warn('tailscale', 'Initial sync after OAuth config failed', { error: e.message });
|
||||
}
|
||||
|
||||
res.json({ success: true, config: tailscale.config });
|
||||
ok(res, { config: tailscale.config });
|
||||
}, 'tailscale-oauth-config'));
|
||||
|
||||
// Remove OAuth credentials and disable API sync
|
||||
@@ -269,7 +265,7 @@ module.exports = function({
|
||||
|
||||
tailscale.stopSync();
|
||||
|
||||
res.json({ success: true, message: 'Tailscale OAuth credentials removed' });
|
||||
successMessage(res, 'Tailscale OAuth credentials removed');
|
||||
}, 'tailscale-oauth-delete'));
|
||||
|
||||
// Get enriched device list from Tailscale API
|
||||
@@ -279,8 +275,7 @@ module.exports = function({
|
||||
}
|
||||
|
||||
// Return cached devices from last sync
|
||||
res.json({
|
||||
success: true,
|
||||
ok(res, {
|
||||
devices: tailscale.config.devices || [],
|
||||
lastSync: tailscale.config.lastSync
|
||||
});
|
||||
@@ -294,8 +289,7 @@ module.exports = function({
|
||||
|
||||
const devices = await tailscale.syncAPI();
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
ok(res, {
|
||||
devices: devices || [],
|
||||
lastSync: tailscale.config.lastSync
|
||||
});
|
||||
@@ -325,7 +319,7 @@ module.exports = function({
|
||||
sshRuleCount: (acl.ssh || []).length
|
||||
};
|
||||
|
||||
res.json({ success: true, acl, summary });
|
||||
ok(res, { acl, summary });
|
||||
}, 'tailscale-acl'));
|
||||
|
||||
return router;
|
||||
|
||||
Reference in New Issue
Block a user