mira-app-server
Version:
Mira Server - standalone server application using mira-app-core
138 lines • 6.35 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.FolderRouter = void 0;
const express_1 = require("express");
const BaseRouter_1 = require("./BaseRouter");
class FolderRouter extends BaseRouter_1.BaseRouter {
constructor(backend) {
super(backend);
this.router = (0, express_1.Router)();
this.setupRoutes();
}
setupRoutes() {
// 获取所有文件夹
this.router.get('/all', async (req, res) => {
await this.handleCrudOperation(req, res, 'getAll', 'getAllFolders');
});
// 查询文件夹
this.router.post('/query', async (req, res) => {
await this.handleCrudOperation(req, res, 'query', 'queryFolder');
});
// 创建文件夹
this.router.post('/create', async (req, res) => {
await this.handleCrudOperation(req, res, 'create', 'createFolder', {
successMessage: 'Folder created successfully',
onSuccess: (result, libraryId) => {
this.broadcastFolderEvent('folder::created', libraryId, { result, libraryId });
}
});
});
// 更新文件夹
this.router.put('/update', async (req, res) => {
await this.handleCrudOperation(req, res, 'update', 'updateFolder', {
requiresId: true,
successMessage: 'Folder updated successfully',
onSuccess: (_result, libraryId) => {
this.broadcastFolderEvent('folder::updated', libraryId, { id: req.body.id, title: req.body.title, libraryId });
}
});
});
// 批量设置文件夹排序 index
this.router.put('/sort-index', async (req, res) => {
try {
const libraryId = req.body.libraryId || req.query.libraryId;
const validation = await this.validateLibrary(libraryId);
if (!validation.success) {
res.status(validation.error.code).json(validation.error);
return;
}
const items = req.body.items;
if (!Array.isArray(items)) {
this.sendError(res, 400, 'items must be an array');
return;
}
const db = validation.library.libraryService;
for (const item of items) {
await db.updateFolder(item.id, { sort_index: item.sort_index });
}
this.broadcastFolderEvent('folder::updated', libraryId, { items, libraryId });
this.sendSuccess(res, { updated: items.length }, 'Sort index updated');
}
catch (error) {
console.error('Update folder sort-index error:', error);
this.sendError(res, 500, 'Internal server error');
}
});
// 删除文件夹
this.router.delete('/delete', async (req, res) => {
const libraryId = req.body.libraryId || req.query.libraryId;
const folderId = req.body.id;
await this.handleCrudOperation(req, res, 'delete', 'deleteFolder', {
requiresId: true,
successMessage: 'Folder deleted successfully',
onSuccess: (_, libId) => {
this.broadcastFolderEvent('folder::deleted', libId, { id: folderId, libraryId: libId });
}
});
});
// 为文件设置文件夹
this.router.post('/file/set', async (req, res) => {
try {
const libraryId = req.body.libraryId || req.query.libraryId;
const fileId = req.body.fileId;
const folderId = req.body.folder;
if (!fileId) {
res.status(400).json({ code: 400, message: 'File ID is required', data: null });
return;
}
const validation = await this.validateLibrary(libraryId);
if (!validation.success) {
res.status(validation.error.code).json(validation.error);
return;
}
const { library } = validation;
const db = library.libraryService;
// 移动前注册忽略路径,避免 Watcher 重复处理
const oldFile = await db.getFile(parseInt(fileId));
const watcher = this.backend.libraries.getLibrary(libraryId)?.watcher;
if (oldFile && watcher) {
const oldPath = await db.getItemFilePath(oldFile);
if (oldPath)
watcher.ignorePath(oldPath);
}
const result = await db.setFileFolder(parseInt(fileId), folderId);
if (result.success) {
const newFile = await db.getFile(parseInt(fileId));
if (newFile) {
const newPath = await db.getItemFilePath(newFile);
if (newPath && watcher)
watcher.ignorePath(newPath);
}
this.broadcastFolderEvent('file::updated', libraryId, {
...newFile, libraryId, fileId: parseInt(fileId), old_data: result.oldData,
});
}
this.sendSuccess(res, { fileId, folder: folderId, success: result.success }, 'File folder set successfully');
}
catch (error) {
console.error('Set file folder error:', error);
this.sendError(res, 500, 'Internal server error');
}
});
// 获取文件的文件夹
this.router.get('/file/:fileId', async (req, res) => {
await this.handleFileAssociation(req, res, 'get', 'getFileFolder', 'folder');
});
}
broadcastFolderEvent(eventName, libraryId, data) {
if (!this.backend.webSocketServer)
return;
this.backend.webSocketServer.broadcastPluginEvent(eventName, data);
this.backend.webSocketServer.broadcastLibraryEvent(libraryId, eventName, data);
}
getRouter() {
return this.router;
}
}
exports.FolderRouter = FolderRouter;
//# sourceMappingURL=FolderRouter.js.map