From 031913ee6e8662144bed03d435f9470e4bfa36b4 Mon Sep 17 00:00:00 2001 From: wanhose Date: Wed, 18 Jan 2023 19:55:54 +0100 Subject: [PATCH] feat(api): add temp v3 endpoints to test --- packages/api/src/index.ts | 4 ++ packages/api/src/routes/v3/data.ts | 26 ++++++++++ packages/api/src/routes/v3/report.ts | 76 ++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 packages/api/src/routes/v3/data.ts create mode 100644 packages/api/src/routes/v3/report.ts diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index 57cf189..9483172 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -5,6 +5,8 @@ import v1EntriesRoutes from 'routes/v1/entries'; import v1ReportRoutes from 'routes/v1/report'; import v2DataRoutes from 'routes/v2/data'; import v2ReportRoutes from 'routes/v2/report'; +import v3DataRoutes from 'routes/v3/data'; +import v3ReportRoutes from 'routes/v3/report'; import environment from 'services/environment'; const server = fastify({ logger: true }); @@ -27,6 +29,8 @@ server.register(v1EntriesRoutes, { prefix: '/rest/v1' }); server.register(v1ReportRoutes, { prefix: '/rest/v1' }); server.register(v2DataRoutes, { prefix: '/rest/v2' }); server.register(v2ReportRoutes, { prefix: '/rest/v2' }); +server.register(v3DataRoutes, { prefix: '/rest/v3' }); +server.register(v3ReportRoutes, { prefix: '/rest/v3' }); server.listen({ host: '0.0.0.0', port: environment.port }, (error, address) => { if (error) { diff --git a/packages/api/src/routes/v3/data.ts b/packages/api/src/routes/v3/data.ts new file mode 100644 index 0000000..6b51ebc --- /dev/null +++ b/packages/api/src/routes/v3/data.ts @@ -0,0 +1,26 @@ +import { FastifyInstance, RouteShorthandOptions } from 'fastify'; +import fetch from 'node-fetch'; + +export default (server: FastifyInstance, options: RouteShorthandOptions, done: () => void) => { + server.get('/data/', async (request, reply) => { + try { + const dataUrl = 'https://raw.githubusercontent.com/wanhose/cookie-dialog-monster/v7.0.0/data'; + const actionsUrl = `${dataUrl}/actions.json`; + const tokensUrl = `${dataUrl}/tokens.json`; + + const results = await Promise.all([fetch(actionsUrl), fetch(tokensUrl)]); + + reply.send({ + data: { + actions: await results[0].json(), + tokens: await results[1].json(), + }, + success: true, + }); + } catch { + reply.send({ success: false }); + } + }); + + done(); +}; diff --git a/packages/api/src/routes/v3/report.ts b/packages/api/src/routes/v3/report.ts new file mode 100644 index 0000000..b338083 --- /dev/null +++ b/packages/api/src/routes/v3/report.ts @@ -0,0 +1,76 @@ +import { FastifyInstance, RouteShorthandOptions } from 'fastify'; +import environment from 'services/environment'; +import { octokit } from 'services/octokit'; + +type PostReportBody = { + reason?: string; + url: string; + userAgent?: string; + version: string; +}; + +export default (server: FastifyInstance, options: RouteShorthandOptions, done: () => void) => { + server.post<{ Body: PostReportBody }>( + '/report/', + { + schema: { + body: { + properties: { + reason: { + type: 'string', + }, + url: { + type: 'string', + }, + userAgent: { + type: 'string', + }, + version: { + type: 'string', + }, + }, + required: ['url', 'version'], + type: 'object', + }, + }, + }, + async (request, reply) => { + try { + const issues = await octokit.request('GET /repos/{owner}/{repo}/issues', { + owner: environment.github.owner, + repo: environment.github.repo, + }); + const url = new URL(request.body.url).hostname + .split('.') + .slice(-3) + .join('.') + .replace('www.', ''); + + if (issues.data.some((issue) => issue.title.includes(url))) { + throw new Error(); + } + + await octokit.request('POST /repos/{owner}/{repo}/issues', { + assignees: [environment.github.owner], + body: [ + '## Specifications', + `- Reason: ${request.body.reason ?? '-'}`, + `- URL: ${request.body.url}`, + `- User-Agent: ${request.body.userAgent ?? '-'}`, + `- Version: ${request.body.version}`, + ].join('\n'), + labels: ['bug'], + owner: environment.github.owner, + repo: environment.github.repo, + title: url, + }); + + reply.send({ success: true }); + } catch (error) { + reply.send({ errors: [error.message], success: false }); + } + } + ); + + done(); +};