Tengo una aplicación de reserva de citas y quiero que los detalles de la reserva se eliminen después de que expire la fecha reservada. ¿Cómo puedo lograr eso?
Lo probé con node-scheduler pero no funciona. y es una API simple con Crud Operations
Traté de llamar a Scheduler en index.js cuando se inicia el servidor
Aquí está mi código: //Programador
import nodeSchedule from "node-schedule"; import AppointsModel from "../models/AppointsModel.js"; const Scheduler = () => { const currentDate = new Date(); const currentTime = currentDate.getTime(); const expiredAppoints = AppointsModel.find({ date: { $lte: currentDate, }, time: { $lte: currentTime, }, }); console.log(expiredAppoints); expiredAppoints.then((appoints) => { appoints.forEach((appoint) => { AppointsModel.findByIdAndRemove(appoint._id); }); } ); }; export default Scheduler; //Controller import AppointsModel from './../models/AppointsModel.js'; import Scheduler from '../middleware/Scheduler.js'; export const CreateAppoint = async (req, res) => { try { //create a new appointment for react native app const newAppoint = new AppointsModel({ name: req.body.name, doctor: req.body.doctor, date: req.body.date, time: req.body.time, }) // don't save the appoint if there is already one with the same time const appoint = await AppointsModel.findOne({ time: req.body.time, date: req.body.date, doctor: req.body.doctor, name: req.body.name }); if (appoint) { res.status(400).json({ message: "Appointment already exists" }) } else { await newAppoint.save(); res.status(201).json({ message: "Appointment created successfully" }) } } catch (e) { res.status(400).json({ success: false, error: e }); } } export const GetAppoints = async (req, res) => { try{ const appoints = await AppointsModel.find(); res.status(200).json({ appoints }) } catch(error){ res.status(500).send(error); } } export const DeleteAppoint = async (req, res) => { try { const appoint = await AppointsModel.findByIdAndDelete(req.params.id); res.status(200).send({ message: 'Appointment deleted successfully' }); } catch (e) { res.status(400).json({ success: false, error: e }); } } export const UpdateAppoint = async (req, res) => { try { const appoint = await AppointsModel.findByIdAndUpdate(req.params.id, req.body); res.status(200).send({ message: 'Appointment updated successfully' }); } catch (e) { res.status(400).json({ success: false, error: e }); } }se puede hacer con TTL
prueba este artículo https://dev.to/lironer/delete-expired-documents-automatically-with-mongodb-ttl-index-l44
Agregue esto dentro de su modelo. Creará un índice TTL en su base de datos:
expireAt: { type: Date, expires: 3600 }Eliminará un documento después de 3600 segundos.
Luego simplemente agregue la clave expireAt y su tiempo como un valor a partir del cual comenzará la cuenta regresiva:
const newAppoint = new AppointsModel({ name: req.body.name, doctor: req.body.doctor, date: req.body.date, time: req.body.time, expireAt: new Date() // or any time you want })