Files

120 lines
3.3 KiB
JavaScript

const express = require('express');
const axios = require('axios');
const { defaultLogger } = require('../utils/logger');
const packageInfo = require('../../package.json');
const router = express.Router();
const logger = defaultLogger.child('UpdateRoute');
/**
* 获取当前版本信息
*/
router.get('/current-version', (req, res) => {
try {
res.json({
success: true,
data: {
version: packageInfo.version,
name: packageInfo.name,
description: packageInfo.description
}
});
} catch (error) {
logger.error('获取当前版本失败', error);
res.status(500).json({
success: false,
error: '获取当前版本失败',
message: error.message
});
}
});
/**
* 检查最新版本
*/
router.get('/check-latest', async (req, res) => {
try {
logger.info('检查最新版本...');
// 获取GitHub发行版信息
const response = await axios.get('https://api.github.com/repos/kjqwer/pixiv-D/releases/latest', {
timeout: 10000,
headers: {
'User-Agent': 'Pixiv-Manager-Update-Checker'
}
});
const latestRelease = response.data;
const currentVersion = packageInfo.version;
const latestVersion = latestRelease.tag_name.replace(/^v/, ''); // 移除v前缀
// 版本比较
const hasUpdate = compareVersions(latestVersion, currentVersion) > 0;
const result = {
current: currentVersion,
latest: latestVersion,
hasUpdate,
releaseInfo: {
name: latestRelease.name,
body: latestRelease.body,
publishedAt: latestRelease.published_at,
htmlUrl: latestRelease.html_url,
downloadUrl: latestRelease.assets.find(asset =>
asset.name.includes('pixiv-manager-portable.rar')
)?.browser_download_url || latestRelease.html_url
}
};
logger.info(`版本检查完成: 当前版本 ${currentVersion}, 最新版本 ${latestVersion}, 有更新: ${hasUpdate}`);
res.json({
success: true,
data: result
});
} catch (error) {
logger.error('检查最新版本失败', error);
// 如果是网络错误,返回友好的错误信息
let errorMessage = '检查更新失败';
if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') {
errorMessage = '无法连接到GitHub,请检查网络连接';
} else if (error.response?.status === 404) {
errorMessage = '未找到发行版信息';
} else if (error.response?.status === 403) {
errorMessage = 'GitHub API访问限制,请稍后再试';
}
res.status(500).json({
success: false,
error: errorMessage,
message: error.message
});
}
});
/**
* 版本比较函数
* @param {string} version1 版本1
* @param {string} version2 版本2
* @returns {number} 1: version1 > version2, 0: 相等, -1: version1 < version2
*/
function compareVersions(version1, version2) {
const v1Parts = version1.split('.').map(Number);
const v2Parts = version2.split('.').map(Number);
const maxLength = Math.max(v1Parts.length, v2Parts.length);
for (let i = 0; i < maxLength; i++) {
const v1Part = v1Parts[i] || 0;
const v2Part = v2Parts[i] || 0;
if (v1Part > v2Part) return 1;
if (v1Part < v2Part) return -1;
}
return 0;
}
module.exports = router;