Skip to content

Commit 2261527

Browse files
committed
messages, storage, users, webhooks - listing endpoints use mongopaging wrapper
1 parent 9af53f6 commit 2261527

4 files changed

Lines changed: 50 additions & 85 deletions

File tree

lib/api/messages.js

Lines changed: 20 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ const config = require('wild-config');
44
const log = require('npmlog');
55
const libmime = require('libmime');
66
const Joi = require('joi');
7-
const MongoPaging = require('mongo-cursor-pagination');
87
const addressparser = require('nodemailer/lib/addressparser');
98
const MailComposer = require('nodemailer/lib/mail-composer');
109
const { htmlToText } = require('html-to-text');
@@ -17,7 +16,7 @@ const forward = require('../forward');
1716
const Maildropper = require('../maildropper');
1817
const util = require('util');
1918
const roles = require('../roles');
20-
const { nextPageCursorSchema, previousPageCursorSchema, pageNrSchema, sessSchema, sessIPSchema, booleanSchema, metaDataSchema } = require('../schemas');
19+
const { nextPageCursorSchema, previousPageCursorSchema, sessSchema, sessIPSchema, booleanSchema, metaDataSchema } = require('../schemas');
2120
const { preprocessAttachments } = require('../data-url');
2221
const TaskHandler = require('../task-handler');
2322
const { prepareSearchFilter, uidRangeStringToQuery } = require('../prepare-search-filter');
@@ -677,8 +676,7 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti
677676
.example('List-ID, MIME-Version')
678677
.description('Comma separated list of header keys to include in the response'),
679678
next: nextPageCursorSchema,
680-
previous: previousPageCursorSchema,
681-
page: pageNrSchema
679+
previous: previousPageCursorSchema
682680
}
683681
},
684682
pathParams: { user: userId },
@@ -788,7 +786,6 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti
788786
let user = new ObjectId(result.value.user);
789787
let threadCounters = result.value.threadCounters;
790788
let limit = result.value.limit;
791-
let page = result.value.page;
792789
let pageNext = result.value.next;
793790
let pagePrevious = result.value.previous;
794791
let order = result.value.order;
@@ -886,13 +883,14 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti
886883

887884
if (pageNext) {
888885
opts.next = pageNext;
889-
} else if ((!page || page > 1) && pagePrevious) {
886+
}
887+
if (pagePrevious) {
890888
opts.previous = pagePrevious;
891889
}
892890

893-
let listing;
891+
let listingWrapper;
894892
try {
895-
listing = await MongoPaging.find(db.database.collection('messages'), opts);
893+
listingWrapper = await mongopagingFindWrapper(db.database.collection('messages'), opts);
896894
} catch (err) {
897895
res.status(500);
898896
return res.json({
@@ -901,24 +899,20 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti
901899
});
902900
}
903901

904-
if (!listing.hasPrevious) {
905-
page = 1;
906-
}
907-
908902
if (threadCounters) {
909-
listing.results = await addThreadCountersToMessageList(user, listing.results);
903+
listingWrapper.listing.results = await addThreadCountersToMessageList(user, listingWrapper.listing.results);
910904
}
911905

912-
await applyBimiToListing(listing.results);
906+
await applyBimiToListing(listingWrapper.listing.results);
913907

914908
let response = {
915909
success: true,
916910
query,
917911
total,
918-
page,
919-
previousCursor: listing.hasPrevious ? listing.previous : false,
920-
nextCursor: listing.hasNext ? listing.next : false,
921-
results: (listing.results || []).map(entry => formatMessageListing(entry, includeHeaders))
912+
page: listingWrapper.page,
913+
previousCursor: listingWrapper.previousCursor,
914+
nextCursor: listingWrapper.nextCursor,
915+
results: (listingWrapper.listing.results || []).map(entry => formatMessageListing(entry, includeHeaders))
922916
};
923917

924918
return res.json(response);
@@ -3232,7 +3226,6 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti
32323226
.empty('')
32333227
.example('List-ID, MIME-Version')
32343228
.description('Comma separated list of header keys to include in the response'),
3235-
page: pageNrSchema,
32363229
sess: sessSchema,
32373230
ip: sessIPSchema
32383231
},
@@ -3341,7 +3334,6 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti
33413334

33423335
let user = new ObjectId(result.value.user);
33433336
let limit = result.value.limit;
3344-
let page = result.value.page;
33453337
let pageNext = result.value.next;
33463338
let pagePrevious = result.value.previous;
33473339
let sortAscending = result.value.order === 'asc';
@@ -3402,13 +3394,14 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti
34023394

34033395
if (pageNext) {
34043396
opts.next = pageNext;
3405-
} else if ((!page || page > 1) && pagePrevious) {
3397+
}
3398+
if (pagePrevious) {
34063399
opts.previous = pagePrevious;
34073400
}
34083401

3409-
let listing;
3402+
let listingWrapper;
34103403
try {
3411-
listing = await MongoPaging.find(db.database.collection('archived'), opts);
3404+
listingWrapper = await mongopagingFindWrapper(db.database.collection('archived'), opts);
34123405
} catch (err) {
34133406
res.status(500);
34143407
return res.json({
@@ -3417,17 +3410,13 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti
34173410
});
34183411
}
34193412

3420-
if (!listing.hasPrevious) {
3421-
page = 1;
3422-
}
3423-
34243413
let response = {
34253414
success: true,
34263415
total,
3427-
page,
3428-
previousCursor: listing.hasPrevious ? listing.previous : false,
3429-
nextCursor: listing.hasNext ? listing.next : false,
3430-
results: (listing.results || [])
3416+
page: listingWrapper.page,
3417+
previousCursor: listingWrapper.previousCursor,
3418+
nextCursor: listingWrapper.nextCursor,
3419+
results: (listingWrapper.listing.results || [])
34313420
.map(m => {
34323421
// prepare message for output
34333422
m.uid = m._id;

lib/api/storage.js

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
'use strict';
22

33
const Joi = require('joi');
4-
const MongoPaging = require('mongo-cursor-pagination');
54
const ObjectId = require('mongodb').ObjectId;
65
const tools = require('../tools');
76
const roles = require('../roles');
87
const consts = require('../consts');
9-
const { nextPageCursorSchema, previousPageCursorSchema, pageNrSchema, sessSchema, sessIPSchema } = require('../schemas');
8+
const { nextPageCursorSchema, previousPageCursorSchema, sessSchema, sessIPSchema } = require('../schemas');
109
const { userId } = require('../schemas/request/general-schemas');
1110
const { successRes, totalRes, pageRes, previousCursorRes, nextCursorRes } = require('../schemas/response/general-schemas');
11+
const { mongopagingFindWrapper } = require('../mongopaging-find-wrapper');
1212

1313
module.exports = (db, server, storageHandler) => {
1414
server.post(
@@ -137,7 +137,6 @@ module.exports = (db, server, storageHandler) => {
137137
limit: Joi.number().default(20).min(1).max(250).description('How many records to return'),
138138
next: nextPageCursorSchema,
139139
previous: previousPageCursorSchema,
140-
page: pageNrSchema,
141140
sess: sessSchema,
142141
ip: sessIPSchema
143142
},
@@ -238,7 +237,6 @@ module.exports = (db, server, storageHandler) => {
238237

239238
let query = result.value.query;
240239
let limit = result.value.limit;
241-
let page = result.value.page;
242240
let pageNext = result.value.next;
243241
let pagePrevious = result.value.previous;
244242

@@ -263,13 +261,14 @@ module.exports = (db, server, storageHandler) => {
263261

264262
if (pageNext) {
265263
opts.next = pageNext;
266-
} else if ((!page || page > 1) && pagePrevious) {
264+
}
265+
if (pagePrevious) {
267266
opts.previous = pagePrevious;
268267
}
269268

270-
let listing;
269+
let listingWrapper;
271270
try {
272-
listing = await MongoPaging.find(db.gridfs.collection('storage.files'), opts);
271+
listingWrapper = await mongopagingFindWrapper(db.gridfs.collection('storage.files'), opts);
273272
} catch (err) {
274273
res.status(500);
275274
return res.json({
@@ -278,18 +277,14 @@ module.exports = (db, server, storageHandler) => {
278277
});
279278
}
280279

281-
if (!listing.hasPrevious) {
282-
page = 1;
283-
}
284-
285280
let response = {
286281
success: true,
287282
query,
288283
total,
289-
page,
290-
previousCursor: listing.hasPrevious ? listing.previous : false,
291-
nextCursor: listing.hasNext ? listing.next : false,
292-
results: (listing.results || []).map(fileData => ({
284+
page: listingWrapper.page,
285+
previousCursor: listingWrapper.previousCursor,
286+
nextCursor: listingWrapper.nextCursor,
287+
results: (listingWrapper.listing.results || []).map(fileData => ({
293288
id: fileData._id.toString(),
294289
filename: fileData.filename || undefined,
295290
contentType: fileData.contentType || undefined,

lib/api/users.js

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
const log = require('npmlog');
44
const config = require('wild-config');
55
const Joi = require('joi');
6-
const MongoPaging = require('mongo-cursor-pagination');
76
const ObjectId = require('mongodb').ObjectId;
87
const tools = require('../tools');
98
const errors = require('../errors');
@@ -13,22 +12,14 @@ const consts = require('../consts');
1312
const roles = require('../roles');
1413
const imapTools = require('../../imap-core/lib/imap-tools');
1514
const pwnedpasswords = require('pwnedpasswords');
16-
const {
17-
nextPageCursorSchema,
18-
previousPageCursorSchema,
19-
pageNrSchema,
20-
sessSchema,
21-
sessIPSchema,
22-
booleanSchema,
23-
metaDataSchema,
24-
usernameSchema
25-
} = require('../schemas');
15+
const { nextPageCursorSchema, previousPageCursorSchema, sessSchema, sessIPSchema, booleanSchema, metaDataSchema, usernameSchema } = require('../schemas');
2616
const TaskHandler = require('../task-handler');
2717
const { publish, FORWARD_ADDED } = require('../events');
2818
const { ExportStream, ImportStream } = require('../export');
2919
const { successRes, totalRes, pageRes, previousCursorRes, nextCursorRes, quotaRes } = require('../schemas/response/general-schemas');
3020
const { GetUsersResult } = require('../schemas/response/users-schemas');
3121
const { userId } = require('../schemas/request/general-schemas');
22+
const { mongopagingFindWrapper } = require('../mongopaging-find-wrapper');
3223

3324
const FEATURE_FLAGS = ['indexing'];
3425

@@ -58,7 +49,6 @@ module.exports = (db, server, userHandler, settingsHandler) => {
5849
limit: Joi.number().default(20).min(1).max(250).description('How many records to return'),
5950
next: nextPageCursorSchema,
6051
previous: previousPageCursorSchema,
61-
page: pageNrSchema,
6252
sess: sessSchema,
6353
ip: sessIPSchema
6454
},
@@ -120,7 +110,6 @@ module.exports = (db, server, userHandler, settingsHandler) => {
120110
let forward = result.value.forward;
121111

122112
let limit = result.value.limit;
123-
let page = result.value.page;
124113
let pageNext = result.value.next;
125114
let pagePrevious = result.value.previous;
126115

@@ -232,13 +221,14 @@ module.exports = (db, server, userHandler, settingsHandler) => {
232221

233222
if (pageNext) {
234223
opts.next = pageNext;
235-
} else if ((!page || page > 1) && pagePrevious) {
224+
}
225+
if (pagePrevious) {
236226
opts.previous = pagePrevious;
237227
}
238228

239-
let listing;
229+
let listingWrapper;
240230
try {
241-
listing = await MongoPaging.find(db.users.collection('users'), opts);
231+
listingWrapper = await mongopagingFindWrapper(db.users.collection('users'), opts);
242232
} catch (err) {
243233
res.status(500);
244234
return res.json({
@@ -247,20 +237,16 @@ module.exports = (db, server, userHandler, settingsHandler) => {
247237
});
248238
}
249239

250-
if (!listing.hasPrevious) {
251-
page = 1;
252-
}
253-
254240
let settings = await settingsHandler.getMulti(['const:max:storage']);
255241

256242
let response = {
257243
success: true,
258244
query,
259245
total,
260-
page,
261-
previousCursor: listing.hasPrevious ? listing.previous : false,
262-
nextCursor: listing.hasNext ? listing.next : false,
263-
results: (listing.results || []).map(userData => {
246+
page: listingWrapper.page,
247+
previousCursor: listingWrapper.previousCursor,
248+
nextCursor: listingWrapper.nextCursor,
249+
results: (listingWrapper.listing.results || []).map(userData => {
264250
let values = {
265251
id: userData._id.toString(),
266252
username: userData.username,

lib/api/webhooks.js

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
'use strict';
22

33
const Joi = require('joi');
4-
const MongoPaging = require('mongo-cursor-pagination');
54
const ObjectId = require('mongodb').ObjectId;
65
const tools = require('../tools');
76
const roles = require('../roles');
8-
const { nextPageCursorSchema, previousPageCursorSchema, pageNrSchema, sessSchema, sessIPSchema } = require('../schemas');
7+
const { nextPageCursorSchema, previousPageCursorSchema, sessSchema, sessIPSchema } = require('../schemas');
98
const { successRes, totalRes, pageRes, previousCursorRes, nextCursorRes } = require('../schemas/response/general-schemas');
9+
const { mongopagingFindWrapper } = require('../mongopaging-find-wrapper');
1010

1111
module.exports = (db, server) => {
1212
server.get(
@@ -27,7 +27,6 @@ module.exports = (db, server) => {
2727
limit: Joi.number().default(20).min(1).max(250).description('How many records to return'),
2828
next: nextPageCursorSchema,
2929
previous: previousPageCursorSchema,
30-
page: pageNrSchema,
3130
sess: sessSchema,
3231
ip: sessIPSchema
3332
},
@@ -110,7 +109,6 @@ module.exports = (db, server) => {
110109
}
111110

112111
let limit = result.value.limit;
113-
let page = result.value.page;
114112
let pageNext = result.value.next;
115113
let pagePrevious = result.value.previous;
116114

@@ -137,13 +135,14 @@ module.exports = (db, server) => {
137135

138136
if (pageNext) {
139137
opts.next = pageNext;
140-
} else if ((!page || page > 1) && pagePrevious) {
138+
}
139+
if (pagePrevious) {
141140
opts.previous = pagePrevious;
142141
}
143142

144-
let listing;
143+
let listingWrapper;
145144
try {
146-
listing = await MongoPaging.find(db.users.collection('webhooks'), opts);
145+
listingWrapper = await mongopagingFindWrapper(db.users.collection('webhooks'), opts);
147146
} catch (err) {
148147
res.status(500);
149148
return res.json({
@@ -152,19 +151,15 @@ module.exports = (db, server) => {
152151
});
153152
}
154153

155-
if (!listing.hasPrevious) {
156-
page = 1;
157-
}
158-
159154
let response = {
160155
success: true,
161156
type: result.value.type,
162157
user,
163158
total,
164-
page,
165-
previousCursor: listing.hasPrevious ? listing.previous : false,
166-
nextCursor: listing.hasNext ? listing.next : false,
167-
results: (listing.results || []).map(webhookData => {
159+
page: listingWrapper.page,
160+
previousCursor: listingWrapper.previousCursor,
161+
nextCursor: listingWrapper.nextCursor,
162+
results: (listingWrapper.listing.results || []).map(webhookData => {
168163
let values = {
169164
id: webhookData._id.toString(),
170165
type: webhookData.type,

0 commit comments

Comments
 (0)