page-group-relation.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. module.exports = function(crowi) {
  2. var debug = require('debug')('crowi:models:pageGroupRelation')
  3. , mongoose = require('mongoose')
  4. , mongoosePaginate = require('mongoose-paginate')
  5. , ObjectId = mongoose.Schema.Types.ObjectId
  6. , PAGE_ITEMS = 50
  7. , pageGroupRelationSchema;
  8. pageGroupRelationSchema = new mongoose.Schema({
  9. pageGroupRelationId: String,
  10. relatedGroup: { type: ObjectId, ref: 'UserGroup' },
  11. targetPage: { type: ObjectId, ref: 'Page' },
  12. createdAt: { type: Date, default: Date.now },
  13. },{
  14. toJSON: { getters: true },
  15. toObject: { getters: true }
  16. });
  17. pageGroupRelationSchema.plugin(mongoosePaginate);
  18. // すべてのグループ所属関係を取得
  19. pageGroupRelationSchema.statics.findAllRelation = function() {
  20. debug('findAllRelations is called');
  21. var PageGroupRelation = this;
  22. return new Promise(function(resolve, reject) {
  23. PageGroupRelation
  24. .find({ relatedGroup: group} )
  25. .populate('targetPage')
  26. .exec(function (err, pageGroupRelationData) {
  27. if (err) {
  28. return reject(err);
  29. }
  30. return resolve(pageGroupRelationData);
  31. });
  32. });
  33. };
  34. // 指定グループに対するすべてのグループ所属関係を取得
  35. pageGroupRelationSchema.statics.findAllRelationForUserGroup = function (userGroup) {
  36. debug('findAllRelation is called', userGroup);
  37. var PageGroupRelation = this;
  38. return new Promise(function (resolve, reject) {
  39. PageGroupRelation
  40. .find({ relatedGroup: userGroup.id })
  41. .populate('targetPage')
  42. .exec(function (err, pageGroupRelationData) {
  43. if (err) {
  44. return reject(err);
  45. }
  46. return resolve(pageGroupRelationData);
  47. });
  48. });
  49. };
  50. // ページネーション利用の検索
  51. pageGroupRelationSchema.statics.findPageGroupRelationsWithPagination = function (userGroup, options, callback) {
  52. this.paginate({ relatedGroup: userGroup }, { page: options.page || 1, limit: options.limit || PAGE_ITEMS }, function(err, result) {
  53. if (err) {
  54. debug('Error on pagination:', err);
  55. return callback(err, null);
  56. }
  57. return callback(err, result);
  58. });
  59. };
  60. // ページとグループを元に関係性を取得
  61. pageGroupRelationSchema.statics.checkIsExistsRelationForPageAndGroup = function (page, userGroup) {
  62. var PageGroupRelation = this
  63. return new Promise(function (resolve, reject) {
  64. PageGroupRelation
  65. .count({ targetPage: page.id, relatedGroup: userGroup.id })
  66. .exec(function (err, count) {
  67. if (err) {
  68. return reject(err);
  69. }
  70. return resolve(0 < count);
  71. });
  72. });
  73. };
  74. // ページを元に関係性を取得
  75. pageGroupRelationSchema.statics.findByPage = function(page) {
  76. var PageGroupRelation = this
  77. return new Promise(function (resolve, reject) {
  78. PageGroupRelation
  79. .findOne({ targetPage: page.id })
  80. .populate('relatedGroup')
  81. .exec(function (err, data) {
  82. if (err) {
  83. return reject(err);
  84. }
  85. return resolve(data);
  86. });
  87. });
  88. };
  89. // 関係性の生成
  90. pageGroupRelationSchema.statics.createRelation = function(userGroup, page, callback) {
  91. var PageGroupRelation = this
  92. , newPageGroupRelation = new PageGroupRelation();
  93. if (userGroup == null || page == null) {
  94. return callback(new Error('userGroup or page is null'));
  95. }
  96. debug('create new page-group-relation for group ', userGroup);
  97. newPageGroupRelation.relatedGroup = userGroup.id;
  98. newPageGroupRelation.targetPage = page.id;
  99. newPageGroupRelation.createdAt = Date.now();
  100. debug('create new page-group-relation ', newPageGroupRelation);
  101. newPageGroupRelation.save(function(err, pageGroupRelationData) {
  102. return callback(err, pageGroupRelationData);
  103. });
  104. };
  105. // グループに紐づく関係性の全削除
  106. pageGroupRelationSchema.statics.removeAllByUserGroup = function (userGroup, callback) {
  107. if (userGroup === null) { return callback(null); }
  108. var PageGroupRelation = this
  109. var relations = PageGroupRelation.findAllRelation(userGroup);
  110. // 関係性削除の実装
  111. relations.array.forEach(relation => {
  112. PageGroupRelation.removeById(relation.id, function(err) {
  113. if (err) { return callback(err); }
  114. });
  115. });
  116. return callback(null);
  117. }
  118. // ページに紐づく関係性の全削除
  119. pageGroupRelationSchema.statics.removeAllByPage = function (page, callback) {
  120. if (page === null) { return callback(null); }
  121. var PageGroupRelation = this
  122. var relations = PageGroupRelation.findByPage(page);
  123. if (relations != null && relations.length > 0) {
  124. // 関係性削除の実装
  125. relations.array.forEach(relation => {
  126. PageGroupRelation.removeById(relation.id, function (err) {
  127. if (err) { return callback(err); }
  128. });
  129. });
  130. }
  131. return callback(null);
  132. }
  133. // ページに紐づくグループの関係性の削除
  134. pageGroupRelationSchema.statics.removeRelationByUserGroupAndPage = function (userGroup, page, callback) {
  135. if (userGroup == null) { return callback(null); }
  136. if (page == null) { return callback(null); }
  137. var PageGroupRelation = this
  138. var relation = PageGroupRelation.findOne()({relatedGroup: userGroup.id, targetPage: page.id });
  139. if (relation == null) { return callback(); }
  140. PageGroupRelation.removeById(relation.id, function (err) {
  141. if (err) { return callback(err); }
  142. });
  143. return callback(null);
  144. }
  145. // ユーザグループの関係性を削除
  146. pageGroupRelationSchema.statics.removeById = function (id, callback) {
  147. var PageGroupRelation = this
  148. PageGroupRelation.findById(id, function (err, relationData) {
  149. if (err) {
  150. debug('Error on find a removing user-group-relation', err);
  151. return callback(err);
  152. }
  153. debug('relationData is ', relationData);
  154. if (relationData == null || relationData == undefined) {
  155. debug('Cannot find user group relation by id', id);
  156. return callback(new Error('Cannot find user group relation by id'));
  157. }
  158. relationData.remove(function(err) {
  159. if (err) {
  160. return callback(err);
  161. }
  162. return callback(null);
  163. });
  164. });
  165. }
  166. pageGroupRelationSchema.statics.PAGE_ITEMS = PAGE_ITEMS;
  167. return mongoose.model('PageGroupRelation', pageGroupRelationSchema);
  168. };