diff --git a/src/backend/src/filesystem/hl_operations/hl_name_search.js b/src/backend/src/filesystem/hl_operations/hl_name_search.js new file mode 100644 index 000000000..b44f75705 --- /dev/null +++ b/src/backend/src/filesystem/hl_operations/hl_name_search.js @@ -0,0 +1,41 @@ +const { DB_READ } = require("../../services/database/consts"); +const { Context } = require("../../util/context"); +const { NodeUIDSelector } = require("../node/selectors"); +const { HLFilesystemOperation } = require("./definitions"); + +class HLNameSearch extends HLFilesystemOperation { + async _run () { + let { actor, term } = this.values; + const services = Context.get('services'); + const svc_fs = services.get('filesystem'); + const db = services.get('database') + .get(DB_READ, 'fs.namesearch'); + + term = term.replace(/%/g, ''); + term = '%' + term + '%'; + + // Only user actors can do this, because the permission + // system would otherwise slow things down + if ( ! actor.type.user ) return []; + + const results = await db.read( + `SELECT uuid FROM fsentries WHERE name LIKE ? AND ` + + `user_id = ?`, + [term, actor.type.user.id] + ); + + const uuids = results.map(v => v.uuid); + + const fsnodes = await Promise.all(uuids.map(async uuid => { + return await svc_fs.node(new NodeUIDSelector(uuid)); + })); + + return Promise.all(fsnodes.map(async fsnode => { + return await fsnode.getSafeEntry(); + })); + } +} + +module.exports = { + HLNameSearch, +}; diff --git a/src/backend/src/routers/filesystem_api/search.js b/src/backend/src/routers/filesystem_api/search.js new file mode 100644 index 000000000..379823b1e --- /dev/null +++ b/src/backend/src/routers/filesystem_api/search.js @@ -0,0 +1,20 @@ +const eggspress = require("../../api/eggspress"); +const { HLNameSearch } = require("../../filesystem/hl_operations/hl_name_search"); +const { subdomain } = require("../../helpers"); +const verified = require("../../middleware/verified"); + +module.exports = eggspress('/search', { + subdomain: 'api', + auth2: true, + verified: true, + fs: true, + json: true, + allowedMethods: ['POST'], +}, async (req, res, next) => { + const hl_name_search = new HLNameSearch(); + const result = await hl_name_search.run({ + actor: req.actor, + term: req.body.text, + }); + res.send(result); +}); diff --git a/src/backend/src/services/FilesystemAPIService.js b/src/backend/src/services/FilesystemAPIService.js index 521a09344..b8872e527 100644 --- a/src/backend/src/services/FilesystemAPIService.js +++ b/src/backend/src/services/FilesystemAPIService.js @@ -38,6 +38,8 @@ class FilesystemAPIService extends BaseService { app.use(require('../routers/filesystem_api/copy')) app.use(require('../routers/filesystem_api/move')) app.use(require('../routers/filesystem_api/rename')) + + app.use(require('../routers/filesystem_api/search')) // v1 app.use(require('../routers/writeFile'))