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

50 lines
1.7 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";
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?limit=1`, {
headers: {
'Accept': 'application/json',
},
}, r => {
let data = '';
r.on('data', c => {
data += c;
});
r.on('end', () => {
try {
const assets = JSON.parse(data)[0].assets;
if (file) {
for (const asset of assets) {
if (asset.name === file) {
log.debug('Redirect to', asset.browser_download_url);
return res.redirect(302, asset.browser_download_url);
}
}
} else {
log.debug('List files');
return res.render('list-files', {assets: assets});
}
} catch (e) {
return next(e);
}
});
}).on('error', err => {
log.error(err);
});
}
}