Skip to content

Commit

Permalink
Merge pull request #771 from SISheogorath/refactor/imageRouter
Browse files Browse the repository at this point in the history
Refactoring imageRouter to modularity
  • Loading branch information
SISheogorath authored Mar 21, 2018
2 parents 6e6a98b + 1756e76 commit 6485f96
Show file tree
Hide file tree
Showing 7 changed files with 190 additions and 132 deletions.
7 changes: 7 additions & 0 deletions lib/config/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const path = require('path')
const {merge} = require('lodash')
const deepFreeze = require('deep-freeze')
const {Environment, Permission} = require('./enum')
const logger = require('../logger')

const appRootPath = path.join(__dirname, '../../')
const env = process.env.NODE_ENV || Environment.development
Expand Down Expand Up @@ -103,6 +104,12 @@ if (config.imageUploadType && !config.imageuploadtype) {
config.imageuploadtype = config.imageUploadType
}

// Validate upload upload providers
if (['filesystem', 's3', 'minio', 'imgur'].indexOf(config.imageuploadtype) === -1) {
logger.error('"imageuploadtype" is not correctly set. Please use "filesystem", "s3", "minio" or "imgur". Defaulting to "imgur"')
config.imageuploadtype = 'imgur'
}

// figure out mime types for image uploads
switch (config.imageuploadtype) {
case 'imgur':
Expand Down
132 changes: 0 additions & 132 deletions lib/web/imageRouter.js

This file was deleted.

18 changes: 18 additions & 0 deletions lib/web/imageRouter/filesystem.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
'use strict'
const url = require('url')

const config = require('../../config')

exports.uploadImage = function (imagePath, callback) {
if (!imagePath || typeof imagePath !== 'string') {
callback(new Error('Image path is missing or wrong'), null)
return
}

if (!callback || typeof callback !== 'function') {
callback(new Error('Callback has to be a function'), null)
return
}

callback(null, url.resolve(config.serverurl + '/', imagePath.match(/^public\/(.+$)/)[1]))
}
28 changes: 28 additions & 0 deletions lib/web/imageRouter/imgur.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
'use strict'
const config = require('../../config')
const logger = require('../../logger')

const imgur = require('imgur')

exports.uploadImage = function (imagePath, callback) {
if (!imagePath || typeof imagePath !== 'string') {
callback(new Error('Image path is missing or wrong'), null)
return
}

if (!callback || typeof callback !== 'function') {
callback(new Error('Callback has to be a function'), null)
return
}

imgur.setClientId(config.imgur.clientID)
imgur.uploadFile(imagePath)
.then(function (json) {
if (config.debug) {
logger.info('SERVER uploadimage success: ' + JSON.stringify(json))
}
callback(null, json.data.link.replace(/^http:\/\//i, 'https://'))
}).catch(function (err) {
callback(new Error(err), null)
})
}
42 changes: 42 additions & 0 deletions lib/web/imageRouter/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
'use strict'

const Router = require('express').Router
const formidable = require('formidable')

const config = require('../../config')
const logger = require('../../logger')
const response = require('../../response')

const imageRouter = module.exports = Router()

// upload image
imageRouter.post('/uploadimage', function (req, res) {
var form = new formidable.IncomingForm()

form.keepExtensions = true

if (config.imageuploadtype === 'filesystem') {
form.uploadDir = 'public/uploads'
}

form.parse(req, function (err, fields, files) {
if (err || !files.image || !files.image.path) {
response.errorForbidden(res)
} else {
if (config.debug) {
logger.info('SERVER received uploadimage: ' + JSON.stringify(files.image))
}

const uploadProvider = require('./' + config.imageuploadtype)
uploadProvider.uploadImage(files.image.path, function (err, url) {
if (err !== null) {
logger.error(err)
return res.status(500).end('upload image error')
}
res.send({
link: url
})
})
}
})
})
45 changes: 45 additions & 0 deletions lib/web/imageRouter/minio.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
'use strict'
const fs = require('fs')
const path = require('path')

const config = require('../../config')
const {getImageMimeType} = require('../../utils')

const Minio = require('minio')
const minioClient = new Minio.Client({
endPoint: config.minio.endPoint,
port: config.minio.port,
secure: config.minio.secure,
accessKey: config.minio.accessKey,
secretKey: config.minio.secretKey
})

exports.uploadImage = function (imagePath, callback) {
if (!imagePath || typeof imagePath !== 'string') {
callback(new Error('Image path is missing or wrong'), null)
return
}

if (!callback || typeof callback !== 'function') {
callback(new Error('Callback has to be a function'), null)
return
}

fs.readFile(imagePath, function (err, buffer) {
if (err) {
callback(new Error(err), null)
return
}

let key = path.join('uploads', path.basename(imagePath))
let protocol = config.minio.secure ? 'https' : 'http'

minioClient.putObject(config.s3bucket, key, buffer, buffer.size, getImageMimeType(imagePath), function (err, data) {
if (err) {
callback(new Error(err), null)
return
}
callback(null, `${protocol}://${config.minio.endPoint}:${config.minio.port}/${config.s3bucket}/${key}`)
})
})
}
50 changes: 50 additions & 0 deletions lib/web/imageRouter/s3.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
'use strict'
const fs = require('fs')
const path = require('path')

const config = require('../../config')
const {getImageMimeType} = require('../../utils')

const AWS = require('aws-sdk')
const awsConfig = new AWS.Config(config.s3)
const s3 = new AWS.S3(awsConfig)

exports.uploadImage = function (imagePath, callback) {
if (!imagePath || typeof imagePath !== 'string') {
callback(new Error('Image path is missing or wrong'), null)
return
}

if (!callback || typeof callback !== 'function') {
callback(new Error('Callback has to be a function'), null)
return
}

fs.readFile(imagePath, function (err, buffer) {
if (err) {
callback(new Error(err), null)
return
}
let params = {
Bucket: config.s3bucket,
Key: path.join('uploads', path.basename(imagePath)),
Body: buffer
}

const mimeType = getImageMimeType(imagePath)
if (mimeType) { params.ContentType = mimeType }

s3.putObject(params, function (err, data) {
if (err) {
callback(new Error(err), null)
return
}

let s3Endpoint = 's3.amazonaws.com'
if (config.s3.region && config.s3.region !== 'us-east-1') {
s3Endpoint = `s3-${config.s3.region}.amazonaws.com`
}
callback(null, `https://${s3Endpoint}/${config.s3bucket}/${params.Key}`)
})
})
}

0 comments on commit 6485f96

Please sign in to comment.