Skip to content

Commit

Permalink
att
Browse files Browse the repository at this point in the history
  • Loading branch information
Th0mzzz committed Sep 12, 2024
1 parent 79c0191 commit 1341b3b
Show file tree
Hide file tree
Showing 7 changed files with 161 additions and 19 deletions.
21 changes: 11 additions & 10 deletions app/controller/usuariosController.js
Original file line number Diff line number Diff line change
Expand Up @@ -289,19 +289,20 @@ const usuariosController = {
},
mudarFoto: async (req, res) => {
let errors = validationResult(req)
let erroMulter = req.session.erroMulter
if (!errors.isEmpty() || erroMulter != null) {
let errosMulter = req.session.erroMulter

if (!errors.isEmpty()) {
var listaErros = errors
} else {
var listaErros = { formatter: null, errors: [] }
}
if (erroMulter != null) {
listaErros.errors.push(erroMulter)
if (req.file) removeImg(`./app/public/img/imagens-servidor/capaImg/${req.file.filename}`)
if (!errors.isEmpty() || errosMulter.length > 0) {

let listaErros = errors.isEmpty() ? { formatter: null, errors: [] } : errors;

if (errosMulter.length > 0) {
listaErros.errors.push(...errosMulter)
if (req.file) removeImg(`./app/public/img/imagens-servidor/perfil/${req.file.filename}`)
}
console.log("-------erro-de-validação-foto--------")
console.log(listaErros)
console.log(errors)
console.log(errosMulter)

const user = req.session.autenticado ? await usuariosModel.findUserById(req.session.autenticado.id) : new Error("Erro ao acessar o banco")

Expand Down
5 changes: 4 additions & 1 deletion app/controller/videosController.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@ const videoControl = {
listaErros.errors.push(...errosMulter)
if (req.file) removeImg(`./app/public/img/imagens-servidor/videos/${req.file.filename}`)
}
console.log("errodevalidaçãovideo--------")
console.log(listaErros)
console.log(errors)
console.log(errosMulter)

const jsonResult = {
page: "../partial/template-home/pub-pages/videos-pub",
Expand All @@ -50,7 +53,7 @@ const videoControl = {
}
const resultado = await videosModel.create(video)
console.log(resultado)
res.redirect(`/view-resenha?idResenha=${resultado.insertId}`)
res.redirect(`/videos?idVideo=${resultado.insertId}`)
} catch (error) {
console.log(error)
if (req.file) { removeImg(`./app/public/img/imagens-servidor/capaImg/${req.file.filename}`) }
Expand Down
Binary file not shown.
Binary file not shown.
2 changes: 1 addition & 1 deletion app/routes/routerEditProfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ const { findUserById } = require("../models/usuariosModel");
const { body } = require("express-validator")
// UTIL ---------------
const upload = require("../util/upload");
const uploadPerfil = upload("./app/public/img/imagens-servidor/perfil/", 3, ['jpeg', 'jpg', 'png', 'webp'], 3 / 4, 0);
const uploadPerfil = upload("./app/public/img/imagens-servidor/perfil/", 3, ['jpeg', 'jpg', 'png', 'webp']);
// Página de falha de autenticação ---------
const destinoDeFalha = {
page: "../partial/template-login/login",
Expand Down
14 changes: 7 additions & 7 deletions app/routes/routerHome.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,11 @@ const middleWares = require("../sessions/middleswares");
// CONTROLLERS -------------
const usuariosController = require("../controller/usuariosController");
const resenhaControl = require("../controller/resenhasController");
const videoControl = require("../controller/videosController");
// UTIL ---------------
const upload = require("../util/upload");
const videoControl = require("../controller/videosController");
const uploadCapaResenha = upload("./app/public/img/imagens-servidor/capas-img/", 5, ['jpeg', 'jpg', 'png']);
const uploadCapaVideo = upload("./app/public/img/imagens-servidor/capas-img/", 5, ['jpeg', 'jpg', 'png']);
const uploadVideo = upload("./app/public/img/imagens-servidor/videos/", 400, ['mp4']);

const uploadMultiplo = require("../util/uploadMultiplo")

// Página de falha de autenticação ---------
const destinoDeFalha = {
Expand Down Expand Up @@ -172,7 +170,7 @@ router.get("/sobre", function (req, res) {
// --------- PAGINA DE VIDEOS ----------

router.get("/videos", function (req, res) {
videoControl.mostrarVideo(req,res)
videoControl.mostrarVideo(req, res)
});


Expand Down Expand Up @@ -215,8 +213,10 @@ router.post("/criarVideo",
},
middleWares.verifyAutenticado,
middleWares.verifyAutorizado("pages/template-login", destinoDeFalha),
uploadCapaVideo("capaVideo"),
uploadVideo("video"),
uploadMultiplo([
{ name: 'capaVideo', caminho: './app/public/img/imagens-servidor/capas-img/', extensoes: ['jpeg', 'jpg', 'png'], fileSize: 5, maxCount: 1 },
{ name: 'video', caminho: './app/public/img/imagens-servidor/videos/', extensoes: ['mp4', 'avi'], fileSize: 400, maxCount: 1 }
]),
videoControl.validacaoVideo,
function (req, res) {
videoControl.postarVideo(req, res)
Expand Down
138 changes: 138 additions & 0 deletions app/util/uploadMultiplo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
const multer = require("multer")
const path = require("path");
const sharp = require("sharp");

// Criador de um filtro de arquivo, onde eu determino as extensoes que eu quero na hora de chamar a função

const createFileFilter = (extensoesPermitidas) => {
return (req, file, cowboy) => {
const extensoesRegex = new RegExp(extensoesPermitidas.join('|'));
const extname = extensoesRegex.test(path.extname(file.originalname).toLowerCase());
const mimetype = extensoesRegex.test(file.mimetype);

if (extname && mimetype) {
return cowboy(null, true);
} else {
return cowboy(new Error("Tipo de arquivo inválido"));
}
};
};


// função para validar a proporção da imagem que está sendo passada, onde eu pego as informações da
// imagem a partir do buffer do req.file e pego sua proporção, comparando-a com a proportion exigida e vendo se está acima da margem de erro.

const validarProporcaoImagem = async (buffer, proportion, margemErro) => {
try {
const metadata = await sharp(buffer).metadata();
const { width, height } = metadata;
const imageProporcao = width / height;
if (Math.abs(imageProporcao - proportion) > margemErro) {
console.log("Testando proporção")
console.log(Math.abs(imageProporcao - proportion) > margemErro)
console.log(Math.abs(imageProporcao - proportion))
console.log(margemErro)
return false
}
return true

} catch (err) {
throw new Error('Erro ao processar a imagem para validação de proporção');
}
};



module.exports = (camposConfig = []) => {
return (req, res, next) => {
const storageConfigs = {}
const fileFilters = {}
const limits = {}
// Criação dinamica para configurações para cada campo, onde, para cada campo passado no router, ele criará uma nova config para o upload
camposConfig.forEach(campo => {
storageConfigs[campo.name] = multer.diskStorage({
destination: (req, file, cowboy) => {
cowboy(null, campo.caminho)
},
filename: (req, file, cowboy) => {
// função para renomear e deixar um padrão no nome dos arquivos
cowboy(
null,
file.fieldname + "-" + Date.now() + path.extname(file.originalname)
)
}
});
// Assim como acima, para cada campo passado, eu crio um limite de tamanho com base no fileSize que o campo passou
limits[campo.name] = campo.fileSize * 1024 * 1024;
// Assim como acima, para cada campo passado, eu crio um filtro com base nas extensões que o campo passou
fileFilters[campo.name] = createFileFilter(campo.extensoes);

})
// Após configurar os filtros baseados em cada campo e salva-los em um objeto, criaremos o filtro nos moldes do multer para utilizar no fileFilter do upload.
const dynamicFileFilter = (req, file, cb) => {
if (fileFilters[file.fieldname]) {
return fileFilters[file.fieldname](req, file, cb);
}
cb(new Error("Campo não suportado: " + file.fieldname));
};
// Após configurar as configs do storage baseados em cada campo e salva-los em um objeto, criaremos uma config nos moldes do multer para utilizar no storage do upload para cada campo passado.
const dynamicStorage = (req, file, cb) => {
if (storageConfigs[file.fieldname]) {
return cb(null, storageConfigs[file.fieldname]);
}
return cb(new Error("Campo não suportado: " + file.fieldname));
}
// Após configurar os limits com base em cada campo e salvar em um objeto, aqui verificamos se existe um limit para o campo passado no upload.fields, se sim retorna um objeto com o fileSize igual ao passado, senao, um erro.
const dynamicLimits = (req, file, cb) => {
const limit = limits[file.fieldname];
if (limit) {
cb(null, { fileSize: limit });
} else {
cb(new Error("Campo não suportado: " + file.fieldname));
}
};

// Aqui o upload é configurado, utilizando as funções dinamicas.
const upload = multer({
storage: dynamicStorage,
limits: dynamicLimits,
fileFilter: dynamicFileFilter
});

// O upload fields faz a função upload(no caso o multer()) para cada campo passado aqui abaixo, ou seja, cada campo do camposConfig, passando as config para as configs do multer.
upload.fields(camposConfig.map(campo =>
({
name: campo.name,
maxCount: campo.maxCount || 1
})))// aqui acaba a função de config os campos para o upload.fields e começa o tratamento para erros ou prosseguir o middlewares
(req, res, function (err) {
// Tratamento de erros de upload

// Se existir um erro do multer ou um err, ele vai passar por todos os campos e verificar se o name deles é igual ao do erro, se sim, ele adiciona um erro ao errosMulter.
if (err instanceof multer.MulterError || err) {
// Adiciona erros de todos os campos
camposConfig.forEach(campo => {
if (err.field === campo.name) {
errosMulter.push({
value: '',
msg: err.message,
path: campo.name
});
}
});
// verifica se existe a variavel de sessão de erros do multer, senao, então cria.
if (!req.session.erroMulter) {
req.session.erroMulter = [];
}
// aqui ele pega os erros que ja tinham da variavel e adiciona os erros do array, descontruindo ambos e colocando num novo array

req.session.erroMulter = [...req.session.erroMulter, ...errosMulter];
return next();
}
next();
});


}

}

0 comments on commit 1341b3b

Please sign in to comment.