aboutsummaryrefslogtreecommitdiff
path: root/src/api/routes
diff options
context:
space:
mode:
authorZephyrrus <[email protected]>2020-07-23 04:09:01 +0300
committerZephyrrus <[email protected]>2020-07-23 04:09:01 +0300
commitc88d08330f239a897e9f24cb32b25759680619b8 (patch)
tree3d0a97fbcf8e3ffbe448a6cb1666b893af0af8aa /src/api/routes
parentfeat: Add hiding to recommendations as a prop (diff)
downloadhost.fuwn.me-c88d08330f239a897e9f24cb32b25759680619b8.tar.xz
host.fuwn.me-c88d08330f239a897e9f24cb32b25759680619b8.zip
feat: add experimental query to sql generator for searching
Diffstat (limited to 'src/api/routes')
-rw-r--r--src/api/routes/search/searchGET.js58
1 files changed, 48 insertions, 10 deletions
diff --git a/src/api/routes/search/searchGET.js b/src/api/routes/search/searchGET.js
index ae73d27..b8757fa 100644
--- a/src/api/routes/search/searchGET.js
+++ b/src/api/routes/search/searchGET.js
@@ -1,24 +1,62 @@
const searchQuery = require('search-query-parser');
-const chrono = require('chrono-node');
+
const Route = require('../../structures/Route');
+const Util = require('../../utils/Util');
+
+const queryHelper = require('../../utils/QueryHelper');
+
+const options = {
+ keywords: ['album', 'tag', 'before', 'after', 'file'],
+ offsets: false,
+ alwaysArray: true,
+ tokenize: true,
+};
-const options = { keywords: ['album', 'tag', 'user', 'before', 'after'], offsets: false };
class configGET extends Route {
constructor() {
- super('/search/:q', 'get', { bypassAuth: true });
+ super('/search/', 'get');
}
- run(req, res) {
- const { q } = req.params;
+ async run(req, res, db, user) {
+ let count = 0;
+
+ const { q } = req.query;
const parsed = searchQuery.parse(q, options);
- if (parsed.before) {
- parsed.before = chrono.parse(parsed.before);
+ let files = db.table('files')
+ .select('*')
+ .where({ 'files.userId': user.id })
+ .orderBy('files.createdAt', 'desc');
+
+ files = queryHelper.processQuery(db, files, parsed);
+
+ const query = files.toString();
+ const { page, limit = 100 } = req.query;
+
+ if (page && page >= 0) {
+ let dbRes = files.clone(); // clone the query to attach a count to it later on
+ files = await files.offset((page - 1) * limit).limit(limit);
+
+ dbRes = await dbRes.count('* as count').first();
+
+ count = dbRes.count;
+ } else {
+ files = await files; // execute the query
+ count = files.length;
}
- if (parsed.after) {
- parsed.after = chrono.parse(parsed.after);
+
+ // For each file, create the public link to be able to display the file
+ for (let file of files) {
+ file = Util.constructFilePublicLink(file);
}
- return res.json(parsed);
+
+ return res.json({
+ message: 'Successfully retrieved files',
+ query,
+ parsed,
+ files,
+ count,
+ });
}
}