feat: get opensky token and cache

This commit is contained in:
2025-07-12 17:38:14 +00:00
parent af7174efca
commit 9644ba8ab8
6 changed files with 61 additions and 2 deletions

8
.prettierrc Normal file
View File

@@ -0,0 +1,8 @@
{
"useTabs": false,
"printWidth": 100,
"tabWidth": 2,
"singleQuote": true,
"trailingComma": "es5",
"semi": true
}

6
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,6 @@
{
"editor.tabSize": 2,
"editor.detectIndentation": false,
"editor.insertSpaces": true,
"editor.rulers": [100]
}

View File

@@ -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=="],

View File

@@ -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"
}
}

View File

@@ -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 :)");

25
src/util/openskyToken.ts Normal file
View File

@@ -0,0 +1,25 @@
import ky from 'ky';
import { cache } from '..';
export async function getOpenskyToken(): Promise<string> {
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;
}