113 lines
3.9 KiB
JavaScript
113 lines
3.9 KiB
JavaScript
|
|
const express = require('express');
|
|||
|
|
const cors = require('cors');
|
|||
|
|
const app = express();
|
|||
|
|
|
|||
|
|
// Middleware
|
|||
|
|
app.use(cors());
|
|||
|
|
app.use(express.json());
|
|||
|
|
|
|||
|
|
// Конфигурация версий - обновляйте это при каждом релизе
|
|||
|
|
const RELEASES = {
|
|||
|
|
stable: {
|
|||
|
|
version: "2.5.8",
|
|||
|
|
build_number: "258",
|
|||
|
|
is_prerelease: false,
|
|||
|
|
download_url: "https://your-storage.com/downloads/umbrix-2.5.8.apk",
|
|||
|
|
release_notes: "Стабильная версия с важными исправлениями:\n\n✨ Новое:\n- Улучшенная система обновлений\n- Оптимизация производительности\n\n🐛 Исправлено:\n- Проблемы с подключением\n- Баги стабильности",
|
|||
|
|
published_at: "2026-01-16T10:00:00Z"
|
|||
|
|
},
|
|||
|
|
beta: {
|
|||
|
|
version: "2.6.0-beta.1",
|
|||
|
|
build_number: "260",
|
|||
|
|
is_prerelease: true,
|
|||
|
|
download_url: "https://your-storage.com/downloads/umbrix-2.6.0-beta.1.apk",
|
|||
|
|
release_notes: "Бета-версия с экспериментальными функциями:\n\n🚀 Новые функции:\n- Новый интерфейс\n- Расширенные настройки\n\n⚠️ Внимание: Это бета-версия, могут быть баги!",
|
|||
|
|
published_at: "2026-01-17T08:00:00Z"
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// API ключ для защиты (опционально)
|
|||
|
|
const API_KEY = process.env.API_KEY || 'your-secret-api-key-change-this';
|
|||
|
|
|
|||
|
|
// Middleware для проверки API ключа (опционально)
|
|||
|
|
function checkApiKey(req, res, next) {
|
|||
|
|
const apiKey = req.headers['x-api-key'];
|
|||
|
|
|
|||
|
|
// Если API_KEY не установлен, пропускаем проверку
|
|||
|
|
if (API_KEY === 'your-secret-api-key-change-this') {
|
|||
|
|
return next();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!apiKey || apiKey !== API_KEY) {
|
|||
|
|
return res.status(401).json({
|
|||
|
|
error: 'Unauthorized',
|
|||
|
|
message: 'Invalid or missing API key'
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
next();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Endpoint для получения последней версии
|
|||
|
|
app.get('/api/updates/latest', checkApiKey, (req, res) => {
|
|||
|
|
const includePrerelease = req.query.include_prerelease === 'true';
|
|||
|
|
const release = includePrerelease ? RELEASES.beta : RELEASES.stable;
|
|||
|
|
|
|||
|
|
// Логирование запросов
|
|||
|
|
console.log(`[${new Date().toISOString()}] Update check: prerelease=${includePrerelease}`);
|
|||
|
|
|
|||
|
|
res.json(release);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// Endpoint для аналитики (опционально)
|
|||
|
|
app.post('/api/updates/analytics', (req, res) => {
|
|||
|
|
const { current_version, device_info, action } = req.body;
|
|||
|
|
|
|||
|
|
console.log(`[${new Date().toISOString()}] Analytics:`, {
|
|||
|
|
current_version,
|
|||
|
|
device_info,
|
|||
|
|
action
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
res.json({ success: true });
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// Endpoint для истории версий
|
|||
|
|
app.get('/api/updates/history', checkApiKey, (req, res) => {
|
|||
|
|
const history = [
|
|||
|
|
RELEASES.beta,
|
|||
|
|
RELEASES.stable,
|
|||
|
|
// Добавьте старые версии здесь
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
res.json({ releases: history });
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// Health check endpoint
|
|||
|
|
app.get('/health', (req, res) => {
|
|||
|
|
res.json({
|
|||
|
|
status: 'ok',
|
|||
|
|
timestamp: new Date().toISOString(),
|
|||
|
|
version: '1.0.0'
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// Запуск сервера
|
|||
|
|
const PORT = process.env.PORT || 3000;
|
|||
|
|
app.listen(PORT, () => {
|
|||
|
|
console.log(`
|
|||
|
|
╔════════════════════════════════════════╗
|
|||
|
|
║ Umbrix Update Server ║
|
|||
|
|
║ Running on port ${PORT} ║
|
|||
|
|
║ ║
|
|||
|
|
║ Endpoints: ║
|
|||
|
|
║ GET /api/updates/latest ║
|
|||
|
|
║ POST /api/updates/analytics ║
|
|||
|
|
║ GET /api/updates/history ║
|
|||
|
|
║ GET /health ║
|
|||
|
|
╚════════════════════════════════════════╝
|
|||
|
|
`);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
module.exports = app;
|