@smartsamurai/krapi-sdk
Version:
KRAPI TypeScript SDK - Easy-to-use client SDK for connecting to self-hosted KRAPI servers (like Appwrite SDK)
374 lines (356 loc) • 8.84 kB
text/typescript
/**
* System HTTP Client for KRAPI SDK
*
* HTTP-based system methods for frontend applications.
* Provides system settings management, email testing, and system information.
*
* @module http-clients/system-http-client
* @example
* const client = new SystemHttpClient({ baseUrl: 'https://api.example.com' });
* const settings = await client.getSettings();
*/
import { ApiResponse } from "../core";
import { BaseHttpClient } from "./base-http-client";
/**
* System Settings Interface
*
* @interface SystemSettings
* @property {Object} general - General system settings
* @property {Object} security - Security settings
* @property {Object} email - Email configuration
* @property {Object} database - Database settings
*/
export interface SystemSettings {
general: {
siteName: string;
siteUrl: string;
adminEmail: string;
timezone: string;
defaultLanguage: string;
};
security: {
requireTwoFactor: boolean;
sessionTimeout: number;
passwordMinLength: number;
passwordRequireUppercase: boolean;
passwordRequireNumbers: boolean;
passwordRequireSymbols: boolean;
maxLoginAttempts: number;
};
email: {
smtpHost: string;
smtpPort: number;
smtpUsername: string;
smtpPassword: string;
smtpSecure: boolean;
fromEmail: string;
fromName: string;
};
database: {
connectionPoolSize: number;
queryTimeout: number;
enableQueryLogging: boolean;
backupSchedule: string;
backupRetentionDays: number;
};
}
/**
* System HTTP Client
*
* HTTP client for system operations.
*
* @class SystemHttpClient
* @extends {BaseHttpClient}
* @example
* const client = new SystemHttpClient({ baseUrl: 'https://api.example.com' });
* const settings = await client.getSettings();
*/
export class SystemHttpClient extends BaseHttpClient {
// System Settings
async getSettings(): Promise<ApiResponse<SystemSettings>> {
return this.get<SystemSettings>("/system/settings");
}
async updateSettings(
updates: Partial<SystemSettings>
): Promise<ApiResponse<SystemSettings>> {
return this.put<SystemSettings>("/system/settings", updates);
}
// Email Configuration Testing
async testEmailConfig(emailConfig: {
smtpHost: string;
smtpPort: number;
smtpUsername: string;
smtpPassword: string;
smtpSecure: boolean;
fromEmail: string;
toEmail: string;
}): Promise<ApiResponse<{ success: boolean; message?: string }>> {
return this.post<{ success: boolean; message?: string }>(
"/system/test-email",
emailConfig
);
}
// System Information
async getSystemInfo(): Promise<
ApiResponse<{
version: string;
environment: string;
uptime: number;
memory: {
used: number;
total: number;
percentage: number;
};
cpu: {
usage: number;
cores: number;
load_average: number[];
};
disk: {
used: number;
total: number;
percentage: number;
};
database: {
size_bytes: number;
tables_count: number;
connections: number;
uptime: number;
};
}>
> {
return this.get<{
version: string;
environment: string;
uptime: number;
memory: {
used: number;
total: number;
percentage: number;
};
cpu: {
usage: number;
cores: number;
load_average: number[];
};
disk: {
used: number;
total: number;
percentage: number;
};
database: {
size_bytes: number;
tables_count: number;
connections: number;
uptime: number;
};
}>("/system/info");
}
// System Maintenance
async runMaintenance(): Promise<
ApiResponse<{
success: boolean;
message: string;
tasks_completed: string[];
duration: number;
}>
> {
return this.post<{
success: boolean;
message: string;
tasks_completed: string[];
duration: number;
}>("/system/maintenance");
}
async backupSystem(): Promise<
ApiResponse<{
success: boolean;
message: string;
backup_path: string;
backup_size: number;
duration: number;
}>
> {
return this.post<{
success: boolean;
message: string;
backup_path: string;
backup_size: number;
duration: number;
}>("/system/backup");
}
// User Management
async getSystemUsers(): Promise<
ApiResponse<
Array<{
id: string;
username: string;
email: string;
role: "admin" | "user";
is_active: boolean;
last_login?: string;
created_at: string;
}>
>
> {
return this.get<
Array<{
id: string;
username: string;
email: string;
role: "admin" | "user";
is_active: boolean;
last_login?: string;
created_at: string;
}>
>("/system/users");
}
async createSystemUser(userData: {
username: string;
email: string;
password: string;
role: "admin" | "user";
}): Promise<
ApiResponse<{
id: string;
username: string;
email: string;
role: "admin" | "user";
is_active: boolean;
created_at: string;
}>
> {
return this.post<{
id: string;
username: string;
email: string;
role: "admin" | "user";
is_active: boolean;
created_at: string;
}>("/system/users", userData);
}
async updateSystemUser(
userId: string,
updates: Partial<{
username: string;
email: string;
role: "admin" | "user";
is_active: boolean;
}>
): Promise<
ApiResponse<{
id: string;
username: string;
email: string;
role: "admin" | "user";
is_active: boolean;
last_login?: string;
created_at: string;
}>
> {
return this.put<{
id: string;
username: string;
email: string;
role: "admin" | "user";
is_active: boolean;
last_login?: string;
created_at: string;
}>(`/system/users/${userId}`, updates);
}
async deleteSystemUser(
userId: string
): Promise<ApiResponse<{ success: boolean }>> {
return this.delete<{ success: boolean }>(`/system/users/${userId}`);
}
// System Logs
async getSystemLogs(options?: {
level?: "debug" | "info" | "warn" | "error";
service?: string;
limit?: number;
offset?: number;
start_date?: string;
end_date?: string;
search?: string;
}): Promise<
ApiResponse<{
logs: Array<{
timestamp: string;
level: string;
service: string;
message: string;
metadata?: Record<string, unknown>;
}>;
total: number;
has_more: boolean;
}>
> {
const params = new URLSearchParams();
if (options?.level) params.append("level", options.level);
if (options?.service) params.append("service", options.service);
if (options?.limit) params.append("limit", options.limit.toString());
if (options?.offset) params.append("offset", options.offset.toString());
if (options?.start_date) params.append("start_date", options.start_date);
if (options?.end_date) params.append("end_date", options.end_date);
if (options?.search) params.append("search", options.search);
const url = params.toString() ? `/system/logs?${params}` : "/system/logs";
return this.get<{
logs: Array<{
timestamp: string;
level: string;
service: string;
message: string;
metadata?: Record<string, unknown>;
}>;
total: number;
has_more: boolean;
}>(url);
}
async clearSystemLogs(options?: {
level?: "debug" | "info" | "warn" | "error";
service?: string;
older_than_days?: number;
}): Promise<
ApiResponse<{
success: boolean;
message: string;
cleared_count: number;
}>
> {
return this.delete<{
success: boolean;
message: string;
cleared_count: number;
}>("/system/logs", options);
}
// Queue Metrics
async getQueueMetrics(): Promise<
ApiResponse<{
queueSize: number;
processingCount: number;
totalProcessed: number;
totalErrors: number;
averageWaitTime: number;
averageProcessTime: number;
queueItems: Array<{
id: string;
priority: number;
timestamp: number;
}>;
}>
> {
return this.get<{
queueSize: number;
processingCount: number;
totalProcessed: number;
totalErrors: number;
averageWaitTime: number;
averageProcessTime: number;
queueItems: Array<{
id: string;
priority: number;
timestamp: number;
}>;
}>("/queue/metrics");
}
}