|
1 | | -import type { SortDirection, Filter } from 'mongodb' |
| 1 | +import type { Filter, Sort } from 'mongodb' |
2 | 2 | import type { FullEvent } from '#types' |
3 | 3 |
|
4 | 4 | import { Router } from 'express' |
5 | 5 | import mongo from '#mongo' |
6 | 6 | import config from '#config' |
7 | 7 | import * as postReq from '#doc/events/post-req/index.ts' |
8 | 8 | import { session, mongoPagination, mongoProjection, httpError, assertReqInternalSecret, reqOrigin } from '@data-fair/lib-express/index.js' |
9 | | -import { postEvents, localizeEvent } from './service.ts' |
| 9 | +import { postEvents, localizeEvent, cleanEvent } from './service.ts' |
10 | 10 |
|
11 | 11 | const router = Router() |
12 | 12 | export default router |
13 | 13 |
|
14 | 14 | router.get('', async (req, res, next) => { |
15 | | - const { account, lang } = await session.reqAuthenticated(req) |
| 15 | + const sessionState = await session.reqAuthenticated(req) |
| 16 | + const { account, lang } = sessionState |
16 | 17 |
|
17 | 18 | const query: Filter<FullEvent> = { 'sender.type': account.type, 'sender.id': account.id } |
18 | 19 | if (req.query.q && typeof req.query.q === 'string') query.$text = { $search: req.query.q, $language: lang || config.i18n.defaultLocale } |
| 20 | + if (typeof req.query.resource === 'string') query['resource.id'] = req.query.resource |
19 | 21 |
|
20 | 22 | const project = mongoProjection(req.query.select, ['_search', 'htmlBody']) |
21 | 23 |
|
22 | 24 | // implement a special pagination based on the fact that we always sort by date |
23 | | - const sort = { date: -1 as SortDirection } |
24 | | - const { skip, size } = mongoPagination(req.query) |
| 25 | + const sort: Sort = { date: -1, _id: -1 } |
| 26 | + const { skip, size } = mongoPagination(req.query, 20) |
25 | 27 | if (skip) throw httpError(400, 'skip is not supported, use "before" parameter with the date of the last event of the previous page') |
26 | 28 | if (req.query.before && typeof req.query.before === 'string') { |
27 | | - const [beforeId, beforeDate] = req.query.before.split(':') |
| 29 | + const [beforeDate, beforeId] = req.query.before.split('/') |
28 | 30 | query.date = { $lte: beforeDate } |
29 | | - query._id = { $ne: beforeId } |
| 31 | + // optional beforeId as a tie-breaker |
| 32 | + if (beforeId) query._id = { $lt: beforeId } |
30 | 33 | } |
31 | 34 |
|
32 | 35 | const events = (await mongo.events.find(query).project(project).limit(size).sort(sort).toArray()) as FullEvent[] |
33 | 36 |
|
34 | | - const results = events.map(event => localizeEvent(event, lang)) |
| 37 | + const results = events.map(event => cleanEvent(localizeEvent(event, lang), sessionState)) |
35 | 38 |
|
36 | 39 | const response: any = { results } |
37 | 40 |
|
38 | 41 | if (results.length === size) { |
39 | 42 | const next = new URL(req.originalUrl, reqOrigin(req)) |
40 | | - next.searchParams.set('before', results[results.length - 1]._id + ':' + results[results.length - 1].date) |
| 43 | + next.searchParams.set('before', results[results.length - 1].date + '/' + results[results.length - 1]._id) |
41 | 44 | response.next = next.href |
42 | 45 | } |
43 | 46 |
|
|
0 commit comments