diff options
| author | Jan Tuomi <jan.tuomi@valuemotive.com> | 2021-04-18 20:10:34 +0300 |
|---|---|---|
| committer | Jan Tuomi <jan.tuomi@valuemotive.com> | 2021-04-18 20:10:34 +0300 |
| commit | cf2e3c99ded0f48bd565858aedc7f10a0d932a61 (patch) | |
| tree | 699e9c6b78456474b4b0e680a15a6b1bc49aab08 /src | |
| parent | baacc7676c688cd2728033e9051208d655255ee5 (diff) | |
Add db connection
Diffstat (limited to 'src')
| -rw-r--r-- | src/config.ts | 15 | ||||
| -rw-r--r-- | src/db.ts | 41 | ||||
| -rw-r--r-- | src/index.ts | 18 | ||||
| -rw-r--r-- | src/middleware.ts | 7 | ||||
| -rw-r--r-- | src/tg.ts | 21 |
5 files changed, 81 insertions, 21 deletions
diff --git a/src/config.ts b/src/config.ts index dc3889a..962fd49 100644 --- a/src/config.ts +++ b/src/config.ts @@ -21,14 +21,6 @@ if (!tgBotToken) { throw new ConfigError("Missing env var TELEGRAM_BOT_TOKEN"); } -const tgUserIds = process.env.TELEGRAM_USER_IDS - ? process.env.TELEGRAM_USER_IDS?.split(",") - .map(Number.parseInt) - : null; -if (!tgUserIds) { - throw new ConfigError("Missing env var TELEGRAM_USER_IDS"); -} - const sheetsSpreadsheetId = process.env.SHEETS_SPREADSHEET_ID || null; if (!sheetsSpreadsheetId) { throw new ConfigError("Missing env var SHEETS_SPREADSHEET_ID"); @@ -39,13 +31,18 @@ if (!sheetsRange) { throw new ConfigError("Missing env var SHEETS_RANGE"); } +const pgConnectionUri = process.env.PG_CONNECTION_URI || null; +if (!pgConnectionUri) { + throw new ConfigError("Missing env var PG_CONNECTION_URI"); +} + const config = { port: process.env.PORT ? Number(process.env.PORT) : 3000, tgWebhookUrl, tgBotToken, - tgUserIds, sheetsSpreadsheetId, sheetsRange, + pgConnectionUri, }; export default config; diff --git a/src/db.ts b/src/db.ts new file mode 100644 index 0000000..b2c9c1e --- /dev/null +++ b/src/db.ts @@ -0,0 +1,41 @@ +import { + createPool, + QueryResultType, + sql, +} from "slonik"; +import config from "./config"; + +interface ActiveChat { + id: number; +} + +interface PermittedUser { + id: number; +} + +const connection = createPool(config.pgConnectionUri); + +export const getActiveChats = async (): Promise<readonly ActiveChat[]> => + connection.any(sql` + SELECT * + FROM active_chats + `); + +export const addActiveChat = async (id: number): Promise<QueryResultType<void>> => + connection.query<void>(sql` + INSERT INTO active_chats + (id) VALUES + (${id}) + `); + +export const removeActiveChat = async (id: number): Promise<QueryResultType<void>> => + connection.query<void>(sql` + DELETE FROM active_chats + WHERE id = ${id} + `); + +export const getPermittedUsers = async (): Promise<readonly PermittedUser[]> => + connection.any(sql` + SELECT * + FROM permitted_users + `); diff --git a/src/index.ts b/src/index.ts index 71e239f..4edfc2f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,16 +1,14 @@ import { App } from "@tinyhttp/app"; import { logger } from "@tinyhttp/logger"; -import { Telegraf } from "telegraf"; import config from "./config"; -import { tgMiddleware } from "./middleware"; +import { bot } from "./tg"; -const app = new App(); -console.log(`Setting up Telegram bot with token ${config.tgBotToken}`); -const bot = new Telegraf(config.tgBotToken); - -bot.use(tgMiddleware.auth); -bot.command("/start", (ctx) => ctx.reply("started")); -bot.command("/stop", (ctx) => ctx.reply("stopped")); +const app = new App({ + onError: (err, _req, res) => { + console.log(err); + res.status(500).send("Something bad happened"); + }, +}); app .use(logger({ @@ -19,7 +17,7 @@ app }, })) .use(bot.webhookCallback("/webhook/telegram")) - .get("/", (_, res) => { + .get("/", async (_, res) => { res.send({ service: "hommabot2 API" }); }) .post("/scheduler/trigger", (_req, res) => { diff --git a/src/middleware.ts b/src/middleware.ts index e2814e0..9aa0775 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,10 +1,13 @@ import { Context } from "telegraf"; -import config from "./config"; +import { getPermittedUsers } from "./db"; const auth = async (ctx: Context, next: () => Promise<void>): Promise<void> => { const userId = ctx.message?.from.id; - if (!userId || !config.tgUserIds.includes(userId)) { + const tgUsers = await getPermittedUsers(); + const tgUserIds = tgUsers.map(u => u.id); + + if (!userId || !tgUserIds.includes(userId)) { ctx.reply("Käyttäjälläsi ei ole oikeuksia startata HommaBottia."); } else { await next(); diff --git a/src/tg.ts b/src/tg.ts new file mode 100644 index 0000000..da8d02d --- /dev/null +++ b/src/tg.ts @@ -0,0 +1,21 @@ +import { Telegraf } from "telegraf"; +import config from "./config"; +import { addActiveChat, removeActiveChat } from "./db"; +import { tgMiddleware } from "./middleware"; + +console.log(`Setting up Telegram bot with token ${config.tgBotToken}`); +const bot = new Telegraf(config.tgBotToken); + +bot.use(tgMiddleware.auth); + +bot.command("/start", async (ctx) => { + await addActiveChat(ctx.chat.id); + await ctx.reply("HommaBot startattu. Uusia hommapäivityksiä viikon välein."); +}); + +bot.command("/stop", async (ctx) => { + await removeActiveChat(ctx.chat.id); + await ctx.reply("HommaBot pysäytetty!"); +}); + +export { bot }; |
