diff --git a/Dockerfile b/Dockerfile index 5d60121f9e598fe062dea363855fce2f82ca89e6..a42e8d17cab08a002b5e72f0ea368fa6be69fe44 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,11 @@ FROM node:20 RUN apt-get update && \ - apt-get install -y ranger vim + apt-get install -y imagemagick potrace ghostscript ranger vim + +RUN sed -i.bak 's/rights="none" pattern="PS"/rights="read | write" pattern="PS"/g' /etc/ImageMagick-6/policy.xml +RUN sed -i.bak 's/rights="none" pattern="EPS"/rights="read | write" pattern="EPS"/g' /etc/ImageMagick-6/policy.xml + RUN corepack enable diff --git a/dev/scripts/setupDevServer.sh b/dev/scripts/setupDevServer.sh index 421d784cd590c8020ee7aca9e90cdf691baeea2b..24c7719de8d047829d959d62f1fcc1af827cf9b5 100644 --- a/dev/scripts/setupDevServer.sh +++ b/dev/scripts/setupDevServer.sh @@ -1,8 +1,8 @@ #!/bin/sh -set -x +# set -x # This is run through docker. Its CWD will be the root folder. -node ./dev/scripts/ensureTempFolderExists.js +# node ./dev/scripts/ensureTempFolderExists.js # node ./dev/scripts/seedAdmin.js exec "$@" diff --git a/src/dbManager/migrate.js b/src/dbManager/migrate.js index 193c386f251125415e2e36007b3be706ec809e50..1a242f11e7c5c6226d43014ee7ba648ffae52c1c 100644 --- a/src/dbManager/migrate.js +++ b/src/dbManager/migrate.js @@ -230,7 +230,7 @@ const updateCheckpoint = async () => { * apply (the creation of the meta table, ie. from the moment they upgraded to * coko server v4). */ -const migrate = async options => { +const migrate = async (options = {}) => { const threshold = await getMetaCreatedAsUnixTimestamp() const umzug = getUmzug(threshold) diff --git a/src/index.js b/src/index.js index 3e75070b5da460d2b5b07f75fb76913753553930..dca4318f638c3f752f0d30f06b5f6dada9d18b7f 100644 --- a/src/index.js +++ b/src/index.js @@ -17,6 +17,7 @@ const app = require('./app') const startServer = require('./startServer') const { BaseModel, useTransaction } = require('./models') const modelTypes = require('./models/_helpers/types') +const tempFolderPath = require('./utils/tempFolderPath') const { healthCheck, @@ -76,6 +77,7 @@ module.exports = { createTables, useTransaction, isEnvVariableTrue, + tempFolderPath, cron, uuid, diff --git a/src/models/file/migrations/1698750314-add-full-quality-converted-object-to-storedobjects.js b/src/models/file/migrations/1698750314-add-full-quality-converted-object-to-storedobjects.js index cf6b5f132d12f8c5d79367b6cd78f037ff342884..b075c80eac32ccdaa8fb2bed4449fcee0e3b65e2 100644 --- a/src/models/file/migrations/1698750314-add-full-quality-converted-object-to-storedobjects.js +++ b/src/models/file/migrations/1698750314-add-full-quality-converted-object-to-storedobjects.js @@ -6,6 +6,7 @@ const sharp = require('sharp') const useTransaction = require('../../useTransaction') const File = require('../file.model') +const tempFolderPath = require('../../../utils/tempFolderPath') const { connectToFileStorage, @@ -65,7 +66,7 @@ exports.up = async () => { await connectToFileStorage() const files = await File.query(trx) - const tempDir = path.join(__dirname, '..', 'temp') + const tempDir = tempFolderPath await fs.ensureDir(tempDir) await Promise.all( @@ -77,7 +78,7 @@ exports.up = async () => { ) if (mimetype.match(/^image\//) && !fullStoredObject) { - const tempFileDir = path.join(__dirname, '..', 'temp', file.id) + const tempFileDir = path.join(tempDir, file.id) await fs.ensureDir(tempFileDir) const originalStoredObject = file.storedObjects.find( @@ -148,7 +149,7 @@ exports.up = async () => { ) try { - await fs.remove(tempDir) + await fs.emptyDir(tempDir) } catch (e) { throw new Error(e) } diff --git a/src/services/__tests__/fileStorage.service.test.js b/src/services/__tests__/fileStorage.service.test.js index 09d7aafb7b31488928432b8b442e0121321ac266..1ff7f903cde0147ffa8db48cc78cb626ccbc8689 100644 --- a/src/services/__tests__/fileStorage.service.test.js +++ b/src/services/__tests__/fileStorage.service.test.js @@ -11,6 +11,7 @@ const { } = require('../fileStorage') const { uploadOneFile, cleanBucket } = require('./helpers/helpers') +const tempFolderPath = require('../../utils/tempFolderPath') describe('File Storage Service', () => { beforeAll(async () => { @@ -21,11 +22,9 @@ describe('File Storage Service', () => { cleanBucket() }) - afterAll(() => - fs.remove( - path.join(process.cwd(), 'src', 'services', '__tests__', 'files', 'temp'), - ), - ) + afterAll(async () => { + await fs.emptyDir(tempFolderPath) + }) it('communicates with file server', async () => { const fileServerHealth = await healthCheck() @@ -166,19 +165,7 @@ describe('File Storage Service', () => { it('downloads locally the given file', async () => { const file = await uploadOneFile() - fs.ensureDir( - path.join(process.cwd(), 'src', 'services', '__tests__', 'files', 'temp'), - ) - - const tempPath = path.join( - process.cwd(), - 'src', - 'services', - '__tests__', - 'files', - 'temp', - `${file.key}`, - ) + const tempPath = path.join(tempFolderPath, `${file.key}`) await download(file.key, tempPath) expect(fs.existsSync(tempPath)).toBe(true) diff --git a/src/services/fileStorage.js b/src/services/fileStorage.js index 5bf5de64a5c80c12bb2ce4a269d604ae70f92fe3..66692a53d12f0a253e82be8ac6191723483d1235 100644 --- a/src/services/fileStorage.js +++ b/src/services/fileStorage.js @@ -7,6 +7,7 @@ const path = require('path') const mime = require('mime-types') const logger = require('../logger') +const tempFolderPath = require('../utils/tempFolderPath') const { getFileExtension, @@ -18,8 +19,6 @@ const { emptyUndefinedOrNull, } = require('../helpers') -const { tempFolderPath } = config.get('pubsweet-server') - const imageConversionToSupportedFormatMapper = { eps: 'svg', } @@ -27,7 +26,7 @@ const imageConversionToSupportedFormatMapper = { // Initializing Storage Interface let s3 -const healthCheck = () => { +const healthCheck = async () => { try { if (!s3) { throw new Error( @@ -55,7 +54,7 @@ const healthCheck = () => { } } -const connectToFileStorage = () => { +const connectToFileStorage = async () => { if (!config.has('fileStorage')) { throw new Error( 'You have declared that you will use file storage but fileStorage configuration is missing', @@ -112,7 +111,7 @@ const connectToFileStorage = () => { endpoint: serverUrl, }) - healthCheck() + await healthCheck() } const getURL = async (objectKey, options = {}) => { @@ -167,7 +166,7 @@ const handleImageUpload = async (fileStream, hashedFilename) => { try { const storedObjects = [] const randomHash = crypto.randomBytes(6).toString('hex') - const tempDirRoot = tempFolderPath || path.join(process.cwd(), 'temp') + const tempDirRoot = tempFolderPath const tempDir = path.join(tempDirRoot, randomHash) let tempSmallFilePath let tempMediumFilePath diff --git a/src/startServer.js b/src/startServer.js index 43d60eccfc20249082601e0bf0310038b9fe7317..63361a4376b39928e3e6b347ac50bdc7bd85a295 100644 --- a/src/startServer.js +++ b/src/startServer.js @@ -9,12 +9,14 @@ const isFunction = require('lodash/isFunction') const logger = require('./logger') const { migrate } = require('./dbManager/migrate') const seedGlobalTeams = require('./startup/seedGlobalTeams') +const ensureTempFolderExists = require('./startup/ensureTempFolderExists') let server const startServer = async (app = express()) => { if (server) return server + await ensureTempFolderExists() await migrate() await seedGlobalTeams() diff --git a/src/startup/ensureTempFolderExists.js b/src/startup/ensureTempFolderExists.js new file mode 100644 index 0000000000000000000000000000000000000000..047812a8e141aef2f6f13be3e627177ba8d28c6b --- /dev/null +++ b/src/startup/ensureTempFolderExists.js @@ -0,0 +1,22 @@ +const fs = require('fs') + +const logger = require('../logger') +const tempFolderPath = require('../utils/tempFolderPath') + +const ensureTempFolderExists = () => { + logger.info('Ensuring "tmp" folder exists...') + + fs.stat(tempFolderPath, (err, stats) => { + if (err || !stats.isDirectory()) { + logger.info( + '[ensureTempFolderExists]: "tmp" folder does not exist. Creating...', + ) + fs.mkdirSync(tempFolderPath) + logger.info('[ensureTempFolderExists]: "tmp" folder created') + } else { + logger.info('[ensureTempFolderExists]: "tmp" folder already exists') + } + }) +} + +module.exports = ensureTempFolderExists diff --git a/src/utils/tempFolderPath.js b/src/utils/tempFolderPath.js new file mode 100644 index 0000000000000000000000000000000000000000..b0898a31672f00693639bac29c4eff0315db4226 --- /dev/null +++ b/src/utils/tempFolderPath.js @@ -0,0 +1,5 @@ +const path = require('path') + +const tempFolderPath = path.join(process.cwd(), 'tmp') + +module.exports = tempFolderPath