version.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import express from "express";
  2. import { debug, express as logger } from "../logger.js";
  3. import pjson from "../package.json" with { type: "json" };
  4. const router = express.Router({
  5. caseSensitive: true,
  6. strict: true,
  7. mergeParams: true,
  8. });
  9. /**
  10. * /api/version/check
  11. */
  12. router
  13. .route("/check")
  14. .options((_, res) => {
  15. res.sendStatus(204);
  16. })
  17. /**
  18. * GET /api/version/check
  19. *
  20. * Check for available updates
  21. */
  22. .get(async (req, res, next) => {
  23. try {
  24. const response = await fetch(
  25. "https://api.github.com/repos/NginxProxyManager/nginx-proxy-manager/releases/latest"
  26. );
  27. if (!response.ok) {
  28. throw new Error(`GitHub API returned ${response.status}`);
  29. }
  30. const data = await response.json();
  31. const latestVersion = data.tag_name;
  32. const version = pjson.version.split("-").shift().split(".");
  33. const currentVersion = `v${version[0]}.${version[1]}.${version[2]}`;
  34. res.status(200).send({
  35. current: currentVersion,
  36. latest: latestVersion,
  37. updateAvailable: compareVersions(currentVersion, latestVersion),
  38. });
  39. } catch (error) {
  40. debug(logger, `${req.method.toUpperCase()} ${req.path}: ${error}`);
  41. res.status(200).send({
  42. current: null,
  43. latest: null,
  44. updateAvailable: false,
  45. });
  46. }
  47. });
  48. /**
  49. * Compare two version strings
  50. *
  51. */
  52. function compareVersions(current, latest) {
  53. const cleanCurrent = current.replace(/^v/, "");
  54. const cleanLatest = latest.replace(/^v/, "");
  55. const currentParts = cleanCurrent.split(".").map(Number);
  56. const latestParts = cleanLatest.split(".").map(Number);
  57. for (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {
  58. const curr = currentParts[i] || 0;
  59. const lat = latestParts[i] || 0;
  60. if (lat > curr) return true;
  61. if (lat < curr) return false;
  62. }
  63. return false;
  64. }
  65. export default router;