From b71d704bcd5e6d22db60a6b966c1afab56045382 Mon Sep 17 00:00:00 2001 From: Hyeseong Kim Date: Fri, 18 Feb 2022 03:34:42 +0900 Subject: [PATCH] Add integrated fields endpoint for Greenhouse content --- _workers/prismic-if-greenhouse/.gitignore | 1 + _workers/prismic-if-greenhouse/package.json | 20 ++++ _workers/prismic-if-greenhouse/src/worker.ts | 103 +++++++++++++++++++ _workers/prismic-if-greenhouse/tsconfig.json | 8 ++ _workers/prismic-if-greenhouse/wrangler.toml | 12 +++ 5 files changed, 144 insertions(+) create mode 100644 _workers/prismic-if-greenhouse/.gitignore create mode 100644 _workers/prismic-if-greenhouse/package.json create mode 100644 _workers/prismic-if-greenhouse/src/worker.ts create mode 100644 _workers/prismic-if-greenhouse/tsconfig.json create mode 100644 _workers/prismic-if-greenhouse/wrangler.toml diff --git a/_workers/prismic-if-greenhouse/.gitignore b/_workers/prismic-if-greenhouse/.gitignore new file mode 100644 index 000000000..178135c2b --- /dev/null +++ b/_workers/prismic-if-greenhouse/.gitignore @@ -0,0 +1 @@ +/dist/ diff --git a/_workers/prismic-if-greenhouse/package.json b/_workers/prismic-if-greenhouse/package.json new file mode 100644 index 000000000..d62f02341 --- /dev/null +++ b/_workers/prismic-if-greenhouse/package.json @@ -0,0 +1,20 @@ +{ + "name": "prismic-if-greenhouse", + "version": "0.0.0", + "private": true, + "type": "module", + "main": "./dist/worker.js", + "scripts": { + "wrangler": "wrangler" + }, + "dependencies": { + "greenhouse-jobboard-js": "^0.3.0", + "worktop": "0.7.3" + }, + "devDependencies": { + "@cloudflare/workers-types": "3.3.1", + "@cloudflare/wrangler": "1.19.8", + "esbuild": "0.14.22", + "typescript": "4.5.5" + } +} diff --git a/_workers/prismic-if-greenhouse/src/worker.ts b/_workers/prismic-if-greenhouse/src/worker.ts new file mode 100644 index 000000000..d35fb835e --- /dev/null +++ b/_workers/prismic-if-greenhouse/src/worker.ts @@ -0,0 +1,103 @@ +/// + +import { Router } from 'worktop'; +import * as CORS from 'worktop/cors'; +import * as Cache from 'worktop/cache'; +import { JobBoardClientV1 } from 'greenhouse-jobboard-js'; + +const API = new Router(); + +API.prepare = CORS.preflight(); + +const MAX_PER_PAGE = 50; + +API.add('GET', '/if/boards/:boardToken/jobs', async (req, res) => { + const { boardToken } = req.params; + const page = +(req.query.get('page') || 1); + const offset = (page - 1) * MAX_PER_PAGE; + + const jobBoardClient = new JobBoardClientV1({ + boardToken, + client: jsonClient, + }); + + const jobs = await jobBoardClient.getJobListWithContent(); + const jobsSlice = jobs.slice(offset, MAX_PER_PAGE); + + const result: IntegrationFieldsFormat = { + results_size: jobs.length, + results: jobsSlice.map(job => ({ + id: job.id.toString(), + title: job.title, + description: '', + image_url: '', + last_update: new Date(job.updated_at).getTime(), + blob: job, + })), + }; + + res.send(200, result); +}); + +API.add('GET', '/if/boards/:boardToken/departments', async (req, res) => { + const { boardToken } = req.params; + const page = +(req.query.get('page') || 1); + const offset = (page - 1) * MAX_PER_PAGE; + + const jobBoardClient = new JobBoardClientV1({ + boardToken, + client: jsonClient, + }); + + const departments = await jobBoardClient.getDepartmentList(); + const leafDepartments = departments + .filter(department => department.id !== 0) + .filter(department => !department.child_ids.length); + const departmentsSlice = leafDepartments.slice(offset, MAX_PER_PAGE); + + const result: IntegrationFieldsFormat = { + results_size: leafDepartments.length, + results: departmentsSlice.map(department => ({ + id: department.id.toString(), + title: department.name, + description: '', + image_url: '', + last_update: Date.now(), + blob: department, + })), + }; + + res.send(200, result); +}); + +Cache.listen(API.run); + +type IntegrationFieldsFormat = { + results_size: number, + results: IntegrationFieldsItem[], +}; + +type IntegrationFieldsItem = { + id: string, + title: string, + description: string, + image_url: string, + last_update: number, + blob: unknown, +}; + +const jsonClient = { + async get(url: URL) { + try { + const response = await fetch(url.toString()); + const body = await response.json(); + return body; + } catch (cause) { + throw new Error( + `Failed to fetch the resource from job board: ${url.toString()}`, + // @ts-ignore + { cause }, + ); + } + }, +}; diff --git a/_workers/prismic-if-greenhouse/tsconfig.json b/_workers/prismic-if-greenhouse/tsconfig.json new file mode 100644 index 000000000..b888bb583 --- /dev/null +++ b/_workers/prismic-if-greenhouse/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "lib": ["DOM.Iterable", "WebWorker", "ES2020"], + "strict": true, + "esModuleInterop": true, + "downlevelIteration": true + } +} diff --git a/_workers/prismic-if-greenhouse/wrangler.toml b/_workers/prismic-if-greenhouse/wrangler.toml new file mode 100644 index 000000000..bc434bbf8 --- /dev/null +++ b/_workers/prismic-if-greenhouse/wrangler.toml @@ -0,0 +1,12 @@ +name = 'prismic-if-greenhouse' +type = 'javascript' +compatibility_date = '2022-02-17' +account_id = 'aad5c82543cd1f267b89737d0f56405e' +usage_model = 'unbound' +workers_dev = true + +[build] +command = 'yarn esbuild src/worker.ts --bundle --outfile=dist/worker.js --format=esm' + +[build.upload] +format = 'service-worker'