Nav apraksta

member.js 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. var crypto = require('crypto');
  2. var mongoose = require('mongoose');
  3. var Member = require('../models/member');
  4. var settings = require('./config');
  5. var utils = require('./utils');
  6. module.exports = {
  7. create: function(member) {
  8. return function(done) {
  9. var _member = new Member({
  10. name: member.name,
  11. email: member.email,
  12. phone: member.phone,
  13. gender: member.gender,
  14. idno: member.idno,
  15. salt: utils.generateSalt(),
  16. birthday: member.birthday,
  17. cardno: member.cardno,
  18. tokens: member.tokens
  19. });
  20. if (member.password) {
  21. // Encrypt plain password
  22. _member.password = utils.encryptPassword(_member.salt, member.password);
  23. } else {
  24. _member.password = '';
  25. }
  26. _member.save(function(err) {
  27. done(err, _member);
  28. });
  29. };
  30. },
  31. getMember: function(id) {
  32. return function(done) {
  33. Member.findOne({ _id: id }, function(err, member) {
  34. if (err)
  35. return done(err);
  36. if (!member)
  37. return done();
  38. return done(null, member);
  39. });
  40. };
  41. },
  42. getMemberByEmail: function(email) {
  43. return function(done) {
  44. Member.findOne({ email: email}, function(err, member) {
  45. if (err)
  46. return done(err);
  47. if (!member)
  48. return done();
  49. return done(null, member);
  50. });
  51. };
  52. },
  53. deleteMembers: function(ids) {
  54. return function(done) {
  55. Member.remove({
  56. _id: {
  57. $in: ids
  58. }
  59. }, function(err) {
  60. done(err);
  61. });
  62. };
  63. },
  64. insert: function(members) {
  65. return function(done) {
  66. Member.collection.insert(members, done);
  67. };
  68. },
  69. updateByEmail: function(email, member, opts) {
  70. return function(done) {
  71. // Update time
  72. member.updated = Date.now();
  73. Member.update({ email: email }, member, opts, done);
  74. };
  75. },
  76. changePassword: function(id, password) {
  77. return function(done) {
  78. // Generate a new salt for encryption
  79. var salt = utils.generateSalt();
  80. var newPassword = utils.encryptPassword(salt, password);
  81. // Update password
  82. Member.findOneAndUpdate({ _id: id }, {
  83. salt: salt,
  84. password: newPassword,
  85. updated: Date.now()
  86. }, { new: true }, function(err, member) {
  87. if (err)
  88. return done(err);
  89. done(null, member ? true : false);
  90. });
  91. };
  92. },
  93. changePasswordWithToken: function(id, token, password) {
  94. return function(done) {
  95. // Generate a new salt for encryption
  96. var salt = utils.generateSalt();
  97. var newPassword = utils.encryptPassword(salt, password);
  98. // TODO: Should check expired time of token
  99. // Update password
  100. Member.findOneAndUpdate({
  101. _id: id,
  102. 'rule_tokens.name': 'reset_password'
  103. }, {
  104. $pull: {
  105. rule_tokens: {
  106. name: 'reset_password'
  107. }
  108. },
  109. salt: salt,
  110. password: newPassword,
  111. updated: Date.now()
  112. }, { new: true }, function(err, member) {
  113. if (err)
  114. return done(err);
  115. done(null, member ? true : false);
  116. });
  117. };
  118. },
  119. checkCard: function(token) {
  120. return function(done) {
  121. Member.findOne({ tokens: token }, function(err, member) {
  122. if (err)
  123. return done(err);
  124. if (!member)
  125. return done(new Error('Not Found'));
  126. return done(null, member);
  127. });
  128. };
  129. },
  130. authorizeMember: function(username, password) {
  131. return function(done) {
  132. Member.findOne({ email: username }, function(err, member) {
  133. if (err)
  134. return done(err);
  135. // Found nothing
  136. if (!member)
  137. return done();
  138. // First time to login
  139. if (!member.password) {
  140. // Using phone to be password
  141. if (member.phone == password)
  142. return done(null, member);
  143. else
  144. return done();
  145. }
  146. // Check password
  147. if (utils.encryptPassword(member.salt, password) == member.password)
  148. return done(null, member);
  149. else
  150. return done();
  151. });
  152. };
  153. },
  154. save: function(id, member) {
  155. return function(done) {
  156. var updated = Date.now();
  157. var m = {
  158. name: member.name || undefined,
  159. email: member.email || undefined,
  160. phone: member.phone || undefined,
  161. gender: member.gender || undefined,
  162. idno: member.idno || undefined,
  163. birthday: member.birthday || undefined,
  164. tokens: member.tokens || undefined,
  165. updated: updated
  166. };
  167. // Remove fields which is unset
  168. for (var key in m) {
  169. if (m[key] == undefined)
  170. delete m[key];
  171. }
  172. Member.findOneAndUpdate({ _id: id }, m, { new: true }, function(err, _member) {
  173. if (err)
  174. return done(err);
  175. done(null, _member);
  176. });
  177. };
  178. },
  179. count: function() {
  180. return function(done) {
  181. Member.count({}, done);
  182. };
  183. },
  184. list: function() {
  185. var conditions = {};
  186. var columns;
  187. var opts = {};
  188. if (arguments.length == 3) {
  189. conditions = arguments[0];
  190. columns = arguments[1];
  191. opts = arguments[2];
  192. } else if (arguments.length == 2) {
  193. if (arguments[0] instanceof Array) {
  194. columns = arguments[0];
  195. opts = arguments[1];
  196. } else if (arguments[1] instanceof Array) {
  197. conditions = arguments[0];
  198. columns = arguments[1];
  199. } else {
  200. conditions = arguments[0];
  201. opts = arguments[1];
  202. }
  203. } else if (arguments.length == 1) {
  204. columns = null;
  205. opts = arguments[0];
  206. }
  207. return function(done) {
  208. var cols = null;
  209. if (columns)
  210. cols = columns.join(' ');
  211. Member.count(conditions, function(err, count) {
  212. if (err) {
  213. done(err);
  214. return;
  215. }
  216. if (!count) {
  217. done(err, { count: 0 });
  218. return;
  219. }
  220. Member.find(conditions, cols, opts, function(err, members) {
  221. done(err, {
  222. count: count,
  223. members: members
  224. });
  225. });
  226. });
  227. };
  228. },
  229. setupRuleToken: function(id, name, expired) {
  230. return function(done) {
  231. var token = utils.generateToken();
  232. // Remove old token
  233. Member.findOneAndUpdate({
  234. _id: id,
  235. 'rule_tokens.name': name
  236. }, {
  237. $pull: {
  238. 'rule_tokens.$.name': name
  239. }
  240. }, function(err) {
  241. if (err) {
  242. return done(err);
  243. }
  244. // Update rule token. add a new one if no key exists
  245. Member.findOneAndUpdate({
  246. _id: id
  247. }, {
  248. $addToSet: {
  249. rule_tokens: {
  250. name: name,
  251. token: token,
  252. expired: expired
  253. }
  254. }
  255. }, function(err, member) {
  256. done(err, member ? {
  257. token: token,
  258. id: member._id
  259. } : null);
  260. });
  261. });
  262. };
  263. },
  264. setupRuleTokenByEmail: function(email, name, expired) {
  265. return function(done) {
  266. var token = utils.generateToken();
  267. // Remove old token
  268. Member.findOneAndUpdate({
  269. email: email,
  270. 'rule_tokens.name': name
  271. }, {
  272. $pull: {
  273. 'rule_tokens.$.name': name
  274. }
  275. }, function(err) {
  276. if (err) {
  277. return done(err);
  278. }
  279. // Update rule token. add a new one if no key exists
  280. Member.findOneAndUpdate({
  281. email: email
  282. }, {
  283. $addToSet: {
  284. rule_tokens: {
  285. name: name,
  286. token: token,
  287. expired: expired
  288. }
  289. }
  290. }, function(err, member) {
  291. done(err, member ? {
  292. token: token,
  293. id: member._id
  294. } : null);
  295. });
  296. });
  297. };
  298. },
  299. updateCardno: function(id, cardno) {
  300. return function(done) {
  301. Member.update({ _id: id }, {
  302. cardno: cardno,
  303. updated: Date.now()
  304. }, done);
  305. };
  306. },
  307. updateCardnoByEmail: function(email, token, cardno) {
  308. return function(done) {
  309. Member.update({ email: email }, {
  310. tokens: [ token ],
  311. cardno: cardno,
  312. updated: Date.now()
  313. }, done);
  314. };
  315. }
  316. };