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
11 changes: 11 additions & 0 deletions 02-nodejs/02-nodejs.code-workspace
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"folders": [
{
"path": "."
},
{
"path": "../../../../Week2/Week2"
}
],
"settings": {}
}
110 changes: 109 additions & 1 deletion 02-nodejs/authenticationServer.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,117 @@
Testing the server - run `npm run test-authenticationServer` command in terminal
*/

const express = require("express")
const express = require("express");
const bodyParser = require("body-parser");
const { v4: uuidv4 } = require("uuid");
const { sign } = require("jsonwebtoken");

const { jwtAuth, authenticate } = require(__dirname +
"/middleware/authentication");

const PORT = 3000;
const app = express();
// write your logic here, DONT WRITE app.listen(3000) when you're running tests, the tests will automatically start the server

app.use(bodyParser.json());

let users = [];

app.post("/signup", (req, res) => {
try {
// console.log(req.body);
const { email, password, firstName, lastName } = req.body;
const user = users.length > 0 && findUser(email, password);
if (user) {
res.status(400).send("User already exists");
return;
}
const id = uuidv4();
users = [...users, { id, ...req.body }];
res.status(201).send("Signup successful");
} catch (err) {
res.status(500).send(err);
}
});

app.post("/mySignup", (req, res) => {
const { username, password, firstName, lastName } = req.body;
const user = getUser(username, password);
if (user) {
res.status(400).send("User already exists");
return;
}
const id = uuidv4();
users = [...users, { id, ...req.body }];
res.status(201).send("Signup successful");
});

app.post("/login", (req, res) => {
const { email, password } = req.body;
const user = users.length > 0 && findUser(email, password);
if (!user) {
res.status(401).send("Invalid credentials");
return;
}
res.status(200).send({
accesstoken: createAccessToken(user.id),
message: "User login successfully",
...user,
});
});

app.post("/myLogin", (req, res) => {
const { username, password } = req.body;
const user = getUser(username, password);
if (!user) {
res.status(401).send("Invalid credentials");
return;
}
res.status(200).send({
accesstoken: createAccessToken(user.id),
message: "User login successfully",
});
});

app.get("/getUsers", jwtAuth, (req, res) => {
const id = req.id;
const user = users.find((user) => user.id === id);

if (!user) return res.status(400).send("Authentication failed");
res.status(200).send(users);
});

app.get("/data", authenticate, (req, res) => {
// const user = users.find(
// (user) => user.email === req.email && user.password === req.password
// );
const user = users && findUser(req.email, req.password);

if (!user) return res.status(401).send("Unauthorized");
res.status(200).send({ users });
});

const getUser = (username, password) => {
const user = users.find(
(user) => user.username === username && user.password === password
);
return user;
};

const findUser = (email, password) => {
const user =
users &&
users.find((user) => user.email === email && user.password === password);
return user;
};

const ACCESS_TOKEN_SECRET =
"gsPAhGCA@PWNX@wfyzDraz!4E!L_KDFgQY6kRbzRj3y@*YhRKgPDo6Grwpud";

const createAccessToken = (id) => {
return sign({ id }, ACCESS_TOKEN_SECRET);
};

// app.listen(PORT, () => console.log(`Listening for requests on port: ${PORT}`));

module.exports = app;
11 changes: 11 additions & 0 deletions 02-nodejs/common/fileOperation.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
const fs = require("node:fs/promises");

const readFromFile = async (fileName) => {
try {
return await fs.readFile(fileName, { encoding: "utf8" });
} catch (err) {
throw err;
}
};

exports.readFromFile = readFromFile;
48 changes: 45 additions & 3 deletions 02-nodejs/fileServer.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,52 @@

Testing the server - run `npm run test-fileServer` command in terminal
*/
const express = require('express');
const fs = require('fs');
const path = require('path');
const express = require("express");
// const fs = require('fs');
const path = require("path");
const fs = require("node:fs/promises");
const { readFromFile } = require(__dirname + "/common/fileOperation");

// const PORT = 3001;

const app = express();

const folderPath = __dirname + "/files";

app.get("/files", async (req, res) => {
try {
let content = [];
let item;
const dir = await fs.opendir(folderPath);
for await (const dirent of dir) {
// console.log(dirent.name);
item = dirent.name;
if (content.length == 0) {
content = [item];
} else {
content = [...content, item];
}
}
res.status(200).send(content);
} catch (error) {
res.status(500).send("Error readinng input directory");
}
});

app.get("/file/:filename", async (req, res) => {
try {
const file = `${folderPath}/${req.params.filename}`;
const content = await readFromFile(file);
res.status(200).send(content);
} catch (err) {
res.status(404).send("File not found");
}
});

app.all("*", (req, res) => {
res.status(404).send("Route not found");
});

// app.listen(PORT, console.log(`Listening on Port ${PORT}`));

module.exports = app;
1 change: 1 addition & 0 deletions 02-nodejs/files/b.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
I am in b.txt
47 changes: 47 additions & 0 deletions 02-nodejs/middleware/authentication.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
const { verify } = require("jsonwebtoken");

const ACCESS_TOKEN_SECRET =
"gsPAhGCA@PWNX@wfyzDraz!4E!L_KDFgQY6kRbzRj3y@*YhRKgPDo6Grwpud";

const jwtAuth = (req, res, next) => {
const authorization = req.headers["authorization"];
if (!authorization)
return res.status(400).send("Authorization header not found.");

const token = authorization.split(" ")[1];
let id;
try {
id = verify(token, ACCESS_TOKEN_SECRET).id;
} catch (err) {
return res.status(400).send("Token is invalid");
}
if (!id) return res.status(400).send("Unable to verify token");
req.id = id;
next();
};

const myAuthenticate = (req, res, next) => {
if (!(req.headers.username && req.headers.password))
return res.status(401).send("Unauthorized");

req.username = req.headers.username;
req.password = req.headers.password;

next();
};

const authenticate = (req, res, next) => {
if (!(req.headers.email && req.headers.password))
return res.status(401).send("Unauthorized");

req.email = req.headers.email;
req.password = req.headers.password;

next();
};

// module.exports = { protected };

exports.jwtAuth = jwtAuth;
exports.authenticate = authenticate;
exports.myAuthenticate = myAuthenticate;
Loading