113 lines
3.5 KiB
JavaScript
113 lines
3.5 KiB
JavaScript
const fs = require('fs-extra');
|
|
const path = require('path');
|
|
const gm = require('gm');
|
|
|
|
module.exports = Self => {
|
|
require('../methods/image/download')(Self);
|
|
require('../methods/image/upload')(Self);
|
|
require('../methods/image/scrub')(Self);
|
|
|
|
Self.resize = async function({collectionName, srcFile, fileName, entityId}) {
|
|
const models = Self.app.models;
|
|
|
|
const collection = await models.ImageCollection.findOne(
|
|
{
|
|
fields: [
|
|
'id',
|
|
'maxWidth',
|
|
'maxHeight',
|
|
'model',
|
|
'property',
|
|
],
|
|
where: {name: collectionName},
|
|
include: {
|
|
relation: 'sizes',
|
|
scope: {
|
|
fields: ['width', 'height', 'crop'],
|
|
},
|
|
},
|
|
}
|
|
);
|
|
|
|
// Insert image row
|
|
const imageName = path.parse(fileName).name;
|
|
await models.Image.upsertWithWhere(
|
|
{
|
|
name: imageName,
|
|
collectionFk: collectionName
|
|
},
|
|
{
|
|
name: imageName,
|
|
collectionFk: collectionName,
|
|
updated: Date.vnNow() / 1000,
|
|
}
|
|
);
|
|
|
|
// Update entity image file name
|
|
const model = models[collection.model];
|
|
if (!model) throw new Error('No matching model found');
|
|
|
|
const entity = await model.findById(entityId);
|
|
if (entity) {
|
|
await entity.updateAttribute(
|
|
collection.property,
|
|
imageName
|
|
);
|
|
}
|
|
|
|
// Resize
|
|
const container = await models.ImageContainer.container(
|
|
collectionName
|
|
);
|
|
const rootPath = container.client.root;
|
|
const collectionDir = path.join(rootPath, collectionName);
|
|
|
|
// To max size
|
|
const {maxWidth, maxHeight} = collection;
|
|
const fullSizePath = path.join(collectionDir, 'full');
|
|
const toFullSizePath = `${fullSizePath}/${fileName}`;
|
|
|
|
await fs.mkdir(fullSizePath, {recursive: true});
|
|
await new Promise((resolve, reject) => {
|
|
gm(srcFile)
|
|
.resize(maxWidth, maxHeight, '>')
|
|
.setFormat('png')
|
|
.quality(100)
|
|
.write(toFullSizePath, function(err) {
|
|
if (err) reject(err);
|
|
if (!err) resolve();
|
|
});
|
|
});
|
|
|
|
// To collection sizes
|
|
for (const size of collection.sizes()) {
|
|
const {width, height} = size;
|
|
|
|
const sizePath = path.join(collectionDir, `${width}x${height}`);
|
|
const toSizePath = `${sizePath}/${fileName}`;
|
|
|
|
await fs.mkdir(sizePath, {recursive: true});
|
|
await new Promise((resolve, reject) => {
|
|
const gmInstance = gm(srcFile);
|
|
|
|
if (size.crop) {
|
|
gmInstance
|
|
.resize(width, height, '^')
|
|
.gravity('Center')
|
|
.crop(width, height);
|
|
}
|
|
|
|
if (!size.crop) gmInstance.resize(width, height, '>');
|
|
|
|
gmInstance
|
|
.setFormat('png')
|
|
.quality(100)
|
|
.write(toSizePath, function(err) {
|
|
if (err) reject(err);
|
|
if (!err) resolve();
|
|
});
|
|
});
|
|
}
|
|
};
|
|
};
|