diff --git a/src/service/db/index.ts b/src/service/db/index.ts index 5e64eae..149d934 100644 --- a/src/service/db/index.ts +++ b/src/service/db/index.ts @@ -37,6 +37,10 @@ export interface Storage { messageId: number, author: number ): Promise; - createPost(eventId: number, text: string): Promise; + createPost( + eventId: number, + text: string, + vkPostId: number + ): Promise; findPostByEvent(eventId: number): Promise; } diff --git a/src/service/db/postgres/entities/Post.ts b/src/service/db/postgres/entities/Post.ts index fdb2bd5..9fba843 100644 --- a/src/service/db/postgres/entities/Post.ts +++ b/src/service/db/postgres/entities/Post.ts @@ -14,6 +14,8 @@ export class Post { eventId!: number; @Column({ type: "text" }) text!: string; + @Column() + vkPostId!: number; @CreateDateColumn() createdAt!: Date; @UpdateDateColumn() diff --git a/src/service/db/postgres/index.ts b/src/service/db/postgres/index.ts index 750b2d0..8acd303 100644 --- a/src/service/db/postgres/index.ts +++ b/src/service/db/postgres/index.ts @@ -124,7 +124,7 @@ export class PostgresDB implements Storage { return this.posts.findOne({ eventId }); }; - createPost = async (eventId: number, text: string) => { - return this.posts.save({ eventId, text }); + createPost = async (eventId: number, text: string, vkPostId: number) => { + return this.posts.save({ eventId, text, vkPostId }); }; } diff --git a/src/service/vk/handlers/PostNewHandler.ts b/src/service/vk/handlers/PostNewHandler.ts index 74c36eb..2182a5f 100644 --- a/src/service/vk/handlers/PostNewHandler.ts +++ b/src/service/vk/handlers/PostNewHandler.ts @@ -16,11 +16,12 @@ import logger from "../../logger"; import Composer from "telegraf"; import CallbackQueryUpdate = Update.CallbackQueryUpdate; -type Button = "links" | "likes"; +type Button = "links" | "likes" | "more"; type UrlPrefix = string; type ExtraGenerator = ( text: string, - eventId?: number + eventId?: number, + postId?: number ) => Promise; interface Fields { @@ -79,7 +80,7 @@ export class PostNewHandler extends VkEventHandler { const extras: ExtraReplyMessage = { disable_web_page_preview: true, - reply_markup: await this.createKeyboard(text), + reply_markup: await this.createKeyboard(text, undefined, context.wall.id), }; let msg: Message; @@ -112,7 +113,11 @@ export class PostNewHandler extends VkEventHandler { context.wall.toJSON() ); - await this.db.createPost(event!.id, context?.wall?.text || ""); + await this.db.createPost( + event!.id, + context?.wall?.text || "", + context.wall.id + ); await next(); }; @@ -137,7 +142,8 @@ export class PostNewHandler extends VkEventHandler { */ private createKeyboard = async ( text: string, - eventId?: number + eventId?: number, + postId?: number ): Promise => { const { buttons } = this.template.fields; @@ -146,7 +152,9 @@ export class PostNewHandler extends VkEventHandler { } const rows = await Promise.all( - buttons.map((button) => this.extrasGenerators[button](text, eventId)) + buttons.map((button) => + this.extrasGenerators[button](text, eventId, postId) + ) ); const inline_keyboard = rows.filter( @@ -187,6 +195,17 @@ export class PostNewHandler extends VkEventHandler { .filter((el) => el) as InlineKeyboardButton[]; }; + /** + * Generates read more button + */ + private generateReadMore: ExtraGenerator = async (text, eventId, postId) => { + const label = this.template.fields.link_text; + + if (!postId || !label) return []; + + return [{ text: label, url: `${postId}` }]; + }; + /** * Generates like button */ @@ -228,6 +247,7 @@ export class PostNewHandler extends VkEventHandler { private extrasGenerators: Record = { links: this.generateLinks, likes: this.generateLikes, + more: this.generateReadMore, }; /** @@ -285,7 +305,11 @@ export class PostNewHandler extends VkEventHandler { await this.createOrUpdateLike(author, event.tgMessageId, emo); - const markup = await this.createKeyboard(post.text, event.id); + const markup = await this.createKeyboard( + post.text, + event.id, + post.vkPostId + ); await ctx.telegram.editMessageReplyMarkup( ctx.chat?.id, diff --git a/templates/post_new.md b/templates/post_new.md index 5b1dd3f..adc35bd 100644 --- a/templates/post_new.md +++ b/templates/post_new.md @@ -1,6 +1,6 @@ --- image: true - buttons: [likes,links] + buttons: [likes,links,more] link_text: Пост полностью links: https://map.vault48.org/: Посмотреть карту