Implemented about page.
All checks were successful
farmcontrol/farmcontrol-api/pipeline/head This commit looks good

This commit is contained in:
Tom Butcher 2026-06-21 13:19:15 +01:00
parent afce36b30a
commit 645a1b6220
7 changed files with 58 additions and 2 deletions

5
.gitignore vendored
View File

@ -141,4 +141,7 @@ gcodefile
gcodefiles/*
gcodefiles
test-results.xml
test-results.xml
# Jenkins generated build metadata
src/buildInfo.json

10
Jenkinsfile vendored
View File

@ -23,6 +23,16 @@ pipeline {
}
}
stage('Write Build Metadata') {
steps {
nodejs(nodeJSInstallationName: 'Node23') {
sh '''
node -e "const fs = require('fs'); fs.writeFileSync('src/buildInfo.json', JSON.stringify({ buildNumber: process.env.BUILD_NUMBER || 'dev' }, null, 2) + '\\n');"
'''
}
}
}
stage('Install Dependencies') {
steps {
nodejs(nodeJSInstallationName: 'Node23') {

View File

@ -60,6 +60,7 @@ import {
csvRoutes,
appLaunchRoutes,
appUpdateRoutes,
serverRoutes,
} from './routes/index.js';
import path from 'path';
import * as fs from 'fs';
@ -187,6 +188,7 @@ app.use('/excel', excelRoutes);
app.use('/csv', csvRoutes);
app.use('/applaunch', appLaunchRoutes);
app.use('/appupdate', appUpdateRoutes);
app.use('/server', serverRoutes);
// Start the application
if (process.env.NODE_ENV !== 'test') {

View File

@ -53,6 +53,7 @@ import excelRoutes from './misc/excel.js';
import csvRoutes from './misc/csv.js';
import appLaunchRoutes from './misc/applaunch.js';
import appUpdateRoutes from './misc/appupdate.js';
import serverRoutes from './misc/server.js';
export {
userRoutes,
@ -110,4 +111,5 @@ export {
csvRoutes,
appLaunchRoutes,
appUpdateRoutes,
serverRoutes,
};

View File

@ -0,0 +1,9 @@
import express from 'express';
import { isAuthenticated } from '../../keycloak.js';
import { serverVersionRouteHandler } from '../../services/misc/server.js';
const router = express.Router();
router.get('/version', isAuthenticated, serverVersionRouteHandler);
export default router;

View File

@ -19,7 +19,7 @@ const buildApiUrl = (baseUrl, query = '') => {
};
const getBranchBuildApiUrl = (branchUrl, buildType = 'lastSuccessfulBuild') =>
`${normalizeProjectUrl(branchUrl)}/${buildType}/api/json?tree=number,url,result,timestamp,artifacts[fileName,relativePath]`;
`${normalizeProjectUrl(branchUrl)}/${buildType}/api/json?tree=number,url,result,displayName,timestamp,artifacts[fileName,relativePath]`;
const mapArtifacts = (build, requestedBranch) => {
const buildUrl = normalizeProjectUrl(build?.url);
@ -107,8 +107,10 @@ export const appUpdateCurrentRouteHandler = async (req, res) => {
return res.send({
branch: requestedBranch,
buildNumber: build.number,
buildUrl: build.url,
buildResult: build.result,
buildName: build.displayName,
buildTimestamp: build.timestamp,
buildSource: source,
artifacts: mapArtifacts(build, requestedBranch),

View File

@ -0,0 +1,28 @@
import { readFileSync } from 'node:fs';
const readJsonFile = (fileUrl) => {
try {
return JSON.parse(readFileSync(fileUrl, 'utf8'));
} catch {
return {};
}
};
const packageJsonUrl = new URL('../../../package.json', import.meta.url);
const buildInfoUrl = new URL('../../buildInfo.json', import.meta.url);
const getServerVersionInfo = () => {
const packageJson = readJsonFile(packageJsonUrl);
const buildInfo = readJsonFile(buildInfoUrl);
return {
version: packageJson.version ?? 'dev',
buildNumber: buildInfo.buildNumber ?? 'dev',
};
};
export const serverVersionRouteHandler = (req, res) => {
res.json({
...getServerVersionInfo(),
});
};