feat: add task routes, dotenv config, and error handling

This commit is contained in:
ikechukwu Elizabeth
2026-04-04 05:06:20 +01:00
parent 3df9fbc1b8
commit fabfe4dae8
4 changed files with 68 additions and 7 deletions
+1
View File
@@ -0,0 +1 @@
PORT=3000
+16 -3
View File
@@ -8,6 +8,7 @@
"name": "task-backend",
"version": "1.0.0",
"dependencies": {
"dotenv": "^17.4.0",
"express": "^4.21.2"
}
},
@@ -156,6 +157,18 @@
"npm": "1.2.8000 || >= 1.4.16"
}
},
"node_modules/dotenv": {
"version": "17.4.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.0.tgz",
"integrity": "sha512-kCKF62fwtzwYm0IGBNjRUjtJgMfGapII+FslMHIjMR5KTnwEmBmWLDRSnc3XSNP8bNy34tekgQyDT0hr7pERRQ==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://dotenvx.com"
}
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@@ -559,9 +572,9 @@
}
},
"node_modules/path-to-regexp": {
"version": "0.1.12",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
"integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
"version": "0.1.13",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz",
"integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==",
"license": "MIT"
},
"node_modules/proxy-addr": {
+3 -1
View File
@@ -4,9 +4,11 @@
"description": "Backend API for scalable task platform",
"main": "server.js",
"scripts": {
"start": "node server.js"
"start": "node server.js",
"dev": "node --watch server.js"
},
"dependencies": {
"dotenv": "^17.4.0",
"express": "^4.21.2"
}
}
+48 -3
View File
@@ -1,16 +1,61 @@
require("dotenv").config();
const express = require("express");
const app = express();
const PORT = 3000;
const PORT = process.env.PORT || 3000;
app.use(express.json());
// In-memory task store
let tasks = [];
let nextId = 1;
// Routes
app.get("/", (req, res) => {
res.send("Task backend is running");
res.json({ message: "Task API is running", version: "1.0.0" });
});
app.get("/health", (req, res) => {
res.status(200).json({ status: "healthy" });
res.status(200).json({ status: "healthy", uptime: process.uptime() });
});
app.get("/tasks", (req, res) => {
res.json(tasks);
});
app.post("/tasks", (req, res) => {
const { title } = req.body;
if (!title) {
return res.status(400).json({ error: "Title is required" });
}
const task = { id: nextId++, title, completed: false, createdAt: new Date() };
tasks.push(task);
res.status(201).json(task);
});
app.patch("/tasks/:id", (req, res) => {
const task = tasks.find((t) => t.id === parseInt(req.params.id));
if (!task) return res.status(404).json({ error: "Task not found" });
task.completed = !task.completed;
res.json(task);
});
app.delete("/tasks/:id", (req, res) => {
const index = tasks.findIndex((t) => t.id === parseInt(req.params.id));
if (index === -1) return res.status(404).json({ error: "Task not found" });
tasks.splice(index, 1);
res.status(204).send();
});
// 404 handler
app.use((req, res) => {
res.status(404).json({ error: "Route not found" });
});
// Global error handler
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({ error: "Internal server error" });
});
app.listen(PORT, () => {