1
0
Fork 0
mirror of https://github.com/muerwre/vk-tg-bot.git synced 2025-04-24 22:46:41 +07:00
vk-tg-bot/src/api/http/index.ts
2021-04-28 12:17:47 +07:00

77 lines
2.1 KiB
TypeScript

import { HttpConfig } from "./types";
import { VkService } from "../../service/vk";
import express, { Express, Request, Response } from "express";
import bodyParser from "body-parser";
import loggerHttpMiddleware from "../../service/logger/http";
import logger from "../../service/logger";
import { TelegramService } from "../../service/telegram";
import http from "http";
import { URL } from "url";
import { corsMiddleware, errorMiddleware } from "./middleware";
import { WebhookConfig } from "../../service/telegram/types";
export class HttpApi {
app: Express;
webhook: WebhookConfig;
constructor(
private props: HttpConfig,
private telegram: TelegramService,
private vk: VkService
) {
this.webhook = this.telegram.webhook;
this.app = express();
this.app.use(corsMiddleware);
this.app.use(express.json());
this.app.use(express.urlencoded({ extended: false }));
this.app.use(loggerHttpMiddleware);
this.app.use(bodyParser.json());
this.app.use(express.json());
this.setupHandlers();
this.app.use(errorMiddleware);
}
/**
* Starts http server
*/
public async listen() {
const httpServer = http.createServer(this.app);
httpServer.listen(this.props.port);
logger.info(`http api listening at ${this.props.port}`);
}
/**
* Adds webhandlers
*/
private setupHandlers() {
// Webhooks (if available)
if (this?.webhook?.enabled && this?.webhook?.url) {
const url = new URL(this.webhook.url);
logger.info(`using webhook at ${url.pathname}`);
this.app.post(url.pathname, this.handleWebhook);
this.app.get(url.pathname, this.testWebhook);
}
// VK event handler
this.app.post(this.vk.endpoint, this.vk.handle);
}
/**
* Handles telegram webhooks
*/
private handleWebhook = async (req: Request, res: Response) => {
logger.debug("got message via webhook", req.body);
await this.telegram.handleUpdate(req.body, res);
};
/**
* Just returns 200
*/
private testWebhook = async (req: Request, res: Response) => {
res.sendStatus(200);
};
}