1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
var db = require("../db");
var search = require("./search");
var snippet = require("./snippet");
var lexicon = require("./lexicon");
module.exports = {
search: function (req, res, next) {
res.search = search.search(
req.query.query,
req.query.start,
req.query.limit,
);
if (!res.search) {
res.sendStatus(400);
return;
}
next();
},
getThreads: function (req, res, next) {
var thread_ids = res.search.thread_ids;
if (!thread_ids || !thread_ids.length) {
res.search.threads = [];
return next();
}
db.getThreadsById(thread_ids).then(function (threads) {
threads.forEach((thread) => {
var flag_id = thread.get("flagged");
if (flag_id) {
res.search.file_ids.push(flag_id);
}
});
res.search.threads = threads;
next();
});
},
getComments: function (req, res, next) {
var comment_ids = res.search.comment_ids;
if (!comment_ids || !comment_ids.length) {
res.search.comments = [];
return next();
}
db.getCommentsById(comment_ids).then(function (comments) {
var terms = res.search.meta.terms;
comments.forEach(function (comment) {
const snip = snippet(comment.get("comment").toString(), terms);
comment.set("comment", snip);
});
res.search.comments = comments;
next();
});
},
getFiles: function (req, res, next) {
var file_ids = res.search.file_ids;
if (!file_ids || !file_ids.length) {
res.search.files = [];
return next();
}
db.getFilesById(file_ids).then(function (files) {
res.search.files = files;
next();
});
},
logQuery: function (req, res, next) {
// req.search.query, req.search.count
next();
},
success: function (req, res, next) {
var terms = res.search.meta.terms;
var threads = {},
comments = {},
files = {};
res.search.threads.forEach((t) => {
threads[t.id] = t;
});
res.search.comments.forEach((t) => {
comments[t.id] = t;
});
res.search.files.forEach((t) => {
files[t.id] = t;
});
var results = res.search.results.map((r) => {
var m = {};
m.thread = threads[r.thread];
m.comment = comments[r.comment];
m.file = files[r.file];
m.count = r.count;
m.strength = r.strength;
if (m.thread) {
var flagged = m.thread.get("flagged");
if (flagged) {
m.thread.set("flagged", files[flagged]);
}
var allowed = m.thread.get("allowed");
if (allowed) {
m.thread.set("allowed", allowed.toString().split(" "));
}
var display = m.thread.get("display");
if (display) {
m.thread.set("display", display.toString().split(" "));
}
}
return m;
});
res.json({
meta: res.search.meta,
results: results,
});
},
rebuild: function (req, res, next) {
lexicon.build().then((data) => {
res.json(data);
});
},
};
|