Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions config/multer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
const multer = require('multer');
const { nanoid } = require('nanoid');
const fs = require('fs-extra');
const path = require('path');


exports.config = {
fileFilter: (req, file, cb) => {
const fileExtension = path.extname(file.originalname);
if (fileExtension === '.tgz') {
cb(null, true);
} else {
cb(new Error('Invalid file type.'));
}
},
storage: multer.diskStorage({
destination: (req, file, cb) => {
const path = `/tmp/import/${nanoid(8)}`
fs.mkdirSync(path, {recursive: true})
cb(null, path)
},
filename: (req, file, cb) => {
cb(null, file.originalname)
}})
};
23 changes: 3 additions & 20 deletions src/controllers/import.js
Original file line number Diff line number Diff line change
@@ -1,34 +1,17 @@
const service = require('../services/import');
const serviceMulter = require('../services/multer');


/**
* @param {import('express').Request} req
* @param {import('express').Response} res
*/
const run = async (req, res) => {
await service.run();
const {bucket, name, path} = req.fileInMinio;
await service.run(bucket, name, path);
res.sendStatus(200);
};

const uploadArchive = () => {
return serviceMulter.importUploader.single('file');
};

/**
* @param {import('express').Request} req
* @param {import('express').Response} res
*/
const checkUploadArchive = async (req, res) => {
console.log('Arquivo recebido',req.file);

if (!req.file)
return res.status(400).json({ success: false, message: 'you need to provide an import archive.'});
await serviceMulter.putUploadToMinio(req)
return res.status(200).json({ success: true, message: 'Success.'});
};

module.exports = {
run,
uploadArchive,
checkUploadArchive,
};
35 changes: 35 additions & 0 deletions src/middlewares/uploadArchive.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
const fs = require('fs-extra');
const objstore = require('../services/objstore');
const config = require('../config')


const putStreamUploadToMinio = async (req) => {
await objstore.putStream(config.minio.importsBucket, req.file.originalname, req.file.buffer);
};

// Por que PUT e não POST?
const putUploadToMinio = async (req) => {
await objstore.put(config.minio.importsBucket, req.file.filename, req.file.path);
await fs.unlink(req.file.path);
await fs.rmdir('/tmp/import', {recursive: true});

return {
bucket: config.minio.importsBucket,
name: req.file.filename,
path: req.file.path,
}
};

// está checando a requisição apenas, não o diretorio do servidor (É necessário chegar o servidor?)
const checkUploadArchive = async (req, res, next) => {

if (!req.file)
return res.status(400).json({ success: false, message: 'you need to provide an import archive.'});
const fileInMinio = await putUploadToMinio(req)
req.fileInMinio = fileInMinio;
return next();
};

module.exports = {
checkUploadArchive,
};
8 changes: 5 additions & 3 deletions src/routes/import.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
const express = require('express');
const controller = require('../controllers/import');
const service = require('../services/multer');

const router = express();

const multer = require('multer');
const multerConfig = require('../../config/multer').config;
const uploadArchive = require('../middlewares/uploadArchive');

// POST /import/run -> Run import
router.post('/run', controller.run);

// POST /import -> upload import archive
router.post('/', controller.uploadArchive('file'), controller.checkUploadArchive);
router.post('/', multer(multerConfig).single('file'), uploadArchive.checkUploadArchive,controller.run);

// GET /export/{instance} -> List exports by instance
// router.get('/:instance', controller.listByInstance);
Expand Down
29 changes: 15 additions & 14 deletions src/services/import.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,48 +26,49 @@ const createControlRecord = async(iteration) => {
await db.query(sql)
}

const resolveImportName = (instance, iteration) => `${instance}.${iteration}.tgz`;

const run = async () => {
console.log('importing')
const run = async (bucket, importName, path) => {
const nextImport = await getNextImport()
const importName = 'IES.1.tgz';
// const importName = resolveImportName(config.instance, nextImport);

const tmpPath = `/tmp/avapolos_syncer/${nanoid(8)}`;
const tmpImportPath = `${tmpPath}/import.tgz`;
const tmpImportDataPath = `${tmpPath}/import`;
const syncDataPath = await container.getVolumeMountpointByContainer(config.replication.sync, "/var/lib/postgresql/data");
const moodledataFiledirPath = `${await container.getVolumeMountpointByContainer('moodle', "/app/moodledata")}/filedir`;

// const nextImport = 50
console.log(`next iteration: ${nextImport}`)
//console.log(`next iteration: ${nextImport}`)

if (! await objstore.has(config.minio.exportsBucket, importName)) throw new Error('import archive was not found');
if (! await objstore.has(bucket, importName)) throw new Error('import archive was not found');

await objstore.get(config.minio.exportsBucket, importName, tmpImportPath);
await compressing.tgz.uncompress(tmpImportPath, tmpImportDataPath);

await objstore.get(bucket, importName, tmpImportPath);
await compressing.tgz.uncompress(tmpImportPath, tmpImportDataPath);

console.log(`${tmpImportDataPath}/database`)
console.log(syncDataPath)


// Apaga o diretorio de dados do container de sincronização
await fs.rmdir(syncDataPath, { recursive: true });
await fs.copy(`${tmpImportDataPath}/database`, syncDataPath, { recursive: true });
// NÃO copia os dados para o diretorio, apresenta erro nessa etapa (Não sei o motivo)
fs.copy(`${tmpImportDataPath}/database`, syncDataPath, { recursive: true });


await container.stop(config.replication.main);
await container.start(config.replication.sync);
await container.start(config.replication.main);

waitForHealthy(async () => {

await waitForHealthy(async () => {
await db.query("SELECT bdr.wait_slot_confirm_lsn(NULL, NULL)");
console.log('stopping sync db')
container.stop(config.replication.sync);
return;
})

await createControlRecord(nextImport);

await container.runCommand('moodle', ["php", "/app/public/admin/cli/purge_caches.php"])
await container.restart('moodle');
return
}

module.exports = {
Expand Down
37 changes: 0 additions & 37 deletions src/services/multer.js

This file was deleted.