group.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. module.exports = function(crowi) {
  2. var debug = require('debug')('crowi:models:group')
  3. , mongoose = require('mongoose')
  4. , mongoosePaginate = require('mongoose-paginate')
  5. , uniqueValidator = require('mongoose-unique-validator')
  6. , crypto = require('crypto')
  7. , ObjectId = mongoose.Schema.Types.ObjectId
  8. , GROUP_PUBLIC_FIELDS = '_id image name groupname createdAt'
  9. , PAGE_ITEMS = 50
  10. , groupSchema;
  11. groupSchema = new mongoose.Schema({
  12. groupId: String,
  13. image: String,
  14. name: { type: String },
  15. groupname: { type: String, index: true },
  16. password: String,
  17. createdAt: { type: Date, default: Date.now },
  18. });
  19. groupSchema.plugin(mongoosePaginate);
  20. groupSchema.plugin(uniqueValidator);
  21. // TBD: 仮グループ管理パスワードの生成
  22. // function generateRandomTempPassword () {
  23. // var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!=-_';
  24. // var password = '';
  25. // var len = 12;
  26. // for (var i = 0; i < len; i++) {
  27. // var randomPoz = Math.floor(Math.random() * chars.length);
  28. // password += chars.substring(randomPoz, randomPoz+1);
  29. // }
  30. // return password;
  31. // }
  32. // TBD: グループ管理パスワードの生成
  33. // function generatePassword (password) {
  34. // var hasher = crypto.createHash('sha256');
  35. // hasher.update(crowi.env.PASSWORD_SEED + password);
  36. // return hasher.digest('hex');
  37. // }
  38. // TBD: グループ管理パスワードの設定済確認
  39. // groupSchema.methods.isPasswordSet = function() {
  40. // if (this.password) {
  41. // return true;
  42. // }
  43. // return false;
  44. // };
  45. // TBD: グループ管理パスワードのバリデーション
  46. // groupSchema.methods.isPasswordValid = function(password) {
  47. // return this.password == generatePassword(password);
  48. // };
  49. // TBD: グループ管理パスワードの設定
  50. // groupSchema.methods.setPassword = function(password) {
  51. // this.password = generatePassword(password);
  52. // return this;
  53. // };
  54. // グループ管理パスワードの更新
  55. // groupSchema.methods.updatePassword = function(password, callback) {
  56. // this.setPassword(password);
  57. // this.save(function(err, groupData) {
  58. // return callback(err, groupData);
  59. // });
  60. // };
  61. // TBD: グループ画像の更新
  62. // groupSchema.methods.updateImage = function(image, callback) {
  63. // this.image = image;
  64. // this.save(function(err, groupData) {
  65. // return callback(err, groupData);
  66. // });
  67. // };
  68. // TBD: グループ画像の削除
  69. // groupSchema.methods.deleteImage = function(callback) {
  70. // return this.updateImage(null, callback);
  71. // };
  72. groupSchema.statics.filterToPublicFields = function(group) {
  73. debug('Group is', typeof group, group);
  74. if (typeof group !== 'object' || !group._id) {
  75. return group;
  76. }
  77. var filteredGroup = {};
  78. var fields = GROUP_PUBLIC_FIELDS.split(' ');
  79. for (var i = 0; i < fields.length; i++) {
  80. var key = fields[i];
  81. if (group[key]) {
  82. filteredGroup[key] = group[key];
  83. }
  84. }
  85. return filteredGroup;
  86. };
  87. // TBD: グループ検索
  88. // groupSchema.statics.findGroups = function(options, callback) {
  89. // var sort = options.sort || {createdAt: 1};
  90. // this.find()
  91. // .sort(sort)
  92. // .skip(options.skip || 0)
  93. // .limit(options.limit || 21)
  94. // .exec(function (err, groupData) {
  95. // callback(err, groupData);
  96. // });
  97. // };
  98. groupSchema.statics.findAllGroups = function(option) {
  99. var Group = this;
  100. var option = option || {}
  101. , sort = option.sort || {createdAt: -1}
  102. , fields = option.fields || GROUP_PUBLIC_FIELDS
  103. ;
  104. return new Promise(function(resolve, reject) {
  105. Group
  106. .find()
  107. .select(fields)
  108. .sort(sort)
  109. .exec(function (err, groupData) {
  110. if (err) {
  111. return reject(err);
  112. }
  113. return resolve(groupData);
  114. });
  115. });
  116. };
  117. // TBD: IDによるグループ検索
  118. // groupSchema.statics.findGroupsByIds = function(ids, option) {
  119. // var Group = this;
  120. // var option = option || {}
  121. // , sort = option.sort || {createdAt: -1}
  122. // , fields = option.fields || GROUP_PUBLIC_FIELDS
  123. // ;
  124. // return new Promise(function(resolve, reject) {
  125. // Group
  126. // .find({ _id: { $in: ids }})
  127. // .select(fields)
  128. // .sort(sort)
  129. // .exec(function (err, groupData) {
  130. // if (err) {
  131. // return reject(err);
  132. // }
  133. // return resolve(groupData);
  134. // });
  135. // });
  136. // };
  137. groupSchema.statics.findGroupsWithPagination = function(options, callback) {
  138. var sort = options.sort || {groupname: 1, createdAt: 1};
  139. this.paginate({ page: options.page || 1, limit: options.limit || PAGE_ITEMS }, function(err, result) {
  140. if (err) {
  141. debug('Error on pagination:', err);
  142. return callback(err, null);
  143. }
  144. return callback(err, result);
  145. }, { sortBy : sort });
  146. };
  147. // TBD: グループ名によるグループ検索
  148. // groupSchema.statics.findGroupByGroupname = function(groupname) {
  149. // var Group = this;
  150. // return new Promise(function(resolve, reject) {
  151. // Group.findOne({groupname: groupname}, function (err, groupData) {
  152. // if (err) {
  153. // return reject(err);
  154. // }
  155. // return resolve(groupData);
  156. // });
  157. // });
  158. // };
  159. // TBD: 登録可能グループ名確認
  160. // groupSchema.statics.isRegisterableGroupname = function(groupname, callback) {
  161. // var Group = this;
  162. // var groupnameUsable = true;
  163. // this.findOne({groupname: groupname}, function (err, groupData) {
  164. // if (groupData) {
  165. // groupnameUsable = false;
  166. // }
  167. // return callback(groupnameUsable);
  168. // });
  169. // };
  170. // TBD: グループの完全削除
  171. // groupSchema.statics.removeCompletelyById = function(id, callback) {
  172. // var Group = this;
  173. // Group.findById(id, function (err, groupData) {
  174. // if (!groupData) {
  175. // return callback(err, null);
  176. // }
  177. // debug('Removing group:', groupData);
  178. // groupData.remove(function(err) {
  179. // if (err) {
  180. // return callback(err, null);
  181. // }
  182. // return callback(null, 1);
  183. // });
  184. // });
  185. // };
  186. // TBD: ランダム生成パスワードリセット
  187. // groupSchema.statics.resetPasswordByRandomString = function(id) {
  188. // var Group = this;
  189. // return new Promise(function(resolve, reject) {
  190. // Group.findById(id, function (err, groupData) {
  191. // if (!groupData) {
  192. // return reject(new Error('Group not found'));
  193. // }
  194. // var newPassword = generateRandomTempPassword();
  195. // groupData.setPassword(newPassword);
  196. // groupData.save(function(err, groupData) {
  197. // if (err) {
  198. // return reject(err);
  199. // }
  200. // resolve({group: groupData, newPassword: newPassword});
  201. // });
  202. // });
  203. // });
  204. // };
  205. // TBD: グループ名・パスワードによるグループ生成
  206. // groupSchema.statics.createGroupByNameAndPassword = function(name, groupname, password, callback) {
  207. // var Group = this
  208. // , newGroup = new Group();
  209. // newGroup.name = name;
  210. // newGroup.groupname = groupname;
  211. // newGroup.setPassword(password);
  212. // newGroup.createdAt = Date.now();
  213. // newGroup.save(function(err, groupData) {
  214. // return callback(err, groupData);
  215. // });
  216. // };
  217. // TBD: グループ画像パスの生成
  218. // groupSchema.statics.createGroupPictureFilePath = function(group, name) {
  219. // var ext = '.' + name.match(/(.*)(?:\.([^.]+$))/)[2];
  220. // return 'group/' + group._id + ext;
  221. // };
  222. groupSchema.statics.GROUP_PUBLIC_FIELDS = GROUP_PUBLIC_FIELDS;
  223. groupSchema.statics.PAGE_ITEMS = PAGE_ITEMS;
  224. return mongoose.model('Group', groupSchema);
  225. };