aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJan Tuomi <jan.tuomi@valuemotive.com>2021-04-18 20:10:34 +0300
committerJan Tuomi <jan.tuomi@valuemotive.com>2021-04-18 20:10:34 +0300
commitcf2e3c99ded0f48bd565858aedc7f10a0d932a61 (patch)
tree699e9c6b78456474b4b0e680a15a6b1bc49aab08 /src
parentbaacc7676c688cd2728033e9051208d655255ee5 (diff)
Add db connection
Diffstat (limited to 'src')
-rw-r--r--src/config.ts15
-rw-r--r--src/db.ts41
-rw-r--r--src/index.ts18
-rw-r--r--src/middleware.ts7
-rw-r--r--src/tg.ts21
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 };