import * as plugins from './plugins.js'; import * as interfaces from '../ts_interfaces/index.js'; import { RouteManager } from './classes.route.js'; import { CertificateManager } from './classes.certificate.js'; import { ApiTokenManager } from './classes.apitoken.js'; import { RemoteIngressManager } from './classes.remoteingress.js'; import { StatsManager } from './classes.stats.js'; import { ConfigManager } from './classes.config.js'; import { LogManager } from './classes.logs.js'; import { EmailManager } from './classes.email.js'; import { RadiusManager } from './classes.radius.js'; export interface IDcRouterApiClientOptions { baseUrl: string; apiToken?: string; } export class DcRouterApiClient { public baseUrl: string; public apiToken?: string; public identity?: interfaces.data.IIdentity; // Resource managers public routes: RouteManager; public certificates: CertificateManager; public apiTokens: ApiTokenManager; public remoteIngress: RemoteIngressManager; public stats: StatsManager; public config: ConfigManager; public logs: LogManager; public emails: EmailManager; public radius: RadiusManager; constructor(options: IDcRouterApiClientOptions) { this.baseUrl = options.baseUrl.replace(/\/+$/, ''); this.apiToken = options.apiToken; this.routes = new RouteManager(this); this.certificates = new CertificateManager(this); this.apiTokens = new ApiTokenManager(this); this.remoteIngress = new RemoteIngressManager(this); this.stats = new StatsManager(this); this.config = new ConfigManager(this); this.logs = new LogManager(this); this.emails = new EmailManager(this); this.radius = new RadiusManager(this); } // ===================== // Auth // ===================== public async login(username: string, password: string): Promise { const response = await this.request( 'adminLoginWithUsernameAndPassword', { username, password }, ); if (response.identity) { this.identity = response.identity; } return response.identity!; } public async logout(): Promise { await this.request( 'adminLogout', { identity: this.identity! }, ); this.identity = undefined; } public async verifyIdentity(): Promise<{ valid: boolean; identity?: interfaces.data.IIdentity }> { const response = await this.request( 'verifyIdentity', { identity: this.identity! }, ); if (response.identity) { this.identity = response.identity; } return response; } // ===================== // Internal request helper // ===================== public async request( method: string, requestData: T['request'], ): Promise { const typedRequest = new plugins.typedrequest.TypedRequest( `${this.baseUrl}/typedrequest`, method, ); return typedRequest.fire(requestData); } /** * Build a request payload with identity and optional API token auto-injected. */ public buildRequestPayload(extra: Record = {}): Record { const payload: Record = { ...extra }; if (this.identity) { payload.identity = this.identity; } if (this.apiToken) { payload.apiToken = this.apiToken; } return payload; } }