feat(apps.web.api): use applyRoute

Signed-off-by: Hanif Dwy Putra S <47862061+hansputera@users.noreply.github.com>
This commit is contained in:
Hanif Dwy Putra S
2022-07-29 12:51:47 +00:00
parent 1e2edfb28a
commit c5534833d6
4 changed files with 111 additions and 102 deletions

View File

@@ -3,86 +3,89 @@ import ow from 'ow';
import {getProvider, Providers, BaseProvider} from 'tiktok-dl-core';
import {getTikTokURL} from '../../lib';
import {rotateProvider} from '../../lib/rotator';
import {applyRoute} from '../../middleware/apply';
import {ratelimitMiddleware} from '../../middleware/ratelimit';
export default async (req: NextApiRequest, res: NextApiResponse) => {
try {
await ratelimitMiddleware(req, res);
if (req.method === 'POST' && typeof req.body === 'string') {
req.body = JSON.parse(req.body);
export default applyRoute(
async (req: NextApiRequest, res: NextApiResponse) => {
try {
if (req.method === 'POST' && typeof req.body === 'string') {
req.body = JSON.parse(req.body);
}
const providersType = Providers.map((p) => p.resourceName());
ow(
req.body || req.query,
ow.object.partialShape({
url: ow.string.url.validate((v) => ({
validator: !!getTikTokURL(v),
message: 'Expected (.*).tiktok.com',
})),
type: ow.optional.string.validate((v) => ({
validator:
typeof v === 'string' &&
providersType.includes(v.toLowerCase()),
message:
'Invalid Provider, available provider is: ' +
Providers.map((x) => x.resourceName()).join(', '),
})),
nocache:
req.method === 'POST'
? ow.optional.boolean
: ow.optional.string,
rotateOnError:
req.method === 'POST'
? ow.optional.boolean
: ow.optional.string,
}),
);
let provider = getProvider(
(req.query.type || req.body.type) ?? 'random',
);
if (!provider) {
return res.status(400).json({
error: 'Invalid provider',
providers: providersType,
});
}
const params = provider.getParams();
if (
params &&
provider.resourceName() ===
(req.query.type?.toString() || req.body.type)?.toLowerCase()
) {
ow(req.query || req.body, ow.object.partialShape(params));
} else if (params) {
provider = getProvider('random');
}
const url = getTikTokURL(req.query.url || req.body.url);
const result = await rotateProvider(
provider as BaseProvider,
url!,
req.method === 'POST'
? req.body.rotateOnError
: !!req.query.rotateOnError,
params
? Object.fromEntries(
Object.keys(params!).map((p) => [
p,
(req.query[p] as string) ?? req.body[p],
]),
)
: {},
);
return res.status(200).json(result);
} catch (e) {
return res
.status((e as Error).name === 'ArgumentError' ? 400 : 500)
.json({
error: (e as Error).name + '|' + (e as Error).message,
});
}
const providersType = Providers.map((p) => p.resourceName());
ow(
req.body || req.query,
ow.object.partialShape({
url: ow.string.url.validate((v) => ({
validator: !!getTikTokURL(v),
message: 'Expected (.*).tiktok.com',
})),
type: ow.optional.string.validate((v) => ({
validator:
typeof v === 'string' &&
providersType.includes(v.toLowerCase()),
message:
'Invalid Provider, available provider is: ' +
Providers.map((x) => x.resourceName()).join(', '),
})),
nocache:
req.method === 'POST'
? ow.optional.boolean
: ow.optional.string,
rotateOnError:
req.method === 'POST'
? ow.optional.boolean
: ow.optional.string,
}),
);
let provider = getProvider(
(req.query.type || req.body.type) ?? 'random',
);
if (!provider) {
return res.status(400).json({
error: 'Invalid provider',
providers: providersType,
});
}
const params = provider.getParams();
if (
params &&
provider.resourceName() ===
(req.query.type?.toString() || req.body.type)?.toLowerCase()
) {
ow(req.query || req.body, ow.object.partialShape(params));
} else if (params) {
provider = getProvider('random');
}
const url = getTikTokURL(req.query.url || req.body.url);
const result = await rotateProvider(
provider as BaseProvider,
url!,
req.method === 'POST'
? req.body.rotateOnError
: !!req.query.rotateOnError,
params
? Object.fromEntries(
Object.keys(params!).map((p) => [
p,
(req.query[p] as string) ?? req.body[p],
]),
)
: {},
);
return res.status(200).json(result);
} catch (e) {
return res
.status((e as Error).name === 'ArgumentError' ? 400 : 500)
.json({
error: (e as Error).name + '|' + (e as Error).message,
});
}
};
},
[ratelimitMiddleware],
);

View File

@@ -1,5 +1,5 @@
import type {NextApiRequest, NextApiResponse} from 'next';
export default async (_: NextApiRequest, res: NextApiResponse) => {
res.send('Y');
return res.redirect('https://github.com/hansputera/tiktok-dl.git');
};

View File

@@ -2,21 +2,23 @@ import type {NextApiRequest, NextApiResponse} from 'next';
import {Providers} from 'tiktok-dl-core';
import {ratelimitMiddleware} from '../../middleware/ratelimit';
import type {Shape} from 'ow';
import {applyRoute} from '../../middleware/apply';
export default async (req: NextApiRequest, res: NextApiResponse) => {
await ratelimitMiddleware(req, res);
export default applyRoute(
async (req: NextApiRequest, res: NextApiResponse) => {
const providers = Providers.map((p) => ({
name: p.resourceName(),
url: p.client?.defaults.options.prefixUrl,
maintenance: p.maintenance,
params: p.getParams()
? Object.keys(p.getParams()!).map((x) => ({
name: x,
type: (p.getParams()![x] as Shape).type,
}))
: {},
}));
const providers = Providers.map((p) => ({
name: p.resourceName(),
url: p.client?.defaults.options.prefixUrl,
maintenance: p.maintenance,
params: p.getParams()
? Object.keys(p.getParams()!).map((x) => ({
name: x,
type: (p.getParams()![x] as Shape).type,
}))
: {},
}));
return res.send(providers);
};
return res.send(providers);
},
[ratelimitMiddleware],
);

View File

@@ -2,9 +2,13 @@ import type {NextApiRequest, NextApiResponse} from 'next';
import {client} from '../../lib';
import {ratelimitMiddleware} from '../../middleware/ratelimit';
import {matchLink} from 'tiktok-dl-core';
import {applyRoute} from '../../middleware/apply';
export default async (req: NextApiRequest, res: NextApiResponse) => {
await ratelimitMiddleware(req, res);
const keys = await client.keys('*');
return res.status(200).json(keys.filter((x) => matchLink(x)));
};
export default applyRoute(
async (req: NextApiRequest, res: NextApiResponse) => {
await ratelimitMiddleware(req, res);
const keys = await client.keys('*');
return res.status(200).json(keys.filter((x) => matchLink(x)));
},
[ratelimitMiddleware],
);