app.js local storage
This commit is contained in:
@@ -3,6 +3,7 @@ require("dotenv").config();
|
|||||||
const express = require("express");
|
const express = require("express");
|
||||||
const cors = require("cors");
|
const cors = require("cors");
|
||||||
const admin = require("firebase-admin");
|
const admin = require("firebase-admin");
|
||||||
|
const fs = require("fs");
|
||||||
|
|
||||||
const app = express();
|
const app = express();
|
||||||
|
|
||||||
@@ -17,7 +18,31 @@ admin.initializeApp({
|
|||||||
|
|
||||||
const API_KEY = process.env.API_KEY;
|
const API_KEY = process.env.API_KEY;
|
||||||
|
|
||||||
|
const TOKEN_FILE = "./tokens.json";
|
||||||
|
|
||||||
|
function loadTokens() {
|
||||||
|
try {
|
||||||
|
if (!fs.existsSync(TOKEN_FILE)) return [];
|
||||||
|
const data = fs.readFileSync(TOKEN_FILE, "utf8");
|
||||||
|
return JSON.parse(data || "[]");
|
||||||
|
} catch (err) {
|
||||||
|
console.error("[ERROR] Failed to load tokens:", err);
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveTokens(tokens) {
|
||||||
|
try {
|
||||||
|
fs.writeFileSync(TOKEN_FILE, JSON.stringify(tokens, null, 2));
|
||||||
|
} catch (err) {
|
||||||
|
console.error("[ERROR] Failed to save tokens:", err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let deviceTokens = new Set(loadTokens());
|
||||||
|
|
||||||
function authMiddleware(req, res, next) {
|
function authMiddleware(req, res, next) {
|
||||||
|
console.log("[INFO] Incoming request to /push");
|
||||||
const authHeader = req.headers.authorization;
|
const authHeader = req.headers.authorization;
|
||||||
|
|
||||||
if (!authHeader) {
|
if (!authHeader) {
|
||||||
@@ -37,13 +62,37 @@ function authMiddleware(req, res, next) {
|
|||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
app.post("/register-token", (req, res) => {
|
||||||
|
console.log("[INFO] /register-token called");
|
||||||
|
|
||||||
|
const { token, platform } = req.body;
|
||||||
|
|
||||||
|
if (!token) {
|
||||||
|
return res.status(400).json({
|
||||||
|
error: "token required",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
deviceTokens.add(token);
|
||||||
|
|
||||||
|
saveTokens([...deviceTokens]);
|
||||||
|
|
||||||
|
console.log("[INFO] Token registered");
|
||||||
|
console.log("[DEBUG] Token:", token);
|
||||||
|
console.log("[DEBUG] Platform:", platform || "unknown");
|
||||||
|
console.log("[INFO] Total tokens:", deviceTokens.size);
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
success: true,
|
||||||
|
count: deviceTokens.size,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
app.post("/push", authMiddleware, async (req, res) => {
|
app.post("/push", authMiddleware, async (req, res) => {
|
||||||
|
console.log("[INFO] /push called");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const {
|
const { type = "none", title, message } = req.body;
|
||||||
type = "none",
|
|
||||||
title,
|
|
||||||
message,
|
|
||||||
} = req.body;
|
|
||||||
|
|
||||||
if (!title || !message) {
|
if (!title || !message) {
|
||||||
return res.status(400).json({
|
return res.status(400).json({
|
||||||
@@ -51,72 +100,69 @@ app.post("/push", authMiddleware, async (req, res) => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
let color = "#2196f3";
|
if (deviceTokens.size === 0) {
|
||||||
|
return res.status(400).json({
|
||||||
|
error: "No registered device tokens",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let color = "#9e9e9e";
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case "info":
|
case "info":
|
||||||
color = "#2196f3";
|
color = "#2196f3";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "warning":
|
case "warning":
|
||||||
color = "#ff9800";
|
color = "#ff9800";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "danger":
|
case "danger":
|
||||||
color = "#f44336";
|
color = "#f44336";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "none":
|
|
||||||
default:
|
|
||||||
color = "#9e9e9e";
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const payload = {
|
const messages = [];
|
||||||
topic: "global",
|
|
||||||
|
|
||||||
notification: {
|
for (const token of deviceTokens) {
|
||||||
title,
|
messages.push({
|
||||||
body: message,
|
token,
|
||||||
},
|
|
||||||
|
|
||||||
data: {
|
|
||||||
type,
|
|
||||||
color,
|
|
||||||
},
|
|
||||||
|
|
||||||
android: {
|
|
||||||
priority: "high",
|
|
||||||
notification: {
|
notification: {
|
||||||
|
title,
|
||||||
|
body: message,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
type,
|
||||||
color,
|
color,
|
||||||
},
|
},
|
||||||
},
|
android: {
|
||||||
|
priority: "high",
|
||||||
apns: {
|
notification: { color },
|
||||||
payload: {
|
},
|
||||||
aps: {
|
apns: {
|
||||||
sound: "default",
|
payload: {
|
||||||
|
aps: { sound: "default" },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
webpush: {
|
||||||
|
notification: {
|
||||||
webpush: {
|
icon: "/icon-192.png",
|
||||||
notification: {
|
},
|
||||||
icon: "/icon-192.png",
|
|
||||||
},
|
},
|
||||||
},
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
const response = await admin
|
console.log("[INFO] Sending messages...");
|
||||||
.messaging()
|
const response = await admin.messaging().sendEach(messages);
|
||||||
.send(payload);
|
|
||||||
|
console.log("[INFO]:", response.successCount);
|
||||||
|
console.log("[ERROR]:", response.failureCount);
|
||||||
|
|
||||||
res.json({
|
res.json({
|
||||||
success: true,
|
success: true,
|
||||||
firebaseResponse: response,
|
successCount: response.successCount,
|
||||||
|
failureCount: response.failureCount,
|
||||||
});
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(err);
|
console.error("[ERROR] PUSH:", err);
|
||||||
|
|
||||||
res.status(500).json({
|
res.status(500).json({
|
||||||
error: err.message,
|
error: err.message,
|
||||||
@@ -127,5 +173,9 @@ app.post("/push", authMiddleware, async (req, res) => {
|
|||||||
const PORT = process.env.PORT || 3000;
|
const PORT = process.env.PORT || 3000;
|
||||||
|
|
||||||
app.listen(PORT, () => {
|
app.listen(PORT, () => {
|
||||||
console.log(`Server running on ${PORT}`);
|
console.log("=================================");
|
||||||
|
console.log("Push Server started");
|
||||||
|
console.log("Port:", PORT);
|
||||||
|
console.log("Tokens:", TOKEN_FILE);
|
||||||
|
console.log("=================================");
|
||||||
});
|
});
|
||||||
Reference in New Issue
Block a user