|
|
@@ -30,11 +30,26 @@ module.exports = function(crowi) {
|
|
|
liker: [{ type: ObjectId, ref: 'User', index: true }],
|
|
|
seenUsers: [{ type: ObjectId, ref: 'User', index: true }],
|
|
|
commentCount: { type: Number, default: 0 },
|
|
|
+ extented: {
|
|
|
+ type: String,
|
|
|
+ default: '{}',
|
|
|
+ get: function(data) {
|
|
|
+ try {
|
|
|
+ return JSON.parse(data);
|
|
|
+ } catch(e) {
|
|
|
+ return data;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ set: function(data) {
|
|
|
+ return JSON.stringify(data);
|
|
|
+ }
|
|
|
+ },
|
|
|
createdAt: { type: Date, default: Date.now },
|
|
|
updatedAt: Date
|
|
|
});
|
|
|
|
|
|
- pageEvent.on('updated', pageEvent.onUpdated);
|
|
|
+ pageEvent.on('create', pageEvent.onCreate);
|
|
|
+ pageEvent.on('update', pageEvent.onUpdate);
|
|
|
|
|
|
pageSchema.methods.isPublic = function() {
|
|
|
if (!this.grant || this.grant == GRANT_PUBLIC) {
|
|
|
@@ -97,21 +112,21 @@ module.exports = function(crowi) {
|
|
|
var self = this,
|
|
|
Page = self;
|
|
|
|
|
|
- return new Promise(function(resolve, reject) {
|
|
|
- var added = self.liker.addToSet(userData._id);
|
|
|
- if (added.length > 0) {
|
|
|
- self.save(function(err, data) {
|
|
|
- if (err) {
|
|
|
- return reject(err);
|
|
|
- }
|
|
|
- debug('liker updated!', added);
|
|
|
- return resolve(data);
|
|
|
- });
|
|
|
- } else {
|
|
|
- debug('liker not updated');
|
|
|
- return reject(self);
|
|
|
- }
|
|
|
- });
|
|
|
+ return new Promise(function(resolve, reject) {
|
|
|
+ var added = self.liker.addToSet(userData._id);
|
|
|
+ if (added.length > 0) {
|
|
|
+ self.save(function(err, data) {
|
|
|
+ if (err) {
|
|
|
+ return reject(err);
|
|
|
+ }
|
|
|
+ debug('liker updated!', added);
|
|
|
+ return resolve(data);
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ debug('liker not updated');
|
|
|
+ return reject(self);
|
|
|
+ }
|
|
|
+ });
|
|
|
|
|
|
};
|
|
|
|
|
|
@@ -119,21 +134,21 @@ module.exports = function(crowi) {
|
|
|
var self = this,
|
|
|
Page = self;
|
|
|
|
|
|
- return new Promise(function(resolve, reject) {
|
|
|
- var beforeCount = self.liker.length;
|
|
|
- self.liker.pull(userData._id);
|
|
|
- if (self.liker.length != beforeCount) {
|
|
|
- self.save(function(err, data) {
|
|
|
- if (err) {
|
|
|
- return reject(err);
|
|
|
- }
|
|
|
- return resolve(data);
|
|
|
- });
|
|
|
- } else {
|
|
|
- debug('liker not updated');
|
|
|
- return reject(self);
|
|
|
- }
|
|
|
- });
|
|
|
+ return new Promise(function(resolve, reject) {
|
|
|
+ var beforeCount = self.liker.length;
|
|
|
+ self.liker.pull(userData._id);
|
|
|
+ if (self.liker.length != beforeCount) {
|
|
|
+ self.save(function(err, data) {
|
|
|
+ if (err) {
|
|
|
+ return reject(err);
|
|
|
+ }
|
|
|
+ return resolve(data);
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ debug('liker not updated');
|
|
|
+ return reject(self);
|
|
|
+ }
|
|
|
+ });
|
|
|
|
|
|
};
|
|
|
|
|
|
@@ -141,35 +156,35 @@ module.exports = function(crowi) {
|
|
|
var self = this,
|
|
|
Page = self;
|
|
|
|
|
|
- return this.seenUsers.some(function(seenUser) {
|
|
|
- return seenUser.equals(userData._id);
|
|
|
- });
|
|
|
+ return this.seenUsers.some(function(seenUser) {
|
|
|
+ return seenUser.equals(userData._id);
|
|
|
+ });
|
|
|
};
|
|
|
|
|
|
pageSchema.methods.seen = function(userData) {
|
|
|
var self = this,
|
|
|
Page = self;
|
|
|
|
|
|
- if (this.isSeenUser(userData)) {
|
|
|
- debug('seenUsers not updated');
|
|
|
- return Promise.resolve(this);
|
|
|
- }
|
|
|
-
|
|
|
- return new Promise(function(resolve, reject) {
|
|
|
- if (!userData || !userData._id) {
|
|
|
- reject(new Error('User data is not valid'));
|
|
|
+ if (this.isSeenUser(userData)) {
|
|
|
+ debug('seenUsers not updated');
|
|
|
+ return Promise.resolve(this);
|
|
|
}
|
|
|
|
|
|
- var added = self.seenUsers.addToSet(userData);
|
|
|
- self.save(function(err, data) {
|
|
|
- if (err) {
|
|
|
- return reject(err);
|
|
|
+ return new Promise(function(resolve, reject) {
|
|
|
+ if (!userData || !userData._id) {
|
|
|
+ reject(new Error('User data is not valid'));
|
|
|
}
|
|
|
|
|
|
- debug('seenUsers updated!', added);
|
|
|
- return resolve(self);
|
|
|
+ var added = self.seenUsers.addToSet(userData);
|
|
|
+ self.save(function(err, data) {
|
|
|
+ if (err) {
|
|
|
+ return reject(err);
|
|
|
+ }
|
|
|
+
|
|
|
+ debug('seenUsers updated!', added);
|
|
|
+ return resolve(self);
|
|
|
+ });
|
|
|
});
|
|
|
- });
|
|
|
};
|
|
|
|
|
|
pageSchema.statics.populatePageData = function(pageData, revisionId) {
|
|
|
@@ -284,13 +299,13 @@ module.exports = function(crowi) {
|
|
|
var forbiddenPages = [
|
|
|
/\^|\$|\*|\+|\#/,
|
|
|
/^\/_api\/.*/,
|
|
|
- /^\/\-\/.*/,
|
|
|
- /^\/_r\/.*/,
|
|
|
- /^\/user\/[^\/]+\/(bookmarks|comments|activities|pages|recent-create|recent-edit)/, // reserved
|
|
|
- /^http:\/\/.+$/, // avoid miss in renaming
|
|
|
- /.+\/edit$/,
|
|
|
- /.+\.md$/,
|
|
|
- /^\/(installer|register|login|logout|admin|me|files|trash|paste|comments).+/,
|
|
|
+/^\/\-\/.*/,
|
|
|
+/^\/_r\/.*/,
|
|
|
+/^\/user\/[^\/]+\/(bookmarks|comments|activities|pages|recent-create|recent-edit)/, // reserved
|
|
|
+/^http:\/\/.+$/, // avoid miss in renaming
|
|
|
+/.+\/edit$/,
|
|
|
+/.+\.md$/,
|
|
|
+/^\/(installer|register|login|logout|admin|me|files|trash|paste|comments).+/,
|
|
|
];
|
|
|
|
|
|
var isCreatable = true;
|
|
|
@@ -313,13 +328,13 @@ module.exports = function(crowi) {
|
|
|
|
|
|
pageSchema.statics.findUpdatedList = function(offset, limit, cb) {
|
|
|
this
|
|
|
- .find({})
|
|
|
- .sort({updatedAt: -1})
|
|
|
- .skip(offset)
|
|
|
- .limit(limit)
|
|
|
- .exec(function(err, data) {
|
|
|
- cb(err, data);
|
|
|
- });
|
|
|
+ .find({})
|
|
|
+ .sort({updatedAt: -1})
|
|
|
+ .skip(offset)
|
|
|
+ .limit(limit)
|
|
|
+ .exec(function(err, data) {
|
|
|
+ cb(err, data);
|
|
|
+ });
|
|
|
};
|
|
|
|
|
|
pageSchema.statics.findPageById = function(id) {
|
|
|
@@ -405,24 +420,24 @@ module.exports = function(crowi) {
|
|
|
|
|
|
return new Promise(function(resolve, reject) {
|
|
|
Page
|
|
|
- .find({ _id: { $in: ids }, grant: GRANT_PUBLIC })
|
|
|
- //.sort({createdAt: -1}) // TODO optionize
|
|
|
- .skip(offset)
|
|
|
- .limit(limit)
|
|
|
- .populate('revision')
|
|
|
- .exec(function(err, pages) {
|
|
|
+ .find({ _id: { $in: ids }, grant: GRANT_PUBLIC })
|
|
|
+ //.sort({createdAt: -1}) // TODO optionize
|
|
|
+ .skip(offset)
|
|
|
+ .limit(limit)
|
|
|
+ .populate('revision')
|
|
|
+ .exec(function(err, pages) {
|
|
|
+ if (err) {
|
|
|
+ return reject(err);
|
|
|
+ }
|
|
|
+
|
|
|
+ Page.populate(pages, {path: 'revision.author', model: 'User', select: User.USER_PUBLIC_FIELDS}, function(err, data) {
|
|
|
if (err) {
|
|
|
return reject(err);
|
|
|
}
|
|
|
|
|
|
- Page.populate(pages, {path: 'revision.author', model: 'User', select: User.USER_PUBLIC_FIELDS}, function(err, data) {
|
|
|
- if (err) {
|
|
|
- return reject(err);
|
|
|
- }
|
|
|
-
|
|
|
- return resolve(data);
|
|
|
- });
|
|
|
+ return resolve(data);
|
|
|
});
|
|
|
+ });
|
|
|
});
|
|
|
};
|
|
|
|
|
|
@@ -434,24 +449,24 @@ module.exports = function(crowi) {
|
|
|
|
|
|
return new Promise(function(resolve, reject) {
|
|
|
Page
|
|
|
- .find({ creator: user._id, grant: GRANT_PUBLIC })
|
|
|
- .sort({createdAt: -1})
|
|
|
- .skip(offset)
|
|
|
- .limit(limit)
|
|
|
- .populate('revision')
|
|
|
- .exec(function(err, pages) {
|
|
|
+ .find({ creator: user._id, grant: GRANT_PUBLIC })
|
|
|
+ .sort({createdAt: -1})
|
|
|
+ .skip(offset)
|
|
|
+ .limit(limit)
|
|
|
+ .populate('revision')
|
|
|
+ .exec(function(err, pages) {
|
|
|
+ if (err) {
|
|
|
+ return reject(err);
|
|
|
+ }
|
|
|
+
|
|
|
+ Page.populate(pages, {path: 'revision.author', model: 'User', select: User.USER_PUBLIC_FIELDS}, function(err, data) {
|
|
|
if (err) {
|
|
|
return reject(err);
|
|
|
}
|
|
|
|
|
|
- Page.populate(pages, {path: 'revision.author', model: 'User', select: User.USER_PUBLIC_FIELDS}, function(err, data) {
|
|
|
- if (err) {
|
|
|
- return reject(err);
|
|
|
- }
|
|
|
-
|
|
|
- return resolve(data);
|
|
|
- });
|
|
|
+ return resolve(data);
|
|
|
});
|
|
|
+ });
|
|
|
});
|
|
|
};
|
|
|
|
|
|
@@ -476,20 +491,20 @@ module.exports = function(crowi) {
|
|
|
return new Promise(function(resolve, reject) {
|
|
|
// FIXME: might be heavy
|
|
|
var q = Page.find({
|
|
|
- path: queryReg,
|
|
|
- redirectTo: null,
|
|
|
- $or: [
|
|
|
- {grant: null},
|
|
|
- {grant: GRANT_PUBLIC},
|
|
|
- {grant: GRANT_RESTRICTED, grantedUsers: userData._id},
|
|
|
- {grant: GRANT_SPECIFIED, grantedUsers: userData._id},
|
|
|
- {grant: GRANT_OWNER, grantedUsers: userData._id},
|
|
|
- ],
|
|
|
- })
|
|
|
- .populate('revision')
|
|
|
- .sort(sortOpt)
|
|
|
- .skip(opt.offset)
|
|
|
- .limit(opt.limit);
|
|
|
+ path: queryReg,
|
|
|
+ redirectTo: null,
|
|
|
+ $or: [
|
|
|
+ {grant: null},
|
|
|
+ {grant: GRANT_PUBLIC},
|
|
|
+ {grant: GRANT_RESTRICTED, grantedUsers: userData._id},
|
|
|
+ {grant: GRANT_SPECIFIED, grantedUsers: userData._id},
|
|
|
+ {grant: GRANT_OWNER, grantedUsers: userData._id},
|
|
|
+ ],
|
|
|
+ })
|
|
|
+ .populate('revision')
|
|
|
+ .sort(sortOpt)
|
|
|
+ .skip(opt.offset)
|
|
|
+ .limit(opt.limit);
|
|
|
|
|
|
q.exec(function(err, pages) {
|
|
|
if (err) {
|
|
|
@@ -584,6 +599,7 @@ module.exports = function(crowi) {
|
|
|
}
|
|
|
|
|
|
resolve(data);
|
|
|
+ pageEvent.emit('update', data, user);
|
|
|
});
|
|
|
});
|
|
|
});
|
|
|
@@ -597,41 +613,42 @@ module.exports = function(crowi) {
|
|
|
, redirectTo = options.redirectTo || null;
|
|
|
|
|
|
// force public
|
|
|
- if (isPortalPath(path)) {
|
|
|
- grant = GRANT_PUBLIC;
|
|
|
- }
|
|
|
-
|
|
|
- return new Promise(function(resolve, reject) {
|
|
|
- Page.findOne({path: path}, function(err, pageData) {
|
|
|
- if (pageData) {
|
|
|
- return reject(new Error('Cannot create new page to existed path'));
|
|
|
- }
|
|
|
+ if (isPortalPath(path)) {
|
|
|
+ grant = GRANT_PUBLIC;
|
|
|
+ }
|
|
|
|
|
|
- var newPage = new Page();
|
|
|
- newPage.path = path;
|
|
|
- newPage.creator = user;
|
|
|
- newPage.createdAt = Date.now();
|
|
|
- newPage.updatedAt = Date.now();
|
|
|
- newPage.redirectTo = redirectTo;
|
|
|
- newPage.grant = grant;
|
|
|
- newPage.grantedUsers = [];
|
|
|
- newPage.grantedUsers.push(user);
|
|
|
-
|
|
|
- newPage.save(function (err, newPage) {
|
|
|
- if (err) {
|
|
|
- return reject(err);
|
|
|
+ return new Promise(function(resolve, reject) {
|
|
|
+ Page.findOne({path: path}, function(err, pageData) {
|
|
|
+ if (pageData) {
|
|
|
+ return reject(new Error('Cannot create new page to existed path'));
|
|
|
}
|
|
|
|
|
|
- var newRevision = Revision.prepareRevision(newPage, body, user, {format: format});
|
|
|
- Page.pushRevision(newPage, newRevision, user).then(function(data) {
|
|
|
- resolve(data);
|
|
|
- }).catch(function(err) {
|
|
|
- debug('Push Revision Error on create page', err);
|
|
|
- return reject(err);
|
|
|
+ var newPage = new Page();
|
|
|
+ newPage.path = path;
|
|
|
+ newPage.creator = user;
|
|
|
+ newPage.createdAt = Date.now();
|
|
|
+ newPage.updatedAt = Date.now();
|
|
|
+ newPage.redirectTo = redirectTo;
|
|
|
+ newPage.grant = grant;
|
|
|
+ newPage.grantedUsers = [];
|
|
|
+ newPage.grantedUsers.push(user);
|
|
|
+
|
|
|
+ newPage.save(function (err, newPage) {
|
|
|
+ if (err) {
|
|
|
+ return reject(err);
|
|
|
+ }
|
|
|
+
|
|
|
+ var newRevision = Revision.prepareRevision(newPage, body, user, {format: format});
|
|
|
+ Page.pushRevision(newPage, newRevision, user).then(function(data) {
|
|
|
+ resolve(data);
|
|
|
+ pageEvent.emit('create', data, user);
|
|
|
+ }).catch(function(err) {
|
|
|
+ debug('Push Revision Error on create page', err);
|
|
|
+ return reject(err);
|
|
|
+ });
|
|
|
});
|
|
|
});
|
|
|
});
|
|
|
- });
|
|
|
};
|
|
|
|
|
|
pageSchema.statics.rename = function(pageData, newPagePath, user, options) {
|