From 9644ba8ab895b9e1c44961e3f9cc499420ab284e Mon Sep 17 00:00:00 2001 From: SrIzan10 <66965250+SrIzan10@users.noreply.github.com> Date: Sat, 12 Jul 2025 17:38:14 +0000 Subject: [PATCH] feat: get opensky token and cache --- .prettierrc | 8 ++++++++ .vscode/settings.json | 6 ++++++ bun.lock | 6 ++++++ package.json | 4 +++- src/index.ts | 14 +++++++++++++- src/util/openskyToken.ts | 25 +++++++++++++++++++++++++ 6 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 .prettierrc create mode 100644 .vscode/settings.json create mode 100644 src/util/openskyToken.ts diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..49d911d --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "useTabs": false, + "printWidth": 100, + "tabWidth": 2, + "singleQuote": true, + "trailingComma": "es5", + "semi": true +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..592a4a7 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "editor.tabSize": 2, + "editor.detectIndentation": false, + "editor.insertSpaces": true, + "editor.rulers": [100] +} \ No newline at end of file diff --git a/bun.lock b/bun.lock index 3a8177e..50feeff 100644 --- a/bun.lock +++ b/bun.lock @@ -6,9 +6,11 @@ "dependencies": { "@keyv/sqlite": "^4.0.5", "@prisma/client": "^6.11.1", + "@samocodes/bun-cache": "^1.0.9", "@slack/bolt": "^4.4.0", "chrono-node": "^2.8.3", "keyv": "^5.3.4", + "ky": "^1.8.1", }, "devDependencies": { "@types/bun": "latest", @@ -31,6 +33,8 @@ "@prisma/client": ["@prisma/client@6.11.1", "", { "peerDependencies": { "prisma": "*", "typescript": ">=5.1.0" }, "optionalPeers": ["prisma", "typescript"] }, "sha512-5CLFh8QP6KxRm83pJ84jaVCeSVPQr8k0L2SEtOJHwdkS57/VQDcI/wQpGmdyOZi+D9gdNabdo8tj1Uk+w+upsQ=="], + "@samocodes/bun-cache": ["@samocodes/bun-cache@1.0.9", "", { "peerDependencies": { "typescript": "^5.4.5" } }, "sha512-YjHEito1ofY0M6w3CN5y0oN04i+BQFvNx8Z1jswHojKIv1goytgVqngyeXmkBijU96PWa8r/g8Qh1H4tK9WbVw=="], + "@slack/bolt": ["@slack/bolt@4.4.0", "", { "dependencies": { "@slack/logger": "^4.0.0", "@slack/oauth": "^3.0.3", "@slack/socket-mode": "^2.0.4", "@slack/types": "^2.14.0", "@slack/web-api": "^7.9.1", "axios": "^1.8.3", "express": "^5.0.0", "path-to-regexp": "^8.1.0", "raw-body": "^3", "tsscmp": "^1.0.6" }, "peerDependencies": { "@types/express": "^5.0.0" } }, "sha512-FjGl1+hUo0w6ZSP2v3ZyjEkpGnA2t83Kz/Et2aEtIe8rRxrHd8R9CKShpd7BesuIcvqaz2eVe33YiKGohOiMKw=="], "@slack/logger": ["@slack/logger@4.0.0", "", { "dependencies": { "@types/node": ">=18.0.0" } }, "sha512-Wz7QYfPAlG/DR+DfABddUZeNgoeY7d1J39OCR2jR+v7VBsB8ezulDK5szTnDDPDwLH5IWhLvXIHlCFZV7MSKgA=="], @@ -291,6 +295,8 @@ "keyv": ["keyv@5.3.4", "", { "dependencies": { "@keyv/serialize": "^1.0.3" } }, "sha512-ypEvQvInNpUe+u+w8BIcPkQvEqXquyyibWE/1NB5T2BTzIpS5cGEV1LZskDzPSTvNAaT4+5FutvzlvnkxOSKlw=="], + "ky": ["ky@1.8.1", "", {}, "sha512-7Bp3TpsE+L+TARSnnDpk3xg8Idi8RwSLdj6CMbNWoOARIrGrbuLGusV0dYwbZOm4bB3jHNxSw8Wk/ByDqJEnDw=="], + "lodash.includes": ["lodash.includes@4.3.0", "", {}, "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="], "lodash.isboolean": ["lodash.isboolean@3.0.3", "", {}, "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="], diff --git a/package.json b/package.json index ec20726..4158201 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,10 @@ "dependencies": { "@keyv/sqlite": "^4.0.5", "@prisma/client": "^6.11.1", + "@samocodes/bun-cache": "^1.0.9", "@slack/bolt": "^4.4.0", "chrono-node": "^2.8.3", - "keyv": "^5.3.4" + "keyv": "^5.3.4", + "ky": "^1.8.1" } } \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 0b15a77..c09ddf9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,8 @@ import { PrismaClient } from "@prisma/client"; +import BunCache from "@samocodes/bun-cache"; import { App } from "@slack/bolt"; +import ky from "ky"; +import { getOpenskyToken } from "./util/openskyToken"; const app = new App({ token: process.env.SLACK_BOT_TOKEN, @@ -7,7 +10,16 @@ const app = new App({ appToken: process.env.SLACK_APP_TOKEN, }); -const db = new PrismaClient(); +export const db = new PrismaClient(); +export const cache = new BunCache(); + +const now = Math.floor(Date.now() / 1000); +const flights = await ky.get(`https://opensky-network.org/api/flights/departure?airport=LEMG&begin=${now - 3600}&end=${now}`, { + headers: { + 'Authorization': `Bearer ${await getOpenskyToken()}`, + } +}).json(); +console.log("Fetched flights:", flights); await app.start(); console.log("We're up and running :)"); diff --git a/src/util/openskyToken.ts b/src/util/openskyToken.ts new file mode 100644 index 0000000..ca8e38b --- /dev/null +++ b/src/util/openskyToken.ts @@ -0,0 +1,25 @@ +import ky from 'ky'; +import { cache } from '..'; + +export async function getOpenskyToken(): Promise { + if (cache.hasKey('openskyToken')) { + return cache.get('openskyToken')?.toString()!; + } + const { access_token: token } = await ky + .post( + 'https://auth.opensky-network.org/auth/realms/opensky-network/protocol/openid-connect/token', + { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: new URLSearchParams({ + grant_type: 'client_credentials', + client_id: process.env.OPENSKY_CLIENT || '', + client_secret: process.env.OPENSKY_SECRET || '', + }), + } + ) + .json<{ access_token: string }>(); + cache.put('openskyToken', token, 30 * 60 * 1000); // 30min cache + return token; +}