fix(haproxy): Use module-level RPC declarations in api.js

Fix TypeError "haproxy.api factory yields invalid constructor" by
refactoring api.js to use correct LuCI module pattern:
- Define RPC calls at module level with rpc.declare()
- Reference them in baseclass.extend() object
- Add getDashboardData helper function at module level

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
CyberMind-FR 2026-01-23 20:15:48 +01:00
parent f3fd676ad1
commit 22bd4bd445
2 changed files with 347 additions and 256 deletions

View File

@ -11,7 +11,7 @@ LUCI_PKGARCH:=all
PKG_NAME:=luci-app-haproxy PKG_NAME:=luci-app-haproxy
PKG_VERSION:=1.0.0 PKG_VERSION:=1.0.0
PKG_RELEASE:=1 PKG_RELEASE:=2
PKG_MAINTAINER:=CyberMind <contact@cybermind.fr> PKG_MAINTAINER:=CyberMind <contact@cybermind.fr>
PKG_LICENSE:=MIT PKG_LICENSE:=MIT

View File

@ -1,276 +1,367 @@
'use strict'; 'use strict';
'require baseclass';
'require rpc'; 'require rpc';
var api = { // ============================================
// Status // Status
status: rpc.declare({ // ============================================
var callStatus = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'status', method: 'status',
expect: {} expect: {}
}), });
getStats: rpc.declare({ var callGetStats = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'get_stats', method: 'get_stats',
expect: {} expect: {}
}), });
// ============================================
// Vhosts // Vhosts
listVhosts: rpc.declare({ // ============================================
var callListVhosts = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'list_vhosts', method: 'list_vhosts',
expect: { vhosts: [] } expect: { vhosts: [] }
}), });
getVhost: rpc.declare({ var callGetVhost = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'get_vhost', method: 'get_vhost',
params: ['id'], params: ['id'],
expect: {} expect: {}
}), });
createVhost: rpc.declare({ var callCreateVhost = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'create_vhost', method: 'create_vhost',
params: ['domain', 'backend', 'ssl', 'ssl_redirect', 'acme', 'enabled'], params: ['domain', 'backend', 'ssl', 'ssl_redirect', 'acme', 'enabled'],
expect: {} expect: {}
}), });
updateVhost: rpc.declare({ var callUpdateVhost = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'update_vhost', method: 'update_vhost',
params: ['id', 'domain', 'backend', 'ssl', 'ssl_redirect', 'acme', 'enabled'], params: ['id', 'domain', 'backend', 'ssl', 'ssl_redirect', 'acme', 'enabled'],
expect: {} expect: {}
}), });
deleteVhost: rpc.declare({ var callDeleteVhost = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'delete_vhost', method: 'delete_vhost',
params: ['id'], params: ['id'],
expect: {} expect: {}
}), });
// ============================================
// Backends // Backends
listBackends: rpc.declare({ // ============================================
var callListBackends = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'list_backends', method: 'list_backends',
expect: { backends: [] } expect: { backends: [] }
}), });
getBackend: rpc.declare({ var callGetBackend = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'get_backend', method: 'get_backend',
params: ['id'], params: ['id'],
expect: {} expect: {}
}), });
createBackend: rpc.declare({ var callCreateBackend = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'create_backend', method: 'create_backend',
params: ['name', 'mode', 'balance', 'health_check', 'enabled'], params: ['name', 'mode', 'balance', 'health_check', 'enabled'],
expect: {} expect: {}
}), });
updateBackend: rpc.declare({ var callUpdateBackend = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'update_backend', method: 'update_backend',
params: ['id', 'name', 'mode', 'balance', 'health_check', 'enabled'], params: ['id', 'name', 'mode', 'balance', 'health_check', 'enabled'],
expect: {} expect: {}
}), });
deleteBackend: rpc.declare({ var callDeleteBackend = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'delete_backend', method: 'delete_backend',
params: ['id'], params: ['id'],
expect: {} expect: {}
}), });
// ============================================
// Servers // Servers
listServers: rpc.declare({ // ============================================
var callListServers = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'list_servers', method: 'list_servers',
params: ['backend'], params: ['backend'],
expect: { servers: [] } expect: { servers: [] }
}), });
createServer: rpc.declare({ var callCreateServer = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'create_server', method: 'create_server',
params: ['backend', 'name', 'address', 'port', 'weight', 'check', 'enabled'], params: ['backend', 'name', 'address', 'port', 'weight', 'check', 'enabled'],
expect: {} expect: {}
}), });
updateServer: rpc.declare({ var callUpdateServer = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'update_server', method: 'update_server',
params: ['id', 'backend', 'name', 'address', 'port', 'weight', 'check', 'enabled'], params: ['id', 'backend', 'name', 'address', 'port', 'weight', 'check', 'enabled'],
expect: {} expect: {}
}), });
deleteServer: rpc.declare({ var callDeleteServer = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'delete_server', method: 'delete_server',
params: ['id'], params: ['id'],
expect: {} expect: {}
}), });
// ============================================
// Certificates // Certificates
listCertificates: rpc.declare({ // ============================================
var callListCertificates = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'list_certificates', method: 'list_certificates',
expect: { certificates: [] } expect: { certificates: [] }
}), });
requestCertificate: rpc.declare({ var callRequestCertificate = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'request_certificate', method: 'request_certificate',
params: ['domain'], params: ['domain'],
expect: {} expect: {}
}), });
importCertificate: rpc.declare({ var callImportCertificate = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'import_certificate', method: 'import_certificate',
params: ['domain', 'cert', 'key'], params: ['domain', 'cert', 'key'],
expect: {} expect: {}
}), });
deleteCertificate: rpc.declare({ var callDeleteCertificate = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'delete_certificate', method: 'delete_certificate',
params: ['id'], params: ['id'],
expect: {} expect: {}
}), });
// ============================================
// ACLs // ACLs
listAcls: rpc.declare({ // ============================================
var callListAcls = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'list_acls', method: 'list_acls',
expect: { acls: [] } expect: { acls: [] }
}), });
createAcl: rpc.declare({ var callCreateAcl = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'create_acl', method: 'create_acl',
params: ['name', 'type', 'pattern', 'backend', 'enabled'], params: ['name', 'type', 'pattern', 'backend', 'enabled'],
expect: {} expect: {}
}), });
updateAcl: rpc.declare({ var callUpdateAcl = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'update_acl', method: 'update_acl',
params: ['id', 'name', 'type', 'pattern', 'backend', 'enabled'], params: ['id', 'name', 'type', 'pattern', 'backend', 'enabled'],
expect: {} expect: {}
}), });
deleteAcl: rpc.declare({ var callDeleteAcl = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'delete_acl', method: 'delete_acl',
params: ['id'], params: ['id'],
expect: {} expect: {}
}), });
// ============================================
// Redirects // Redirects
listRedirects: rpc.declare({ // ============================================
var callListRedirects = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'list_redirects', method: 'list_redirects',
expect: { redirects: [] } expect: { redirects: [] }
}), });
createRedirect: rpc.declare({ var callCreateRedirect = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'create_redirect', method: 'create_redirect',
params: ['name', 'match_host', 'target_host', 'strip_www', 'code', 'enabled'], params: ['name', 'match_host', 'target_host', 'strip_www', 'code', 'enabled'],
expect: {} expect: {}
}), });
deleteRedirect: rpc.declare({ var callDeleteRedirect = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'delete_redirect', method: 'delete_redirect',
params: ['id'], params: ['id'],
expect: {} expect: {}
}), });
// ============================================
// Settings // Settings
getSettings: rpc.declare({ // ============================================
var callGetSettings = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'get_settings', method: 'get_settings',
expect: {} expect: {}
}), });
saveSettings: rpc.declare({ var callSaveSettings = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'save_settings', method: 'save_settings',
params: ['main', 'defaults', 'acme'], params: ['main', 'defaults', 'acme'],
expect: {} expect: {}
}), });
// Service control // ============================================
install: rpc.declare({ // Service Control
// ============================================
var callInstall = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'install', method: 'install',
expect: {} expect: {}
}), });
start: rpc.declare({ var callStart = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'start', method: 'start',
expect: {} expect: {}
}), });
stop: rpc.declare({ var callStop = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'stop', method: 'stop',
expect: {} expect: {}
}), });
restart: rpc.declare({ var callRestart = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'restart', method: 'restart',
expect: {} expect: {}
}), });
reload: rpc.declare({ var callReload = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'reload', method: 'reload',
expect: {} expect: {}
}), });
generate: rpc.declare({ var callGenerate = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'generate', method: 'generate',
expect: {} expect: {}
}), });
validate: rpc.declare({ var callValidate = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'validate', method: 'validate',
expect: {} expect: {}
}), });
getLogs: rpc.declare({ var callGetLogs = rpc.declare({
object: 'luci.haproxy', object: 'luci.haproxy',
method: 'get_logs', method: 'get_logs',
params: ['lines'], params: ['lines'],
expect: { logs: '' } expect: { logs: '' }
}), });
// Fetch all data for dashboard // ============================================
getDashboardData: function() { // Helper Functions
// ============================================
function getDashboardData() {
return Promise.all([ return Promise.all([
this.status(), callStatus(),
this.listVhosts(), callListVhosts(),
this.listBackends(), callListBackends(),
this.listCertificates() callListCertificates()
]).then(function(results) { ]).then(function(results) {
return { return {
status: results[0], status: results[0],
vhosts: results[1], vhosts: results[1].vhosts || [],
backends: results[2], backends: results[2].backends || [],
certificates: results[3] certificates: results[3].certificates || []
}; };
}); });
} }
};
return api; // ============================================
// Module Export
// ============================================
return baseclass.extend({
// Status
status: callStatus,
getStats: callGetStats,
// Vhosts
listVhosts: callListVhosts,
getVhost: callGetVhost,
createVhost: callCreateVhost,
updateVhost: callUpdateVhost,
deleteVhost: callDeleteVhost,
// Backends
listBackends: callListBackends,
getBackend: callGetBackend,
createBackend: callCreateBackend,
updateBackend: callUpdateBackend,
deleteBackend: callDeleteBackend,
// Servers
listServers: callListServers,
createServer: callCreateServer,
updateServer: callUpdateServer,
deleteServer: callDeleteServer,
// Certificates
listCertificates: callListCertificates,
requestCertificate: callRequestCertificate,
importCertificate: callImportCertificate,
deleteCertificate: callDeleteCertificate,
// ACLs
listAcls: callListAcls,
createAcl: callCreateAcl,
updateAcl: callUpdateAcl,
deleteAcl: callDeleteAcl,
// Redirects
listRedirects: callListRedirects,
createRedirect: callCreateRedirect,
deleteRedirect: callDeleteRedirect,
// Settings
getSettings: callGetSettings,
saveSettings: callSaveSettings,
// Service control
install: callInstall,
start: callStart,
stop: callStop,
restart: callRestart,
reload: callReload,
generate: callGenerate,
validate: callValidate,
getLogs: callGetLogs,
// Helpers
getDashboardData: getDashboardData
});