|
Use one tenant-aware email service as the only counted path: [src/utils/email.js (line 102)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\utils\\email.js:102) or, if you want the cleaner long-term version, [src/utils/mailer/base.mail.js (line 87)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\utils\\mailer\\base.mail.js:87). Both already record tenant usage, but right now the repo is split between them.
|
|
For accurate per-tenant email counting, every triggered email should go through one common sender and always pass dbName for non-request flows.
|
|
Recommended common service
|
|
Use [src/utils/mailer/base.mail.js (line 87)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\utils\\mailer\\base.mail.js:87) as the final common service.
|
|
Reason:
|
|
It is tenant-aware via ConnectEmail
|
|
It supports templates
|
|
It already records metered usage per tenant
|
|
It is a better abstraction than scattering raw sendEmail(...)
|
|
Places already good for tenant counting
|
|
These already use the common path with dbName explicitly:
|
|
[src/utils/notifyUsers.js (line 224)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\utils\\notifyUsers.js:224)
|
|
[src/utils/notifyUsers.js (line 293)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\utils\\notifyUsers.js:293)
|
|
[src/routes/EvergreenInvoice/EverGreen-invoice-controller.js (line 2109)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\routes\\EvergreenInvoice\\EverGreen-invoice-controller.js:2109)
|
|
[src/routes/EvergreenInvoice/EverGreen-invoice-controller.js (line 5059)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\routes\\EvergreenInvoice\\EverGreen-invoice-controller.js:5059)
|
|
[src/routes/EvergreenInvoice/EverGreen-invoice-controller.js (line 6704)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\routes\\EvergreenInvoice\\EverGreen-invoice-controller.js:6704)
|
|
Places that must reuse the common service for correct per-tenant counting
|
|
These are the important email-trigger services to standardize:
|
|
Subscription/service email helper layer[src/services/email.service.js (line 63)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\services\\email.service.js:63)
|
|
[src/services/email.service.js (line 115)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\services\\email.service.js:115)
|
|
[src/services/email.service.js (line 206)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\services\\email.service.js:206)
|
|
[src/services/email.service.js (line 274)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\services\\email.service.js:274)
|
|
[src/services/email.service.js (line 299)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\services\\email.service.js:299)
|
|
|
|
These should all pass dbName into the common sender.
|
|
Webhook-triggered emails[src/webhook-handlers/subscriptionUpdated.js (line 199)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\webhook-handlers\\subscriptionUpdated.js:199)
|
|
Also similar webhook mail flows in:src/webhook-handlers/*
|
|
src/service-webhook-handlers/*
|
|
|
|
|
|
These run outside normal request context, so they must use the common sender with explicit dbName.
|
|
Cron-triggered emails[src/cron/subscriptionEmailCron.js (line 267)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\cron\\subscriptionEmailCron.js:267)
|
|
[src/cron/subscriptionEmailCron.js (line 352)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\cron\\subscriptionEmailCron.js:352)
|
|
[src/cron/subscriptionEmailCron.js (line 404)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\cron\\subscriptionEmailCron.js:404)
|
|
Also review:src/cron/workerCron.js
|
|
src/cron/enquiryCron.js
|
|
src/cron/orderTrackingCron.js
|
|
|
|
|
|
Cron jobs are the biggest risk for wrong tenant counts if dbName is omitted.
|
|
Business services sending customer/admin emailssrc/allservices/InvoiceService.js
|
|
src/allservices/clientService.js
|
|
src/allservices/jobService.js
|
|
src/services/subscripiton.service.js
|
|
src/services/orderTrackingService.js
|
|
src/services/nursery/order.service.js
|
|
src/services/nursery/payment.service.js
|
|
src/services/nursery/sale.service.js
|
|
src/services/nursery/ecom.service.js
|
|
src/services/nursery/assets.service.js
|
|
src/services/quotation.service.js
|
|
|
|
Controllers/routes still triggering email directlysrc/controllers/EverGreenQuotation/QuotationController.js
|
|
src/controllers/ProductQuotation/product-quote.controller.js
|
|
src/controllers/nursery/shop-controller.js
|
|
src/controllers/nursery/user-controller.js
|
|
src/controllers/user-controller.js
|
|
src/controllers/subscription.controller.js
|
|
src/controllers/superadmin/onboarding.controller.js
|
|
src/routes/productQuoteRoute.js
|
|
src/routes/productInvoiceRoute.js
|
|
|
|
Architecture recommendation
|
|
For tenant email counting, define one rule:
|
|
All email triggers must call one function like:
|
|
sendTenantEmail({ dbName, to, subject, html, template, attachments, service })
|
|
Then meter only there.
|
|
Best answer to your question
|
|
The email service you should use for counting per tenant is the single shared backend sender:
|
|
Preferred final choice: [src/utils/mailer/base.mail.js (line 87)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\utils\\mailer\\base.mail.js:87)
|
|
Current most-used choice: [src/utils/email.js (line 102)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\utils\\email.js:102)
|