All checks were successful
Build SMS Gateway / Build image (push) Successful in 16s
126 lines
3.5 KiB
JavaScript
126 lines
3.5 KiB
JavaScript
const express = require("express");
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
|
|
const app = express();
|
|
const PORT = process.env.PORT || 3000;
|
|
const BASE_FILE = path.join(__dirname, "data", "base.json");
|
|
const BASE_PATH = (process.env.BASE_PATH || "/").replace(/\/$/, "") || "/";
|
|
|
|
// Auth credentials from environment
|
|
const AUTH_LOGIN = process.env.SMS_LOGIN;
|
|
const AUTH_PASSWORD = process.env.SMS_PASSWORD;
|
|
|
|
// Router for all endpoints
|
|
const router = express.Router();
|
|
|
|
// Middleware
|
|
app.use(express.urlencoded({ extended: true }));
|
|
app.use(express.json());
|
|
|
|
// Ensure data directory and base.json exist
|
|
function ensureBaseFile() {
|
|
const dataDir = path.dirname(BASE_FILE);
|
|
if (!fs.existsSync(dataDir)) {
|
|
fs.mkdirSync(dataDir, { recursive: true });
|
|
}
|
|
if (!fs.existsSync(BASE_FILE)) {
|
|
fs.writeFileSync(BASE_FILE, JSON.stringify({ messages: [] }, null, 2));
|
|
}
|
|
}
|
|
|
|
// Read messages from base.json
|
|
function readMessages() {
|
|
ensureBaseFile();
|
|
const data = fs.readFileSync(BASE_FILE, "utf8");
|
|
return JSON.parse(data).messages;
|
|
}
|
|
|
|
// Write messages to base.json
|
|
function writeMessages(messages) {
|
|
ensureBaseFile();
|
|
fs.writeFileSync(BASE_FILE, JSON.stringify({ messages }, null, 2));
|
|
}
|
|
|
|
// POST /send-msg - receive and log SMS
|
|
router.post("/send", (req, res) => {
|
|
const { login, psw, phones, mes } = req.body;
|
|
|
|
if (!login || !psw || !phones || !mes) {
|
|
return res.json({ error: "Отсутствуют обязательные параметры", error_code: 1 });
|
|
}
|
|
|
|
// Validate credentials
|
|
if (login !== AUTH_LOGIN || psw !== AUTH_PASSWORD) {
|
|
return res.json({ error: "Ошибка авторизации", error_code: 2 });
|
|
}
|
|
|
|
const message = {
|
|
id: Date.now(),
|
|
timestamp: new Date().toISOString(),
|
|
login,
|
|
phone: phones,
|
|
message: mes,
|
|
};
|
|
|
|
const messages = readMessages();
|
|
messages.push(message);
|
|
writeMessages(messages);
|
|
|
|
console.log(`[${message.timestamp}] SMS to ${phones}: ${mes}`);
|
|
|
|
res.json({ id: message.id, cnt: 1 });
|
|
});
|
|
|
|
// GET /view-all-sms - view all logged messages
|
|
router.get("/view-all-sms", (req, res) => {
|
|
const messages = readMessages();
|
|
res.json({ messages });
|
|
});
|
|
|
|
// POST /clear-all-sms - clear all messages
|
|
router.post("/clear-all-sms", (req, res) => {
|
|
writeMessages([]);
|
|
console.log("All messages cleared");
|
|
res.json({ status: "ok", message: "All messages cleared" });
|
|
});
|
|
|
|
// GET /balance - get account balance (SMSC API compatible)
|
|
router.get("/balance", (req, res) => {
|
|
const { login, psw } = req.query;
|
|
|
|
if (!login || !psw) {
|
|
return res.json({ error: "Отсутствуют обязательные параметры", error_code: 1 });
|
|
}
|
|
|
|
if (login !== AUTH_LOGIN || psw !== AUTH_PASSWORD) {
|
|
return res.json({ error: "Ошибка авторизации", error_code: 2 });
|
|
}
|
|
|
|
res.json({ balance: "1000.00" });
|
|
});
|
|
|
|
// Serve static files
|
|
router.use(express.static(path.join(__dirname, "public")));
|
|
|
|
// GET / - serve main page with injected credentials
|
|
router.get("/", (req, res) => {
|
|
const indexPath = path.join(__dirname, "public", "index.html");
|
|
let html = fs.readFileSync(indexPath, "utf8");
|
|
|
|
// Inject credentials for frontend
|
|
const configScript = `<script>window.SMS_CONFIG = { login: "${AUTH_LOGIN || ""}", psw: "${AUTH_PASSWORD || ""}" };</script>`;
|
|
html = html.replace("</head>", configScript + "</head>");
|
|
|
|
res.send(html);
|
|
});
|
|
|
|
// Mount router at BASE_PATH
|
|
app.use(BASE_PATH, router);
|
|
|
|
// Initialize and start server
|
|
ensureBaseFile();
|
|
app.listen(PORT, () => {
|
|
console.log(`SMS OTP Gateway running on port ${PORT}, base path: ${BASE_PATH}`);
|
|
});
|