const mongoose = require("mongoose"); const TaskSchema = new mongoose.Schema( { street: { type: mongoose.Schema.Types.ObjectId, ref: "Street", required: true, index: true, }, description: { type: String, required: true, }, completedBy: { type: mongoose.Schema.Types.ObjectId, ref: "User", index: true, }, status: { type: String, enum: ["pending", "completed"], default: "pending", index: true, }, }, { timestamps: true, }, ); // Compound indexes for common queries TaskSchema.index({ street: 1, status: 1 }); TaskSchema.index({ completedBy: 1, status: 1 }); // Update user relationship when task is completed TaskSchema.post("save", async function (doc) { if (doc.completedBy && doc.status === "completed") { const User = mongoose.model("User"); // Add task to user's completedTasks if not already there await User.updateOne( { _id: doc.completedBy }, { $addToSet: { completedTasks: doc._id } } ); } }); // Cascade cleanup when a task is deleted TaskSchema.pre("deleteOne", { document: true, query: false }, async function () { const User = mongoose.model("User"); // Remove task from user's completedTasks if (this.completedBy) { await User.updateOne( { _id: this.completedBy }, { $pull: { completedTasks: this._id } } ); } }); module.exports = mongoose.model("Task", TaskSchema);