mira-app-core
Version:
Core library for Mira TypeScript project - provides base functionality without auto-execution
65 lines (62 loc) • 2.59 kB
text/typescript
import { MessageHandler } from './MessageHandler';
import { WebSocket, WebSocketServer } from 'ws';
import { WebSocketMessage } from '../WebSocketRouter';
import { ILibraryServerData } from 'mira-storage-sqlite';
import { MiraWebsocketServer } from '../WebSocketServer';
export class FileHandler extends MessageHandler {
constructor(
server: MiraWebsocketServer,
dbService: ILibraryServerData,
ws: WebSocket,
message: WebSocketMessage
) {
super(server, dbService, ws, message);
}
async handle(): Promise<void> {
try {
const message = this.message;
const { action, payload } = message;
const { data } = payload;
const libraryId = message.libraryId;
let result;
switch(action) {
case 'read':
const config = this.dbService.config;
result = await this.dbService.getFiles({
filters: data?.query ?? {},
isUrlFile: config && config['useHttpFile'] ? true : false
});
break;
case 'create':
const path = data.path;
result = path != null ? await this.dbService.createFileFromPath(path, data) : await this.dbService.createFile(data);
this.server.broadcastPluginEvent('file::created', {message, result, libraryId});
this.server.sendToWebsocket(this.ws, { eventName: 'file::uploaded', data: {path} });
this.server.broadcastLibraryEvent(libraryId, 'file::created', result);
break;
case 'update':
result = await this.dbService.updateFile(data.id, data);
break;
case 'recover':
var {id } = data;
if(await this.dbService.recoverFile(id)){
this.server.broadcastPluginEvent('file::recovered', { id, libraryId });
this.server.sendToWebsocket(this.ws, { eventName: 'file::recovered', data: {id, libraryId} });
}
break;
case 'delete':
var {id, moveToRecycleBin } = data;
if(await this.dbService.deleteFile(id, {moveToRecycleBin})){
this.server.broadcastPluginEvent('file::deleted', { id, libraryId });
this.server.sendToWebsocket(this.ws, { eventName: 'file::deleted', data: {id, libraryId} });
}
break;
default:
throw new Error(`Unsupported file action: ${action}`);
}
this.sendResponse(result as Record<string, any>);
} catch (err) {
this.sendError(err instanceof Error ? err.message : 'File operation failed');
}
}
}