From 81b50b179822e6d589313ab96513a49b5b8328fd Mon Sep 17 00:00:00 2001 From: wanhose Date: Wed, 3 Apr 2024 18:51:04 +0200 Subject: [PATCH] feat(api): update v3 endpoints to fit new files, return pull request url when reporting and improve v1 deprecated route error message --- packages/api/src/routes/v1/report.ts | 2 +- packages/api/src/routes/v2/data.ts | 38 ++++--------- packages/api/src/routes/v3/data.ts | 25 ++++++--- packages/api/src/routes/v3/report.ts | 83 +++++++++++++++++++++++++++- 4 files changed, 111 insertions(+), 37 deletions(-) diff --git a/packages/api/src/routes/v1/report.ts b/packages/api/src/routes/v1/report.ts index 43fab88..9b67c7f 100644 --- a/packages/api/src/routes/v1/report.ts +++ b/packages/api/src/routes/v1/report.ts @@ -22,7 +22,7 @@ export default (server: FastifyInstance, options: RouteShorthandOptions, done: ( async (_request, reply) => { reply.status(500).send({ success: false, - errors: ['This API route is no longer supported in Mozilla Firefox'], + errors: ['This API route is no longer supported. Please upgrade to the latest version'], }); } ); diff --git a/packages/api/src/routes/v2/data.ts b/packages/api/src/routes/v2/data.ts index 996acbb..112db6e 100644 --- a/packages/api/src/routes/v2/data.ts +++ b/packages/api/src/routes/v2/data.ts @@ -5,42 +5,26 @@ export default (server: FastifyInstance, options: RouteShorthandOptions, done: ( server.get('/data/', async (request, reply) => { try { const dataUrl = 'https://raw.githubusercontent.com/wanhose/cookie-dialog-monster/main/data'; - const classesUrl = `${dataUrl}/classes.txt`; - const elementsUrl = `${dataUrl}/elements.txt`; + const commonWordsUrl = `${dataUrl}/common-words.json`; const fixesUrl = `${dataUrl}/fixes.txt`; - const skipsUrl = `${dataUrl}/skips.txt`; - const tagsUrl = `${dataUrl}/tags.txt`; + const skipsUrl = `${dataUrl}/skips.json`; + const tokensUrl = `${dataUrl}/tokens.txt`; const results = await Promise.all([ - fetch(classesUrl), - fetch(elementsUrl), + fetch(commonWordsUrl), fetch(fixesUrl), fetch(skipsUrl), - fetch(tagsUrl), + fetch(tokensUrl), ]); reply.send({ data: { - classes: (await results[0].text()).split('\n').filter((x) => !!x), - commonWords: [ - 'banner', - 'cc', - 'cmp', - 'compliance', - 'consent', - 'cookie', - 'dialog', - 'disclaimer', - 'gdpr', - 'law', - 'policy', - 'popup', - 'privacy', - ], - elements: (await results[1].text()).split('\n').filter((x) => !!x), - fixes: (await results[2].text()).split('\n').filter((x) => !!x), - skips: (await results[3].text()).split('\n').filter((x) => !!x), - tags: (await results[4].text()).split('\n').filter((x) => !!x), + classes: (await results[3].json()).classes, + commonWords: await results[0].json(), + elements: (await results[3].json()).selectors, + fixes: (await results[1].text()).split('\n').filter((x) => !!x), + skips: (await results[2].json()).domains, + tags: (await results[2].json()).tags, }, success: true, }); diff --git a/packages/api/src/routes/v3/data.ts b/packages/api/src/routes/v3/data.ts index 6b51ebc..20207ce 100644 --- a/packages/api/src/routes/v3/data.ts +++ b/packages/api/src/routes/v3/data.ts @@ -1,23 +1,32 @@ import { FastifyInstance, RouteShorthandOptions } from 'fastify'; import fetch from 'node-fetch'; -export default (server: FastifyInstance, options: RouteShorthandOptions, done: () => void) => { - server.get('/data/', async (request, reply) => { +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 dataUrl = 'https://raw.githubusercontent.com/wanhose/cookie-dialog-monster/main/data'; + const commonWordsUrl = `${dataUrl}/common-words.json`; + const fixesUrl = `${dataUrl}/fixes.txt`; + const skipsUrl = `${dataUrl}/skips.json`; const tokensUrl = `${dataUrl}/tokens.json`; - const results = await Promise.all([fetch(actionsUrl), fetch(tokensUrl)]); + const results = await Promise.all([ + fetch(commonWordsUrl), + fetch(fixesUrl), + fetch(skipsUrl), + fetch(tokensUrl), + ]); reply.send({ data: { - actions: await results[0].json(), - tokens: await results[1].json(), + commonWords: await results[0].json(), + fixes: (await results[1].text()).split('\n').filter((x) => !!x), + skips: await results[2].json(), + tokens: await results[3].json(), }, success: true, }); - } catch { + } catch (error) { reply.send({ success: false }); } }); diff --git a/packages/api/src/routes/v3/report.ts b/packages/api/src/routes/v3/report.ts index 11f2d07..7781274 100644 --- a/packages/api/src/routes/v3/report.ts +++ b/packages/api/src/routes/v3/report.ts @@ -1 +1,82 @@ -export { default as default } from 'routes/v2/report'; +import { FastifyInstance, RouteShorthandOptions } from 'fastify'; +import environment from 'services/environment'; +import { octokit } from 'services/octokit'; + +interface PostReportBody { + readonly reason?: string; + readonly url: string; + readonly userAgent?: string; + readonly 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('Issue already exists'); + } + + const response = 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({ + data: response.data.html_url, + success: true, + }); + } catch (error) { + reply.send({ + errors: [error.message], + success: false, + }); + } + } + ); + + done(); +};