From 3f9766cab097c1c9621d2ea9586ab008f84071e8 Mon Sep 17 00:00:00 2001 From: Mike Fitzpatrick Date: Sun, 4 Mar 2018 20:47:21 -0500 Subject: [PATCH] no message --- models/message.js | 40 +++++++++++++++++++++ models/profile.js | 91 ++++++++++++++++++++++++++++++++++++++++++----- modules/images.js | 56 +++++++++++++++++++++++++++++ 3 files changed, 179 insertions(+), 8 deletions(-) create mode 100644 modules/images.js diff --git a/models/message.js b/models/message.js index 066df59..dd2dfed 100644 --- a/models/message.js +++ b/models/message.js @@ -1,3 +1,5 @@ +const Images = require('../modules/images'); +const Logger = require('../modules/logger'); const Mongoose = require('mongoose'); const MessageSchema = new Mongoose.Schema({ @@ -7,6 +9,44 @@ const MessageSchema = new Mongoose.Schema({ "isUser" : { type: Boolean, default: false, required: true, index: true } }); +MessageSchema.pre('findOneAndUpdate', function (next) { + var message = this; + + if (message.image && typeof message.image === 'object') { + Images.saveMessageImage(message.image, (err, filename) => { + if (err) { + Logger.error('[MessageSchema.pre(save)] There was an error processing the message image. [' + err + ']', { error: err }); + } + + if (filename) { + message.image = filename; + next(); + } + }) + } else { + next(); + } +}); + +MessageSchema.pre('save', function (next) { + var message = this; + + if (message.image && typeof message.image === 'object') { + Images.saveMessageImage(message.image, (err, filename) => { + if (err) { + Logger.error('[MessageSchema.pre(save)] There was an error processing the message image. [' + err + ']', { error: err }); + } + + if (filename) { + message.image = filename; + next(); + } + }) + } else { + next(); + } +}); + const MessageModel = Mongoose.model('messages', MessageSchema); module.exports = { diff --git a/models/profile.js b/models/profile.js index 864dde4..95d7449 100644 --- a/models/profile.js +++ b/models/profile.js @@ -1,14 +1,7 @@ -const fs = require('fs'); +const Images = require('../modules/images'); const Messages = require('../models/message'); const Mongoose = require('mongoose'); -const ShortId = require('shortid'); -const ATTACHMENT_STORE = '../images'; -const ATTACHMENT_STORE_PROFILE = '/profile'; -const ATTACHMENT_STORE_MESSAGE = '/message'; -const ATTACHMENT_SUFFIX_DETAIL = '_detail'; -const ATTACHMENT_SUFFIX_THUMBNAIL = '_thumbnail'; - const ProfileSchema = new Mongoose.Schema({ "order" : { type: Number, default: 0 }, "details": { @@ -34,6 +27,88 @@ const ProfileSchema = new Mongoose.Schema({ "messages" : [ { type: Messages.schema } ] }); +ProfileSchema.pre('findOneAndUpdate', function (next) { + var cnt = 0; + + if (this.details && this.details.pic) { + var pic = this.details.pic + cnt = cnt + (typeof pic.detail === 'object' ? 1 : 0) + (typeof pic.thumb === 'object' ? 1 : 0); + } + + if (cnt > 0) { + if (typeof pic.detail === 'object') { + Images.saveProfileDetailImage(pic.detail, (err, filename) => { + if (err) { + Logger.error('[MessageSchema.pre(save)] There was an error processing the message image. [' + err + ']', { error: err }); + } + + if (filename) { + pic.detail = filename; + cnt -= 1; + if (cnt === 0) next(); + } + }); + } + + if (typeof pic.thumb === 'object') { + Images.saveProfileThumbnailImage(pic.thumb, (err, filename) => { + if (err) { + Logger.error('[MessageSchema.pre(save)] There was an error processing the message image. [' + err + ']', { error: err }); + } + + if (filename) { + pic.thumb = filename; + cnt -= 1; + if (cnt === 0) next(); + } + }); + } + } else { + next(); + } +}); + +ProfileSchema.pre('save', function (next) { + var cnt = 0; + + if (this.details && this.details.pic) { + var pic = this.details.pic + cnt = cnt + (typeof pic.detail === 'object' ? 1 : 0) + (typeof pic.thumb === 'object' ? 1 : 0); + } + + if (cnt > 0) { + if (typeof pic.detail === 'object') { + Images.saveProfileDetailImage(pic.detail, (err, filename) => { + if (err) { + Logger.error('[MessageSchema.pre(save)] There was an error processing the message image. [' + err + ']', { error: err }); + } + + if (filename) { + pic.detail = filename; + cnt -= 1; + if (cnt === 0) next(); + } + }); + } + + if (typeof pic.thumb === 'object') { + Images.saveProfileThumbnailImage(pic.thumb, (err, filename) => { + if (err) { + Logger.error('[MessageSchema.pre(save)] There was an error processing the message image. [' + err + ']', { error: err }); + } + + if (filename) { + pic.thumb = filename; + cnt -= 1; + if (cnt === 0) next(); + } + }); + } + } else { + next(); + } +}); + const ProfileModel = Mongoose.model('profiles', ProfileSchema); module.exports = { diff --git a/modules/images.js b/modules/images.js new file mode 100644 index 0000000..2a01a65 --- /dev/null +++ b/modules/images.js @@ -0,0 +1,56 @@ +const fs = require('fs'); +const ShortId = require('shortid'); + +const ATTACHMENT_STORE = '../images'; +const ATTACHMENT_STORE_PROFILE = '/profile'; +const ATTACHMENT_STORE_MESSAGE = '/message'; +const ATTACHMENT_SUFFIX_DETAIL = '_detail'; +const ATTACHMENT_SUFFIX_THUMBNAIL = '_thumbnail'; + +function generateFilename (filename, type = 'detail') { + var re = /(?:\.([^.]+))?$/; + var ext = re.exec(filename)[1]; + return shortid.generate() + (type === 'thumbnail' ? ATTACHMENT_SUFFIX_THUMBNAIL : ATTACHMENT_SUFFIX_DETAIL) + "." + ext; +} + +function processImage (data, context, type, callback) { + var folder = ATTACHMENT_STORE + (context === 'profile' ? ATTACHMENT_STORE_PROFILE : ATTACHMENT_STORE_MESSAGE); + var filename = generateFilename(data.imageFilename, type); + + var data_url = data.image; + var matches = data_url.match(/^data:.+\/(.+);base64,(.*)$/); + var base64_data = matches[2]; + var buffer = new Buffer(base64_data, 'base64'); + + saveImage(folder + '/' + filename, buffer, callback); +} + +function saveImage (filename, data, callback = function(){}) { + fs.writeFile(filename, data, function (err, stat) { + if (err) { + callback(err, null); + } else { + callback(null, filename.substring(2)); + } + }); +} + +module.exports = { + + save: (data, filename, callback = function(){}) { + saveImage(filename, data, callback); + }, + + saveMessageImage: (data, callback) => { + processImage(data, 'message', 'detail', callback); + }, + + saveProfileDetailImage: (data, callback) => { + processImage(data, 'profile', 'detail', callback); + }, + + saveProfileThumbnailImage: (data, callback) => { + processImage(data, 'profile', 'thumbnail', callback); + } +}; +