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
34 changes: 34 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: Build on PR

on:
pull_request:
branches:
- '*'

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: '20'

- name: Install Dependencies in Frontend
run: |
cd frontend
npm install

- name: Install Dependencies in Backend
run: |
cd backend
npm install

- name: Run Frontend Build
run: |
cd frontend
npm run build


6 changes: 3 additions & 3 deletions backend/config.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
const JWT_SECRET = "IAMGAYLOL";

module.exports = JWT_SECRET;
const JWT_SECRET = "IAMGAYLOL";
module.exports = JWT_SECRET;
58 changes: 29 additions & 29 deletions backend/db.js
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
const mongoose = require("mongoose");
mongoose.connect("mongodb://localhost:27017/basicTodoApp");

const UserSchema = mongoose.Schema({
firstName: String,
lastName: String,
username: String,
password: String,
todos: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "Todo",
},
],
});

const TodoSchema = mongoose.Schema({
title: String,
description: String,
completed: Boolean,
});

const User = mongoose.model("User", UserSchema);
const Todo = mongoose.model("Todo", TodoSchema);

module.exports = {
User,
Todo,
};
const mongoose = require("mongoose");
mongoose.connect("mongodb://localhost:27017/basicTodoApp");
const UserSchema = mongoose.Schema({
firstName: String,
lastName: String,
username: String,
password: String,
todos: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "Todo",
},
],
});
const TodoSchema = mongoose.Schema({
title: String,
description: String,
completed: Boolean,
});
const User = mongoose.model("User", UserSchema);
const Todo = mongoose.model("Todo", TodoSchema);
module.exports = {
User,
Todo,
};
36 changes: 18 additions & 18 deletions backend/index.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
const express = require("express");
const PORT = 3000;
const bodyParser = require("body-parser");
const userRouter = require("./routes/user");
const cors = require("cors");

const app = express();
app.use(cors());
app.use(bodyParser.json());
app.use("/user", userRouter);

app.get("/", (req, res) => {
res.send("Hello World! Welcome to Todo");
});

app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
const express = require("express");
const PORT = 3000;
const bodyParser = require("body-parser");
const userRouter = require("./routes/user");
const cors = require("cors");
const app = express();
app.use(cors());
app.use(bodyParser.json());
app.use("/user", userRouter);
app.get("/", (req, res) => {
res.send("Hello World! Welcome to Todo");
});
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
86 changes: 43 additions & 43 deletions backend/middleware/authMiddleware.js
Original file line number Diff line number Diff line change
@@ -1,43 +1,43 @@
const jwt = require("jsonwebtoken");
const JWT_SECRET = require("../config");

const authMiddleware = (req, res, next) => {
const authHeader = req.headers.authorization;

if (!authHeader) {
return res.status(401).json({
message: "No Authorization Header Found",
});
}

const words = authHeader.split(" ");

if (words[0] !== "Bearer" || words.length !== 2) {
return res.status(401).json({
message: "Invalid Token Format",
});
}

const token = words[1];

try {
const decoded = jwt.verify(token, JWT_SECRET);

if (decoded.userId) {
req.userId = decoded.userId;
next();
} else {
res.status(401).json({
message: "Invalid Token",
});
}
} catch (error) {
console.error("The Error is " + error);
res.status(500).json({
message: "Some Error Occurred",
error: error.message,
});
}
};

module.exports = authMiddleware; // Ensure this is correct
const jwt = require("jsonwebtoken");
const JWT_SECRET = require("../config");
const authMiddleware = (req, res, next) => {
const authHeader = req.headers.authorization;
if (!authHeader) {
return res.status(401).json({
message: "No Authorization Header Found",
});
}
const words = authHeader.split(" ");
if (words[0] !== "Bearer" || words.length !== 2) {
return res.status(401).json({
message: "Invalid Token Format",
});
}
const token = words[1];
try {
const decoded = jwt.verify(token, JWT_SECRET);
if (decoded.userId) {
req.userId = decoded.userId;
next();
} else {
res.status(401).json({
message: "Invalid Token",
});
}
} catch (error) {
console.error("The Error is " + error);
res.status(500).json({
message: "Some Error Occurred",
error: error.message,
});
}
};
module.exports = authMiddleware; // Ensure this is correct
96 changes: 48 additions & 48 deletions backend/middleware/validateMiddleware.js
Original file line number Diff line number Diff line change
@@ -1,48 +1,48 @@
const zod = require("zod");
const { default: errorMap } = require("zod/locales/en.js");

const validateMiddleware = (schema) => (req, res, next) => {
try {
const result = schema.safeParse(req.body);
if (!result.success) {
return res.status(400).json({
message: "Validation Error",
errors: result.error.errors.map((err) => ({
path: err.path.join("."), // Path of the field with the error
message: err.message, // Error message
})),
});
}
next();
} catch (error) {
return res.status(500).json({
message: "Internal Server Error",
error: error.message,
});
}
};

const userSchema = zod.object({
firstName: zod.string().min(1).max(30), // Should not be empty
lastName: zod.string().min(1).max(30), // Should not be empty
username: zod.string().email().min(1), // Should not be empty and must be a valid email
password: zod.string().min(8).max(20), // Length constraints
});

const signinSchema = zod.object({
username: zod.string().email(),
password: zod.string().min(8).max(20),
});

const todoSchema = zod.object({
title: zod.string().min(1, "Title is required").max(30),
description: zod.string().optional(),
completed: zod.boolean(),
});

module.exports = {
userSchema,
todoSchema,
signinSchema,
validateMiddleware,
};
const zod = require("zod");
const { default: errorMap } = require("zod/locales/en.js");
const validateMiddleware = (schema) => (req, res, next) => {
try {
const result = schema.safeParse(req.body);
if (!result.success) {
return res.status(400).json({
message: "Validation Error",
errors: result.error.errors.map((err) => ({
path: err.path.join("."), // Path of the field with the error
message: err.message, // Error message
})),
});
}
next();
} catch (error) {
return res.status(500).json({
message: "Internal Server Error",
error: error.message,
});
}
};
const userSchema = zod.object({
firstName: zod.string().min(1).max(30), // Should not be empty
lastName: zod.string().min(1).max(30), // Should not be empty
username: zod.string().email().min(1), // Should not be empty and must be a valid email
password: zod.string().min(8).max(20), // Length constraints
});
const signinSchema = zod.object({
username: zod.string().email(),
password: zod.string().min(8).max(20),
});
const todoSchema = zod.object({
title: zod.string().min(1, "Title is required").max(30),
description: zod.string().optional(),
completed: zod.boolean().optional(),
});
module.exports = {
userSchema,
todoSchema,
signinSchema,
validateMiddleware,
};
Loading
Loading