-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathroute.ts
73 lines (59 loc) · 2.42 KB
/
route.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import { NextResponse } from 'next/server';
import { callParseNewMonth, callParseNOldMonths, callParseOldMonth } from '@/modules/parser/calls';
import { getLastMonth } from '@/modules/database/select/month';
import logger from '@/libs/winston';
import { SCRIPTS } from '@/constants/scripts';
import { SERVER_CONFIG } from '@/config/server';
import type { ErrorResponse, ParserResponse, ParserRouteParam } from '@/types/api';
export const dynamic = 'force-dynamic';
const { apiSecret } = SERVER_CONFIG;
const scripts = Object.values(SCRIPTS);
/**
* Called by cron with curl. Benefit: single Next.js build context without node_modules for .ts scripts.
*
* @example http://localhost:3000/api/parser/new?parser-secret=my-secret
*/
export const GET = async (
request: Request,
{ params }: ParserRouteParam
): Promise<NextResponse<ParserResponse | ErrorResponse>> => {
// 1. permissions
const { searchParams } = new URL(request.url);
const secretParam = searchParams.get('parser-secret');
if (secretParam !== apiSecret) {
logger.error(`Wrong parser-secret: ${secretParam}`);
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
// 2. script param
const { script } = await params;
if (!scripts.includes(script)) {
logger.error(`Wrong route param script: ${script}`);
return NextResponse.json({ error: 'Invalid route param.' }, { status: 400 });
}
try {
switch (script) {
case SCRIPTS.parseNew: {
const parserResponse: ParserResponse = await callParseNewMonth();
logger.info('api parseNew, parserResponse:', parserResponse);
return NextResponse.json(parserResponse);
}
case SCRIPTS.parseOld: {
const parserResponse: ParserResponse = await callParseOldMonth();
logger.info('api parseOld, parserResponse:', parserResponse);
return NextResponse.json(parserResponse);
}
case SCRIPTS.parseOldMany: {
const parserResponse: ParserResponse = await callParseNOldMonths();
logger.info('api parseOldMany, parserResponse:', parserResponse);
return NextResponse.json(parserResponse);
}
default: {
logger.error('Not allowed script triggered.', script);
return NextResponse.json({ error: 'Not allowed.' }, { status: 401 });
}
}
} catch (error) {
logger.error('Parsing failed.', error);
return NextResponse.json({ error: 'Parsing failed.' }, { status: 400 });
}
};