update.eternae.ink/src/controllers/GiteaRepoLatestReleaseContr...

58 lines
2.1 KiB
TypeScript

import Controller from "swaf/Controller";
import {NextFunction, Request, Response} from "express";
import * as https from "https";
import config from "config";
import {log} from "swaf/Logger";
import {NotFoundHttpError} from "swaf/HttpError";
export default class GiteaRepoLatestReleaseController extends Controller {
public routes(): void {
this.get('/:owner/:name/:file?', this.getFile, 'get-repo-release-file');
}
protected async getFile(req: Request, res: Response, next: NextFunction): Promise<void> {
log.info('Serving ' + req.path + ' ...');
const {owner, name, file} = req.params;
if (!owner || !name) return next();
https.get(`${config.get('gitea_instance_url')}/api/v1/repos/${owner}/${name}/releases`, {
headers: {
'Accept': 'application/json',
},
}, r => {
let data = '';
r.on('data', c => {
data += c;
});
r.on('end', () => {
try {
const releases = JSON.parse(data);
if (file) {
for (const release of releases) {
for (const asset of release.assets) {
if (asset.name === file) {
log.debug('Redirect to', asset.browser_download_url);
return res.redirect(302, asset.browser_download_url);
}
}
}
throw new NotFoundHttpError('Asset', req.url);
} else {
log.debug('List files');
return res.render('list-files', {
owner: owner,
name: name,
releases: releases,
});
}
} catch (e) {
return next(e);
}
});
}).on('error', err => {
log.error(err);
});
}
}