-
Notifications
You must be signed in to change notification settings - Fork 285
/
user.js
153 lines (133 loc) · 3.93 KB
/
user.js
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
'use strict';
const utility = require('utility');
const uuid = require('uuid');
const Service = require('egg').Service;
class UserService extends Service {
/*
* 根据用户名列表查找用户列表
* @param {Array} names 用户名列表
* @return {Promise[users]} 承载用户列表的 Promise 对象
*/
async getUsersByNames(names) {
if (names.length === 0) {
return [];
}
const query = { loginname: { $in: names } };
return this.ctx.model.User.find(query).exec();
}
/*
* 根据登录名查找用户
* @param {String} loginName 登录名
* @return {Promise[user]} 承载用户的 Promise 对象
*/
getUserByLoginName(loginName) {
const query = { loginname: new RegExp('^' + loginName + '$', 'i') };
return this.ctx.model.User.findOne(query).exec();
}
/*
* 根据 githubId 查找用户
* @param {String} githubId 登录名
* @return {Promise[user]} 承载用户的 Promise 对象
*/
getUserByGithubId(githubId) {
const query = { githubId };
return this.ctx.model.User.findOne(query).exec();
}
/*
* 根据 token 查找用户
* @param {String} token
* @return {Promise[user]} 承载用户的 Promise 对象
*/
getUserByToken(accessToken) {
const query = { accessToken };
return this.ctx.model.User.findOne(query).exec();
}
/*
* 根据用户ID,查找用户
* @param {String} id 用户ID
* @return {Promise[user]} 承载用户的 Promise 对象
*/
async getUserById(id) {
if (!id) {
return null;
}
return this.ctx.model.User.findOne({ _id: id }).exec();
}
/*
* 根据邮箱,查找用户
* @param {String} email 邮箱地址
* @return {Promise[user]} 承载用户的 Promise 对象
*/
getUserByMail(email) {
return this.ctx.model.User.findOne({ email }).exec();
}
/*
* 根据用户ID列表,获取一组用户
* @param {Array} ids 用户ID列表
* @return {Promise[users]} 承载用户列表的 Promise 对象
*/
getUsersByIds(ids) {
return this.ctx.model.User.find({ _id: { $in: ids } }).exec();
}
/*
* 根据关键字,获取一组用户
* Callback:
* - err, 数据库异常
* - users, 用户列表
* @param {String} query 关键字
* @param {Object} opt 选项
* @return {Promise[users]} 承载用户列表的 Promise 对象
*/
getUsersByQuery(query, opt) {
return this.ctx.model.User.find(query, '', opt).exec();
}
/*
* 获取关键词能搜索到的用户数量
* @param {String} query 搜索关键词
*/
getCountByQuery(query) {
return this.ctx.model.User.count(query).exec();
}
/*
* 根据查询条件,获取一个用户
* @param {String} name 用户名
* @param {String} key 激活码
* @return {Promise[user]} 承载用户的 Promise 对象
*/
getUserByNameAndKey(loginname, key) {
const query = { loginname, retrieve_key: key };
return this.ctx.model.User.findOne(query).exec();
}
incrementScoreAndReplyCount(id, score, replyCount) {
const query = { _id: id };
const update = { $inc: { score, reply_count: replyCount } };
return this.ctx.model.User.findByIdAndUpdate(query, update).exec();
}
incrementCollectTopicCount(id) {
const query = { _id: id };
const update = { $inc: { collect_topic_count: 1 } };
return this.ctx.model.User.findByIdAndUpdate(query, update).exec();
}
newAndSave(name, loginname, pass, email, avatar_url, active) {
const user = new this.ctx.model.User();
user.name = loginname;
user.loginname = loginname;
user.pass = pass;
user.email = email;
user.avatar = avatar_url;
user.active = active || false;
user.accessToken = uuid.v4();
return user.save();
}
makeGravatar(email) {
return (
'http://www.gravatar.com/avatar/' +
utility.md5(email.toLowerCase()) +
'?size=48'
);
}
getGravatar(user) {
return user.avatar || this.makeGravatar(user.email);
}
}
module.exports = UserService;