| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 | SessionData = new Mongo.Collection('sessiondata');/** * A UserSessionData in Wekan. Organization in Trello. */SessionData.attachSchema(  new SimpleSchema({    _id: {      /**       * the organization id       */      type: Number,      optional: true,      // eslint-disable-next-line consistent-return      autoValue() {        if (this.isInsert && !this.isSet) {          return incrementCounter('counters', 'orgId', 1);        }      },    },    userId: {      /**       * userId of the user       */      type: String,      optional: false,    },    sessionId: {      /**       * unique session ID       */      type: String,      optional: false,    },    totalHits: {      /**       * total number of hits in the last report query       */      type: Number,      optional: true,    },    resultsCount: {      /**       * number of results returned       */      type: Number,      optional: true,    },    lastHit: {      /**       * the last hit returned from a report query       */      type: Number,      optional: true,    },    cards: {      type: [String],      optional: true,    },    selector: {      type: String,      optional: true,      blackbox: true,    },    projection: {      type: String,      optional: true,      blackbox: true,      defaultValue: {},    },    errorMessages: {      type: [String],      optional: true,    },    errors: {      type: [Object],      optional: true,      defaultValue: [],    },    debug: {      type: String,      optional: true,    },    'errors.$': {      type: new SimpleSchema({        tag: {          /**           * i18n tag           */          type: String,          optional: false,        },        value: {          /**           * value for the tag           */          type: String,          optional: true,          defaultValue: null,        },        color: {          type: Boolean,          optional: true,          defaultValue: false,        },      }),    },    createdAt: {      /**       * creation date of the team       */      type: Date,      // eslint-disable-next-line consistent-return      autoValue() {        if (this.isInsert) {          return new Date();        } else if (this.isUpsert) {          return { $setOnInsert: new Date() };        } else {          this.unset();        }      },    },    modifiedAt: {      type: Date,      denyUpdate: false,      // eslint-disable-next-line consistent-return      autoValue() {        if (this.isInsert || this.isUpsert || this.isUpdate) {          return new Date();        } else {          this.unset();        }      },    },  }),);SessionData.helpers({  getSelector() {    return SessionData.unpickle(this.selector);  },  getProjection() {    return SessionData.unpickle(this.projection);  },});SessionData.unpickle = pickle => {  return JSON.parse(pickle, (key, value) => {    return unpickleValue(value);  });};function unpickleValue(value) {  if (value === null) {    return null;  } else if (typeof value === 'object') {    // eslint-disable-next-line no-prototype-builtins    if (value.hasOwnProperty('$$class')) {      switch (value.$$class) {        case 'RegExp':          return new RegExp(value.source, value.flags);        case 'Date':          return new Date(value.stringValue);        case 'Object':          return unpickleObject(value);      }    }  }  return value;}function unpickleObject(obj) {  const newObject = {};  Object.entries(obj).forEach(([key, value]) => {    newObject[key] = unpickleValue(value);  });  return newObject;}SessionData.pickle = value => {  return JSON.stringify(value, (key, value) => {    return pickleValue(value);  }, 2);};function pickleValue(value) {  if (value === null) {    return null;  } else if (typeof value === 'object') {    switch (value.constructor.name) {      case 'RegExp':        return {          $$class: 'RegExp',          source: value.source,          flags: value.flags,        };      case 'Date':        return {          $$class: 'Date',          stringValue: String(value),        };      case 'Object':        return pickleObject(value);    }  }  return value;}function pickleObject(obj) {  const newObject = {};  Object.entries(obj).forEach(([key, value]) => {    newObject[key] = pickleValue(value);  });  return newObject;}if (!Meteor.isServer) {  SessionData.getSessionId = () => {    let sessionId = Session.get('sessionId');    if (!sessionId) {      sessionId = `${String(Meteor.userId())}-${String(Math.random())}`;      Session.set('sessionId', sessionId);    }    return sessionId;  };}export default SessionData;
 |