mirror of https://gitgud.io/fatchan/jschan.git
parent
55c0ecb6bb
commit
a93e42d90c
20 changed files with 335 additions and 15 deletions
@ -0,0 +1,47 @@ |
||||
'use strict'; |
||||
|
||||
const addAssets = require(__dirname+'/../../models/forms/addassets.js') |
||||
, dynamicResponse = require(__dirname+'/../../helpers/dynamic.js') |
||||
, deleteTempFiles = require(__dirname+'/../../helpers/files/deletetempfiles.js') |
||||
, config = require(__dirname+'/../../config.js') |
||||
, { checkSchema, lengthBody, numberBody, minmaxBody, numberBodyVariable, |
||||
inArrayBody, arrayInBody, existsBody } = require(__dirname+'/../../helpers/schema.js'); |
||||
|
||||
//almost a copy of banners code, since it can be handled the same. maybe refactor both into 1 with a "type" arg or something
|
||||
//or allowing 2 types to accommodate flags too where they are named (not the object.keys & .values use in manageassets template)
|
||||
module.exports = { |
||||
|
||||
//paramConverter: paramConverter({}),
|
||||
|
||||
controller: async (req, res, next) => { |
||||
|
||||
const { globalLimits } = config.get; |
||||
const errors = []; |
||||
|
||||
if (res.locals.numFiles === 0) { |
||||
errors.push('Must provide a file'); |
||||
} else if (res.locals.numFiles > globalLimits.assetFiles.max) { |
||||
errors.push(`Exceeded max asset uploads in one request of ${globalLimits.assetFiles.max}`); |
||||
} else if (res.locals.board.assets.length+res.locals.numFiles > globalLimits.assetFiles.total) { |
||||
errors.push(`Total number of assets would exceed global limit of ${globalLimits.assetFiles.total}`); |
||||
} |
||||
|
||||
if (errors.length > 0) { |
||||
await deleteTempFiles(req).catch(e => console.error); |
||||
return dynamicResponse(req, res, 400, 'message', { |
||||
'title': 'Bad request', |
||||
'errors': errors, |
||||
'redirect': `/${req.params.board}/manage/assets.html` |
||||
}) |
||||
} |
||||
|
||||
try { |
||||
await addAssets(req, res, next); |
||||
} catch (err) { |
||||
await deleteTempFiles(req).catch(e => console.error); |
||||
return next(err); |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
@ -0,0 +1,48 @@ |
||||
'use strict'; |
||||
|
||||
const deleteAssets = require(__dirname+'/../../models/forms/deleteassets.js') |
||||
, dynamicResponse = require(__dirname+'/../../helpers/dynamic.js') |
||||
, paramConverter = require(__dirname+'/../../helpers/paramconverter.js') |
||||
, { checkSchema, lengthBody, numberBody, minmaxBody, numberBodyVariable, |
||||
inArrayBody, arrayInBody, existsBody } = require(__dirname+'/../../helpers/schema.js'); |
||||
|
||||
module.exports = { |
||||
|
||||
paramConverter: paramConverter({ |
||||
allowedArrays: ['checkedassets'] |
||||
}), |
||||
|
||||
controller: async (req, res, next) => { |
||||
|
||||
const errors = await checkSchema([ |
||||
{ result: lengthBody(req.body.checkedassets, 1), expected: false, error: 'Must select at least one asset to delete' }, |
||||
]); |
||||
|
||||
if (errors.length > 0) { |
||||
return dynamicResponse(req, res, 400, 'message', { |
||||
'title': 'Bad request', |
||||
'errors': errors, |
||||
'redirect': `/${req.params.board}/manage/assets.html` |
||||
}) |
||||
} |
||||
|
||||
for (let i = 0; i < req.body.checkedassets.length; i++) { |
||||
if (!res.locals.board.assets.includes(req.body.checkedassets[i])) { |
||||
return dynamicResponse(req, res, 400, 'message', { |
||||
'title': 'Bad request', |
||||
'message': 'Invalid assets selected', |
||||
'redirect': `/${req.params.board}/manage/assets.html` |
||||
}) |
||||
} |
||||
} |
||||
|
||||
try { |
||||
await deleteAssets(req, res, next); |
||||
} catch (err) { |
||||
console.error(err); |
||||
return next(err); |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
@ -0,0 +1,26 @@ |
||||
'use strict'; |
||||
|
||||
const config = require(__dirname+'/../config.js') |
||||
, fs = require('fs-extra') |
||||
, uploadDirectory = require(__dirname+'/../helpers/files/uploadDirectory.js'); |
||||
|
||||
module.exports = async(db, redis) => { |
||||
console.log('Adding assets'); |
||||
await fs.ensureDir(`${uploadDirectory}/asset/`); |
||||
const template = require(__dirname+'/../configs/template.js.example'); |
||||
await db.collection('globalsettings').updateOne({ _id: 'globalsettings' }, { |
||||
'$set': { |
||||
'globalLimits.assetFiles': template.globalLimits.assetFiles, |
||||
'globalLimits.assetFilesSize': template.globalLimits.assetFilesSize, |
||||
}, |
||||
}); |
||||
await db.collection('boards').updateMany({}, { |
||||
'$set': { |
||||
'assets': [], |
||||
}, |
||||
}); |
||||
console.log('Cleared boards cache'); |
||||
await redis.deletePattern('board:*'); |
||||
console.log('Cleared globalsettings cache'); |
||||
await redis.deletePattern('globalsettings'); |
||||
}; |
@ -0,0 +1,96 @@ |
||||
'use strict'; |
||||
|
||||
const path = require('path') |
||||
, { remove, pathExists } = require('fs-extra') |
||||
, config = require(__dirname+'/../../config.js') |
||||
, uploadDirectory = require(__dirname+'/../../helpers/files/uploadDirectory.js') |
||||
, moveUpload = require(__dirname+'/../../helpers/files/moveupload.js') |
||||
, mimeTypes = require(__dirname+'/../../helpers/files/mimetypes.js') |
||||
, imageIdentify = require(__dirname+'/../../helpers/files/imageidentify.js') |
||||
, deleteTempFiles = require(__dirname+'/../../helpers/files/deletetempfiles.js') |
||||
, dynamicResponse = require(__dirname+'/../../helpers/dynamic.js') |
||||
, { Boards } = require(__dirname+'/../../db/') |
||||
, buildQueue = require(__dirname+'/../../queue.js'); |
||||
|
||||
module.exports = async (req, res, next) => { |
||||
|
||||
const { globalLimits, checkRealMimeTypes } = config.get; |
||||
const redirect = `/${req.params.board}/manage/assets.html`; |
||||
|
||||
for (let i = 0; i < res.locals.numFiles; i++) { |
||||
if (!mimeTypes.allowed(req.files.file[i].mimetype, { |
||||
image: true, |
||||
animatedImage: true, |
||||
video: false, |
||||
audio: false, |
||||
other: false |
||||
})) { |
||||
await deleteTempFiles(req).catch(e => console.error); |
||||
return dynamicResponse(req, res, 400, 'message', { |
||||
'title': 'Bad request', |
||||
'message': `Invalid file type for ${req.files.file[i].name}. Mimetype ${req.files.file[i].mimetype} not allowed.`, |
||||
'redirect': redirect |
||||
}); |
||||
} |
||||
// check for any mismatching supposed mimetypes from the actual file mimetype
|
||||
if (checkRealMimeTypes) { |
||||
if (!(await mimeTypes.realMimeCheck(req.files.file[i]))) { |
||||
deleteTempFiles(req).catch(e => console.error); |
||||
return dynamicResponse(req, res, 400, 'message', { |
||||
'title': 'Bad request', |
||||
'message': `Mime type mismatch for file "${req.files.file[i].name}"`, |
||||
'redirect': redirect |
||||
}); |
||||
} |
||||
} |
||||
} |
||||
|
||||
const filenames = []; |
||||
for (let i = 0; i < res.locals.numFiles; i++) { |
||||
const file = req.files.file[i]; |
||||
const filename = file.sha256 + path.extname(file.name); |
||||
file.filename = filename; |
||||
|
||||
//check if already exists
|
||||
const exists = await pathExists(`${uploadDirectory}/asset/${req.params.board}/${filename}`); |
||||
|
||||
if (exists) { |
||||
await remove(file.tempFilePath); |
||||
continue; |
||||
} |
||||
|
||||
//add to list after checking it doesnt already exist
|
||||
filenames.push(filename); |
||||
|
||||
//then upload it
|
||||
await moveUpload(file, filename, `asset/${req.params.board}`); |
||||
|
||||
//and delete the temp file
|
||||
await remove(file.tempFilePath); |
||||
|
||||
} |
||||
|
||||
deleteTempFiles(req).catch(e => console.error); |
||||
|
||||
// no new assets
|
||||
if (filenames.length === 0) { |
||||
return dynamicResponse(req, res, 400, 'message', { |
||||
'title': 'Bad request', |
||||
'message': `Asset${res.locals.numFiles > 1 ? 's' : ''} already exist${res.locals.numFiles > 1 ? '' : 's'}`, |
||||
'redirect': redirect |
||||
}); |
||||
} |
||||
|
||||
// add assets to the db
|
||||
await Boards.addAssets(req.params.board, filenames); |
||||
|
||||
// add assets to board in memory
|
||||
res.locals.board.assets = res.locals.board.assets.concat(filenames); |
||||
|
||||
return dynamicResponse(req, res, 200, 'message', { |
||||
'title': 'Success', |
||||
'message': `Uploaded ${filenames.length} new assets.`, |
||||
'redirect': redirect |
||||
}); |
||||
|
||||
} |
@ -0,0 +1,32 @@ |
||||
|
||||
'use strict'; |
||||
|
||||
const { remove } = require('fs-extra') |
||||
, dynamicResponse = require(__dirname+'/../../helpers/dynamic.js') |
||||
, uploadDirectory = require(__dirname+'/../../helpers/files/uploadDirectory.js') |
||||
, { Boards } = require(__dirname+'/../../db/') |
||||
, buildQueue = require(__dirname+'/../../queue.js'); |
||||
|
||||
module.exports = async (req, res, next) => { |
||||
|
||||
const redirect = `/${req.params.board}/manage/assets.html`; |
||||
|
||||
//delete file of all selected assets
|
||||
await Promise.all(req.body.checkedassets.map(async filename => { |
||||
remove(`${uploadDirectory}/asset/${req.params.board}/${filename}`); |
||||
})); |
||||
|
||||
//remove from db
|
||||
const amount = await Boards.removeAssets(req.params.board, req.body.checkedassets); |
||||
|
||||
//update res locals assets in memory
|
||||
res.locals.board.assets = res.locals.board.assets.filter(asset => { |
||||
return !req.body.checkedassets.includes(asset); |
||||
}); |
||||
|
||||
return dynamicResponse(req, res, 200, 'message', { |
||||
'title': 'Success', |
||||
'message': `Deleted assets.`, |
||||
'redirect': redirect |
||||
}); |
||||
} |
Loading…
Reference in new issue