|
@@ -6,25 +6,77 @@ Boards.attachSchema(new SimpleSchema({
|
|
|
},
|
|
|
slug: {
|
|
|
type: String,
|
|
|
+ autoValue() { // eslint-disable-line consistent-return
|
|
|
+ // XXX We need to improve slug management. Only the id should be necessary
|
|
|
+ // to identify a board in the code.
|
|
|
+ // XXX If the board title is updated, the slug should also be updated.
|
|
|
+ // In some cases (Chinese and Japanese for instance) the `getSlug` function
|
|
|
+ // return an empty string. This is causes bugs in our application so we set
|
|
|
+ // a default slug in this case.
|
|
|
+ if (this.isInsert && !this.isSet) {
|
|
|
+ let slug = 'board';
|
|
|
+ const title = this.field('title');
|
|
|
+ if (title.isSet) {
|
|
|
+ slug = getSlug(title.value) || slug;
|
|
|
+ }
|
|
|
+ return slug;
|
|
|
+ }
|
|
|
+ },
|
|
|
},
|
|
|
archived: {
|
|
|
type: Boolean,
|
|
|
+ autoValue() { // eslint-disable-line consistent-return
|
|
|
+ if (this.isInsert && !this.isSet) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ },
|
|
|
},
|
|
|
createdAt: {
|
|
|
type: Date,
|
|
|
- denyUpdate: true,
|
|
|
+ autoValue() { // eslint-disable-line consistent-return
|
|
|
+ if (this.isInsert) {
|
|
|
+ return new Date();
|
|
|
+ } else {
|
|
|
+ this.unset();
|
|
|
+ }
|
|
|
+ },
|
|
|
},
|
|
|
// XXX Inconsistent field naming
|
|
|
modifiedAt: {
|
|
|
type: Date,
|
|
|
- denyInsert: true,
|
|
|
optional: true,
|
|
|
+ autoValue() { // eslint-disable-line consistent-return
|
|
|
+ if (this.isUpdate) {
|
|
|
+ return new Date();
|
|
|
+ } else {
|
|
|
+ this.unset();
|
|
|
+ }
|
|
|
+ },
|
|
|
},
|
|
|
// De-normalized number of users that have starred this board
|
|
|
stars: {
|
|
|
type: Number,
|
|
|
+ autoValue() { // eslint-disable-line consistent-return
|
|
|
+ if (this.isInsert) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ },
|
|
|
},
|
|
|
// De-normalized label system
|
|
|
+ 'labels': {
|
|
|
+ type: [Object],
|
|
|
+ autoValue() { // eslint-disable-line consistent-return
|
|
|
+ if (this.isInsert && !this.isSet) {
|
|
|
+ const colors = Boards.simpleSchema()._schema['labels.$.color'].allowedValues;
|
|
|
+ const defaultLabelsColors = _.clone(colors).splice(0, 6);
|
|
|
+ return defaultLabelsColors.map((color) => ({
|
|
|
+ color,
|
|
|
+ _id: Random.id(6),
|
|
|
+ name: '',
|
|
|
+ }));
|
|
|
+ }
|
|
|
+ },
|
|
|
+ },
|
|
|
'labels.$._id': {
|
|
|
// We don't specify that this field must be unique in the board because that
|
|
|
// will cause performance penalties and is not necessary since this field is
|
|
@@ -47,6 +99,19 @@ Boards.attachSchema(new SimpleSchema({
|
|
|
// XXX We might want to maintain more informations under the member sub-
|
|
|
// documents like de-normalized meta-data (the date the member joined the
|
|
|
// board, the number of contributions, etc.).
|
|
|
+ 'members': {
|
|
|
+ type: [Object],
|
|
|
+ autoValue() { // eslint-disable-line consistent-return
|
|
|
+ if (this.isInsert && !this.isSet) {
|
|
|
+ return [{
|
|
|
+ userId: this.userId,
|
|
|
+ isAdmin: true,
|
|
|
+ isActive: true,
|
|
|
+ isInvited: false,
|
|
|
+ }];
|
|
|
+ }
|
|
|
+ },
|
|
|
+ },
|
|
|
'members.$.userId': {
|
|
|
type: String,
|
|
|
},
|
|
@@ -70,6 +135,11 @@ Boards.attachSchema(new SimpleSchema({
|
|
|
'wisteria',
|
|
|
'midnight',
|
|
|
],
|
|
|
+ autoValue() { // eslint-disable-line consistent-return
|
|
|
+ if (this.isInsert && !this.isSet) {
|
|
|
+ return Boards.simpleSchema()._schema.color.allowedValues[0];
|
|
|
+ }
|
|
|
+ },
|
|
|
},
|
|
|
description: {
|
|
|
type: String,
|
|
@@ -338,41 +408,6 @@ if (Meteor.isServer) {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
-Boards.before.insert((userId, doc) => {
|
|
|
- // XXX We need to improve slug management. Only the id should be necessary
|
|
|
- // to identify a board in the code.
|
|
|
- // XXX If the board title is updated, the slug should also be updated.
|
|
|
- // In some cases (Chinese and Japanese for instance) the `getSlug` function
|
|
|
- // return an empty string. This is causes bugs in our application so we set
|
|
|
- // a default slug in this case.
|
|
|
- doc.slug = doc.slug || getSlug(doc.title) || 'board';
|
|
|
- doc.createdAt = new Date();
|
|
|
- doc.archived = false;
|
|
|
- doc.members = doc.members || [{
|
|
|
- userId,
|
|
|
- isAdmin: true,
|
|
|
- isActive: true,
|
|
|
- }];
|
|
|
- doc.stars = 0;
|
|
|
- doc.color = Boards.simpleSchema()._schema.color.allowedValues[0];
|
|
|
-
|
|
|
- // Handle labels
|
|
|
- const colors = Boards.simpleSchema()._schema['labels.$.color'].allowedValues;
|
|
|
- const defaultLabelsColors = _.clone(colors).splice(0, 6);
|
|
|
- doc.labels = defaultLabelsColors.map((color) => {
|
|
|
- return {
|
|
|
- color,
|
|
|
- _id: Random.id(6),
|
|
|
- name: '',
|
|
|
- };
|
|
|
- });
|
|
|
-});
|
|
|
-
|
|
|
-Boards.before.update((userId, doc, fieldNames, modifier) => {
|
|
|
- modifier.$set = modifier.$set || {};
|
|
|
- modifier.$set.modifiedAt = new Date();
|
|
|
-});
|
|
|
-
|
|
|
if (Meteor.isServer) {
|
|
|
// Let MongoDB ensure that a member is not included twice in the same board
|
|
|
Meteor.startup(() => {
|