Merhaba değerli forum kullanıcıları,
NodeJS de socket.io ile veritabanına veri yazma işlemi yapan ve sonrasında node-cron ile oluşturulan verinin date fieldının value sundan 30 dakika önce ve 15 dakika önce web-push ile notification göndertmek istiyorum fakat yaşadığım problem şu ki tüm işlemler çalışıyor veri, kaydediyor vs fakat cronJob dan kaynaklı bir nedenden ötürü belirttiğim zaman süreci içinde notification push etmiyor.
Dedim belki notification da bir problem vardır fakat onu ayrı kontrol ettim ve çalışıyor, tahminimce ve araştırmalarımca cron için tarih formatlaması doğru değil fakat çözemedim yardımcı olursanız çok sevinirim, saygılarımla 😊
socket.js Kodu
const socketIo = require("socket.io");
const Pages = require("../models/pagesSchema");
const Meets = require("../models/meetSchema");
const dotenvConfig = require("../configs/envConfig/index");
const cron = require("node-cron");
const webPush = require("web-push");
const moment = require("moment");
const express = require("express");
const cors = require("cors");
dotenvConfig();
const app = express();
app.use(cors());
const publicVapidKey = process.env.PUBLIC_VAPID_KEY;
const privateVapidKey = process.env.PRIVATE_VAPID_KEY;
webPush.setVapidDetails(process.env.MAIL_TO, publicVapidKey, privateVapidKey);
const sendPushNotification = (subscription, message) => {
const payload = JSON.stringify({ title: "Randevu Hatırlatıcı", body: message });
webPush
.sendNotification(subscription, payload)
.then(() => console.log("Bildirim başarıyla gönderildi:", message))
.catch((error) => console.error("Push Notification Error:", error));
};
const scheduleAppointmentNotification = (subscription, formattedDate) => {
const notificationTimes = [
{ time: moment(formattedDate).subtract(20, "minutes"), message: "Randevunuz 30 dakika sonra başlıyor!" },
{ time: moment(formattedDate).subtract(15, "minutes"), message: "Randevunuz 15 dakika sonra başlıyor!" },
];
notificationTimes.forEach(({ time, message }) => {
if (time.isAfter(moment())) {
const cronExpression = `${time.minutes()} ${time.hours()} ${time.date()} ${time.month() + 1} *`;
cron.schedule(cronExpression, () => {
console.log(message);
sendPushNotification(subscription, message);
});
}
});
};
module.exports = function (server) {
const io = socketIo(server, {
cors: {
origin: "*",
methods: ["GET", "POST"],
},
});
io.on("connection", (socket) => {
console.log("Yeni bir kullanıcı bağlandı:", socket.id);
socket.on("get-meet-data", async (data) => {
try {
const pageId = data.pageId;
if (!pageId) {
return socket.emit("pendingMeets", { status: "error", message: "Page ID is missing" });
}
const page = await Pages.findById(pageId).populate("meet");
if (!page) {
return socket.emit("pendingMeets", { status: "error", message: "Page not found" });
}
const pendingMeets = page.meet.filter((meet) => !meet.isDone);
socket.emit("pendingMeets", {
status: "success",
message: "Pending meets fetched successfully",
data: pendingMeets,
});
} catch (error) {
console.error("Error fetching meet data:", error);
socket.emit("pendingMeets", { status: "error", message: error.message });
}
});
socket.on("add-data", async (data) => {
try {
const { pageId, date, price, models, sex, fullName, personal, subscription } = data;
const ip = socket.handshake.headers["x-forwarded-for"] || socket.handshake.address;
const userAgent = socket.handshake.headers["user-agent"];
const deviceIdentifier = `${userAgent} - ${ip}`;
const page = await Pages.findById(pageId);
if (!page || !date || !fullName || !personal ||
typeof price !== "number" || price <= 0 ||
!Array.isArray(models) || models.length === 0 || !subscription) {
return socket.emit("newMeet", { message: "Lütfen hizmetleri seçiniz" });
}
const existingMeet = await Meets.find({
date: new Date(date).toISOString(),
personal,
});
if (existingMeet.length > 0) {
return socket.emit("newMeet", { message: "Bu tarih için randevu uygun değildir" });
}
const formattedDate = new Date(date).toISOString();
const meet = new Meets({
code: Math.floor(100000000000 + Math.random() * 900000000000),
date: formattedDate,
price: price,
models: models,
isDone: false,
device: deviceIdentifier,
sex: sex,
fullName: fullName,
personal: personal,
subscription: subscription,
});
const savedMeet = await meet.save();
const updatedPage = await Pages.findByIdAndUpdate(
pageId,
{ $push: { meet: savedMeet._id } },
{ new: true, useFindAndModify: false }
);
scheduleAppointmentNotification(savedMeet.subscription, formattedDate);
if (!updatedPage) {
return socket.emit("newMeet", { message: "Page not found" });
}
io.emit("newMeet", {
status: "success",
message: "New meet added successfully",
meet: savedMeet,
});
} catch (error) {
console.error("Randevu eklenirken hata:", error);
socket.emit("newMeet", { message: error.message });
}
});
socket.on("complete-or-cancel-meet", async (data, callback) => {
try {
const { meetId, isDoneBooleanValue } = data;
const meet = await Meets.findById(meetId);
if (!meet) {
return callback({ status: "error", message: "Meet not found" });
}
if (isDoneBooleanValue === "false") {
meet.isCancel = true;
meet.isDone = false;
} else {
meet.isDone = true;
meet.isCancel = false;
}
await meet.save();
callback({
status: "success",
message:
isDoneBooleanValue === "false"
? "Meet successfully canceled"
: "Meet successfully completed",
});
io.emit("meet-updated", meet);
} catch (error) {
callback({ status: "fail", message: error.message });
}
});
socket.on("disconnect", () => {
console.log("Bir kullanıcı bağlantıyı kesti:", socket.id);
});
});
return io;
};