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
138
|
'use strict';
/**
* Module dependencies
*/
import * as mongo from 'mongodb';
const deepcopy = require('deepcopy');
import User from '../models/user';
import Following from '../models/following';
import getFriends from '../common/get-friends';
/**
* Serialize a user
*
* @param {Object} user
* @param {Object} me?
* @param {Object} options?
* @return {Promise<Object>}
*/
export default (
user: any,
me?: any,
options?: {
detail: boolean,
includeSecrets: boolean
}
) => new Promise<any>(async (resolve, reject) => {
const opts = Object.assign({
detail: false,
includeSecrets: false
}, options);
let _user: any;
// Populate the user if 'user' is ID
if (mongo.ObjectID.prototype.isPrototypeOf(user)) {
_user = await User.findOne({
_id: user
});
} else if (typeof user === 'string') {
_user = await User.findOne({
_id: new mongo.ObjectID(user)
});
} else {
_user = deepcopy(user);
}
// Me
if (me && !mongo.ObjectID.prototype.isPrototypeOf(me)) {
if (typeof me === 'string') {
me = new mongo.ObjectID(me);
} else {
me = me._id;
}
}
// Rename _id to id
_user.id = _user._id;
delete _user._id;
// Remove private properties
delete _user.password;
delete _user.token;
delete _user.username_lower;
// Visible via only the official client
if (!opts.includeSecrets) {
delete _user.data;
delete _user.email;
}
_user.avatar_url = _user.avatar_id != null
? `${config.drive_url}/${_user.avatar_id}`
: `${config.drive_url}/default-avatar.jpg`;
_user.banner_url = _user.banner_id != null
? `${config.drive_url}/${_user.banner_id}`
: null;
if (!me || !me.equals(_user.id) || !opts.detail) {
delete _user.avatar_id;
delete _user.banner_id;
delete _user.drive_capacity;
}
if (me && !me.equals(_user.id)) {
// If the user is following
const follow = await Following.findOne({
follower_id: me,
followee_id: _user.id,
deleted_at: { $exists: false }
});
_user.is_following = follow !== null;
// If the user is followed
const follow2 = await Following.findOne({
follower_id: _user.id,
followee_id: me,
deleted_at: { $exists: false }
});
_user.is_followed = follow2 !== null;
}
if (me && !me.equals(_user.id) && opts.detail) {
const myFollowingIds = await getFriends(me);
// Get following you know count
const followingYouKnowCount = await Following.count({
followee_id: { $in: myFollowingIds },
follower_id: _user.id,
deleted_at: { $exists: false }
});
_user.following_you_know_count = followingYouKnowCount;
// Get followers you know count
const followersYouKnowCount = await Following.count({
followee_id: _user.id,
follower_id: { $in: myFollowingIds },
deleted_at: { $exists: false }
});
_user.followers_you_know_count = followersYouKnowCount;
}
resolve(_user);
});
/*
function img(url) {
return {
thumbnail: {
large: `${url}`,
medium: '',
small: ''
}
};
}
*/
|