UNPKG

@smartsamurai/krapi-sdk

Version:

KRAPI TypeScript SDK - Easy-to-use client SDK for connecting to self-hosted KRAPI servers (like Appwrite SDK)

757 lines (709 loc) 20.1 kB
/** * Shared Interfaces * * These interfaces define the contract that both frontend SDK and backend SDK must implement. * Ensures perfect client/server parity - same methods, same signatures, same behavior. * * @module interfaces */ import { ApiResponse, PaginatedResponse, QueryOptions, AdminUser, Project, Collection, Document, FileInfo, ProjectUser, ApiKey, EmailTemplate, ChangelogEntry, CreateChangelogEntry, ProjectSettings, ProjectStats, StorageStats, EmailConfig, EmailSendRequest, ActivityLog, SystemInfo, DatabaseHealth, TestResult, SchemaValidationResult, SystemSettings, BackupMetadata, ChatMessage, ChatResponse, ModelCapabilities, Model, } from "./types"; export interface IAuthService { register(registerData: { username: string; email: string; password: string; role?: string; access_level?: string; permissions?: string[]; }): Promise<ApiResponse<{ success: boolean; user: AdminUser }>>; logout(sessionId?: string): Promise<ApiResponse<{ success: boolean }>>; adminLogin(credentials: { username: string; password: string }): Promise< ApiResponse<{ user: AdminUser & { scopes: string[] }; token: string; session_token: string; expires_at: string; }> >; adminApiLogin(apiKey: string): Promise< ApiResponse<{ user: AdminUser & { scopes: string[] }; token: string; session_token: string; expires_at: string; }> >; createAdminSession(apiKey: string): Promise< ApiResponse<{ user: AdminUser & { scopes: string[] }; token: string; session_token: string; expires_at: string; }> >; createProjectSession( projectId: string, credentials: { username: string; password: string } ): Promise< ApiResponse<{ user: ProjectUser & { scopes: string[] }; token: string; session_token: string; expires_at: string; }> >; validateSession(token: string): Promise< ApiResponse<{ valid: boolean; user?: AdminUser | ProjectUser; scopes?: string[]; }> >; getCurrentUser(req: unknown): Promise<ApiResponse<AdminUser | ProjectUser>>; logout(req: unknown): Promise<ApiResponse<void>>; changePassword(req: unknown): Promise<ApiResponse<void>>; regenerateApiKey(req: unknown): Promise<ApiResponse<{ apiKey: string }>>; } export interface IAdminService { getUsers( options?: QueryOptions ): Promise<PaginatedResponse<Omit<AdminUser, "password_hash">>>; getUserById( id: string ): Promise<ApiResponse<Omit<AdminUser, "password_hash">>>; createUser( userData: Partial<AdminUser> ): Promise<ApiResponse<Omit<AdminUser, "password_hash">>>; updateUser( id: string, updates: Partial<AdminUser> ): Promise<ApiResponse<Omit<AdminUser, "password_hash">>>; deleteUser(id: string): Promise<ApiResponse<void>>; toggleUserStatus(id: string): Promise<ApiResponse<{ active: boolean }>>; getUserActivity(id: string): Promise<ApiResponse<ActivityLog[]>>; getUserApiKeys(userId: string): Promise<ApiResponse<ApiKey[]>>; createUserApiKey( userId: string, keyData: Partial<ApiKey> ): Promise<ApiResponse<ApiKey>>; deleteApiKey(keyId: string): Promise<ApiResponse<void>>; createMasterApiKey(): Promise<ApiResponse<ApiKey>>; getSystemStats(): Promise<ApiResponse<SystemInfo>>; getActivityLogs( options?: QueryOptions ): Promise<PaginatedResponse<ActivityLog>>; getDatabaseHealth(): Promise<ApiResponse<DatabaseHealth>>; repairDatabase(): Promise<ApiResponse<{ success: boolean; message: string }>>; runDiagnostics(): Promise< ApiResponse<{ summary: { total: number; passed: number; failed: number; duration: number; }; tests: TestResult[]; }> >; } export interface IProjectService { getAll(options?: QueryOptions): Promise<PaginatedResponse<Project>>; getById(id: string): Promise<ApiResponse<Project>>; create(projectData: Partial<Project>): Promise<ApiResponse<Project>>; update(id: string, updates: Partial<Project>): Promise<ApiResponse<Project>>; delete(id: string): Promise<ApiResponse<void>>; getStats(id: string): Promise<ApiResponse<ProjectStats>>; getActivity(id: string): Promise<ApiResponse<ActivityLog[]>>; getSettings(id: string): Promise<ApiResponse<ProjectSettings>>; updateSettings( id: string, settings: Partial<ProjectSettings> ): Promise<ApiResponse<ProjectSettings>>; createApiKey( id: string, keyData: Partial<ApiKey> ): Promise<ApiResponse<ApiKey>>; getApiKeys(id: string): Promise<ApiResponse<ApiKey[]>>; deleteApiKey(id: string, keyId: string): Promise<ApiResponse<void>>; regenerateApiKey(id: string): Promise<ApiResponse<{ apiKey: string }>>; } export interface ICollectionService { getAll( projectId: string, options?: QueryOptions ): Promise<PaginatedResponse<Collection>>; getById(id: string): Promise<ApiResponse<Collection>>; getCollectionsByProject(projectId: string): Promise<Collection[]>; getDocuments( collectionId: string, options?: { page?: number; limit?: number; orderBy?: string; order?: "asc" | "desc"; search?: string; filter?: Array<{ field: string; operator: string; value: unknown; }>; } ): Promise<Document[]>; createDocument( collectionId: string, data: Record<string, unknown> ): Promise<Document>; create( projectId: string, collectionData: Partial<Collection> ): Promise<ApiResponse<Collection>>; update( id: string, updates: Partial<Collection> ): Promise<ApiResponse<Collection>>; delete(id: string): Promise<ApiResponse<void>>; getSchema(id: string): Promise<ApiResponse<Collection>>; validateSchema( schema: Collection ): Promise<ApiResponse<SchemaValidationResult>>; // NEW: Advanced collections functionality getHealth(collectionId: string): Promise< ApiResponse<{ status: "healthy" | "degraded" | "unhealthy"; schemaValid: boolean; dataIntegrity: { hasNullViolations: boolean; hasUniqueViolations: boolean; hasForeignKeyViolations: boolean; issues: string[]; }; tableStats: { rowCount: number; sizeBytes: number; indexSizeBytes: number; }; lastValidated: string; }> >; getAllWithHealth(projectId: string): Promise< ApiResponse< Array< Collection & { health: { status: "healthy" | "degraded" | "unhealthy"; issues: number; }; } > > >; createFromTemplate( templateName: string, customizations?: { name?: string; description?: string; additionalFields?: Array<{ name: string; type: string; required?: boolean; unique?: boolean; indexed?: boolean; description?: string; }>; } ): Promise<ApiResponse<Collection>>; updateSchema( collectionId: string, updates: { addFields?: Array<{ name: string; type: string; required?: boolean; unique?: boolean; indexed?: boolean; default?: unknown; description?: string; }>; removeFields?: string[]; modifyFields?: Array<{ name: string; type?: string; required?: boolean; unique?: boolean; indexed?: boolean; default?: unknown; description?: string; }>; addIndexes?: Array<{ name: string; fields: string[]; unique?: boolean; }>; removeIndexes?: string[]; } ): Promise<ApiResponse<Collection>>; autoFixSchema(collectionId: string): Promise< ApiResponse<{ success: boolean; fixesApplied: number; details: string[]; remainingIssues: number; }> >; generateTypeScriptInterface(collectionId: string): Promise< ApiResponse<{ interfaceCode: string; fileName: string; }> >; generateAllTypeScriptInterfaces(): Promise< ApiResponse<{ interfacesCode: string; fileName: string; }> >; } export interface IDocumentService { getAll( collectionId: string, options?: QueryOptions ): Promise<PaginatedResponse<Document>>; getById(id: string): Promise<ApiResponse<Document>>; create( collectionId: string, documentData: Record<string, unknown> ): Promise<ApiResponse<Document>>; update( id: string, updates: Record<string, unknown> ): Promise<ApiResponse<Document>>; delete(id: string): Promise<ApiResponse<void>>; search( collectionId: string, query: string, options?: QueryOptions ): Promise<PaginatedResponse<Document>>; bulkCreate( collectionId: string, documents: Record<string, unknown>[] ): Promise<ApiResponse<Document[]>>; bulkUpdate( collectionId: string, updates: Record<string, unknown>[] ): Promise<ApiResponse<Document[]>>; bulkDelete( collectionId: string, documentIds: string[] ): Promise<ApiResponse<void>>; getByTable( projectId: string, tableName: string, options?: QueryOptions ): Promise<PaginatedResponse<Document>>; } export interface IStorageService { getStorageInfo(projectId: string): Promise<{ total_files: number; total_size: number; storage_used_percentage: number; quota: number; }>; uploadFile( projectId: string, file: File | Buffer, metadata?: Record<string, unknown> ): Promise<ApiResponse<FileInfo>>; downloadFile( fileId: string ): Promise< ApiResponse<{ buffer: Buffer; filename: string; mimeType: string }> >; deleteFile(fileId: string): Promise<ApiResponse<void>>; getFileInfo(fileId: string): Promise<ApiResponse<FileInfo>>; getFiles( projectId: string, options?: QueryOptions ): Promise<PaginatedResponse<FileInfo>>; getStorageStats(projectId: string): Promise<ApiResponse<StorageStats>>; getFileBuffer(fileId: string): Promise<ApiResponse<Buffer>>; } export interface IUserService { getAll( projectId: string, options?: QueryOptions ): Promise<PaginatedResponse<ProjectUser>>; getById(id: string): Promise<ApiResponse<ProjectUser>>; create( projectId: string, userData: Partial<ProjectUser> ): Promise<ApiResponse<ProjectUser>>; update( id: string, updates: Partial<ProjectUser> ): Promise<ApiResponse<ProjectUser>>; delete(id: string): Promise<ApiResponse<void>>; authenticate( projectId: string, credentials: { username: string; password: string } ): Promise<ApiResponse<ProjectUser>>; verifyEmail( userId: string, token: string ): Promise<ApiResponse<{ verified: boolean }>>; sendPasswordReset(email: string): Promise<ApiResponse<void>>; resetPassword(token: string, newPassword: string): Promise<ApiResponse<void>>; } export interface IApiKeyService { getAll(options?: QueryOptions): Promise<PaginatedResponse<ApiKey>>; getById(id: string): Promise<ApiResponse<ApiKey>>; create(keyData: Partial<ApiKey>): Promise<ApiResponse<ApiKey>>; update(id: string, updates: Partial<ApiKey>): Promise<ApiResponse<ApiKey>>; delete(id: string): Promise<ApiResponse<void>>; validate(key: string): Promise< ApiResponse<{ valid: boolean; scopes?: string[]; user?: AdminUser | ProjectUser; }> >; getByUser(userId: string): Promise<ApiResponse<ApiKey[]>>; getByEntity( entityType: string, entityId: string ): Promise<ApiResponse<ApiKey[]>>; } export interface IEmailService { sendEmail(request: EmailSendRequest): Promise<ApiResponse<void>>; getTemplates(projectId: string): Promise<ApiResponse<EmailTemplate>>; getTemplate(id: string): Promise<ApiResponse<EmailTemplate>>; createTemplate( templateData: Partial<EmailTemplate> ): Promise<ApiResponse<EmailTemplate>>; updateTemplate( id: string, updates: Partial<EmailTemplate> ): Promise<ApiResponse<EmailTemplate>>; deleteTemplate(id: string): Promise<ApiResponse<void>>; testConfig( projectId: string ): Promise<ApiResponse<{ success: boolean; message: string }>>; getConfig(projectId: string): Promise<ApiResponse<EmailConfig>>; updateConfig( projectId: string, config: Partial<EmailConfig> ): Promise<ApiResponse<EmailConfig>>; } export interface ISystemService { getSettings(): Promise<ApiResponse<SystemSettings>>; updateSettings( updates: Partial<SystemSettings> ): Promise<ApiResponse<SystemSettings>>; testEmailConfig( config: EmailConfig ): Promise<ApiResponse<{ success: boolean }>>; getSystemInfo(): Promise<ApiResponse<SystemInfo>>; getDatabaseHealth(): Promise<ApiResponse<DatabaseHealth>>; } export interface IChangelogService { getEntries( projectId: string, options?: QueryOptions ): Promise<PaginatedResponse<ChangelogEntry>>; getByEntity( entityType: string, entityId: string ): Promise<ApiResponse<ChangelogEntry[]>>; create(entry: CreateChangelogEntry): Promise<ApiResponse<ChangelogEntry>>; } export interface IHealthService { check(): Promise< ApiResponse<{ status: string; timestamp: string; services: Record<string, { status: string; message: string }>; }> >; getSystemInfo(): Promise<ApiResponse<SystemInfo>>; getDatabaseStatus(): Promise<ApiResponse<DatabaseHealth>>; // NEW: Advanced database health management validateSchema(): Promise< ApiResponse<{ isValid: boolean; mismatches: Array<{ type: string; table?: string; field?: string; expected?: string; actual?: string; description: string; severity: "error" | "warning" | "info"; }>; missingTables: string[]; extraTables: string[]; fieldMismatches: Array<{ table: string; field: string; expected: string; actual: string; description: string; }>; timestamp: string; }> >; autoFixSchema(): Promise< ApiResponse<{ success: boolean; fixesApplied: number; details: string[]; remainingIssues: number; duration: number; }> >; getMigrationStatus(): Promise< ApiResponse<{ currentVersion: string; pendingMigrations: Array<{ name: string; version: string; description: string; }>; appliedMigrations: Array<{ name: string; version: string; appliedAt: string; }>; }> >; runMigrations(): Promise< ApiResponse<{ success: boolean; migrationsApplied: number; details: string[]; duration: number; }> >; rollbackDatabase(targetVersion: string): Promise< ApiResponse<{ success: boolean; rollbackVersion: string; message: string; duration: number; }> >; getDatabaseStats(): Promise< ApiResponse<{ tables: Array<{ name: string; rowCount: number; sizeBytes: number; indexSizeBytes: number; lastAnalyzed: string; }>; totalSize: number; totalIndexSize: number; connectionCount: number; uptime: number; }> >; checkTableIntegrity(tableName?: string): Promise< ApiResponse<{ healthy: boolean; issues: Array<{ table: string; type: string; description: string; severity: "error" | "warning" | "info"; autoFixable: boolean; }>; summary: { totalTables: number; healthyTables: number; tablesWithIssues: number; }; }> >; repairDatabase(): Promise< ApiResponse<{ success: boolean; message: string; repairs?: string[]; }> >; } export interface ITestingService { createTestProject(): Promise<ApiResponse<Project>>; cleanup(): Promise<ApiResponse<void>>; runIntegrationTests(): Promise< ApiResponse<{ summary: { total: number; passed: number; failed: number; duration: number; }; tests: TestResult[]; }> >; checkSchema(): Promise<ApiResponse<SchemaValidationResult>>; } export interface IActivityService { log(activityData: Omit<ActivityLog, "id" | "timestamp">): Promise<ActivityLog>; query(options?: { limit?: number; offset?: number; project_id?: string; user_id?: string; action?: string; resource_type?: string; severity?: string; start_date?: Date; end_date?: Date; }): Promise<{ logs: ActivityLog[]; total: number }>; getStats(projectId?: string, days?: number): Promise<{ total_actions: number; actions_by_type: Record<string, number>; actions_by_severity: Record<string, number>; actions_by_user: Record<string, number>; }>; getRecent(userId?: string, projectId?: string, limit?: number): Promise<ActivityLog[]>; getUserTimeline( userId: string, options?: { limit?: number; offset?: number; start_date?: Date; end_date?: Date; } ): Promise<{ logs: ActivityLog[]; total: number }>; cleanup(daysToKeep?: number): Promise<{ success: boolean; deleted_count: number }>; } export interface IBackupService { createProjectBackup( projectId: string, options?: { description?: string; password?: string; includeFiles?: boolean; } ): Promise<BackupMetadata & { password: string }>; createSystemBackup(options?: { description?: string; password?: string; }): Promise<BackupMetadata & { password: string }>; list(options?: { type?: "project" | "system"; projectId?: string; limit?: number; offset?: number; }): Promise<BackupMetadata[]>; get(backupId: string): Promise<BackupMetadata>; delete(backupId: string): Promise<{ success: boolean }>; restore( backupId: string, options?: { password?: string; targetProjectId?: string; overwrite?: boolean; } ): Promise<{ success: boolean; message?: string }>; } export interface IMCPService { getModelCapabilities(): Promise<ModelCapabilities>; chat(projectId: string, messages: ChatMessage[]): Promise<ChatResponse>; adminChat(messages: ChatMessage[]): Promise<ChatResponse>; listModels(): Promise<Model[]>; } // Main SDK interface that combines all services export interface IKrapiSDK { auth: IAuthService; admin: IAdminService; projects: IProjectService; collections: ICollectionService; documents: IDocumentService; storage: IStorageService; users: IUserService; apiKeys: IApiKeyService; email: IEmailService; system: ISystemService; changelog: IChangelogService; health: IHealthService; testing: ITestingService; activity: IActivityService; backups: IBackupService; mcp: IMCPService; // Utility methods setSessionToken(token: string): void; setApiKey(key: string): void; clearAuth(): void; get baseURL(): string; } // Re-export types for convenience export type { ApiResponse, PaginatedResponse, QueryOptions, AdminUser, Project, Collection, Document, FileInfo, ProjectUser, Session as _Session, ApiKey as _ApiKey, EmailTemplate as _EmailTemplate, ChangelogEntry as _ChangelogEntry, CreateChangelogEntry as _CreateChangelogEntry, ProjectSettings as _ProjectSettings, ProjectStats as _ProjectStats, StorageStats as _StorageStats, EmailConfig as _EmailConfig, EmailSendRequest as _EmailSendRequest, SystemSettings as _SystemSettings, AdminRole as _AdminRole, AccessLevel as _AccessLevel, AdminPermission as _AdminPermission, Scope as _Scope, CollectionField as _CollectionField, CollectionIndex as _CollectionIndex, FieldType as _FieldType, FieldValidation as _FieldValidation, RelationConfig as _RelationConfig, FileRelation as _FileRelation, FileAttachment as _FileAttachment, FilterCondition as _FilterCondition, ActivityLog, SystemInfo, DatabaseHealth, TestResult, SchemaValidationResult, } from "./types";