wekan/models/usersessiondata.js

230 lines
4.7 KiB
JavaScript

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;