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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
/**
* Module dependencies
*/
import $ from 'cafy';
import getHostLower from '../../common/get-host-lower';
import Post, { pack } from '../../../../models/post';
import User from '../../../../models/user';
/**
* Get posts of a user
*
* @param {any} params
* @param {any} me
* @return {Promise<any>}
*/
module.exports = (params, me) => new Promise(async (res, rej) => {
// Get 'userId' parameter
const [userId, userIdErr] = $(params.userId).optional.id().$;
if (userIdErr) return rej('invalid userId param');
// Get 'username' parameter
const [username, usernameErr] = $(params.username).optional.string().$;
if (usernameErr) return rej('invalid username param');
if (userId === undefined && username === undefined) {
return rej('userId or pair of username and host is required');
}
// Get 'host' parameter
const [host, hostErr] = $(params.host).optional.string().$;
if (hostErr) return rej('invalid host param');
if (userId === undefined && host === undefined) {
return rej('userId or pair of username and host is required');
}
// Get 'includeReplies' parameter
const [includeReplies = true, includeRepliesErr] = $(params.includeReplies).optional.boolean().$;
if (includeRepliesErr) return rej('invalid includeReplies param');
// Get 'withMedia' parameter
const [withMedia = false, withMediaErr] = $(params.withMedia).optional.boolean().$;
if (withMediaErr) return rej('invalid withMedia param');
// Get 'limit' parameter
const [limit = 10, limitErr] = $(params.limit).optional.number().range(1, 100).$;
if (limitErr) return rej('invalid limit param');
// Get 'sinceId' parameter
const [sinceId, sinceIdErr] = $(params.sinceId).optional.id().$;
if (sinceIdErr) return rej('invalid sinceId param');
// Get 'untilId' parameter
const [untilId, untilIdErr] = $(params.untilId).optional.id().$;
if (untilIdErr) return rej('invalid untilId param');
// Get 'sinceDate' parameter
const [sinceDate, sinceDateErr] = $(params.sinceDate).optional.number().$;
if (sinceDateErr) throw 'invalid sinceDate param';
// Get 'untilDate' parameter
const [untilDate, untilDateErr] = $(params.untilDate).optional.number().$;
if (untilDateErr) throw 'invalid untilDate param';
// Check if only one of sinceId, untilId, sinceDate, untilDate specified
if ([sinceId, untilId, sinceDate, untilDate].filter(x => x != null).length > 1) {
throw 'only one of sinceId, untilId, sinceDate, untilDate can be specified';
}
const q = userId !== undefined
? { _id: userId }
: { usernameLower: username.toLowerCase(), hostLower: getHostLower(host) } ;
// Lookup user
const user = await User.findOne(q, {
fields: {
_id: true
}
});
if (user === null) {
return rej('user not found');
}
//#region Construct query
const sort = {
_id: -1
};
const query = {
userId: user._id
} as any;
if (sinceId) {
sort._id = 1;
query._id = {
$gt: sinceId
};
} else if (untilId) {
query._id = {
$lt: untilId
};
} else if (sinceDate) {
sort._id = 1;
query.createdAt = {
$gt: new Date(sinceDate)
};
} else if (untilDate) {
query.createdAt = {
$lt: new Date(untilDate)
};
}
if (!includeReplies) {
query.replyId = null;
}
if (withMedia) {
query.mediaIds = {
$exists: true,
$ne: null
};
}
//#endregion
// Issue query
const posts = await Post
.find(query, {
limit: limit,
sort: sort
});
// Serialize
res(await Promise.all(posts.map(async (post) =>
await pack(post, me)
)));
});
|