From f75e3068a0860a8fec4dda9797895d53af5925a4 Mon Sep 17 00:00:00 2001 From: Fedor Katurov Date: Tue, 4 May 2021 14:58:39 +0700 Subject: [PATCH] #4 added duplicate check for wall_post_new --- src/service/db/index.ts | 10 +++++++-- src/service/db/postgres/entities/Event.ts | 5 +++-- src/service/db/postgres/entities/Like.ts | 3 +-- src/service/db/postgres/index.ts | 22 ++++++++++++++------ src/service/telegram/index.ts | 3 +-- src/service/vk/handlers/PostNewHandler.ts | 22 ++++++++++++++++++-- src/service/vk/handlers/VkEventHandler.ts | 25 +++++++++++++++++++++++ src/service/vk/index.ts | 1 + 8 files changed, 75 insertions(+), 16 deletions(-) diff --git a/src/service/db/index.ts b/src/service/db/index.ts index 9704718..713b9ef 100644 --- a/src/service/db/index.ts +++ b/src/service/db/index.ts @@ -5,12 +5,18 @@ import { Event } from "./postgres/entities/Event"; export interface Storage { getEvent( type: VkEvent, - id: number, + eventId: number, groupId: number, channel: string ): Promise; - createEvent(event: Partial): Promise; + createEvent( + type: VkEvent, + eventId: number, + groupId: number, + channel: string, + tgMessageId: number + ): Promise; createOrUpdateLike(like: Partial): Promise; diff --git a/src/service/db/postgres/entities/Event.ts b/src/service/db/postgres/entities/Event.ts index d203219..f5578a7 100644 --- a/src/service/db/postgres/entities/Event.ts +++ b/src/service/db/postgres/entities/Event.ts @@ -5,16 +5,17 @@ import { PrimaryGeneratedColumn, UpdateDateColumn, } from "typeorm"; -import { StoredEvent } from "../../types"; import { VkEvent } from "../../../vk/types"; @Entity() -export class Event implements StoredEvent { +export class Event { @PrimaryGeneratedColumn() id: number; @Column() type: VkEvent; @Column() + eventId: number; + @Column() groupId: number; @Column() channel: string; diff --git a/src/service/db/postgres/entities/Like.ts b/src/service/db/postgres/entities/Like.ts index 3132510..ff1c2d3 100644 --- a/src/service/db/postgres/entities/Like.ts +++ b/src/service/db/postgres/entities/Like.ts @@ -5,10 +5,9 @@ import { PrimaryGeneratedColumn, UpdateDateColumn, } from "typeorm"; -import { StoredLike } from "../../types"; @Entity() -export class Like implements StoredLike { +export class Like { @PrimaryGeneratedColumn() id: number; @Column() diff --git a/src/service/db/postgres/index.ts b/src/service/db/postgres/index.ts index 6830cf9..b7b65b0 100644 --- a/src/service/db/postgres/index.ts +++ b/src/service/db/postgres/index.ts @@ -35,19 +35,29 @@ export class PostgresDB implements Storage { getEvent = async ( type: VkEvent, - id: number, + eventId: number, groupId: number, channel: string ) => { - return await this.events.findOne({ type, id, groupId, channel }); + return await this.events.findOne({ type, eventId, groupId, channel }); }; - createEvent = async (event) => { - const result = this.events.create({ - ...event, + createEvent = async ( + type: VkEvent, + eventId: number, + groupId: number, + channel: string, + tgMessageId: number + ) => { + const event = this.events.create({ + type, + eventId, + groupId, + channel, + tgMessageId, }); - return result[0]; + return await this.events.save(event); }; getLikesFor = async (channel, messageId) => { diff --git a/src/service/telegram/index.ts b/src/service/telegram/index.ts index fac6483..498d8ca 100644 --- a/src/service/telegram/index.ts +++ b/src/service/telegram/index.ts @@ -85,7 +85,6 @@ export class TelegramService { extra?: ExtraReplyMessage ) => { logger.debug(`sending message "${message}" to chan "${channel}"`); - await this.bot.telegram.sendMessage(channel, message, extra); - return; + return await this.bot.telegram.sendMessage(channel, message, extra); }; } diff --git a/src/service/vk/handlers/PostNewHandler.ts b/src/service/vk/handlers/PostNewHandler.ts index b5d23dd..0846920 100644 --- a/src/service/vk/handlers/PostNewHandler.ts +++ b/src/service/vk/handlers/PostNewHandler.ts @@ -41,14 +41,26 @@ export class PostNewHandler extends VkEventHandler { private likes: string[] = ["👎", "👍"]; public execute = async (context: WallPostContext, next: NextMiddleware) => { + const id = context?.wall?.id; + if ( context.isRepost || - !PostNewHandler.isValidPostType(context?.wall?.postType) + !PostNewHandler.isValidPostType(context?.wall?.postType) || + !id ) { await next(); return; } + const exist = await this.getEventFromDB(id); + if (exist) { + logger.warn( + `received duplicate entry for ${this.group.name}, ${this.type}, ${id}` + ); + await next(); + return; + } + const user = context.wall.signerId ? await this.getUserByID(String(context.wall.signerId)) : undefined; @@ -67,7 +79,13 @@ export class PostNewHandler extends VkEventHandler { this.appendExtras(extras, text); - await this.telegram.sendMessageToChan(this.channel, parsed, extras); + const msg = await this.telegram.sendMessageToChan( + this.channel, + parsed, + extras + ); + + await this.storeInDB(id, msg.message_id); await next(); }; diff --git a/src/service/vk/handlers/VkEventHandler.ts b/src/service/vk/handlers/VkEventHandler.ts index 20fb48e..54b1e0d 100644 --- a/src/service/vk/handlers/VkEventHandler.ts +++ b/src/service/vk/handlers/VkEventHandler.ts @@ -4,6 +4,7 @@ import { VkService } from "../index"; import { TelegramService } from "../../telegram"; import { Template } from "../../template"; import { Storage } from "../../db"; +import { Event } from "../../db/postgres/entities/Event"; export class VkEventHandler< F extends Record = any, @@ -46,4 +47,28 @@ export class VkEventHandler< */ protected makeDialogUrl = (groupId: number, userId: number): string => `https://vk.com/gim${groupId}?sel=${userId}`; + + /** + * Checks for duplicates + */ + getEventFromDB = async (id?: number): Promise => { + if (!id) { + return undefined; + } + + return await this.db.getEvent(this.type, id, this.group.id, this.channel); + }; + + /** + * Creates event record in DB + */ + storeInDB = async (id: number, tgMessageId: number) => { + return await this.db.createEvent( + this.type, + id, + this.group.id, + this.channel, + tgMessageId + ); + }; } diff --git a/src/service/vk/index.ts b/src/service/vk/index.ts index 001995e..9655482 100644 --- a/src/service/vk/index.ts +++ b/src/service/vk/index.ts @@ -66,6 +66,7 @@ export class VkService { logger.debug(`received vk event`, { body }); const inst = this.instances[groupId] as GroupInstance; + inst.updates.getWebhookCallback(this.config.endpoint)(req, res, next); } catch (e) { next(e);