Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Worked in infrastructure #30

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
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
File renamed without changes.
File renamed without changes.
4 changes: 2 additions & 2 deletions Backend/users.js → Backend/controllers/users.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
const express = require("express");
const bcrypt = require("bcryptjs");
const users = require("./models/users");
const users = require("../models/users");
const router = express.Router()
const tokenAuth = require("./tokenAuth");
const tokenAuth = require("../tokenAuth");

router.use(tokenAuth); //All user management endpoints are token authenticated
//User endpoints
Expand Down
11 changes: 11 additions & 0 deletions Backend/errors/custom-error.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
export abstract class CustomError extends Error {
abstract statusCode: number;

constructor(message: string) {
super(message);

Object.setPrototypeOf(this, CustomError.prototype);
}

abstract serializeErrors(): { message: string; field?: string }[];
}
19 changes: 19 additions & 0 deletions Backend/errors/request-validation-error.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { ValidationError } from 'express-validator';
import { CustomError } from './custom-error';

export class RequestValidationError extends CustomError {
statusCode = 400;

constructor(public errors: ValidationError[]) {
super('Invalid request parameters');

// Only because we are extending a built in class
Object.setPrototypeOf(this, RequestValidationError.prototype);
}

serializeErrors() {
return this.errors.map(err => {
return { message: err.msg, field: err.param };
});
}
}
14 changes: 14 additions & 0 deletions Backend/helpers/parseJwtFromCookies.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
export default function parseJwtFromCookies(req:any) {
let cookiesArray = [];
let cookies: { [key: string]: string } = {};
var cookiesData = req.headers.cookie;
if (cookiesData) {
cookiesArray = cookiesData.split(";");

cookiesArray.forEach((cookie:any) => {
const [key, value] = cookie.trim().split("=");
cookies[key] = value;
});
}
return cookies['jwt']
}
40 changes: 40 additions & 0 deletions Backend/middlewares/current-user.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { Request, Response, NextFunction } from "express";
import jwt from "jsonwebtoken";
import parseJwtFromCookies from "../helpers/parseJwtFromCookies";

interface UserPayload {
id: string;
email: string;
}

declare global {
namespace Express {
interface Request {
currentUser?: UserPayload;
}
}
}

export const currentUser = (
req: Request,
res: Response,
next: NextFunction
) => {
var jwtParsed = parseJwtFromCookies(req);
if (!jwtParsed) {
//!req.session?.jwt) {
return next();
}

try {
console.log("currentUserMiddleware: ", jwtParsed);

const payload = jwt.verify(
jwtParsed, // req.session.jwt,
process.env.JWT_KEY!
) as UserPayload;
req.currentUser = payload;
} catch (err) {}

next();
};
17 changes: 17 additions & 0 deletions Backend/middlewares/error-handler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { Request, Response, NextFunction } from 'express';
import { CustomError } from '../errors/custom-error';

export const errorHandler = (
err: Error,
req: Request,
res: Response,
next: NextFunction
) => {
if (err instanceof CustomError) {
return res.status(err.statusCode).send({ errors: err.serializeErrors() });
}

res.status(400).send({
errors: [{ message: 'Something went wrong' }]
});
};
14 changes: 14 additions & 0 deletions Backend/middlewares/require-auth.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { Request, Response, NextFunction } from 'express';
import { NotAuthorizedError } from '../errors/not-authorized-error';

export const requireAuth = (
req: Request,
res: Response,
next: NextFunction
) => {
if (!req.currentUser) {
throw new NotAuthorizedError();
}

next();
};
17 changes: 17 additions & 0 deletions Backend/middlewares/validate-request.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { Request, Response, NextFunction } from 'express';
import { validationResult } from 'express-validator';
import { RequestValidationError } from '../errors/request-validation-error';

export const validateRequest = (
req: Request,
res: Response,
next: NextFunction
) => {
const errors = validationResult(req);

if (!errors.isEmpty()) {
throw new RequestValidationError(errors.array());
}

next();
};
75 changes: 63 additions & 12 deletions Backend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions Backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,15 @@
"cors": "^2.8.5",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"express-validator": "^7.0.1",
"jsonwebtoken": "^8.5.1",
"mongoose": "^5.12.2",
"multer": "^1.4.2",
"typescript": "^5.1.6",
"validator": "^13.5.2"
},
"devDependencies": {
"@types/node": "^20.5.1",
"nodemon": "^2.0.7"
}
}
11 changes: 8 additions & 3 deletions Backend/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ const mongoose = require("mongoose");
const cors = require("cors");

const authRouter = require("./auth.js");
const usersRouter = require("./users.js");
const usersRouter = require("./controllers/users.js");
const issuesRouter = require("./issues.js");

//constants
Expand All @@ -14,9 +14,14 @@ const PORT = process.env.PORT || 9000;
//initialization
const app = express();

app.use(cors({origin:process.env.REACT_URL}));
app.use(cors(
// {origin:process.env.REACT_URL}
));

mongoose.connect(process.env.MONGODB_CONNECTION_STRING, {useNewUrlParser: true, useUnifiedTopology: true});
mongoose.connect(
'mongodb://localhost:27017/ritech'
// process.env.MONGODB_CONNECTION_STRING
, {useNewUrlParser: true, useUnifiedTopology: true});
app.use(express.json());
//routes

Expand Down
Loading