From bddca26ee33449f2f5cd20e3edca1491d44005a4 Mon Sep 17 00:00:00 2001 From: Muhsin <12408980+muhsin-k@users.noreply.github.com> Date: Sat, 30 May 2026 14:53:54 +0400 Subject: [PATCH] feat: mvp --- app/javascript/dashboard/api/campaigns.js | 12 + .../Campaigns/CampaignCard/CampaignCard.vue | 18 +- .../Pages/CampaignPage/CampaignList.vue | 13 +- .../dashboard/i18n/locale/en/campaign.json | 29 ++ .../dashboard/campaigns/campaigns.routes.js | 10 + .../pages/WhatsAppCampaignAnalyticsPage.vue | 378 ++++++++++++++++++ .../campaigns/pages/WhatsAppCampaignsPage.vue | 10 + app/models/campaign.rb | 1 + app/models/channel/whatsapp.rb | 2 + .../whatsapp/incoming_message_base_service.rb | 2 + .../whatsapp/oneoff_campaign_service.rb | 2 + .../whatsapp/providers/base_service.rb | 2 + config/routes.rb | 7 +- ...260530090000_create_campaign_deliveries.rb | 36 ++ db/schema.rb | 33 +- .../campaigns/analytics_controller.rb | 83 ++++ enterprise/app/models/campaign_delivery.rb | 80 ++++ enterprise/app/models/enterprise/campaign.rb | 7 + .../app/models/enterprise/channel/whatsapp.rb | 10 + .../app/models/enterprise/concerns/contact.rb | 1 + .../whatsapp/incoming_message_base_service.rb | 10 + .../whatsapp/oneoff_campaign_service.rb | 102 +++++ .../whatsapp/providers/base_service.rb | 37 ++ 23 files changed, 880 insertions(+), 5 deletions(-) create mode 100644 app/javascript/dashboard/routes/dashboard/campaigns/pages/WhatsAppCampaignAnalyticsPage.vue create mode 100644 db/migrate/20260530090000_create_campaign_deliveries.rb create mode 100644 enterprise/app/controllers/api/v1/accounts/campaigns/analytics_controller.rb create mode 100644 enterprise/app/models/campaign_delivery.rb create mode 100644 enterprise/app/models/enterprise/campaign.rb create mode 100644 enterprise/app/models/enterprise/channel/whatsapp.rb create mode 100644 enterprise/app/services/enterprise/whatsapp/incoming_message_base_service.rb create mode 100644 enterprise/app/services/enterprise/whatsapp/oneoff_campaign_service.rb create mode 100644 enterprise/app/services/enterprise/whatsapp/providers/base_service.rb diff --git a/app/javascript/dashboard/api/campaigns.js b/app/javascript/dashboard/api/campaigns.js index 1c73a3360..b3d2ca3e0 100644 --- a/app/javascript/dashboard/api/campaigns.js +++ b/app/javascript/dashboard/api/campaigns.js @@ -1,9 +1,21 @@ +/* global axios */ + import ApiClient from './ApiClient'; class CampaignsAPI extends ApiClient { constructor() { super('campaigns', { accountScoped: true }); } + + analyticsMetrics(id) { + return axios.get(`${this.url}/${id}/analytics/metrics`); + } + + analyticsContacts(id, { status, page } = {}) { + return axios.get(`${this.url}/${id}/analytics/contacts`, { + params: { status, page }, + }); + } } export default new CampaignsAPI(); diff --git a/app/javascript/dashboard/components-next/Campaigns/CampaignCard/CampaignCard.vue b/app/javascript/dashboard/components-next/Campaigns/CampaignCard/CampaignCard.vue index 05507fc89..bd772dce9 100644 --- a/app/javascript/dashboard/components-next/Campaigns/CampaignCard/CampaignCard.vue +++ b/app/javascript/dashboard/components-next/Campaigns/CampaignCard/CampaignCard.vue @@ -42,9 +42,13 @@ const props = defineProps({ type: Number, default: 0, }, + showAnalytics: { + type: Boolean, + default: false, + }, }); -const emit = defineEmits(['edit', 'delete']); +const emit = defineEmits(['edit', 'delete', 'analytics']); const { t } = useI18n(); @@ -116,7 +120,17 @@ const inboxIcon = computed(() => { /> -
+
+