app.js local storage

This commit is contained in:
Thies Mueller
2026-05-16 17:14:00 +02:00
parent 9b92e834d0
commit 7146f9af88
+97 -47
View File
@@ -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("=================================");
});