// Opens the shared Mongoose connection used by the API and seed script.
const mongoose = require('mongoose');
const connectDB = async () => {
const connection = await mongoose.connect(
process.env.MONGODB_URI || 'mongodb://127.0.0.1:27017/taskflow'
);
console.log(`MongoDB connected: ${connection.connection.host}`);
return connection;
};
module.exports = connectDB;
// Implements all REST operations and query filtering for TaskFlow tasks.
const mongoose = require('mongoose');
const Task = require('../models/Task');
const escapeRegex = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
const buildFilter = ({ priority, status, search }) => {np
const filter = {};
if (priority) filter.priority = priority;
if (status) filter.$or = [{ simpleStatus: status }, { detailedStatus: status }];
if (search) {
const matcher = new RegExp(escapeRegex(search), 'i');
const conditions = [{ name: matcher }, { description: matcher }];
if (filter.$or) filter.$and = [{ $or: filter.$or }, { $or: conditions }];
else filter.$or = conditions;
}
return filter;
};
const getTasks = async (req, res, next) => {
try {
const tasks = await Task.find(buildFilter(req.query)).sort({ createdAt: 1 });
res.json(tasks);
} catch (error) {
next(error);
}
};
const createTask = async (req, res, next) => {
try {
const task = await Task.create(req.body);
res.status(201).json(task);
} catch (error) {
next(error);
}
};
const updateTask = async (req, res, next) => {
try {
if (!mongoose.isValidObjectId(req.params.id)) {
return res.status(400).json({ message: 'Invalid task id' });
}
const task = await Task.findByIdAndUpdate(req.params.id, req.body, {
new: true,
runValidators: true,
overwrite: req.method === 'PUT',
});
if (!task) return res.status(404).json({ message: 'Task not found' });
return res.json(task);
} catch (error) {
return next(error);
}
};
const deleteTask = async (req, res, next) => {
try {
if (!mongoose.isValidObjectId(req.params.id)) {
return res.status(400).json({ message: 'Invalid task id' });
}
const task = await Task.findByIdAndDelete(req.params.id);
if (!task) return res.status(404).json({ message: 'Task not found' });
return res.json({ message: 'Task deleted' });
} catch (error) {
return next(error);
}
};
module.exports = { getTasks, createTask, updateTask, deleteTask };
[
{ "name": "Design Homepage UI", "description": "Create wireframe and UI for the homepage", "priority": "High", "detailedStatus": "In Progress", "simpleStatus": "Done", "dueDate": "2024-04-22", "progress": 75 },
{ "name": "API Integration", "description": "Integrate backend APIs with frontend", "priority": "Medium", "detailedStatus": "To Do", "simpleStatus": "Pending", "dueDate": "2024-04-25", "progress": 40 },
{ "name": "Fix Dashboard Bugs", "description": "Resolve issues reported in dashboard", "priority": "High", "detailedStatus": "Review", "simpleStatus": "Pending", "dueDate": "2024-04-27", "progress": 60 },
{ "name": "Write Unit Tests", "description": "Add unit tests for components", "priority": "Low", "detailedStatus": "In Progress", "simpleStatus": "Done", "dueDate": "2024-04-21", "progress": 30 },
{ "name": "Update Documentation", "description": "Update project documentation", "priority": "Low", "detailedStatus": "To Do", "simpleStatus": "Pending", "dueDate": "2024-04-30", "progress": 20 },
{ "name": "Database Schema", "description": "Finalize MongoDB task collections", "priority": "High", "detailedStatus": "Done", "simpleStatus": "Done", "dueDate": "2024-04-18", "progress": 100 },
{ "name": "Responsive Layout", "description": "Make dashboard responsive on tablets", "priority": "Medium", "detailedStatus": "In Progress", "simpleStatus": "Done", "dueDate": "2024-05-02", "progress": 55 },
{ "name": "User Profile", "description": "Build the profile placeholder screen", "priority": "Low", "detailedStatus": "To Do", "simpleStatus": "Done", "dueDate": "2024-05-04", "progress": 10 },
{ "name": "Code Review", "description": "Review frontend component structure", "priority": "Medium", "detailedStatus": "Review", "simpleStatus": "Done", "dueDate": "2024-05-06", "progress": 85 },
{ "name": "Deployment Setup", "description": "Prepare the production environment", "priority": "High", "detailedStatus": "In Progress", "simpleStatus": "Pending", "dueDate": "2024-05-08", "progress": 45 },
{ "name": "Accessibility Audit", "description": "Check labels, contrast, and keyboard use", "priority": "Medium", "detailedStatus": "To Do", "simpleStatus": "Done", "dueDate": "2024-05-10", "progress": 15 },
{ "name": "Release Checklist", "description": "Complete the final release checklist", "priority": "Low", "detailedStatus": "Done", "simpleStatus": "Done", "dueDate": "2024-05-12", "progress": 100 }
]
// Defines the MongoDB shape and validation rules for a TaskFlow task.
const mongoose = require('mongoose');
const taskSchema = new mongoose.Schema(
{
name: { type: String, required: true, trim: true },
description: { type: String, default: '', trim: true },
priority: { type: String, enum: ['High', 'Medium', 'Low'], required: true },
detailedStatus: {
type: String,
enum: ['To Do', 'In Progress', 'Review', 'Done'],
required: true,
},
simpleStatus: { type: String, enum: ['Pending', 'Done'], required: true },
dueDate: { type: Date, required: true },
progress: { type: Number, min: 0, max: 100, required: true },
},
{ timestamps: true }
);
module.exports = mongoose.model('Task', taskSchema);