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 { 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); }); } }