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.php", (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 router.get("/", (req, res) => { res.sendFile(path.join(__dirname, "public", "index.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}`); });