Files
firebase-push/app.js
T
Thies Mueller 437f16fef1 initial
2026-05-16 16:47:04 +02:00

132 lines
2.1 KiB
JavaScript

require("dotenv").config();
const express = require("express");
const cors = require("cors");
const admin = require("firebase-admin");
const app = express();
app.use(cors());
app.use(express.json());
admin.initializeApp({
credential: admin.credential.cert(
require("./serviceAccountKey.json")
),
});
const API_KEY = process.env.API_KEY;
function authMiddleware(req, res, next) {
const authHeader = req.headers.authorization;
if (!authHeader) {
return res.status(401).json({
error: "Missing Authorization Header",
});
}
const token = authHeader.replace("Bearer ", "");
if (token !== API_KEY) {
return res.status(403).json({
error: "Invalid API Key",
});
}
next();
}
app.post("/push", authMiddleware, async (req, res) => {
try {
const {
type = "none",
title,
message,
} = req.body;
if (!title || !message) {
return res.status(400).json({
error: "title and message required",
});
}
let color = "#2196f3";
switch (type) {
case "info":
color = "#2196f3";
break;
case "warning":
color = "#ff9800";
break;
case "danger":
color = "#f44336";
break;
case "none":
default:
color = "#9e9e9e";
break;
}
const payload = {
topic: "global",
notification: {
title,
body: message,
},
data: {
type,
color,
},
android: {
priority: "high",
notification: {
color,
},
},
apns: {
payload: {
aps: {
sound: "default",
},
},
},
webpush: {
notification: {
icon: "/icon-192.png",
},
},
};
const response = await admin
.messaging()
.send(payload);
res.json({
success: true,
firebaseResponse: response,
});
} catch (err) {
console.error(err);
res.status(500).json({
error: err.message,
});
}
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server running on ${PORT}`);
});