const crypto = require('crypto');

const express = require('express');
const fileUpload = require('express-fileupload');
const morgan = require('morgan');
const app = express();

const mockUsers = require('./users.json');

app.use(fileUpload());
app.use(morgan('dev'));

/**
 * Valida o cabeçalho Authorization
 */
app.use(function(req, res, next) {
    if (req.method.toUpperCase() == 'POST' && req.path == '/auth_upload') {
        if (!req.get('authorization')) {
            res.status(401).json({ msg: 'Header Authorization is invalid' }).end();
        }
    }

    next();
})

/**
 * Valida usuário
 */
app.use(function(req, res, next) {
    if (req.method == 'POST' && req.path == '/auth_upload') {
        const [, AccessKeyId, Signature] = req.get('authorization').match(/([\w]+):([\w]+)/i)

        const userFiltered = mockUsers.filter((item) => item.AccessKeyId == AccessKeyId);

        if (!userFiltered || userFiltered.length == 0) {
            res.status(401).json({ msg: 'User not found' }).end();
        }

        req.user = userFiltered[0];
        req.signature = Signature;
    }

    next();
})

app.post('/auth_upload', (req, res, next) => {
    if (!req.files?.file) {
        res.status(401).end();
    }

    const StringToSign = `${req.method}\n${req.files.file.md5}\n${req.files.file.mimetype}\n${req.get('date')}`;

    const HMacHash = crypto.createHmac('sha1', req.user.YourSecretAccessKey).update(StringToSign).digest('hex');

    let statusCode = 401;

    if ( req.signature === HMacHash ) {
        statusCode = 200;
    }

    res.status(statusCode).end();
});

app.listen(80, '0.0.0.0', () => console.log(`Start server ${new Date().toLocaleString()}`))