This commit is contained in:
2018-03-04 21:21:35 -05:00
parent 173c7e2d68
commit f23c329662
3 changed files with 263 additions and 253 deletions

View File

@@ -1,137 +1,140 @@
const Images = require('../modules/images'); const Images = require('../modules/images');
const Logger = require('../modules/logger');
const Messages = require('../models/message'); const Messages = require('../models/message');
const Mongoose = require('mongoose'); const Mongoose = require('mongoose');
const ProfileSchema = new Mongoose.Schema({ const ProfileSchema = new Mongoose.Schema({
"order" : { type: Number, default: 0 }, "order" : { type: Number, default: 0 },
"details": { "details": {
"about": { type: String }, "about": { type: String },
"age": { type: Number, index: true, defaulrt: 0 }, "age": { type: Number, index: true, defaulrt: 0 },
"body": { type: String }, "body": { type: String },
"ethnicity": { type: String }, "ethnicity": { type: String },
"gender": { type: String }, "gender": { type: String },
"height": { type: String }, "height": { type: String },
"looking": { type: String }, "looking": { type: String },
"name": { type: String, index: true }, "name": { type: String, index: true },
"pic": { "pic": {
"detail": { type: String, default: "profile/default_detail.png" }, "detail": { type: String, default: "profile/default_detail.png" },
"thumb": { type: String, default: "profile/default_thumbnail.png" } "thumb": { type: String, default: "profile/default_thumbnail.png" }
}, },
"position": { type: String }, "position": { type: String },
"pronouns": { type: String }, "pronouns": { type: String },
"weight": { type: Number }, "weight": { type: Number },
"status": { type: String }, "status": { type: String },
"tested": { type: Date }, "tested": { type: Date },
"tribe": { type: String } "tribe": { type: String }
}, },
"messages" : [ { type: Messages.schema } ] "messages" : [ { type: Messages.schema } ]
}); });
ProfileSchema.pre('findOneAndUpdate', function (next) { ProfileSchema.pre('findOneAndUpdate', function (next) {
var cnt = 0; var cnt = 0
var pic;
if (this.details && this.details.pic) { if (this.details && this.details.pic) {
var pic = this.details.pic pic = this.details.pic;
cnt = cnt + (typeof pic.detail === 'object' ? 1 : 0) + (typeof pic.thumb === 'object' ? 1 : 0); cnt = cnt + (typeof pic.detail === 'object' ? 1 : 0) + (typeof pic.thumb === 'object' ? 1 : 0);
} }
if (cnt > 0) { if (cnt > 0) {
if (typeof pic.detail === 'object') { if (typeof pic.detail === 'object') {
Images.saveProfileDetailImage(pic.detail, (err, filename) => { Images.saveProfileDetailImage(pic.detail, (err, filename) => {
if (err) { if (err) {
Logger.error('[MessageSchema.pre(save)] There was an error processing the message image. [' + err + ']', { error: err }); Logger.error('[MessageSchema.pre(save)] There was an error processing the message image. [' + err + ']', { error: err });
} }
if (filename) { if (filename) {
pic.detail = filename; pic.detail = filename;
cnt -= 1; cnt -= 1;
if (cnt === 0) next(); if (cnt === 0) next();
} }
}); });
} }
if (typeof pic.thumb === 'object') { if (typeof pic.thumb === 'object') {
Images.saveProfileThumbnailImage(pic.thumb, (err, filename) => { Images.saveProfileThumbnailImage(pic.thumb, (err, filename) => {
if (err) { if (err) {
Logger.error('[MessageSchema.pre(save)] There was an error processing the message image. [' + err + ']', { error: err }); Logger.error('[MessageSchema.pre(save)] There was an error processing the message image. [' + err + ']', { error: err });
} }
if (filename) { if (filename) {
pic.thumb = filename; pic.thumb = filename;
cnt -= 1; cnt -= 1;
if (cnt === 0) next(); if (cnt === 0) next();
} }
}); });
} }
} else { } else {
next(); next();
} }
}); });
ProfileSchema.pre('save', function (next) { ProfileSchema.pre('save', function (next) {
var cnt = 0; var cnt = 0;
var pic;
if (this.details && this.details.pic) { if (this.details && this.details.pic) {
var pic = this.details.pic pic = this.details.pic
cnt = cnt + (typeof pic.detail === 'object' ? 1 : 0) + (typeof pic.thumb === 'object' ? 1 : 0); cnt = cnt + (typeof pic.detail === 'object' ? 1 : 0) + (typeof pic.thumb === 'object' ? 1 : 0);
} }
if (cnt > 0) { if (cnt > 0) {
if (typeof pic.detail === 'object') { if (typeof pic.detail === 'object') {
Images.saveProfileDetailImage(pic.detail, (err, filename) => { Images.saveProfileDetailImage(pic.detail, (err, filename) => {
if (err) { if (err) {
Logger.error('[MessageSchema.pre(save)] There was an error processing the message image. [' + err + ']', { error: err }); Logger.error('[MessageSchema.pre(save)] There was an error processing the message image. [' + err + ']', { error: err });
} }
if (filename) { if (filename) {
pic.detail = filename; pic.detail = filename;
cnt -= 1; cnt -= 1;
if (cnt === 0) next(); if (cnt === 0) next();
} }
}); });
} }
if (typeof pic.thumb === 'object') { if (typeof pic.thumb === 'object') {
Images.saveProfileThumbnailImage(pic.thumb, (err, filename) => { Images.saveProfileThumbnailImage(pic.thumb, (err, filename) => {
if (err) { if (err) {
Logger.error('[MessageSchema.pre(save)] There was an error processing the message image. [' + err + ']', { error: err }); Logger.error('[MessageSchema.pre(save)] There was an error processing the message image. [' + err + ']', { error: err });
} }
if (filename) { if (filename) {
pic.thumb = filename; pic.thumb = filename;
cnt -= 1; cnt -= 1;
if (cnt === 0) next(); if (cnt === 0) next();
} }
}); });
} }
} else { } else {
next(); next();
} }
}); });
const ProfileModel = Mongoose.model('profiles', ProfileSchema); const ProfileModel = Mongoose.model('profiles', ProfileSchema);
module.exports = { module.exports = {
all: (e) => { all: (e) => {
const promise = new Promise((resolve, reject) => { const promise = new Promise((resolve, reject) => {
ProfileModel ProfileModel
.find({}) .find({})
.sort({ order: 1 }) .sort({ order: 1 })
.populate({ .populate({
path: 'messages', path: 'messages',
select: 'order text image isUser', select: 'order text image isUser',
options: { sort: { order: 1 } } options: { sort: { order: 1 } }
}) })
.exec((err, result) => { .exec((err, result) => {
if (err) { if (err) {
reject(err); reject(err);
} }
if (result) { if (result) {
resolve(result); resolve(result);
} }
}); });
}); });
promise.then((result) => { promise.then((result) => {
@@ -140,19 +143,19 @@ module.exports = {
.catch((err) => { .catch((err) => {
e.emit('all', err, null); e.emit('all', err, null);
}); });
}, },
allMessages: (e, prodileId) => { allMessages: (e, prodileId) => {
const promise = new Promise((resolve, reject) => { const promise = new Promise((resolve, reject) => {
ProfileModel.findById(prodileId, (err, result) => { ProfileModel.findById(prodileId, (err, result) => {
if (err) { if (err) {
reject(err); reject(err);
} }
if (result) { if (result) {
resolve(result.messages || []); resolve(result.messages || []);
} }
}); });
}); });
promise.then((result) => { promise.then((result) => {
@@ -164,19 +167,19 @@ module.exports = {
}, },
allMessageImages: (e, profileId) => { allMessageImages: (e, profileId) => {
const promise = new Promise((resolve, reject) => { const promise = new Promise((resolve, reject) => {
ProfileModel ProfileModel
.find({ _id: prodileId, 'messages.image': { $exists: true } }) .find({ _id: profileId, 'messages.image': { $exists: true } })
.select('image') .select('image')
.exec((err, result) => { .exec((err, result) => {
if (err) { if (err) {
reject(err); reject(err);
} }
if (result) { if (result) {
resolve(result); resolve(result);
} }
}); });
}); });
promise.then((result) => { promise.then((result) => {
@@ -188,36 +191,36 @@ module.exports = {
}, },
create: (e, profiles) => { create: (e, profiles) => {
var count = profiles.length; var count = profiles.length;
var errors = []; var errors = [];
var results = []; var results = [];
const promise = new Promise((resolve, reject) => { const promise = new Promise((resolve, reject) => {
for (let i = 0; i < profiles.length; i++) { for (let i = 0; i < profiles.length; i++) {
var profile = profiles[i]; var profile = profiles[i];
var profileInstance = new ProfileModel(profile); var profileInstance = new ProfileModel(profile);
profileInstance.save((err, result) => { profileInstance.save((err, result) => {
if (err) { if (err) {
count -= 1; count -= 1;
errors.push({ errors.push({
profile: profile, profile: profile,
error: err error: err
}); });
if (count === 0) { if (count === 0) {
reject({ results: results, errors: errors }); reject({ results: results, errors: errors });
} }
} }
if (result) { if (result) {
count -= 1; count -= 1;
results.push(result); results.push(result);
if (count === 0) { if (count === 0) {
resolve({ results: results, errors: errors }); resolve({ results: results, errors: errors });
} }
} }
}); });
} }
}); });
@@ -251,31 +254,31 @@ module.exports = {
}, },
deleteMessage: (e, profileId, messageId) => { deleteMessage: (e, profileId, messageId) => {
const promise = new Promise((resolve, reject) => { const promise = new Promise((resolve, reject) => {
ProfileModel.findById(prodileId, (err, profile) => { ProfileModel.findById(profileId, (err, profile) => {
if (err) { if (err) {
reject(err); reject(err);
} }
if (result) { if (profile) {
let message = profile.messages.id(messageId); let message = profile.messages.id(messageId);
if (message) { if (message) {
message.remove(); message.remove();
profile.save((err, result) => { profile.save((err, result) => {
if (err) { if (err) {
reject(err); reject(err);
} }
if (result) { if (result) {
resolve(result); resolve(result);
} }
}); });
} else { } else {
reject('The specified message does not exist'); reject('The specified message does not exist');
} }
} }
}); });
}); });
promise.then((result) => { promise.then((result) => {
@@ -287,31 +290,31 @@ module.exports = {
}, },
find: (e, find) => { find: (e, find) => {
const promise = new Promise((resolve, reject) => { const promise = new Promise((resolve, reject) => {
var query = ProfileModel var query = ProfileModel
.find(find.find) .find(find.find)
.skip(find.options.skip) .skip(find.options.skip)
.limit(find.options.limit) .limit(find.options.limit)
.sort(find.options.sort) .sort(find.options.sort)
.select(find.select || ''); .select(find.select || '');
if (!find.select || (find.select.length && find.select.indexOf('messages'))) { if (!find.select || (find.select.length && find.select.indexOf('messages'))) {
query.populate({ query.populate({
path: 'messages', path: 'messages',
select: 'order text image isUser', select: 'order text image isUser',
options: { sort: { order: 1 } } options: { sort: { order: 1 } }
}); });
} }
query.exec((err, results) => { query.exec((err, results) => {
if (err) { if (err) {
reject(err); reject(err);
} }
if (results) { if (results) {
resolve(results); resolve(results);
} }
}); });
}); });
promise.then((result) => { promise.then((result) => {
@@ -323,16 +326,16 @@ module.exports = {
}, },
get: (e, id) => { get: (e, id) => {
const promise = new Promise((resolve, reject) => { const promise = new Promise((resolve, reject) => {
ProfileModel.findById(id, (err, result) => { ProfileModel.findById(id, (err, result) => {
if (err) { if (err) {
reject(err); reject(err);
} }
if (result) { if (result) {
resolve(result); resolve(result);
} }
}); });
}); });
promise.then((result) => { promise.then((result) => {
@@ -344,17 +347,17 @@ module.exports = {
}, },
getMessage: (e, prodileId, messageId) => { getMessage: (e, prodileId, messageId) => {
const promise = new Promise((resolve, reject) => { const promise = new Promise((resolve, reject) => {
ProfileModel.findById(prodileId, (err, result) => { ProfileModel.findById(prodileId, (err, result) => {
if (err) { if (err) {
reject(err); reject(err);
} }
if (result) { if (result) {
let message = result.messages.id(messageId); let message = result.messages.id(messageId);
resolve(message ? message : {}); resolve(message ? message : {});
} }
}); });
}); });
promise.then((result) => { promise.then((result) => {
@@ -368,18 +371,18 @@ module.exports = {
update: (e, id, profile) => { update: (e, id, profile) => {
const promise = new Promise((resolve, reject) => { const promise = new Promise((resolve, reject) => {
ProfileModel.findOneAndUpdate( ProfileModel.findOneAndUpdate(
{ _id: profileId }, { _id: id },
{ $set: profile }, { $set: profile },
{ new: true }, { new: true },
(err, result) => { (err, result) => {
if (err) { if (err) {
reject(err); reject(err);
} }
if (result) { if (result) {
resolve(result); resolve(result);
} }
}); });
}); });
promise.then((result) => { promise.then((result) => {
@@ -393,18 +396,18 @@ module.exports = {
updateMessage: (e, profileId, messageId, data) => { updateMessage: (e, profileId, messageId, data) => {
const promise = new Promise((resolve, reject) => { const promise = new Promise((resolve, reject) => {
ProfileModel.findOneAndUpdate( ProfileModel.findOneAndUpdate(
{ _id: profileId, 'messages._id': messageId }, { _id: profileId, 'messages._id': messageId },
{ $set: { 'messages.$': data } }, { $set: { 'messages.$': data } },
{ new: true }, { new: true },
(err, result) => { (err, result) => {
if (err) { if (err) {
reject(err); reject(err);
} }
if (result) { if (result) {
resolve(result); resolve(result);
} }
}); });
}); });
promise.then((result) => { promise.then((result) => {

View File

@@ -1,4 +1,5 @@
const fs = require('fs'); const fs = require('fs');
const Logger = require('./logger');
const ShortId = require('shortid'); const ShortId = require('shortid');
const ATTACHMENT_STORE = '../images'; const ATTACHMENT_STORE = '../images';
@@ -6,38 +7,44 @@ const ATTACHMENT_STORE_PROFILE = '/profile';
const ATTACHMENT_STORE_MESSAGE = '/message'; const ATTACHMENT_STORE_MESSAGE = '/message';
const ATTACHMENT_SUFFIX_DETAIL = '_detail'; const ATTACHMENT_SUFFIX_DETAIL = '_detail';
const ATTACHMENT_SUFFIX_THUMBNAIL = '_thumbnail'; const ATTACHMENT_SUFFIX_THUMBNAIL = '_thumbnail';
function generateFilename (filename, type = 'detail') { function generateFilename (filename, type = 'detail') {
var re = /(?:\.([^.]+))?$/; var re = /(?:\.([^.]+))?$/;
var ext = re.exec(filename)[1]; var ext = re.exec(filename)[1];
return shortid.generate() + (type === 'thumbnail' ? ATTACHMENT_SUFFIX_THUMBNAIL : ATTACHMENT_SUFFIX_DETAIL) + "." + ext; return '' + ShortId.generate() + (type === 'thumbnail' ? ATTACHMENT_SUFFIX_THUMBNAIL : ATTACHMENT_SUFFIX_DETAIL) + "." + ext;
} }
function processImage (data, context, type, callback) { function processImage (data, context, type, callback) {
var folder = ATTACHMENT_STORE + (context === 'profile' ? ATTACHMENT_STORE_PROFILE : ATTACHMENT_STORE_MESSAGE); var folder = ATTACHMENT_STORE + (context === 'profile' ? ATTACHMENT_STORE_PROFILE : ATTACHMENT_STORE_MESSAGE);
var filename = generateFilename(data.imageFilename, type); var filename = generateFilename(data.imageFilename, type);
var data_url = data.image; var dataUrl = data.image;
var matches = data_url.match(/^data:.+\/(.+);base64,(.*)$/); var matches = dataUrl.match(/^data:.+\/(.+);base64,(.*)$/);
var base64_data = matches[2]; var base64Data = matches[2];
var buffer = new Buffer(base64_data, 'base64'); var buffer = new Buffer(base64Data, 'base64');
saveImage(folder + '/' + filename, buffer, callback); saveImage(folder + '/' + filename, buffer, callback);
} }
function saveImage (filename, data, callback = function(){}) { function saveImage (filename, data, callback = noop) {
fs.writeFile(filename, data, function (err, stat) { fs.writeFile(filename, data, function (err, stat) {
if (err) { if (err) {
Logger.error('[Images.saveImage] Image save failure.', { err: err, stat: stat, filename: filename });
callback(err, null); callback(err, null);
} else { } else {
Logger.debug('[Images.saveImage] Image save successful.', { stat: stat, filename: filename });
callback(null, filename.substring(2)); callback(null, filename.substring(2));
} }
}); });
} }
function noop (err, result) {
Logger.debug('No callback function supplied.', { err: err, result: result });
}
module.exports = { module.exports = {
save: (data, filename, callback = function(){}) { save: (data, filename, callback = noop) => {
saveImage(filename, data, callback); saveImage(filename, data, callback);
}, },

View File

@@ -79,14 +79,14 @@ function updateMessage (req, res, next) {
var messageId = req.params.messageId; var messageId = req.params.messageId;
var data = req.body; var data = req.body;
if (!id || !data) { if (!profileId || !data) {
res.status(500).json({ message: 'No profile id or data specified.', err: err }); res.status(500).json({ message: 'No profile id or data specified.', err: err });
return; return;
} }
ProfileEvents.once('updateMessage', (err, result) => { ProfileEvents.once('updateMessage', (err, result) => {
if (err) { if (err) {
res.status(500).json({message: 'Could not update profile id: ' + id, err: err}); res.status(500).json({message: 'Could not update profile id: ' + profileId + ' [' + err + ']', err: err});
} }
if (result) { if (result) {