Skip to content
Snippets Groups Projects
downloadDatabase.js 2.41 KiB
const libs = `${process.cwd()}/libs`;

const log = require(`${libs}/log`)(module);

const execute = require(`${libs}/middlewares/query`).execute;

const request = require(`request`);

const config = require(`${libs}/config`);

const Download = require(`${libs}/models/download`);

module.exports = function download(table, mappingTable) {
    return (req, res, next) => {
        // First, query the mapping
        execute(`SELECT target_name, name FROM ${mappingTable}`, undefined, (err, result) => {
            if(err) {
                log.error(err.stack);
                next(new Error('Request could not be satisfied due to a database error.'));
            } else {
                let header = '';
                req.sql.from(table);
                result.forEach((field) => {
                    req.sql.field(table + '.' + field.name, field.target_name);
                    if(header === '') header += field.target_name;
                    else header = header + ';' + field.target_name;
                });

                let form = {
                    query: req.sql.toString(),
                    table: req.sql.tableFrom,
                    name: req.sql.tableFrom,
                    username: req.user.name,
                    email: req.user.email,
                    header
                };

                request.post(config.cdn.url + '/api/v1/file', {form}, (err, response, body) => {
                    if(err) {
                        log.error(err);
                        return res.json({error: err});
                    }

                    Download.findOne({query: req.sql.toString()}, (err, download) => {
                        if(download) {
                            download.updatedAt = Date.now();
                        } else {
                            download = new Download({
                                userId: req.user._id,
                                table,
                                mappingTable,
                                query: req.sql.toString()
                            });
                        }

                        download.save((err) => {
                            if(err) {
                                log.error(err);
                            }
                            res.json({msg: 'Wait for download email', waitForIt: true});
                        });
                    });
                });
            }
        });
    }
};