2020-11-22 13:49:08 +01:00
|
|
|
import Controller from "swaf/Controller";
|
2020-07-06 10:49:18 +02:00
|
|
|
import {NextFunction, Request, Response} from "express";
|
|
|
|
import URLRedirect from "../models/URLRedirect";
|
2020-11-22 13:49:08 +01:00
|
|
|
import {RequireAuthMiddleware} from "swaf/auth/AuthComponent";
|
2020-07-06 10:49:18 +02:00
|
|
|
import generateSlug from "../SlugGenerator";
|
2020-07-06 14:52:38 +02:00
|
|
|
import config from "config";
|
2020-07-06 16:11:02 +02:00
|
|
|
import AuthToken from "../models/AuthToken";
|
2020-07-06 10:49:18 +02:00
|
|
|
|
|
|
|
export default class URLRedirectController extends Controller {
|
2020-11-22 14:13:57 +01:00
|
|
|
public routes(): void {
|
2020-11-22 13:49:08 +01:00
|
|
|
this.get('/url/shrink', this.getURLShrinker, 'url-shrinker', RequireAuthMiddleware);
|
2020-07-06 14:52:38 +02:00
|
|
|
this.get('/url/shrink/script', this.downloadLinuxScript, 'url-linux-script');
|
2020-11-22 13:49:08 +01:00
|
|
|
this.post('/url/shrink', this.addURLFrontend, 'shrink-url', RequireAuthMiddleware);
|
|
|
|
this.get('/urls/:page([0-9]+)?', this.getURLRedirectManager, 'url-manager', RequireAuthMiddleware);
|
2020-07-06 10:49:18 +02:00
|
|
|
}
|
|
|
|
|
2020-07-06 14:52:38 +02:00
|
|
|
protected async getURLShrinker(req: Request, res: Response): Promise<void> {
|
2020-11-22 13:49:08 +01:00
|
|
|
const user = req.as(RequireAuthMiddleware).getUser();
|
2020-07-06 14:52:38 +02:00
|
|
|
const allowedDomains = config.get<string[]>('allowed_url_domains');
|
|
|
|
res.render('url-shrinker', {
|
2020-11-22 13:49:08 +01:00
|
|
|
auth_tokens: await AuthToken.select().where('user_id', user.id).get(),
|
2020-07-06 14:52:38 +02:00
|
|
|
allowed_domains: allowedDomains,
|
|
|
|
default_domain: allowedDomains[config.get<number>('default_url_domain_for_urls')],
|
|
|
|
});
|
2020-07-06 10:49:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
protected async downloadLinuxScript(req: Request, res: Response): Promise<void> {
|
2020-07-06 14:52:38 +02:00
|
|
|
res.download('assets/files/shrink_url.sh', 'shrink_url.sh');
|
2020-07-06 10:49:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
protected async getURLRedirectManager(req: Request, res: Response): Promise<void> {
|
2020-11-22 13:49:08 +01:00
|
|
|
const user = req.as(RequireAuthMiddleware).getUser();
|
2020-07-06 10:49:18 +02:00
|
|
|
res.render('url-manager', {
|
2020-11-22 13:49:08 +01:00
|
|
|
urls: await URLRedirect.paginateForUser(req, 100, user.getOrFail('id')),
|
2020-07-06 10:49:18 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
protected async addURLFrontend(req: Request, res: Response, next: NextFunction): Promise<void> {
|
|
|
|
req.body.type = 'url';
|
2020-11-22 14:13:57 +01:00
|
|
|
await URLRedirectController.addURL(
|
|
|
|
req,
|
|
|
|
res,
|
|
|
|
next,
|
|
|
|
req.body.autogen_url === undefined && req.body.slug ?
|
|
|
|
req.body.slug :
|
|
|
|
await generateSlug(10),
|
|
|
|
);
|
2020-07-06 10:49:18 +02:00
|
|
|
}
|
|
|
|
|
2020-07-06 15:39:47 +02:00
|
|
|
public static async addURL(req: Request, res: Response, next: NextFunction, slug?: string): Promise<void> {
|
2020-07-06 10:49:18 +02:00
|
|
|
if (req.body.type !== 'url') return next();
|
|
|
|
|
2020-11-22 13:49:08 +01:00
|
|
|
const user = req.as(RequireAuthMiddleware).getUser();
|
2020-07-06 10:49:18 +02:00
|
|
|
slug = slug || req.params.slug || req.body.slug || await generateSlug(10);
|
2020-09-01 11:21:54 +02:00
|
|
|
const urlRedirect = URLRedirect.create({
|
2020-11-22 13:49:08 +01:00
|
|
|
user_id: user.id,
|
2020-07-06 10:49:18 +02:00
|
|
|
slug: slug,
|
|
|
|
target_url: req.body.target_url,
|
|
|
|
});
|
|
|
|
|
|
|
|
await urlRedirect.save();
|
|
|
|
|
2020-07-06 14:52:38 +02:00
|
|
|
const domain = req.body.url_domain || config.get<string[]>('allowed_url_domains')[config.get<number>('default_url_domain_for_urls')];
|
2020-07-06 10:49:18 +02:00
|
|
|
res.format({
|
|
|
|
json: () => res.json({
|
2020-07-06 14:52:38 +02:00
|
|
|
url: urlRedirect.getURL(domain),
|
2020-07-06 10:49:18 +02:00
|
|
|
}),
|
2020-07-06 14:52:38 +02:00
|
|
|
text: () => res.send(urlRedirect.getURL(domain)),
|
2020-07-06 10:49:18 +02:00
|
|
|
html: () => {
|
2020-07-06 14:52:38 +02:00
|
|
|
req.flash('success', 'URL shrunk successfully!');
|
|
|
|
req.flash('url', urlRedirect.getURL(domain));
|
2020-07-06 10:49:18 +02:00
|
|
|
res.redirectBack('/');
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
2020-11-22 13:49:08 +01:00
|
|
|
}
|