From dcfc231d4dc75fefe31aecaba6ac935933ad4dc9 Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Sun, 1 Sep 2024 23:01:25 +0200 Subject: [PATCH 1/2] feat(server): Events tracking using Posthog --- .env.example | 4 ++ packages/server/package.json | 1 + packages/server/src/config/index.ts | 8 +++ .../server/src/constants/event-tracker.ts | 43 ++++++++++++ packages/server/src/loaders/eventEmitter.ts | 3 + .../src/services/EventsTracker/PostHog.ts | 24 +++++++ .../events/AccountEventsTracker.ts | 65 ++++++++++++++++++ .../events/AuthenticationEventsTracker.ts | 35 ++++++++++ .../EventsTracker/events/BillEventsTracker.ts | 59 ++++++++++++++++ .../events/ExpenseEventsTracker.ts | 65 ++++++++++++++++++ .../EventsTracker/events/ItemEventsTracker.ts | 59 ++++++++++++++++ .../events/PaymentMadeEventsTracker.ts | 68 +++++++++++++++++++ .../events/PaymentReceivedEventsTracker.ts | 68 +++++++++++++++++++ .../events/SaleEstimateEventsTracker.ts | 68 +++++++++++++++++++ .../events/SaleInvoicesEventsTracker.ts | 67 ++++++++++++++++++ .../services/EventsTracker/events/events.ts | 21 ++++++ .../webapp/src/constants/event-tracker.ts | 28 ++++++++ pnpm-lock.yaml | 27 ++++++++ 18 files changed, 713 insertions(+) create mode 100644 packages/server/src/constants/event-tracker.ts create mode 100644 packages/server/src/services/EventsTracker/PostHog.ts create mode 100644 packages/server/src/services/EventsTracker/events/AccountEventsTracker.ts create mode 100644 packages/server/src/services/EventsTracker/events/AuthenticationEventsTracker.ts create mode 100644 packages/server/src/services/EventsTracker/events/BillEventsTracker.ts create mode 100644 packages/server/src/services/EventsTracker/events/ExpenseEventsTracker.ts create mode 100644 packages/server/src/services/EventsTracker/events/ItemEventsTracker.ts create mode 100644 packages/server/src/services/EventsTracker/events/PaymentMadeEventsTracker.ts create mode 100644 packages/server/src/services/EventsTracker/events/PaymentReceivedEventsTracker.ts create mode 100644 packages/server/src/services/EventsTracker/events/SaleEstimateEventsTracker.ts create mode 100644 packages/server/src/services/EventsTracker/events/SaleInvoicesEventsTracker.ts create mode 100644 packages/server/src/services/EventsTracker/events/events.ts create mode 100644 packages/webapp/src/constants/event-tracker.ts diff --git a/.env.example b/.env.example index f8693053c..99a2cae8d 100644 --- a/.env.example +++ b/.env.example @@ -89,3 +89,7 @@ S3_ACCESS_KEY_ID= S3_SECRET_ACCESS_KEY= S3_ENDPOINT= S3_BUCKET= + +# PostHog +POSTHOG_API_KEY= +POSTHOG_HOST= \ No newline at end of file diff --git a/packages/server/package.json b/packages/server/package.json index d9951a0d7..b07d5694b 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -99,6 +99,7 @@ "objection-unique": "^1.2.2", "plaid": "^10.3.0", "pluralize": "^8.0.0", + "posthog-node": "^4.2.0", "pug": "^3.0.2", "puppeteer": "^10.2.0", "qim": "0.0.52", diff --git a/packages/server/src/config/index.ts b/packages/server/src/config/index.ts index 79c3911b3..a806fe7d7 100644 --- a/packages/server/src/config/index.ts +++ b/packages/server/src/config/index.ts @@ -253,4 +253,12 @@ module.exports = { enable: parseBoolean(process.env.ONE_CLICK_DEMO_ACCOUNTS, false), demoUrl: process.env.ONE_CLICK_DEMO_ACCOUNTS_URL || '', }, + + /** + * PostHog + */ + posthog: { + apiKey: process.env.POSTHOG_API_KEY, + host: process.env.POSTHOG_HOST + } }; diff --git a/packages/server/src/constants/event-tracker.ts b/packages/server/src/constants/event-tracker.ts new file mode 100644 index 000000000..4fcb92aed --- /dev/null +++ b/packages/server/src/constants/event-tracker.ts @@ -0,0 +1,43 @@ +export const SALE_INVOICE_CREATED = 'Sale invoice created'; +export const SALE_INVOICE_EDITED = 'Sale invoice d'; +export const SALE_INVOICE_DELETED = 'Sale invoice deleted'; +export const SALE_INVOICE_MAIL_DELIVERED = 'Sale invoice mail delivered'; + +export const SALE_ESTIMATE_CREATED = 'Sale estimate created'; +export const SALE_ESTIMATE_EDITED = 'Sale estimate edited'; +export const SALE_ESTIMATE_DELETED = 'Sale estimate deleted'; + +export const PAYMENT_RECEIVED_CREATED = 'Payment received created'; +export const PAYMENT_RECEIVED_EDITED = 'payment received edited'; +export const PAYMENT_RECEIVED_DELETED = 'Payment received deleted'; + +export const BILL_CREATED = 'Bill created'; +export const BILL_EDITED = 'Bill edited'; +export const BILL_DELETED = 'Bill deleted'; + +export const PAYMENT_MADE_CREATED = 'Payment made created'; +export const PAYMENT_MADE_EDITED = 'Payment made edited'; +export const PAYMENT_MADE_DELETED = 'Payment made deleted'; + +export const EXPENSE_CREATED = 'Expense created'; +export const EXPENSE_EDITED = 'Expense edited'; +export const EXPENSE_DELETED = 'Expense deleted'; + +export const ACCOUNT_CREATED = 'Account created'; +export const ACCOUNT_EDITED = 'Account Edited'; +export const ACCOUNT_DELETED = 'Account deleted'; + +export const ITEM_EVENT_CREATED = 'Item created'; +export const ITEM_EVENT_EDITED = 'Item edited'; +export const ITEM_EVENT_DELETED = 'Item deleted'; + +export const AUTH_SIGNED_UP = 'Auth Signed-up'; +export const AUTH_RESET_PASSWORD = 'Auth reset password'; + +export const ACCOUNT_GROUP = 'Account'; +export const ITEM_GROUP = 'Item'; +export const AUTH_GROUP = 'Auth'; +export const SALE_GROUP = 'Sale'; +export const PAYMENT_GROUP = 'Payment'; +export const BILL_GROUP = 'Bill'; +export const EXPENSE_GROUP = 'Expense'; diff --git a/packages/server/src/loaders/eventEmitter.ts b/packages/server/src/loaders/eventEmitter.ts index 6fed9bc5d..967e43f57 100644 --- a/packages/server/src/loaders/eventEmitter.ts +++ b/packages/server/src/loaders/eventEmitter.ts @@ -118,6 +118,7 @@ import { LoopsEventsSubscriber } from '@/services/Loops/LoopsEventsSubscriber'; import { DeleteUncategorizedTransactionsOnAccountDeleting } from '@/services/Banking/BankAccounts/events/DeleteUncategorizedTransactionsOnAccountDeleting'; import { SeedInitialDemoAccountDataOnOrgBuild } from '@/services/OneClickDemo/events/SeedInitialDemoAccountData'; import { TriggerInvalidateCacheOnSubscriptionChange } from '@/services/Subscription/events/TriggerInvalidateCacheOnSubscriptionChange'; +import { EventsTrackerListeners } from '@/services/EventsTracker/events/events'; export default () => { return new EventPublisher(); @@ -289,5 +290,7 @@ export const susbcribers = () => { // Demo Account SeedInitialDemoAccountDataOnOrgBuild, + + ...EventsTrackerListeners ]; }; diff --git a/packages/server/src/services/EventsTracker/PostHog.ts b/packages/server/src/services/EventsTracker/PostHog.ts new file mode 100644 index 000000000..ef4d46b9e --- /dev/null +++ b/packages/server/src/services/EventsTracker/PostHog.ts @@ -0,0 +1,24 @@ +import { PostHog } from 'posthog-node'; +import { Service } from 'typedi'; +import { EventMessage } from 'posthog-node/src/types'; +import config from '@/config'; + +@Service() +export class PosthogService { + public posthog: PostHog; + + constructor() { + if (config.posthog.apiKey && config.posthog.host) { + this.posthog = new PostHog(config.posthog.apiKey, { + host: config.posthog.host, + }); + } + } + + public trackEvent(event: EventMessage) { + // Cannot continue if the Posthog not configured. + if (!this.posthog) return; + + this.posthog.capture(event); + } +} diff --git a/packages/server/src/services/EventsTracker/events/AccountEventsTracker.ts b/packages/server/src/services/EventsTracker/events/AccountEventsTracker.ts new file mode 100644 index 000000000..8b371a79f --- /dev/null +++ b/packages/server/src/services/EventsTracker/events/AccountEventsTracker.ts @@ -0,0 +1,65 @@ +import { Inject, Service } from 'typedi'; +import { EventSubscriber } from '@/lib/EventPublisher/EventPublisher'; +import { + IAccountEventCreatedPayload, + IAccountEventEditedPayload, + IAccountEventDeletedPayload, +} from '@/interfaces'; +import { PosthogService } from '../PostHog'; +import events from '@/subscribers/events'; +import { + ACCOUNT_CREATED, + ACCOUNT_EDITED, + ACCOUNT_DELETED, +} from '@/constants/event-tracker'; + +@Service() +export class AccountEventsTracker extends EventSubscriber { + @Inject() + private posthog: PosthogService; + + /** + * Constructor method. + */ + public attach(bus) { + bus.subscribe( + events.accounts.onCreated, + this.handleTrackAccountCreatedEvent + ); + bus.subscribe(events.accounts.onEdited, this.handleTrackEditedAccountEvent); + bus.subscribe( + events.accounts.onDeleted, + this.handleTrackDeletedAccountEvent + ); + } + + private handleTrackAccountCreatedEvent = ({ + tenantId, + }: IAccountEventCreatedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: ACCOUNT_CREATED, + properties: {}, + }); + }; + + private handleTrackEditedAccountEvent = ({ + tenantId, + }: IAccountEventEditedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: ACCOUNT_EDITED, + properties: {}, + }); + }; + + private handleTrackDeletedAccountEvent = ({ + tenantId, + }: IAccountEventDeletedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: ACCOUNT_DELETED, + properties: {}, + }); + }; +} diff --git a/packages/server/src/services/EventsTracker/events/AuthenticationEventsTracker.ts b/packages/server/src/services/EventsTracker/events/AuthenticationEventsTracker.ts new file mode 100644 index 000000000..cce7495fe --- /dev/null +++ b/packages/server/src/services/EventsTracker/events/AuthenticationEventsTracker.ts @@ -0,0 +1,35 @@ +import { Inject, Service } from 'typedi'; +import { EventSubscriber } from '@/lib/EventPublisher/EventPublisher'; +import { IAuthSignedUpEventPayload } from '@/interfaces'; +import { PosthogService } from '../PostHog'; +import { AUTH_SIGNED_UP } from '@/constants/event-tracker'; +import events from '@/subscribers/events'; + +@Service() +export class AuthenticationEventsTracker extends EventSubscriber { + @Inject() + private posthog: PosthogService; + + /** + * Constructor method. + */ + public attach(bus) { + bus.subscribe(events.auth.signUp, this.handleTrackSignUpEvent); + } + + private handleTrackSignUpEvent = ({ + signupDTO, + user, + tenant, + }: IAuthSignedUpEventPayload) => { + this.posthog.trackEvent({ + distinctId: user.email, + event: AUTH_SIGNED_UP, + properties: { + firstName: user.firstName, + lastName: user.lastName, + email: user.email, + }, + }); + }; +} diff --git a/packages/server/src/services/EventsTracker/events/BillEventsTracker.ts b/packages/server/src/services/EventsTracker/events/BillEventsTracker.ts new file mode 100644 index 000000000..dceb01bd8 --- /dev/null +++ b/packages/server/src/services/EventsTracker/events/BillEventsTracker.ts @@ -0,0 +1,59 @@ +import { Inject, Service } from 'typedi'; +import { EventSubscriber } from '@/lib/EventPublisher/EventPublisher'; +import { + IBillPaymentEventCreatedPayload, + IBillPaymentEventEditedPayload, + IBillPaymentEventDeletedPayload, +} from '@/interfaces'; +import { PosthogService } from '../PostHog'; +import events from '@/subscribers/events'; +import { + BILL_CREATED, + BILL_EDITED, + BILL_DELETED, +} from '@/constants/event-tracker'; + +@Service() +export class BillEventsTracker extends EventSubscriber { + @Inject() + private posthog: PosthogService; + + /** + * Constructor method. + */ + public attach(bus) { + bus.subscribe(events.bill.onCreated, this.handleTrackBillCreatedEvent); + bus.subscribe(events.bill.onEdited, this.handleTrackEditedBillEvent); + bus.subscribe(events.bill.onDeleted, this.handleTrackDeletedBillEvent); + } + + private handleTrackBillCreatedEvent = ({ + tenantId, + }: IBillPaymentEventCreatedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: BILL_CREATED, + properties: {}, + }); + }; + + private handleTrackEditedBillEvent = ({ + tenantId, + }: IBillPaymentEventEditedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: BILL_EDITED, + properties: {}, + }); + }; + + private handleTrackDeletedBillEvent = ({ + tenantId, + }: IBillPaymentEventDeletedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: BILL_DELETED, + properties: {}, + }); + }; +} diff --git a/packages/server/src/services/EventsTracker/events/ExpenseEventsTracker.ts b/packages/server/src/services/EventsTracker/events/ExpenseEventsTracker.ts new file mode 100644 index 000000000..d766bbb10 --- /dev/null +++ b/packages/server/src/services/EventsTracker/events/ExpenseEventsTracker.ts @@ -0,0 +1,65 @@ +import { Inject, Service } from 'typedi'; +import { EventSubscriber } from '@/lib/EventPublisher/EventPublisher'; +import { + IExpenseCreatedPayload, + IExpenseEventEditPayload, + IExpenseEventDeletePayload, +} from '@/interfaces'; +import { PosthogService } from '../PostHog'; +import events from '@/subscribers/events'; +import { + EXPENSE_CREATED, + EXPENSE_EDITED, + EXPENSE_DELETED, +} from '@/constants/event-tracker'; + +@Service() +export class ExpenseEventsTracker extends EventSubscriber { + @Inject() + private posthog: PosthogService; + + /** + * Constructor method. + */ + public attach(bus) { + bus.subscribe( + events.expenses.onCreated, + this.handleTrackExpenseCreatedEvent + ); + bus.subscribe(events.expenses.onEdited, this.handleTrackEditedExpenseEvent); + bus.subscribe( + events.expenses.onDeleted, + this.handleTrackDeletedExpenseEvent + ); + } + + private handleTrackExpenseCreatedEvent = ({ + tenantId, + }: IExpenseCreatedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: EXPENSE_CREATED, + properties: {}, + }); + }; + + private handleTrackEditedExpenseEvent = ({ + tenantId, + }: IExpenseEventEditPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: EXPENSE_EDITED, + properties: {}, + }); + }; + + private handleTrackDeletedExpenseEvent = ({ + tenantId, + }: IExpenseEventDeletePayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: EXPENSE_DELETED, + properties: {}, + }); + }; +} diff --git a/packages/server/src/services/EventsTracker/events/ItemEventsTracker.ts b/packages/server/src/services/EventsTracker/events/ItemEventsTracker.ts new file mode 100644 index 000000000..97820b2e9 --- /dev/null +++ b/packages/server/src/services/EventsTracker/events/ItemEventsTracker.ts @@ -0,0 +1,59 @@ +import { Inject, Service } from 'typedi'; +import { EventSubscriber } from '@/lib/EventPublisher/EventPublisher'; +import { + IItemEventCreatedPayload, + IItemEventEditedPayload, + IItemEventDeletedPayload, +} from '@/interfaces'; +import { PosthogService } from '../PostHog'; +import events from '@/subscribers/events'; +import { + ITEM_EVENT_CREATED, + ITEM_EVENT_EDITED, + ITEM_EVENT_DELETED, +} from '@/constants/event-tracker'; + +@Service() +export class ItemEventsTracker extends EventSubscriber { + @Inject() + private posthog: PosthogService; + + /** + * Constructor method. + */ + public attach(bus) { + bus.subscribe(events.item.onCreated, this.handleTrackItemCreatedEvent); + bus.subscribe(events.item.onEdited, this.handleTrackEditedItemEvent); + bus.subscribe(events.item.onDeleted, this.handleTrackDeletedItemEvent); + } + + private handleTrackItemCreatedEvent = ({ + tenantId, + }: IItemEventCreatedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: ITEM_EVENT_CREATED, + properties: {}, + }); + }; + + private handleTrackEditedItemEvent = ({ + tenantId, + }: IItemEventEditedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: ITEM_EVENT_EDITED, + properties: {}, + }); + }; + + private handleTrackDeletedItemEvent = ({ + tenantId, + }: IItemEventDeletedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: ITEM_EVENT_DELETED, + properties: {}, + }); + }; +} diff --git a/packages/server/src/services/EventsTracker/events/PaymentMadeEventsTracker.ts b/packages/server/src/services/EventsTracker/events/PaymentMadeEventsTracker.ts new file mode 100644 index 000000000..0f17989b8 --- /dev/null +++ b/packages/server/src/services/EventsTracker/events/PaymentMadeEventsTracker.ts @@ -0,0 +1,68 @@ +import { Inject, Service } from 'typedi'; +import { EventSubscriber } from '@/lib/EventPublisher/EventPublisher'; +import { + IBillPaymentEventCreatedPayload, + IBillPaymentEditingPayload, + IBillPaymentEventDeletedPayload, +} from '@/interfaces'; +import { PosthogService } from '../PostHog'; +import events from '@/subscribers/events'; +import { + PAYMENT_MADE_CREATED, + PAYMENT_MADE_EDITED, + PAYMENT_MADE_DELETED, +} from '@/constants/event-tracker'; + +@Service() +export class PaymentMadeEventsTracker extends EventSubscriber { + @Inject() + private posthog: PosthogService; + + /** + * Constructor method. + */ + public attach(bus) { + bus.subscribe( + events.billPayment.onCreated, + this.handleTrackPaymentMadeCreatedEvent + ); + bus.subscribe( + events.billPayment.onEdited, + this.handleTrackEditedPaymentMadeEvent + ); + bus.subscribe( + events.billPayment.onDeleted, + this.handleTrackDeletedPaymentMadeEvent + ); + } + + private handleTrackPaymentMadeCreatedEvent = ({ + tenantId, + }: IBillPaymentEventCreatedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: PAYMENT_MADE_CREATED, + properties: {}, + }); + }; + + private handleTrackEditedPaymentMadeEvent = ({ + tenantId, + }: IBillPaymentEditingPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: PAYMENT_MADE_EDITED, + properties: {}, + }); + }; + + private handleTrackDeletedPaymentMadeEvent = ({ + tenantId, + }: IBillPaymentEventDeletedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: PAYMENT_MADE_DELETED, + properties: {}, + }); + }; +} diff --git a/packages/server/src/services/EventsTracker/events/PaymentReceivedEventsTracker.ts b/packages/server/src/services/EventsTracker/events/PaymentReceivedEventsTracker.ts new file mode 100644 index 000000000..0a3a87f37 --- /dev/null +++ b/packages/server/src/services/EventsTracker/events/PaymentReceivedEventsTracker.ts @@ -0,0 +1,68 @@ +import { Inject, Service } from 'typedi'; +import { EventSubscriber } from '@/lib/EventPublisher/EventPublisher'; +import { + IPaymentReceivedCreatedPayload, + IPaymentReceivedEditedPayload, + IPaymentReceivedDeletedPayload, +} from '@/interfaces'; +import { PosthogService } from '../PostHog'; +import events from '@/subscribers/events'; +import { + PAYMENT_RECEIVED_CREATED, + PAYMENT_RECEIVED_EDITED, + PAYMENT_RECEIVED_DELETED, +} from '@/constants/event-tracker'; + +@Service() +export class PaymentReceivedEventsTracker extends EventSubscriber { + @Inject() + private posthog: PosthogService; + + /** + * Constructor method. + */ + public attach(bus) { + bus.subscribe( + events.paymentReceive.onCreated, + this.handleTrackPaymentReceivedCreatedEvent + ); + bus.subscribe( + events.paymentReceive.onEdited, + this.handleTrackEditedPaymentReceivedEvent + ); + bus.subscribe( + events.paymentReceive.onDeleted, + this.handleTrackDeletedPaymentReceivedEvent + ); + } + + private handleTrackPaymentReceivedCreatedEvent = ({ + tenantId, + }: IPaymentReceivedCreatedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: PAYMENT_RECEIVED_CREATED, + properties: {}, + }); + }; + + private handleTrackEditedPaymentReceivedEvent = ({ + tenantId, + }: IPaymentReceivedEditedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: PAYMENT_RECEIVED_EDITED, + properties: {}, + }); + }; + + private handleTrackDeletedPaymentReceivedEvent = ({ + tenantId, + }: IPaymentReceivedDeletedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: PAYMENT_RECEIVED_DELETED, + properties: {}, + }); + }; +} diff --git a/packages/server/src/services/EventsTracker/events/SaleEstimateEventsTracker.ts b/packages/server/src/services/EventsTracker/events/SaleEstimateEventsTracker.ts new file mode 100644 index 000000000..469e20c3c --- /dev/null +++ b/packages/server/src/services/EventsTracker/events/SaleEstimateEventsTracker.ts @@ -0,0 +1,68 @@ +import { Inject, Service } from 'typedi'; +import { EventSubscriber } from '@/lib/EventPublisher/EventPublisher'; +import { + ISaleEstimateCreatedPayload, + ISaleEstimateEditedPayload, + ISaleEstimateDeletedPayload, +} from '@/interfaces'; +import { PosthogService } from '../PostHog'; +import events from '@/subscribers/events'; +import { + SALE_ESTIMATE_CREATED, + SALE_ESTIMATE_EDITED, + SALE_ESTIMATE_DELETED, +} from '@/constants/event-tracker'; + +@Service() +export class SaleEstimateEventsTracker extends EventSubscriber { + @Inject() + private posthog: PosthogService; + + /** + * Constructor method. + */ + public attach(bus) { + bus.subscribe( + events.saleEstimate.onCreated, + this.handleTrackEstimateCreatedEvent + ); + bus.subscribe( + events.saleEstimate.onEdited, + this.handleTrackEditedEstimateEvent + ); + bus.subscribe( + events.saleEstimate.onDeleted, + this.handleTrackDeletedEstimateEvent + ); + } + + private handleTrackEstimateCreatedEvent = ({ + tenantId, + }: ISaleEstimateCreatedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: SALE_ESTIMATE_CREATED, + properties: {}, + }); + }; + + private handleTrackEditedEstimateEvent = ({ + tenantId, + }: ISaleEstimateEditedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: SALE_ESTIMATE_EDITED, + properties: {}, + }); + }; + + private handleTrackDeletedEstimateEvent = ({ + tenantId, + }: ISaleEstimateDeletedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: SALE_ESTIMATE_DELETED, + properties: {}, + }); + }; +} diff --git a/packages/server/src/services/EventsTracker/events/SaleInvoicesEventsTracker.ts b/packages/server/src/services/EventsTracker/events/SaleInvoicesEventsTracker.ts new file mode 100644 index 000000000..1ec34c885 --- /dev/null +++ b/packages/server/src/services/EventsTracker/events/SaleInvoicesEventsTracker.ts @@ -0,0 +1,67 @@ +import { Inject, Service } from 'typedi'; +import { EventSubscriber } from '@/lib/EventPublisher/EventPublisher'; +import { + ISaleInvoiceCreatedPayload, + ISaleInvoiceEditedPayload, +} from '@/interfaces'; +import { PosthogService } from '../PostHog'; +import events from '@/subscribers/events'; +import { + SALE_INVOICE_CREATED, + SALE_INVOICE_DELETED, + SALE_INVOICE_EDITED, +} from '@/constants/event-tracker'; + +@Service() +export class SaleInvoiceEventsTracker extends EventSubscriber { + @Inject() + private posthog: PosthogService; + + /** + * Constructor method. + */ + public attach(bus) { + bus.subscribe( + events.saleInvoice.onCreated, + this.handleTrackInvoiceCreatedEvent + ); + bus.subscribe( + events.saleInvoice.onEdited, + this.handleTrackEditedInvoiceEvent + ); + bus.subscribe( + events.saleInvoice.onDeleted, + this.handleTrackDeletedInvoiceEvent + ); + } + + private handleTrackInvoiceCreatedEvent = ({ + tenantId, + }: ISaleInvoiceCreatedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: SALE_INVOICE_CREATED, + properties: {}, + }); + }; + + private handleTrackEditedInvoiceEvent = ({ + tenantId, + }: ISaleInvoiceEditedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: SALE_INVOICE_EDITED, + properties: {}, + }); + }; + + private handleTrackDeletedInvoiceEvent = ({ + tenantId, + }: ISaleInvoiceEditedPayload) => { + this.posthog.trackEvent({ + distinctId: `tenant-${tenantId}`, + event: SALE_INVOICE_DELETED, + properties: {}, + }); + }; +} diff --git a/packages/server/src/services/EventsTracker/events/events.ts b/packages/server/src/services/EventsTracker/events/events.ts new file mode 100644 index 000000000..8f1b9c54f --- /dev/null +++ b/packages/server/src/services/EventsTracker/events/events.ts @@ -0,0 +1,21 @@ +import { SaleInvoiceEventsTracker } from './SaleInvoicesEventsTracker'; +import { SaleEstimateEventsTracker } from './SaleEstimateEventsTracker'; +import { PaymentMadeEventsTracker } from './PaymentMadeEventsTracker'; +import { PaymentReceivedEventsTracker } from './PaymentReceivedEventsTracker'; +import { BillEventsTracker } from './BillEventsTracker'; +import { ExpenseEventsTracker } from './ExpenseEventsTracker'; +import { AccountEventsTracker } from './AccountEventsTracker'; +import { AuthenticationEventsTracker } from './AuthenticationEventsTracker'; +import { ItemEventsTracker } from './ItemEventsTracker'; + +export const EventsTrackerListeners = [ + SaleInvoiceEventsTracker, + SaleEstimateEventsTracker, + PaymentMadeEventsTracker, + PaymentReceivedEventsTracker, + BillEventsTracker, + AccountEventsTracker, + ExpenseEventsTracker, + AuthenticationEventsTracker, + ItemEventsTracker +]; diff --git a/packages/webapp/src/constants/event-tracker.ts b/packages/webapp/src/constants/event-tracker.ts new file mode 100644 index 000000000..fce1be52f --- /dev/null +++ b/packages/webapp/src/constants/event-tracker.ts @@ -0,0 +1,28 @@ +export const SALE_INVOICE_CREATED = 'Sale invoice created'; +export const SALE_INVOICE_EDITED = 'Sale invoice d'; +export const SALE_INVOICE_DELETED = 'Sale invoice deleted'; +export const SALE_INVOICE_MAIL_DELIVERED = 'Sale invoice mail delivered'; + +export const SALE_ESTIMATE_CREATED = 'Sale estimate created'; +export const SALE_ESTIMATE_EDITED = 'Sale estimate edited'; +export const SALE_ESTIMATE_DELETED = 'Sale estimate deleted'; + +export const PAYMENT_RECEIVED_CREATED = 'Payment received created'; +export const PAYMENT_RECEIVED_EDITED = 'payment received edited'; +export const PAYMENT_RECEIVED_DELETED = 'Payment received deleted'; + +export const BILL_CREATED = 'Bill created'; +export const BILL_EDITED = 'Bill edited'; +export const BILL_DELETED = 'Bill deleted'; + +export const PAYMENT_MADE_CREATED = 'Payment made created'; +export const PAYMENT_MADE_EDITED = 'Payment made edited'; +export const PAYMENT_MADE_DELETED = 'Payment made deleted'; + +export const EXPENSE_CREATED = 'Expense created'; +export const EXPENSE_EDITED = 'Expense edited'; +export const EXPENSE_DELETED = 'Expense deleted'; + +export const ACCOUNT_CREATED = 'Account created'; +export const ACCOUNT_EDITED = 'Account Edited'; +export const ACCOUNT_DELETED = 'Account deleted'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 93fa17bb3..f26282a66 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -272,6 +272,9 @@ importers: pluralize: specifier: ^8.0.0 version: 8.0.0 + posthog-node: + specifier: ^4.2.0 + version: 4.2.0 pug: specifier: ^3.0.2 version: 3.0.2 @@ -8099,6 +8102,16 @@ packages: transitivePeerDependencies: - debug + /axios@1.7.7: + resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + /axobject-query@3.2.1: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} dependencies: @@ -20477,6 +20490,16 @@ packages: picocolors: 1.0.1 source-map-js: 1.2.0 + /posthog-node@4.2.0: + resolution: {integrity: sha512-hgyCYMyzMvuF3qWMw6JvS8gT55v7Mtp5wKWcnDrw+nu39D0Tk9BXD7I0LOBp0lGlHEPaXCEVYUtviNKrhMALGA==} + engines: {node: '>=15.0.0'} + dependencies: + axios: 1.7.7 + rusha: 0.8.14 + transitivePeerDependencies: + - debug + dev: false + /prebuildify@6.0.1: resolution: {integrity: sha512-8Y2oOOateom/s8dNBsGIcnm6AxPmLH4/nanQzL5lQMU+sC0CMhzARZHizwr36pUPLdvBnOkCNQzxg4djuFSgIw==} hasBin: true @@ -22731,6 +22754,10 @@ packages: engines: {node: '>=14'} dev: true + /rusha@0.8.14: + resolution: {integrity: sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==} + dev: false + /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: From 302564a56e0b89c8ef9231f76abfceb764fcd431 Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Sun, 1 Sep 2024 23:02:41 +0200 Subject: [PATCH 2/2] fix: remove the un-used file --- .../webapp/src/constants/event-tracker.ts | 28 ------------------- 1 file changed, 28 deletions(-) delete mode 100644 packages/webapp/src/constants/event-tracker.ts diff --git a/packages/webapp/src/constants/event-tracker.ts b/packages/webapp/src/constants/event-tracker.ts deleted file mode 100644 index fce1be52f..000000000 --- a/packages/webapp/src/constants/event-tracker.ts +++ /dev/null @@ -1,28 +0,0 @@ -export const SALE_INVOICE_CREATED = 'Sale invoice created'; -export const SALE_INVOICE_EDITED = 'Sale invoice d'; -export const SALE_INVOICE_DELETED = 'Sale invoice deleted'; -export const SALE_INVOICE_MAIL_DELIVERED = 'Sale invoice mail delivered'; - -export const SALE_ESTIMATE_CREATED = 'Sale estimate created'; -export const SALE_ESTIMATE_EDITED = 'Sale estimate edited'; -export const SALE_ESTIMATE_DELETED = 'Sale estimate deleted'; - -export const PAYMENT_RECEIVED_CREATED = 'Payment received created'; -export const PAYMENT_RECEIVED_EDITED = 'payment received edited'; -export const PAYMENT_RECEIVED_DELETED = 'Payment received deleted'; - -export const BILL_CREATED = 'Bill created'; -export const BILL_EDITED = 'Bill edited'; -export const BILL_DELETED = 'Bill deleted'; - -export const PAYMENT_MADE_CREATED = 'Payment made created'; -export const PAYMENT_MADE_EDITED = 'Payment made edited'; -export const PAYMENT_MADE_DELETED = 'Payment made deleted'; - -export const EXPENSE_CREATED = 'Expense created'; -export const EXPENSE_EDITED = 'Expense edited'; -export const EXPENSE_DELETED = 'Expense deleted'; - -export const ACCOUNT_CREATED = 'Account created'; -export const ACCOUNT_EDITED = 'Account Edited'; -export const ACCOUNT_DELETED = 'Account deleted';