This commit is contained in:
2025-11-18 14:16:27 +00:00
parent 1fe3cd7f14
commit 44267bbb27
9 changed files with 703 additions and 160 deletions

View File

@@ -373,19 +373,31 @@ export class OneboxDatabase {
this.query('DELETE FROM services WHERE id = ?', [id]);
}
private rowToService(row: unknown[]): IService {
private rowToService(row: any): IService {
// Handle env_vars JSON parsing safely
let envVars = {};
const envVarsRaw = row.env_vars || row[4];
if (envVarsRaw && envVarsRaw !== 'undefined' && envVarsRaw !== 'null') {
try {
envVars = JSON.parse(String(envVarsRaw));
} catch (e) {
logger.warn(`Failed to parse env_vars for service: ${e.message}`);
envVars = {};
}
}
return {
id: Number(row[0]),
name: String(row[1]),
image: String(row[2]),
registry: row[3] ? String(row[3]) : undefined,
envVars: JSON.parse(String(row[4])),
port: Number(row[5]),
domain: row[6] ? String(row[6]) : undefined,
containerID: row[7] ? String(row[7]) : undefined,
status: String(row[8]) as IService['status'],
createdAt: Number(row[9]),
updatedAt: Number(row[10]),
id: Number(row.id || row[0]),
name: String(row.name || row[1]),
image: String(row.image || row[2]),
registry: (row.registry || row[3]) ? String(row.registry || row[3]) : undefined,
envVars,
port: Number(row.port || row[5]),
domain: (row.domain || row[6]) ? String(row.domain || row[6]) : undefined,
containerID: (row.container_id || row[7]) ? String(row.container_id || row[7]) : undefined,
status: String(row.status || row[8]) as IService['status'],
createdAt: Number(row.created_at || row[9]),
updatedAt: Number(row.updated_at || row[10]),
};
}
@@ -422,13 +434,13 @@ export class OneboxDatabase {
this.query('DELETE FROM registries WHERE url = ?', [url]);
}
private rowToRegistry(row: unknown[]): IRegistry {
private rowToRegistry(row: any): IRegistry {
return {
id: Number(row[0]),
url: String(row[1]),
username: String(row[2]),
passwordEncrypted: String(row[3]),
createdAt: Number(row[4]),
id: Number(row.id || row[0]),
url: String(row.url || row[1]),
username: String(row.username || row[2]),
passwordEncrypted: String(row.password_encrypted || row[3]),
createdAt: Number(row.created_at || row[4]),
};
}
@@ -552,16 +564,16 @@ export class OneboxDatabase {
return rows.map((row) => this.rowToMetric(row));
}
private rowToMetric(row: unknown[]): IMetric {
private rowToMetric(row: any): IMetric {
return {
id: Number(row[0]),
serviceId: Number(row[1]),
timestamp: Number(row[2]),
cpuPercent: Number(row[3]),
memoryUsed: Number(row[4]),
memoryLimit: Number(row[5]),
networkRxBytes: Number(row[6]),
networkTxBytes: Number(row[7]),
id: Number(row.id || row[0]),
serviceId: Number(row.service_id || row[1]),
timestamp: Number(row.timestamp || row[2]),
cpuPercent: Number(row.cpu_percent || row[3]),
memoryUsed: Number(row.memory_used || row[4]),
memoryLimit: Number(row.memory_limit || row[5]),
networkRxBytes: Number(row.network_rx_bytes || row[6]),
networkTxBytes: Number(row.network_tx_bytes || row[7]),
};
}
@@ -586,14 +598,14 @@ export class OneboxDatabase {
return rows.map((row) => this.rowToLog(row));
}
private rowToLog(row: unknown[]): ILogEntry {
private rowToLog(row: any): ILogEntry {
return {
id: Number(row[0]),
serviceId: Number(row[1]),
timestamp: Number(row[2]),
message: String(row[3]),
level: String(row[4]) as ILogEntry['level'],
source: String(row[5]) as ILogEntry['source'],
id: Number(row.id || row[0]),
serviceId: Number(row.service_id || row[1]),
timestamp: Number(row.timestamp || row[2]),
message: String(row.message || row[3]),
level: String(row.level || row[4]) as ILogEntry['level'],
source: String(row.source || row[5]) as ILogEntry['source'],
};
}
@@ -670,17 +682,17 @@ export class OneboxDatabase {
this.query('DELETE FROM ssl_certificates WHERE domain = ?', [domain]);
}
private rowToSSLCert(row: unknown[]): ISslCertificate {
private rowToSSLCert(row: any): ISslCertificate {
return {
id: Number(row[0]),
domain: String(row[1]),
certPath: String(row[2]),
keyPath: String(row[3]),
fullChainPath: String(row[4]),
expiryDate: Number(row[5]),
issuer: String(row[6]),
createdAt: Number(row[7]),
updatedAt: Number(row[8]),
id: Number(row.id || row[0]),
domain: String(row.domain || row[1]),
certPath: String(row.cert_path || row[2]),
keyPath: String(row.key_path || row[3]),
fullChainPath: String(row.full_chain_path || row[4]),
expiryDate: Number(row.expiry_date || row[5]),
issuer: String(row.issuer || row[6]),
createdAt: Number(row.created_at || row[7]),
updatedAt: Number(row.updated_at || row[8]),
};
}
}