Skip to content

Commit

Permalink
Moved image utils to lib/image
Browse files Browse the repository at this point in the history
refs #9178

- i am not super happy about `const imageLib = require('../lib/image')`
- i don't really like the name `imageLib`
- but i had no better idea 😃
- if we use the same name in the whole project, it's very easy to rename the folder or the variable
  • Loading branch information
kirrg001 committed Dec 14, 2017
1 parent 740b247 commit fc5b4dd
Show file tree
Hide file tree
Showing 20 changed files with 127 additions and 102 deletions.
4 changes: 2 additions & 2 deletions core/server/data/meta/asset_url.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

const crypto = require('crypto'),
config = require('../../config'),
blogIconUtils = require('../../utils/blog-icon'),
imageLib = require('../../lib/image'),
urlService = require('../../services/url'),
packageInfo = require('../../../../package.json');

Expand All @@ -11,7 +11,7 @@ const crypto = require('crypto'),
* @return {string}
*/
function getFaviconUrl() {
return blogIconUtils.getIconUrl();
return imageLib.blogIcon.getIconUrl();
}

function getAssetUrl(path, hasMinFile) {
Expand Down
4 changes: 2 additions & 2 deletions core/server/data/meta/blog_logo.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
var urlService = require('../../services/url'),
settingsCache = require('../../services/settings/cache'),
blogIconUtils = require('../../utils/blog-icon');
imageLib = require('../../lib/image');

function getBlogLogo() {
var logo = {};
Expand All @@ -11,7 +11,7 @@ function getBlogLogo() {
// CASE: no publication logo is updated. We can try to use either an uploaded publication icon
// or use the default one to make
// Google happy with it. See https://github.com/TryGhost/Ghost/issues/7558
logo.url = blogIconUtils.getIconUrl(true);
logo.url = imageLib.blogIcon.getIconUrl(true);
}

return logo;
Expand Down
14 changes: 7 additions & 7 deletions core/server/data/meta/image-dimensions.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
var getCachedImageSizeFromUrl = require('../../utils/cached-image-size-from-url'),
Promise = require('bluebird'),
_ = require('lodash');
var Promise = require('bluebird'),
_ = require('lodash'),
imageLib = require('../../lib/image');

/**
* Get Image dimensions
Expand All @@ -11,10 +11,10 @@ var getCachedImageSizeFromUrl = require('../../utils/cached-image-size-from-url'
*/
function getImageDimensions(metaData) {
var fetch = {
coverImage: getCachedImageSizeFromUrl(metaData.coverImage.url),
authorImage: getCachedImageSizeFromUrl(metaData.authorImage.url),
ogImage: getCachedImageSizeFromUrl(metaData.ogImage.url),
logo: getCachedImageSizeFromUrl(metaData.blog.logo.url)
coverImage: imageLib.imageSizeCache(metaData.coverImage.url),
authorImage: imageLib.imageSizeCache(metaData.authorImage.url),
ogImage: imageLib.imageSizeCache(metaData.ogImage.url),
logo: imageLib.imageSizeCache(metaData.blog.logo.url)
};

return Promise
Expand Down
2 changes: 1 addition & 1 deletion core/server/helpers/proxy.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ module.exports = {

// Various utils, needs cleaning up / simplifying
socialUrls: require('../utils/social-urls'),
blogIcon: require('../utils/blog-icon'),
blogIcon: require('../lib/image/blog-icon'),
url: require('../services/url').utils,
localUtils: require('./utils')
};
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ var sizeOf = require('image-size'),
Promise = require('bluebird'),
_ = require('lodash'),
path = require('path'),
common = require('../lib/common'),
settingsCache = require('../services/settings/cache'),
config = require('../config'),
urlService = require('../services/url'),
storageUtils = require('../adapters/storage/utils'),
config = require('../../config'),
common = require('../common'),
settingsCache = require('../../services/settings/cache'),
urlService = require('../../services/url'),
storageUtils = require('../../adapters/storage/utils'),
getIconDimensions,
isIcoImageType,
getIconType,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
var debug = require('ghost-ignition').debug('utils:image-size-cache'),
imageSize = require('./image-size'),
common = require('../lib/common'),
imageSizeCache = {};
common = require('../common'),
cache = {};

/**
* Get cached image size from URL
Expand All @@ -17,32 +17,32 @@ function getCachedImageSizeFromUrl(url) {
}

// image size is not in cache
if (!imageSizeCache[url]) {
if (!cache[url]) {
return imageSize.getImageSizeFromUrl(url).then(function (res) {
imageSizeCache[url] = res;
cache[url] = res;

debug('Cached image:', url);

return imageSizeCache[url];
return cache[url];
}).catch(common.errors.NotFoundError, function () {
debug('Cached image (not found):', url);
// in case of error we just attach the url
imageSizeCache[url] = url;
cache[url] = url;

return imageSizeCache[url];
return cache[url];
}).catch(function (err) {
debug('Cached image (error):', url);
common.logging.error(err);

// in case of error we just attach the url
imageSizeCache[url] = url;
cache[url] = url;

return imageSizeCache[url];
return cache[url];
});
}
debug('Read image from cache:', url);
// returns image size from cache
return imageSizeCache[url];
return cache[url];
}

module.exports = getCachedImageSizeFromUrl;
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
var Promise = require('bluebird'),
crypto = require('crypto'),
config = require('../config'),
request = require('../lib/request');
config = require('../../config'),
request = require('../request');

module.exports.lookup = function lookup(userData, timeout) {
var gravatarUrl = '//www.gravatar.com/avatar/' +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ var debug = require('ghost-ignition').debug('utils:image-size'),
sizeOf = require('image-size'),
url = require('url'),
Promise = require('bluebird'),
request = require('../lib/request'),
urlService = require('../services/url'),
common = require('../lib/common'),
config = require('../config'),
storage = require('../adapters/storage'),
_ = require('lodash'),
storageUtils = require('../adapters/storage/utils'),
request = require('../request'),
urlService = require('../../services/url'),
common = require('../common'),
config = require('../../config'),
storage = require('../../adapters/storage'),
storageUtils = require('../../adapters/storage/utils'),
getImageSizeFromUrl,
getImageSizeFromFilePath;

Expand Down
19 changes: 19 additions & 0 deletions core/server/lib/image/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
'use strict';

module.exports = {
get blogIcon() {
return require('./blog-icon');
},

get imageSize() {
return require('./image-size');
},

get gravatar() {
return require('./gravatar');
},

get imageSizeCache() {
return require('./cached-image-size-from-url');
}
};
6 changes: 3 additions & 3 deletions core/server/models/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ var _ = require('lodash'),
baseUtils = require('./base/utils'),
common = require('../lib/common'),
security = require('../lib/security'),
gravatar = require('../utils/gravatar'),
validation = require('../data/validation'),
imageLib = require('../lib/image'),
pipeline = require('../lib/promise/pipeline'),
validation = require('../data/validation'),

bcryptGenSalt = Promise.promisify(bcrypt.genSalt),
bcryptHash = Promise.promisify(bcrypt.hash),
Expand Down Expand Up @@ -107,7 +107,7 @@ User = ghostBookshelf.Model.extend({
// If the user's email is set & has changed & we are not importing
if (self.hasChanged('email') && self.get('email') && !options.importing) {
tasks.gravatar = (function lookUpGravatar() {
return gravatar.lookup({
return imageLib.gravatar.lookup({
email: self.get('email')
}).then(function (response) {
if (response && response.image) {
Expand Down
4 changes: 2 additions & 2 deletions core/server/services/slack.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
var common = require('../lib/common'),
request = require('../lib/request'),
imageLib = require('../lib/image'),
urlService = require('../services/url'),
blogIconUtils = require('../utils/blog-icon'),
settingsCache = require('./settings/cache'),
schema = require('../data/schema').checks,
defaultPostSlugs = [
Expand Down Expand Up @@ -50,7 +50,7 @@ function ping(post) {
slackData = {
text: message,
unfurl_links: true,
icon_url: blogIconUtils.getIconUrl(true),
icon_url: imageLib.blogIcon.getIconUrl(true),
username: 'Ghost'
};

Expand Down
8 changes: 4 additions & 4 deletions core/server/web/middleware/serve-favicon.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
var fs = require('fs-extra'),
path = require('path'),
crypto = require('crypto'),
config = require('../../config'),
imageLib = require('../../lib/image'),
storage = require('../../adapters/storage'),
urlService = require('../../services/url'),
config = require('../../config'),
settingsCache = require('../../services/settings/cache'),
blogIconUtils = require('../../utils/blog-icon'),
buildContentResponse,
content;

Expand Down Expand Up @@ -37,7 +37,7 @@ function serveFavicon() {
// we are using an express route to skip /content/images and the result is a image path
// based on config.getContentPath('images') + req.path
// in this case we don't use path rewrite, that's why we have to make it manually
filePath = blogIconUtils.getIconPath();
filePath = imageLib.blogIcon.getIconPath();

var originalExtension = path.extname(filePath).toLowerCase(),
requestedExtension = path.extname(req.path).toLowerCase();
Expand All @@ -52,7 +52,7 @@ function serveFavicon() {
storage.getStorage()
.read({path: filePath})
.then(function readFile(buf) {
iconType = blogIconUtils.getIconType();
iconType = imageLib.blogIcon.getIconType();
content = buildContentResponse(iconType, buf);

res.writeHead(200, content.headers);
Expand Down
20 changes: 14 additions & 6 deletions core/server/web/middleware/validation/blog-icon.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
var config = require('../../../config'),
common = require('../../../lib/common'),
blogIconUtils = require('../../../utils/blog-icon'),
imageLib = require('../../../lib/image'),
validIconFileSize;

validIconFileSize = function validIconFileSize(size) {
Expand All @@ -14,27 +14,35 @@ module.exports = function blogIcon() {

// CASE: file should not be larger than 100kb
if (!validIconFileSize(req.file.size)) {
return next(new common.errors.ValidationError({message: common.i18n.t('errors.api.icons.invalidFile', {extensions: iconExtensions})}));
return next(new common.errors.ValidationError({
message: common.i18n.t('errors.api.icons.invalidFile', {extensions: iconExtensions})
}));
}

return blogIconUtils.getIconDimensions(req.file.path).then(function (response) {
return imageLib.blogIcon.getIconDimensions(req.file.path).then(function (response) {
// save the image dimensions in new property for file
req.file.dimensions = response;

// CASE: file needs to be a square
if (req.file.dimensions.width !== req.file.dimensions.height) {
return next(new common.errors.ValidationError({message: common.i18n.t('errors.api.icons.invalidFile', {extensions: iconExtensions})}));
return next(new common.errors.ValidationError({
message: common.i18n.t('errors.api.icons.invalidFile', {extensions: iconExtensions})
}));
}

// CASE: icon needs to be bigger than or equal to 60px
// .ico files can contain multiple sizes, we need at least a minimum of 60px (16px is ok, as long as 60px are present as well)
if (req.file.dimensions.width < 60) {
return next(new common.errors.ValidationError({message: common.i18n.t('errors.api.icons.invalidFile', {extensions: iconExtensions})}));
return next(new common.errors.ValidationError({
message: common.i18n.t('errors.api.icons.invalidFile', {extensions: iconExtensions})
}));
}

// CASE: icon needs to be smaller than or equal to 1000px
if (req.file.dimensions.width > 1000) {
return next(new common.errors.ValidationError({message: common.i18n.t('errors.api.icons.invalidFile', {extensions: iconExtensions})}));
return next(new common.errors.ValidationError({
message: common.i18n.t('errors.api.icons.invalidFile', {extensions: iconExtensions})
}));
}

next();
Expand Down
6 changes: 3 additions & 3 deletions core/test/integration/model/model_users_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ var should = require('should'),

// Stuff we are testing
common = require('../../../server/lib/common'),
gravatar = require('../../../server/utils/gravatar'),
imageLib = require('../../../server/lib/image'),
UserModel = require('../../../server/models/user').User,
RoleModel = require('../../../server/models/role').Role,
context = testUtils.context.admin,
Expand Down Expand Up @@ -89,7 +89,7 @@ describe('User Model', function run() {
it('can find gravatar', function (done) {
var userData = testUtils.DataGenerator.forModel.users[4];

sandbox.stub(gravatar, 'lookup').callsFake(function (userData) {
sandbox.stub(imageLib.gravatar, 'lookup').callsFake(function (userData) {
userData.image = 'http://www.gravatar.com/avatar/2fab21a4c4ed88e76add10650c73bae1?d=404';
return Promise.resolve(userData);
});
Expand All @@ -106,7 +106,7 @@ describe('User Model', function run() {
it('can handle no gravatar', function (done) {
var userData = testUtils.DataGenerator.forModel.users[0];

sandbox.stub(gravatar, 'lookup').callsFake(function (userData) {
sandbox.stub(imageLib.gravatar, 'lookup').callsFake(function (userData) {
return Promise.resolve(userData);
});

Expand Down
10 changes: 4 additions & 6 deletions core/test/unit/data/meta/image-dimensions_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ var should = require('should'),
sinon = require('sinon'),
rewire = require('rewire'),
getImageDimensions = rewire('../../../../server/data/meta/image-dimensions'),
getCachedImageSizeFromUrl = rewire('../../../../server/utils/cached-image-size-from-url'),
sandbox = sinon.sandbox.create();

describe('getImageDimensions', function () {
Expand All @@ -14,7 +13,6 @@ describe('getImageDimensions', function () {

afterEach(function () {
sandbox.restore();
getCachedImageSizeFromUrl.__set__('imageSizeCache', {});
});

it('should return dimension for images', function (done) {
Expand All @@ -41,7 +39,7 @@ describe('getImageDimensions', function () {
type: 'jpg'
});

getImageDimensions.__set__('getCachedImageSizeFromUrl', sizeOfStub);
getImageDimensions.__set__('imageLib', {imageSizeCache: sizeOfStub});

getImageDimensions(metaData).then(function (result) {
should.exist(result);
Expand Down Expand Up @@ -92,7 +90,7 @@ describe('getImageDimensions', function () {

sizeOfStub.returns({});

getImageDimensions.__set__('getCachedImageSizeFromUrl', sizeOfStub);
getImageDimensions.__set__('imageLib', {imageSizeCache: sizeOfStub});

getImageDimensions(metaData).then(function (result) {
should.exist(result);
Expand Down Expand Up @@ -136,7 +134,7 @@ describe('getImageDimensions', function () {
type: 'jpg'
});

getImageDimensions.__set__('getCachedImageSizeFromUrl', sizeOfStub);
getImageDimensions.__set__('imageLib', {imageSizeCache: sizeOfStub});

getImageDimensions(metaData).then(function (result) {
should.exist(result);
Expand Down Expand Up @@ -188,7 +186,7 @@ describe('getImageDimensions', function () {
type: 'jpg'
});

getImageDimensions.__set__('getCachedImageSizeFromUrl', sizeOfStub);
getImageDimensions.__set__('imageLib', {imageSizeCache: sizeOfStub});

getImageDimensions(metaData).then(function (result) {
should.exist(result);
Expand Down
Loading

0 comments on commit fc5b4dd

Please sign in to comment.