From a6e6209770a45b4d08b1c6e61c68858b78d4ba7e Mon Sep 17 00:00:00 2001 From: Fedor Katurov Date: Wed, 5 May 2021 12:14:31 +0700 Subject: [PATCH] #4 storing events in db --- src/service/db/index.ts | 3 ++- src/service/db/postgres/entities/Event.ts | 4 ++-- src/service/db/postgres/index.ts | 4 +++- src/service/vk/handlers/PostNewHandler.ts | 28 +++++++++++++++++++---- src/service/vk/handlers/VkEventHandler.ts | 11 ++++++--- 5 files changed, 38 insertions(+), 12 deletions(-) diff --git a/src/service/db/index.ts b/src/service/db/index.ts index 713b9ef..5a53ebf 100644 --- a/src/service/db/index.ts +++ b/src/service/db/index.ts @@ -15,7 +15,8 @@ export interface Storage { eventId: number, groupId: number, channel: string, - tgMessageId: number + tgMessageId: number, + text: Record ): Promise; createOrUpdateLike(like: Partial): Promise; diff --git a/src/service/db/postgres/entities/Event.ts b/src/service/db/postgres/entities/Event.ts index 8136b4e..310a8d8 100644 --- a/src/service/db/postgres/entities/Event.ts +++ b/src/service/db/postgres/entities/Event.ts @@ -25,6 +25,6 @@ export class Event { createdAt: Date; @UpdateDateColumn() updatedAt: Date; - @Column({ type: "text", default: "", nullable: false }) - text: string; + @Column("simple-json", { default: {}, nullable: false }) + text: Record; } diff --git a/src/service/db/postgres/index.ts b/src/service/db/postgres/index.ts index b7b65b0..9fdbc4c 100644 --- a/src/service/db/postgres/index.ts +++ b/src/service/db/postgres/index.ts @@ -47,7 +47,8 @@ export class PostgresDB implements Storage { eventId: number, groupId: number, channel: string, - tgMessageId: number + tgMessageId: number, + text: Record ) => { const event = this.events.create({ type, @@ -55,6 +56,7 @@ export class PostgresDB implements Storage { groupId, channel, tgMessageId, + text, }); return await this.events.save(event); diff --git a/src/service/vk/handlers/PostNewHandler.ts b/src/service/vk/handlers/PostNewHandler.ts index 0846920..33a0a4e 100644 --- a/src/service/vk/handlers/PostNewHandler.ts +++ b/src/service/vk/handlers/PostNewHandler.ts @@ -13,7 +13,10 @@ import CallbackQueryUpdate = Update.CallbackQueryUpdate; type Button = "links" | "likes"; type UrlPrefix = string; -type ExtraGenerator = (text: string) => InlineKeyboardButton[]; +type ExtraGenerator = ( + text: string, + messageId?: number +) => InlineKeyboardButton[]; interface Fields { image?: boolean; @@ -52,7 +55,7 @@ export class PostNewHandler extends VkEventHandler { return; } - const exist = await this.getEventFromDB(id); + const exist = await this.getEvent(id); if (exist) { logger.warn( `received duplicate entry for ${this.group.name}, ${this.type}, ${id}` @@ -85,7 +88,7 @@ export class PostNewHandler extends VkEventHandler { extras ); - await this.storeInDB(id, msg.message_id); + await this.createEvent(id, msg.message_id, context.wall.toJSON()); await next(); }; @@ -100,14 +103,18 @@ export class PostNewHandler extends VkEventHandler { /** * Creates extras */ - private appendExtras = (extras: ExtraReplyMessage, text: string) => { + private appendExtras = ( + extras: ExtraReplyMessage, + text: string, + messageId?: number + ) => { const { buttons } = this.template.fields; if (!buttons?.length) { return; } const keyboard = buttons - .map((button) => this.extrasGenerators[button](text)) + .map((button) => this.extrasGenerators[button](text, messageId)) .filter((el) => el && el.length); if (!keyboard.length) { @@ -185,11 +192,13 @@ export class PostNewHandler extends VkEventHandler { onLikeAction = async (ctx: LikeCtx, next) => { const id = ctx.update.callback_query.message.message_id; const [_, channel, emo] = ctx.match; + const exist = await this.getEvent(id); if ( !channel || !emo || !id || + !exist || channel != this.channel || !this.likes.includes(emo) ) { @@ -197,6 +206,15 @@ export class PostNewHandler extends VkEventHandler { return; } + // const extras: ExtraReplyMessage = {}; + // this.appendExtras(extras, exist.text); + // await ctx.telegram.editMessageReplyMarkup( + // ctx.chat.id, + // id, + // ctx.inlineMessageId, + // extras.reply_markup.inline_keyboard + // ); + logger.warn( `someone reacted with ${emo} to message ${id} on channel ${channel}` ); diff --git a/src/service/vk/handlers/VkEventHandler.ts b/src/service/vk/handlers/VkEventHandler.ts index 54b1e0d..b6a6305 100644 --- a/src/service/vk/handlers/VkEventHandler.ts +++ b/src/service/vk/handlers/VkEventHandler.ts @@ -51,7 +51,7 @@ export class VkEventHandler< /** * Checks for duplicates */ - getEventFromDB = async (id?: number): Promise => { + getEvent = async (id?: number): Promise => { if (!id) { return undefined; } @@ -62,13 +62,18 @@ export class VkEventHandler< /** * Creates event record in DB */ - storeInDB = async (id: number, tgMessageId: number) => { + createEvent = async ( + id: number, + tgMessageId: number, + text: Record + ) => { return await this.db.createEvent( this.type, id, this.group.id, this.channel, - tgMessageId + tgMessageId, + text ); }; }