Created
June 6, 2021 02:59
-
-
Save mbrown3321/a9df201cf82a44468ccce84143e81b71 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const express = require("express"); | |
const passport = require("passport"); | |
const Strategy = require("passport-local").Strategy; | |
const models = require("./models"); | |
const formidable = require("formidable"); | |
const { v4: uuidv4 } = require("uuid"); | |
const fs = require("fs"); | |
const AWS = require("aws-sdk"); | |
const S3 = new AWS.S3({ | |
signatureVersion: "v4", | |
apiVersion: "2006-03-01", | |
accessKeyId: "YOUR_ACCESS_KEY_HERE", | |
secretAccessKey: "YOUR_SECRET_ACCESS_KEY_HERE", | |
region: "us-east-1", | |
}); | |
passport.use( | |
new Strategy(async (username, password, cb) => { | |
const user = await models.user.findOne({ | |
where: { | |
email: username, | |
}, | |
}); | |
if (!user) { | |
return cb(null, false); | |
} | |
if (user.password !== password) { | |
return cb(null, false); | |
} | |
return cb(null, user); | |
}) | |
); | |
passport.serializeUser((user, cb) => { | |
cb(null, user.id); | |
}); | |
passport.deserializeUser(async (id, cb) => { | |
const user = await models.user.findByPk(id); | |
if (!user) { | |
return cb({}); | |
} | |
cb(null, user); | |
}); | |
const port = process.env.PORT || 3000; | |
const app = express(); | |
app.set("views", __dirname + "/views"); | |
app.set("view engine", "ejs"); | |
app.use( | |
require("express-session")({ | |
secret: "changeme", | |
resave: false, | |
saveUninitialized: false, | |
}) | |
); | |
app.use(passport.initialize()); | |
app.use(passport.session()); | |
app.use(express.urlencoded({ limit: "100mb" })); | |
app.use(require("body-parser").urlencoded({ extended: true })); | |
app.get("/health", (req, res) => { | |
res.sendStatus(200); | |
}); | |
app.get("/", (req, res) => { | |
res.render("home", { user: req.user }); | |
}); | |
app.get("/login", (req, res) => { | |
res.render("login"); | |
}); | |
app.post( | |
"/login", | |
passport.authenticate("local", { failureRedirect: "/login" }), | |
(req, res) => { | |
res.redirect("/"); | |
} | |
); | |
app.get("/register", (req, res) => { | |
res.render("register"); | |
}); | |
app.post( | |
"/register", | |
async (req, res, next) => { | |
await models.user.create({ | |
email: req.body.username, | |
password: req.body.password, | |
}); | |
next(); | |
}, | |
passport.authenticate("local", { failureRedirect: "/login" }), | |
(req, res) => { | |
res.redirect("/"); | |
} | |
); | |
app.get("/upload", (req, res) => { | |
res.render("upload"); | |
}); | |
app.post("/upload", (req, res, next) => { | |
const form = formidable({ multiples: true }); | |
form.parse(req, async (err, fields, files) => { | |
if (err) { | |
next(err); | |
return; | |
} | |
const id = uuidv4(); | |
S3.putObject( | |
{ | |
Bucket: "YOUR_BUCKET_HERE", | |
Key: id, | |
ContentType: files.file.type, | |
ContentLength: files.file.size, | |
Body: fs.createReadStream(files.file.path), | |
}, | |
async (data) => { | |
await models.upload.create({ | |
id, | |
file_name: files.file.name, | |
user_id: req.user.id, | |
}); | |
res.redirect("/"); | |
} | |
); | |
}); | |
}); | |
function getSignedUrl(key) { | |
return new Promise((resolve, reject) => { | |
S3.getSignedUrl( | |
"getObject", | |
{ | |
Bucket: "YOUR_BUCKET_HERE", | |
Key: key, | |
}, | |
function (err, url) { | |
if (err) reject(err); | |
resolve(url); | |
} | |
); | |
}); | |
} | |
app.get("/files", async (req, res) => { | |
let uploads = await models.upload.findAll({ | |
where: { | |
user_id: req.user.id, | |
}, | |
}); | |
uploads = await Promise.all( | |
uploads.map(async (upload) => { | |
const url = await getSignedUrl(upload.id); | |
return { | |
...upload.toJSON(), | |
url, | |
}; | |
}) | |
); | |
res.render("files", { uploads }); | |
}); | |
app.get("/logout", (req, res) => { | |
req.logout(); | |
res.redirect("/"); | |
}); | |
// Start the app | |
app.listen(port, () => console.log(`API listening on ${port}`)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment