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
97 changes: 97 additions & 0 deletions backend/controllers/todosControllers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
const todos = require("../data/data.js");

// gets all todo items
exports.getAllTodos = (req, res) => {
res.json(todos);
};

// gets a todo item by id
exports.getTodoById = (req, res) => {
const id = parseInt(req.params.id);
if (isNaN(id)) {
return res.status(400).json({ message: "Invalid ID" });
}
const todo = todos.find((t) => {
return t.id === id;
});

if (!todo) {
return res.status(400).json({ message: "Todo not found" });
}

res.json(todo);
};

// creates a new todo item
exports.createTodo = (req, res) => {
const { title } = req.body;

if (!title) {
return res.status(404).json({ message: "Title is required" });
}

const date = new Date();
const newTodo = {
id: todos.length ? todos[todos.length - 1].id + 1 : 1,
title: title,
completed: false,
createdAt: date.toLocaleDateString("en-US"),
};

todos.push(newTodo);
res.status(201).json(newTodo);
};

// updates the todo item
exports.updateTodoById = (req, res) => {
const id = parseInt(req.params.id);
if (isNaN(id)) {
return res.status(400).json({ message: "Invalid ID" });
}

const todo = todos.find((t) => {
return t.id === id;
});

if (!todo) {
return res.status(404).json({ message: "Todo not found" });
}

const { title, completed } = req.body;

//updates todo Item if values are provided
if (title !== undefined) {
todo.title = title;
}
if (completed !== undefined) {
if (typeof completed !== "boolean") {
// validation if completed is boolean
return res.status(400).json({ message: "Completed must be boolean" });
}
todo.completed = completed;
}
res.json(todo);
};

// deletes todo item by id
exports.deleteTodoById = (req, res) => {
const id = parseInt(req.params.id);

if (isNaN(id)) {
return res.status(400).json({ message: "Invalid ID" });
}
const todoIndex = todos.findIndex((t) => {
return t.id === id;
});

if (todoIndex === -1) {
return res.status(404).json({ message: "Todo not found" });
}

const deletedTodo = todos.splice(todoIndex, 1);

res.json({
message: "Deleted Todo successfully.",
todo: deletedTodo[0],
});
};
18 changes: 18 additions & 0 deletions backend/data/data.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// sample data

const todos = [
{
id: 1,
title: "Cook pasta",
completed: true,
createdAt: "01-01-2026",
},
{
id: 2,
title: "Do homework",
completed: true,
createdAt: "03-23-2026",
},
];

module.exports = todos;
21 changes: 21 additions & 0 deletions backend/routes/todos.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
const express = require("express");
const router = express.Router();
const {
getAllTodos,
getTodoById,
createTodo,
updateTodoById,
deleteTodoById,
} = require("../controllers/todosControllers.js");

router.get("/", getAllTodos);

router.get("/:id", getTodoById);

router.post("/", createTodo);

router.put("/:id", updateTodoById);

router.delete("/:id", deleteTodoById);

module.exports = router;
12 changes: 7 additions & 5 deletions backend/index.js → backend/server.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
// todo API

const express = require("express");
const app = express();
const PORT = process.env.PORT || 4000;
const PORT = process.env.PORT || 10533;
const todoRoutes = require("./routes/todos.js");

// Basic route
app.get("/", (req, res) => {
res.send("Hello from Express!");
});
app.use(express.json());

app.use("/api/todos", todoRoutes);

// Start server
app.listen(PORT, () => {
Expand Down
Loading