From 96b0848cfd243547d1a46568557d261d786acbf4 Mon Sep 17 00:00:00 2001 From: Alexandr Kazachenko Date: Thu, 9 May 2024 10:00:23 +0300 Subject: [PATCH] feat: get subscriptions for several accounts (#27) --- .../notification/controllers/notification.ts | 42 ++---------------- src/api/notification/services/notification.ts | 43 ++++++++++++++++++- .../controllers/telegram-subscription.ts | 13 ++++-- .../routes/telegram-subscription.ts | 13 +++++- .../services/telegram-subscription.ts | 22 ++++++++-- .../1.0.0/full_documentation.json | 2 +- 6 files changed, 85 insertions(+), 50 deletions(-) diff --git a/src/api/notification/controllers/notification.ts b/src/api/notification/controllers/notification.ts index 9e9ba5c..96696ce 100644 --- a/src/api/notification/controllers/notification.ts +++ b/src/api/notification/controllers/notification.ts @@ -5,8 +5,6 @@ import { factories } from '@strapi/strapi' const MODULE_ID = 'api::notification.notification' -const GLOBAL_MODULE_ID = 'api::notifications-consumer.notifications-consumer' -const SINGLETON_ID = 1 export default factories.createCoreController(MODULE_ID, ({ strapi }) => { return { @@ -17,44 +15,10 @@ export default factories.createCoreController(MODULE_ID, ({ strapi }) => { }, async getPushNotifications() { - const global = await strapi.entityService.findOne(GLOBAL_MODULE_ID, SINGLETON_ID, { - populate: ['id', 'lastConsumedNotificationDate'] - }) + const service = strapi.service(MODULE_ID) + const notifications = service.getPushNotifications() - const lastConsumedNotificationDate = global?.lastConsumedNotificationDate - - const notifications = await strapi.entityService.findMany( - MODULE_ID, - { - limit: 200, - filters: { - notification_template: { push: true }, - ...(lastConsumedNotificationDate ? { - createdAt: {$gt: lastConsumedNotificationDate} - } : undefined) - }, - populate: { - notification_template: { - fields: ['id', 'title', 'description', 'url', 'push'], - populate: { - thumbnail: { - fields: ['url'] - } - } - } - } - } - ) - - if (notifications.length) { - await strapi.entityService.update( - GLOBAL_MODULE_ID, - SINGLETON_ID, - { - data: { lastConsumedNotificationDate: new Date() } - } - ) - } + await service.updateLastConsumedNotificationDate() return notifications }, diff --git a/src/api/notification/services/notification.ts b/src/api/notification/services/notification.ts index 32e43c7..4534d9a 100644 --- a/src/api/notification/services/notification.ts +++ b/src/api/notification/services/notification.ts @@ -5,6 +5,8 @@ import { factories } from '@strapi/strapi'; const MODULE_ID = 'api::notification.notification' +const GLOBAL_MODULE_ID = 'api::notifications-consumer.notifications-consumer' +const SINGLETON_ID = 1 export default factories.createCoreService(MODULE_ID, ({ strapi }) => { return { @@ -41,10 +43,49 @@ export default factories.createCoreService(MODULE_ID, ({ strapi }) => { thumbnail: notification.notification_template.thumbnail.url })) }, + async getPushNotifications() { + const global = await strapi.entityService.findOne(GLOBAL_MODULE_ID, SINGLETON_ID, { + populate: ['id', 'lastConsumedNotificationDate'] + }) + + const lastConsumedNotificationDate = global?.lastConsumedNotificationDate + + return strapi.entityService.findMany( + MODULE_ID, + { + limit: 200, + filters: { + notification_template: { push: true }, + ...(lastConsumedNotificationDate ? { + createdAt: {$gt: lastConsumedNotificationDate} + } : undefined) + }, + populate: { + notification_template: { + fields: ['id', 'title', 'description', 'url', 'push'], + populate: { + thumbnail: { + fields: ['url'] + } + } + } + } + } + ) + }, + updateLastConsumedNotificationDate() { + return strapi.entityService.update( + GLOBAL_MODULE_ID, + SINGLETON_ID, + { + data: { lastConsumedNotificationDate: new Date() } + } + ) + } } }); -function templateNotification(description: string, data: {[key: string]: string}): string { +export function templateNotification(description: string, data: {[key: string]: string}): string { let result = description if (!data) return result diff --git a/src/api/telegram-subscription/controllers/telegram-subscription.ts b/src/api/telegram-subscription/controllers/telegram-subscription.ts index 42389a8..fa787be 100644 --- a/src/api/telegram-subscription/controllers/telegram-subscription.ts +++ b/src/api/telegram-subscription/controllers/telegram-subscription.ts @@ -30,14 +30,21 @@ export default factories.createCoreController(MODULE_ID, ({strapi}) => { return true }, async getSubscriptions(context) { + const { accounts } = context.query + + const accountsArray = accounts ? accounts.split(',') : [] + + if (!accountsArray.length) return [] + + return strapi.service(MODULE_ID).getSubscriptions(accountsArray) + }, + async getAccountSubscriptions(context) { const account = context.params.account return strapi.service(MODULE_ID).getAccountSubscriptions(account) }, async sendNotifications(context) { - const account = context.params.account - - return strapi.service(MODULE_ID).sendNotifications(account) + return strapi.service(MODULE_ID).sendNotifications() } } }); diff --git a/src/api/telegram-subscription/routes/telegram-subscription.ts b/src/api/telegram-subscription/routes/telegram-subscription.ts index bb04c1c..1e13bcb 100644 --- a/src/api/telegram-subscription/routes/telegram-subscription.ts +++ b/src/api/telegram-subscription/routes/telegram-subscription.ts @@ -22,13 +22,22 @@ const customRouter = (innerRouter, extraRoutes = []) => { const myExtraRoutes = [ { method: 'GET', - path: '/tg-subscriptions/:account', + path: '/tg-subscriptions', handler: 'telegram-subscription.getSubscriptions', config: { policies: [], middlewares: [], }, }, + { + method: 'GET', + path: '/tg-subscriptions/:account', + handler: 'telegram-subscription.getAccountSubscriptions', + config: { + policies: [], + middlewares: [], + }, + }, { method: 'POST', path: '/add-tg-subscription', @@ -40,7 +49,7 @@ const myExtraRoutes = [ }, { method: 'GET', - path: '/send-tg-notifications/:account', + path: '/send-tg-notifications', handler: 'telegram-subscription.sendNotifications', config: { policies: [], diff --git a/src/api/telegram-subscription/services/telegram-subscription.ts b/src/api/telegram-subscription/services/telegram-subscription.ts index 6f2ac89..ca8bb13 100644 --- a/src/api/telegram-subscription/services/telegram-subscription.ts +++ b/src/api/telegram-subscription/services/telegram-subscription.ts @@ -7,6 +7,7 @@ import { env } from '@strapi/utils' import fetch from 'node-fetch' import crypto from 'crypto' import { TelegramData } from '../types' +import { templateNotification } from '../../notification/services/notification' const MODULE_ID = 'api::telegram-subscription.telegram-subscription' @@ -42,6 +43,19 @@ export default factories.createCoreService(MODULE_ID, ({strapi}) => { } }) }, + async getSubscriptions(accounts: string[]) { + return strapi.entityService.findMany( + MODULE_ID, + { + filters: { + account: { + $in: accounts + } + }, + fields: ['id', 'account', 'chat_id'] + } + ) + }, async getAccountSubscriptions(account: string) { return strapi.entityService.findMany( MODULE_ID, @@ -54,12 +68,12 @@ export default factories.createCoreService(MODULE_ID, ({strapi}) => { ) }, // TODO: temporary implementation - async sendNotifications(account: string): Promise { - const notifications = await strapi.service('api::notification.notification').getNotificationList(account, true) + async sendNotifications(): Promise { + const notifications = await strapi.service('api::notification.notification').getPushNotifications() if (notifications.length === 0) return 0 - const subscriptions = await this.getAccountSubscriptions(account) + const subscriptions = await this.getSubscriptions(notifications.map(n => n.account)) const requests = subscriptions.map(subscription => { return notifications.map(notification => { @@ -70,7 +84,7 @@ export default factories.createCoreService(MODULE_ID, ({strapi}) => { }, body: JSON.stringify({ chat_id: subscription.chat_id, - text: notification.description + text: templateNotification(notification.notification_template.description, notification.data) }) }) }) diff --git a/src/extensions/documentation/documentation/1.0.0/full_documentation.json b/src/extensions/documentation/documentation/1.0.0/full_documentation.json index 2e20361..c946d8c 100644 --- a/src/extensions/documentation/documentation/1.0.0/full_documentation.json +++ b/src/extensions/documentation/documentation/1.0.0/full_documentation.json @@ -14,7 +14,7 @@ "name": "Apache 2.0", "url": "https://www.apache.org/licenses/LICENSE-2.0.html" }, - "x-generation-date": "2024-05-08T15:28:37.728Z" + "x-generation-date": "2024-05-09T06:57:04.271Z" }, "x-strapi-config": { "path": "/documentation",