thegameofcode/cipherlayer

View on GitHub
src/managers/file_store.js

Summary

Maintainability
A
1 hr
Test Coverage
'use strict';

const AWS = require('aws-sdk');
const https = require('https');
const config = require('../../config');

let s3;

function initAWS(cbk) {
    if (!config.aws) {
        return cbk();
    }

    AWS.config.update({
        accessKeyId: config.aws.accessKeyId,
        secretAccessKey: config.aws.secretAccessKey,
        region: config.aws.region
    });
    s3 = new AWS.S3();
    return cbk(true);
}

function uploadFile(bucket, fileName, binaryFile, cbk) {
    initAWS(function (started) {
        if (!started) {
            return cbk({err: 'cannot_initialize_AWS_service'});
        }
        if (!bucket || bucket === '') {
            return cbk({err: 'invalid_bucket'});
        } else if (!fileName || fileName === '') {
            return cbk({err: 'invalid_file_name'});
        } else if (!binaryFile || binaryFile.length === 0) {
            return cbk({err: 'invalid_file_data'});
        }

        const data = {Key: fileName, Body: binaryFile, Bucket: bucket, ACL: 'public-read'};
        s3.putObject(data, function (err, res) {
            if (err) {
                return cbk(err);
            }
            return cbk(null, res);
        });
    });
}

function getFileURL(bucket, fileName, cbk) {
    initAWS(function (started) {
        if (!started) {
            return cbk({err: 'cannot_initialize_AWS_service'});
        }

        if (!bucket || bucket === '') {
            return cbk({err: 'invalid_bucket'});
        } else if (!fileName || fileName === '') {
            return cbk({err: 'invalid_file_name'});
        }

        const urlParams = {Bucket: bucket, Key: fileName};
        s3.getSignedUrl('getObject', urlParams, function (err, url) {
            let signedUrl = url;
            if (err) {
                return cbk(err);
            }
            if (url.indexOf('?') > -1) {
                signedUrl = url.substr(0, url.indexOf('?'));
            }
            return cbk(null, signedUrl);
        });
    });
}

function uploadAvatarToAWS(httpsAvatarUrl, avatarName, cbk) {

    const validBucket = config.aws.buckets.avatars;

    https.get(httpsAvatarUrl, function (res) {
        if (res.statusCode !== 200) {
            return cbk({err: 'avatar_inaccessible'});
        }
        const data = [];
        let dataLen = 0;

        res.on('data', function (chunk) {
            data.push(chunk);
            dataLen += chunk.length;
        });

        res.on('end', function () {
            const buf = new Buffer(dataLen);


            // TODO: replace for with map()
            for (let i = 0, len = data.length, pos = 0; i < len; i++) {
                data[i].copy(buf, pos);
                pos += data[i].length;
            }

            //Save in S3
            uploadFile(validBucket, avatarName, buf, function (err) {
                if (err) {
                    return cbk({err: 'avatar_not_uploaded'});
                }

                getFileURL(validBucket, avatarName, function (err, fileURL) {
                    if (err) {
                        return cbk({err: 'avatar_address_inaccessible'});
                    }
                    return cbk(null, fileURL);
                });
            });
        });
    });
}

module.exports = {
    uploadFile,
    getFileURL,
    uploadAvatarToAWS
};