ghost 5.33.7 → 5.33.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/components/{tryghost-adapter-manager-5.33.7.tgz → tryghost-adapter-manager-5.33.8.tgz} +0 -0
  2. package/components/{tryghost-api-framework-5.33.7.tgz → tryghost-api-framework-5.33.8.tgz} +0 -0
  3. package/components/{tryghost-api-version-compatibility-service-5.33.7.tgz → tryghost-api-version-compatibility-service-5.33.8.tgz} +0 -0
  4. package/components/tryghost-audience-feedback-5.33.8.tgz +0 -0
  5. package/components/tryghost-bootstrap-socket-5.33.8.tgz +0 -0
  6. package/components/{tryghost-constants-5.33.7.tgz → tryghost-constants-5.33.8.tgz} +0 -0
  7. package/components/tryghost-custom-theme-settings-service-5.33.8.tgz +0 -0
  8. package/components/{tryghost-data-generator-5.33.7.tgz → tryghost-data-generator-5.33.8.tgz} +0 -0
  9. package/components/tryghost-domain-events-5.33.8.tgz +0 -0
  10. package/components/tryghost-dynamic-routing-events-5.33.8.tgz +0 -0
  11. package/components/tryghost-email-analytics-provider-mailgun-5.33.8.tgz +0 -0
  12. package/components/tryghost-email-analytics-service-5.33.8.tgz +0 -0
  13. package/components/tryghost-email-content-generator-5.33.8.tgz +0 -0
  14. package/components/tryghost-email-events-5.33.8.tgz +0 -0
  15. package/components/tryghost-email-service-5.33.8.tgz +0 -0
  16. package/components/tryghost-email-suppression-list-5.33.8.tgz +0 -0
  17. package/components/{tryghost-express-dynamic-redirects-5.33.7.tgz → tryghost-express-dynamic-redirects-5.33.8.tgz} +0 -0
  18. package/components/tryghost-extract-api-key-5.33.8.tgz +0 -0
  19. package/components/tryghost-html-to-plaintext-5.33.8.tgz +0 -0
  20. package/components/tryghost-i18n-5.33.8.tgz +0 -0
  21. package/components/tryghost-importer-revue-5.33.8.tgz +0 -0
  22. package/components/{tryghost-job-manager-5.33.7.tgz → tryghost-job-manager-5.33.8.tgz} +0 -0
  23. package/components/tryghost-link-redirects-5.33.8.tgz +0 -0
  24. package/components/tryghost-link-replacer-5.33.8.tgz +0 -0
  25. package/components/tryghost-link-tracking-5.33.8.tgz +0 -0
  26. package/components/{tryghost-magic-link-5.33.7.tgz → tryghost-magic-link-5.33.8.tgz} +0 -0
  27. package/components/tryghost-mailgun-client-5.33.8.tgz +0 -0
  28. package/components/{tryghost-member-attribution-5.33.7.tgz → tryghost-member-attribution-5.33.8.tgz} +0 -0
  29. package/components/tryghost-member-events-5.33.8.tgz +0 -0
  30. package/components/tryghost-members-api-5.33.8.tgz +0 -0
  31. package/components/tryghost-members-csv-5.33.8.tgz +0 -0
  32. package/components/{tryghost-members-events-service-5.33.7.tgz → tryghost-members-events-service-5.33.8.tgz} +0 -0
  33. package/components/{tryghost-members-importer-5.33.7.tgz → tryghost-members-importer-5.33.8.tgz} +0 -0
  34. package/components/tryghost-members-offers-5.33.8.tgz +0 -0
  35. package/components/tryghost-members-payments-5.33.8.tgz +0 -0
  36. package/components/tryghost-members-ssr-5.33.8.tgz +0 -0
  37. package/components/tryghost-members-stripe-service-5.33.8.tgz +0 -0
  38. package/components/tryghost-minifier-5.33.8.tgz +0 -0
  39. package/components/tryghost-mw-api-version-mismatch-5.33.8.tgz +0 -0
  40. package/components/{tryghost-mw-cache-control-5.33.7.tgz → tryghost-mw-cache-control-5.33.8.tgz} +0 -0
  41. package/components/{tryghost-mw-error-handler-5.33.7.tgz → tryghost-mw-error-handler-5.33.8.tgz} +0 -0
  42. package/components/tryghost-mw-session-from-token-5.33.8.tgz +0 -0
  43. package/components/tryghost-mw-update-user-last-seen-5.33.8.tgz +0 -0
  44. package/components/tryghost-mw-vhost-5.33.8.tgz +0 -0
  45. package/components/tryghost-oembed-service-5.33.8.tgz +0 -0
  46. package/components/{tryghost-package-json-5.33.7.tgz → tryghost-package-json-5.33.8.tgz} +0 -0
  47. package/components/{tryghost-referrers-5.33.7.tgz → tryghost-referrers-5.33.8.tgz} +0 -0
  48. package/components/tryghost-security-5.33.8.tgz +0 -0
  49. package/components/tryghost-session-service-5.33.8.tgz +0 -0
  50. package/components/tryghost-settings-path-manager-5.33.8.tgz +0 -0
  51. package/components/{tryghost-staff-service-5.33.7.tgz → tryghost-staff-service-5.33.8.tgz} +0 -0
  52. package/components/tryghost-stats-service-5.33.8.tgz +0 -0
  53. package/components/tryghost-tiers-5.33.8.tgz +0 -0
  54. package/components/tryghost-update-check-service-5.33.8.tgz +0 -0
  55. package/components/tryghost-verification-trigger-5.33.8.tgz +0 -0
  56. package/components/tryghost-version-notifications-data-service-5.33.8.tgz +0 -0
  57. package/components/tryghost-webmentions-5.33.8.tgz +0 -0
  58. package/core/boot.js +2 -0
  59. package/core/built/admin/assets/{chunk.143.9057a1659075c0ee7336.js → chunk.143.caa7dbd727b76021c31b.js} +5 -5
  60. package/core/built/admin/assets/{chunk.178.1d2c848ebe2c7baa38dd.js → chunk.178.9803e6194593a0ed6595.js} +4 -4
  61. package/core/built/admin/assets/{ghost-904f203ff1f5f6bff4e55a03f39a4fbf.js → ghost-872d240189f9b5ff85f4f7cb2ac3ab4c.js} +2 -2
  62. package/core/built/admin/index.html +2 -2
  63. package/core/server/api/endpoints/utils/serializers/output/email-posts.js +1 -1
  64. package/core/server/api/endpoints/utils/serializers/output/pages.js +1 -1
  65. package/core/server/api/endpoints/utils/serializers/output/posts.js +1 -1
  66. package/core/server/api/endpoints/utils/serializers/output/previews.js +1 -1
  67. package/core/server/services/email-analytics/events/StartEmailAnalyticsJobEvent.js +22 -0
  68. package/core/server/services/email-analytics/index.js +2 -22
  69. package/core/server/services/email-analytics/jobs/fetch-latest/index.js +6 -12
  70. package/core/server/services/email-analytics/wrapper.js +90 -0
  71. package/core/server/services/email-service/wrapper.js +2 -13
  72. package/package.json +108 -108
  73. package/components/tryghost-audience-feedback-5.33.7.tgz +0 -0
  74. package/components/tryghost-bootstrap-socket-5.33.7.tgz +0 -0
  75. package/components/tryghost-custom-theme-settings-service-5.33.7.tgz +0 -0
  76. package/components/tryghost-domain-events-5.33.7.tgz +0 -0
  77. package/components/tryghost-dynamic-routing-events-5.33.7.tgz +0 -0
  78. package/components/tryghost-email-analytics-provider-mailgun-5.33.7.tgz +0 -0
  79. package/components/tryghost-email-analytics-service-5.33.7.tgz +0 -0
  80. package/components/tryghost-email-content-generator-5.33.7.tgz +0 -0
  81. package/components/tryghost-email-events-5.33.7.tgz +0 -0
  82. package/components/tryghost-email-service-5.33.7.tgz +0 -0
  83. package/components/tryghost-email-suppression-list-5.33.7.tgz +0 -0
  84. package/components/tryghost-extract-api-key-5.33.7.tgz +0 -0
  85. package/components/tryghost-html-to-plaintext-5.33.7.tgz +0 -0
  86. package/components/tryghost-i18n-5.33.7.tgz +0 -0
  87. package/components/tryghost-importer-revue-5.33.7.tgz +0 -0
  88. package/components/tryghost-link-redirects-5.33.7.tgz +0 -0
  89. package/components/tryghost-link-replacer-5.33.7.tgz +0 -0
  90. package/components/tryghost-link-tracking-5.33.7.tgz +0 -0
  91. package/components/tryghost-mailgun-client-5.33.7.tgz +0 -0
  92. package/components/tryghost-member-events-5.33.7.tgz +0 -0
  93. package/components/tryghost-members-api-5.33.7.tgz +0 -0
  94. package/components/tryghost-members-csv-5.33.7.tgz +0 -0
  95. package/components/tryghost-members-offers-5.33.7.tgz +0 -0
  96. package/components/tryghost-members-payments-5.33.7.tgz +0 -0
  97. package/components/tryghost-members-ssr-5.33.7.tgz +0 -0
  98. package/components/tryghost-members-stripe-service-5.33.7.tgz +0 -0
  99. package/components/tryghost-minifier-5.33.7.tgz +0 -0
  100. package/components/tryghost-mw-api-version-mismatch-5.33.7.tgz +0 -0
  101. package/components/tryghost-mw-session-from-token-5.33.7.tgz +0 -0
  102. package/components/tryghost-mw-update-user-last-seen-5.33.7.tgz +0 -0
  103. package/components/tryghost-mw-vhost-5.33.7.tgz +0 -0
  104. package/components/tryghost-oembed-service-5.33.7.tgz +0 -0
  105. package/components/tryghost-security-5.33.7.tgz +0 -0
  106. package/components/tryghost-session-service-5.33.7.tgz +0 -0
  107. package/components/tryghost-settings-path-manager-5.33.7.tgz +0 -0
  108. package/components/tryghost-stats-service-5.33.7.tgz +0 -0
  109. package/components/tryghost-tiers-5.33.7.tgz +0 -0
  110. package/components/tryghost-update-check-service-5.33.7.tgz +0 -0
  111. package/components/tryghost-verification-trigger-5.33.7.tgz +0 -0
  112. package/components/tryghost-version-notifications-data-service-5.33.7.tgz +0 -0
  113. package/components/tryghost-webmentions-5.33.7.tgz +0 -0
  114. package/core/server/services/email-analytics/jobs/fetch-latest/run.js +0 -57
package/core/boot.js CHANGED
@@ -292,6 +292,7 @@ async function initServices({config}) {
292
292
  const audienceFeedback = require('./server/services/audience-feedback');
293
293
  const emailSuppressionList = require('./server/services/email-suppression-list');
294
294
  const emailService = require('./server/services/email-service');
295
+ const emailAnalytics = require('./server/services/email-analytics');
295
296
  const mentionsService = require('./server/services/mentions');
296
297
 
297
298
  const urlUtils = require('./shared/url-utils');
@@ -316,6 +317,7 @@ async function initServices({config}) {
316
317
  slack.listen(),
317
318
  audienceFeedback.init(),
318
319
  emailService.init(),
320
+ emailAnalytics.init(),
319
321
  mega.listen(),
320
322
  webhooks.listen(),
321
323
  appService.init(),
@@ -10,8 +10,8 @@ return s.unparse(t,{columns:r})}},96616:(e,r,t)=>{var n={"./af":21516,"./af.js":
10
10
  function s(e){var r=o(e)
11
11
  return t(r)}function o(e){if(!t.o(n,e)){var r=new Error("Cannot find module '"+e+"'")
12
12
  throw r.code="MODULE_NOT_FOUND",r}return n[e]}s.keys=function(){return Object.keys(n)},s.resolve=o,e.exports=s,s.id=96616},7456:e=>{"use strict"
13
- e.exports=require("@ember/test-waiters")},11975:()=>{},28162:(e,r,t)=>{var n,s
14
- e.exports=(n=_eai_d,s=_eai_r,window.emberAutoImportDynamic=function(e){return 1===arguments.length?s("_eai_dyn_"+e):s("_eai_dynt_"+e)(Array.prototype.slice.call(arguments,1))},window.emberAutoImportSync=function(e){return s("_eai_sync_"+e)(Array.prototype.slice.call(arguments,1))},n("@joeattardi/emoji-button",[],(function(){return t(28936)})),n("@sentry/browser",[],(function(){return t(40545)})),n("@sentry/utils",[],(function(){return t(59517)})),n("@tryghost/color-utils",[],(function(){return t(82485)})),n("@tryghost/helpers",[],(function(){return t(74752)})),n("@tryghost/kg-clean-basic-html",[],(function(){return t(89096)})),n("@tryghost/kg-parser-plugins",[],(function(){return t(3199)})),n("@tryghost/kg-parser-plugins/lib/cards/softReturn",[],(function(){return t(74557)})),n("@tryghost/limit-service",[],(function(){return t(12336)})),n("@tryghost/members-csv/lib/unparse",[],(function(){return t(91883)})),n("@tryghost/nql-lang",[],(function(){return t(75420)})),n("@tryghost/string",[],(function(){return t(57348)})),n("@tryghost/timezone-data",[],(function(){return t(28961)})),n("element-resize-detector",[],(function(){return t(87381)})),n("ember-css-transitions/modifiers/css-transition",[],(function(){return t(56112)})),n("ember-keyboard",[],(function(){return t(86771)})),n("ember-keyboard/helpers/if-key.js",[],(function(){return t(43481)})),n("ember-keyboard/helpers/on-key.js",[],(function(){return t(66415)})),n("ember-keyboard/modifiers/on-key.js",[],(function(){return t(4146)})),n("ember-keyboard/services/keyboard.js",[],(function(){return t(35466)})),n("ember-modifier",[],(function(){return t(92509)})),n("ember-moment/helpers/-base.js",[],(function(){return t(76465)})),n("ember-moment/helpers/is-after.js",[],(function(){return t(876)})),n("ember-moment/helpers/is-before.js",[],(function(){return t(13971)})),n("ember-moment/helpers/is-between.js",[],(function(){return t(2063)})),n("ember-moment/helpers/is-same-or-after.js",[],(function(){return t(12915)})),n("ember-moment/helpers/is-same-or-before.js",[],(function(){return t(46102)})),n("ember-moment/helpers/is-same.js",[],(function(){return t(71465)})),n("ember-moment/helpers/moment-add.js",[],(function(){return t(64462)})),n("ember-moment/helpers/moment-calendar.js",[],(function(){return t(69021)})),n("ember-moment/helpers/moment-diff.js",[],(function(){return t(95198)})),n("ember-moment/helpers/moment-duration.js",[],(function(){return t(17216)})),n("ember-moment/helpers/moment-format.js",[],(function(){return t(99152)})),n("ember-moment/helpers/moment-from-now.js",[],(function(){return t(16396)})),n("ember-moment/helpers/moment-from.js",[],(function(){return t(48478)})),n("ember-moment/helpers/moment-subtract.js",[],(function(){return t(4647)})),n("ember-moment/helpers/moment-to-date.js",[],(function(){return t(18351)})),n("ember-moment/helpers/moment-to-now.js",[],(function(){return t(94612)})),n("ember-moment/helpers/moment-to.js",[],(function(){return t(91857)})),n("ember-moment/helpers/moment.js",[],(function(){return t(26852)})),n("ember-moment/helpers/now.js",[],(function(){return t(67842)})),n("ember-moment/helpers/unix.js",[],(function(){return t(29700)})),n("ember-moment/helpers/utc.js",[],(function(){return t(71755)})),n("ember-moment/services/moment.js",[],(function(){return t(27475)})),n("fast-deep-equal",[],(function(){return t(64710)})),n("focus-trap",[],(function(){return t(10755)})),n("intersection-observer-admin",[],(function(){return t(77577)})),n("markdown-it",[],(function(){return t(77647)})),n("markdown-it-footnote",[],(function(){return t(41297)})),n("markdown-it-lazy-headers",[],(function(){return t(72553)})),n("markdown-it-mark",[],(function(){return t(76519)})),n("markdown-it-sub",[],(function(){return t(8830)})),n("markdown-it-sup",[],(function(){return t(55977)})),n("moment-timezone",[],(function(){return t(19127)})),n("papaparse",[],(function(){return t(99112)})),n("raf-pool",[],(function(){return t(42586)})),n("react",[],(function(){return t(36058)})),n("react-dom",[],(function(){return t(18971)})),n("react-dom/client",[],(function(){return t(79793)})),n("tooltip.js",[],(function(){return t(15028)})),n("validator",[],(function(){return t(2228)})),void n("_eai_dyn_@sentry/tracing",[],(function(){return t.e(79).then(t.bind(t,98079))})))},78478:function(e,r){window._eai_r=require,window._eai_d=define}},s={}
13
+ e.exports=require("@ember/test-waiters")},11975:()=>{},77255:(e,r,t)=>{var n,s
14
+ e.exports=(n=_eai_d,s=_eai_r,window.emberAutoImportDynamic=function(e){return 1===arguments.length?s("_eai_dyn_"+e):s("_eai_dynt_"+e)(Array.prototype.slice.call(arguments,1))},window.emberAutoImportSync=function(e){return s("_eai_sync_"+e)(Array.prototype.slice.call(arguments,1))},n("@joeattardi/emoji-button",[],(function(){return t(28936)})),n("@sentry/browser",[],(function(){return t(40545)})),n("@sentry/utils",[],(function(){return t(59517)})),n("@tryghost/color-utils",[],(function(){return t(82485)})),n("@tryghost/helpers",[],(function(){return t(74752)})),n("@tryghost/kg-clean-basic-html",[],(function(){return t(89096)})),n("@tryghost/kg-parser-plugins",[],(function(){return t(3199)})),n("@tryghost/kg-parser-plugins/lib/cards/softReturn",[],(function(){return t(74557)})),n("@tryghost/limit-service",[],(function(){return t(12336)})),n("@tryghost/members-csv/lib/unparse",[],(function(){return t(91883)})),n("@tryghost/nql-lang",[],(function(){return t(75420)})),n("@tryghost/string",[],(function(){return t(57348)})),n("@tryghost/timezone-data",[],(function(){return t(28961)})),n("element-resize-detector",[],(function(){return t(87381)})),n("ember-css-transitions/modifiers/css-transition",[],(function(){return t(56112)})),n("ember-keyboard",[],(function(){return t(86771)})),n("ember-keyboard/helpers/if-key.js",[],(function(){return t(43481)})),n("ember-keyboard/helpers/on-key.js",[],(function(){return t(66415)})),n("ember-keyboard/modifiers/on-key.js",[],(function(){return t(4146)})),n("ember-keyboard/services/keyboard.js",[],(function(){return t(35466)})),n("ember-modifier",[],(function(){return t(92509)})),n("ember-moment/helpers/-base.js",[],(function(){return t(76465)})),n("ember-moment/helpers/is-after.js",[],(function(){return t(876)})),n("ember-moment/helpers/is-before.js",[],(function(){return t(13971)})),n("ember-moment/helpers/is-between.js",[],(function(){return t(2063)})),n("ember-moment/helpers/is-same-or-after.js",[],(function(){return t(12915)})),n("ember-moment/helpers/is-same-or-before.js",[],(function(){return t(46102)})),n("ember-moment/helpers/is-same.js",[],(function(){return t(71465)})),n("ember-moment/helpers/moment-add.js",[],(function(){return t(64462)})),n("ember-moment/helpers/moment-calendar.js",[],(function(){return t(69021)})),n("ember-moment/helpers/moment-diff.js",[],(function(){return t(95198)})),n("ember-moment/helpers/moment-duration.js",[],(function(){return t(17216)})),n("ember-moment/helpers/moment-format.js",[],(function(){return t(99152)})),n("ember-moment/helpers/moment-from-now.js",[],(function(){return t(16396)})),n("ember-moment/helpers/moment-from.js",[],(function(){return t(48478)})),n("ember-moment/helpers/moment-subtract.js",[],(function(){return t(4647)})),n("ember-moment/helpers/moment-to-date.js",[],(function(){return t(18351)})),n("ember-moment/helpers/moment-to-now.js",[],(function(){return t(94612)})),n("ember-moment/helpers/moment-to.js",[],(function(){return t(91857)})),n("ember-moment/helpers/moment.js",[],(function(){return t(26852)})),n("ember-moment/helpers/now.js",[],(function(){return t(67842)})),n("ember-moment/helpers/unix.js",[],(function(){return t(29700)})),n("ember-moment/helpers/utc.js",[],(function(){return t(71755)})),n("ember-moment/services/moment.js",[],(function(){return t(27475)})),n("fast-deep-equal",[],(function(){return t(64710)})),n("focus-trap",[],(function(){return t(10755)})),n("intersection-observer-admin",[],(function(){return t(77577)})),n("markdown-it",[],(function(){return t(77647)})),n("markdown-it-footnote",[],(function(){return t(41297)})),n("markdown-it-lazy-headers",[],(function(){return t(72553)})),n("markdown-it-mark",[],(function(){return t(76519)})),n("markdown-it-sub",[],(function(){return t(8830)})),n("markdown-it-sup",[],(function(){return t(55977)})),n("moment-timezone",[],(function(){return t(19127)})),n("papaparse",[],(function(){return t(99112)})),n("raf-pool",[],(function(){return t(42586)})),n("react",[],(function(){return t(36058)})),n("react-dom",[],(function(){return t(18971)})),n("react-dom/client",[],(function(){return t(79793)})),n("tooltip.js",[],(function(){return t(15028)})),n("validator",[],(function(){return t(2228)})),void n("_eai_dyn_@sentry/tracing",[],(function(){return t.e(79).then(t.bind(t,98079))})))},88562:function(e,r){window._eai_r=require,window._eai_d=define}},s={}
15
15
  function o(e){var r=s[e]
16
16
  if(void 0!==r)return r.exports
17
17
  var t=s[e]={id:e,loaded:!1,exports:{}}
@@ -42,8 +42,8 @@ var r=(r,t)=>{var n,s,[i,u,a]=t,m=0
42
42
  if(i.some((r=>0!==e[r]))){for(n in u)o.o(u,n)&&(o.m[n]=u[n])
43
43
  if(a)var c=a(o)}for(r&&r(t);m<i.length;m++)s=i[m],o.o(e,s)&&e[s]&&e[s][0](),e[s]=0
44
44
  return o.O(c)},t=globalThis.webpackChunk_ember_auto_import_=globalThis.webpackChunk_ember_auto_import_||[]
45
- t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),o.O(void 0,[963],(()=>o(o.s=78478)))
46
- var i=o.O(void 0,[963],(()=>o(o.s=28162)))
45
+ t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),o.O(void 0,[963],(()=>o(o.s=88562)))
46
+ var i=o.O(void 0,[963],(()=>o(o.s=77255)))
47
47
  i=o.O(i),__ember_auto_import__=i})()
48
48
 
49
- //# sourceMappingURL=chunk.143.9057a1659075c0ee7336.map
49
+ //# sourceMappingURL=chunk.143.caa7dbd727b76021c31b.map
@@ -1,11 +1,11 @@
1
- var __ember_auto_import__;(()=>{var r={78478:function(r,e){window._eai_r=require,window._eai_d=define},50696:r=>{r.exports=function(){_eai_d
1
+ var __ember_auto_import__;(()=>{var r={88562:function(r,e){window._eai_r=require,window._eai_d=define},4481:r=>{r.exports=function(){_eai_d
2
2
  var r=_eai_r
3
3
  window.emberAutoImportDynamic=function(e){return 1===arguments.length?r("_eai_dyn_"+e):r("_eai_dynt_"+e)(Array.prototype.slice.call(arguments,1))},window.emberAutoImportSync=function(e){return r("_eai_sync_"+e)(Array.prototype.slice.call(arguments,1))}}()}},e={}
4
4
  function t(_){var o=e[_]
5
5
  if(void 0!==o)return o.exports
6
6
  var i=e[_]={exports:{}}
7
- return r[_].call(i.exports,i,i.exports,t),i.exports}t(78478)
8
- var _=t(50696)
7
+ return r[_].call(i.exports,i,i.exports,t),i.exports}t(88562)
8
+ var _=t(4481)
9
9
  __ember_auto_import__=_})()
10
10
 
11
- //# sourceMappingURL=chunk.178.1d2c848ebe2c7baa38dd.map
11
+ //# sourceMappingURL=chunk.178.9803e6194593a0ed6595.map
@@ -5862,7 +5862,7 @@ return"symbol"==typeof t?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r
5862
5862
  return Object.keys(i).forEach((function(e){a[e]=i[e]})),a.enumerable=!!a.enumerable,a.configurable=!!a.configurable,("value"in a||a.initializer)&&(a.writable=!0),a=r.slice().reverse().reduce((function(r,i){return i(e,t,r)||r}),a),n&&void 0!==a.initializer&&(a.value=a.initializer?a.initializer.call(n):void 0,a.initializer=void 0),void 0===a.initializer&&(Object.defineProperty(e,t,a),a=null),a}Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0
5863
5863
  let C=(i=Ember._tracked,n=Ember._tracked,a=Ember._tracked,s=Ember._tracked,o=Ember._action,l=Ember._action,u=Ember._action,d=Ember._tracked,c=Ember._tracked,p=Ember._action,m=Ember._tracked,h=Ember._tracked,b=Ember._action,g=Ember._action,f=(0,r.task)({drop:!0}),v=(0,r.task)({drop:!0}),y=class{get isLoading(){return this.setupTask.isRunning}get willEmail(){return"publish"!==this.publishType&&this.recipientFilter&&this.post.isDraft&&!this.post.email||this.post.isDraft&&this.post.email&&"failed"===this.post.email.status}get willPublish(){return"send"!==this.publishType}get willOnlyEmail(){return"send"===this.publishType}get minScheduledAt(){return t.default.utc().add(5,"seconds").milliseconds(0)}get defaultScheduledAt(){return t.default.utc().add(10,"minutes").milliseconds(0)}toggleScheduled(e){void 0===e&&(e=!this.isScheduled),this.isScheduled=e,!e||this.scheduledAtUTC&&!this.scheduledAtUTC.isBefore(this.defaultScheduledAt)||(this.scheduledAtUTC=this.defaultScheduledAt)}setScheduledAt(e){(e=t.default.utc(e).milliseconds(0)).isBefore(this.minScheduledAt)?this.scheduledAtUTC=this.minScheduledAt:this.scheduledAtUTC=e}resetPastScheduledAt(){this.scheduledAtUTC.isBefore(this.minScheduledAt)&&(this.isScheduled=!1,this.scheduledAt=null)}get publishTypeOptions(){return[{value:"publish+send",label:"Publish and email",display:"Publish and email",disabled:this.emailDisabled},{value:"publish",label:"Publish only",display:"Publish"},{value:"send",label:"Email only",display:"Email",disabled:this.emailDisabled}]}get selectedPublishTypeOption(){return this.publishTypeOptions.find((e=>e.value===this.publishType))}get emailDisabledInSettings(){return"disabled"===this.settings.editorDefaultEmailRecipients||"none"===this.settings.membersSignupAccess}get emailUnavailable(){return this.post.isPage||this.post.email||this.emailDisabledInSettings}get emailDisabled(){const e=0===this.totalMemberCount
5864
5864
  return!this.mailgunIsConfigured||e||this.emailDisabledError}get mailgunIsConfigured(){return this.settings.mailgunIsConfigured||this.config.mailgunIsConfigured}setPublishType(e){this.publishType=e}get newsletters(){return this.allNewsletters.filter((e=>"active"===e.status)).sort(((e,t)=>{let{sortOrder:r}=e,{sortOrder:i}=t
5865
- return r-i}))}get defaultNewsletter(){return this.newsletters[0]}get onlyDefaultNewsletter(){return 1===this.newsletters.length}get recipientFilter(){return this.selectedRecipientFilter||this.post.emailSegment||this.defaultRecipientFilter}get defaultRecipientFilter(){const e=this.settings.editorDefaultEmailRecipients,t=this.settings.editorDefaultEmailRecipientsFilter
5865
+ return r-i}))}get defaultNewsletter(){return this.newsletters[0]}get onlyDefaultNewsletter(){return 1===this.newsletters.length}get recipientFilter(){return this.selectedRecipientFilter||this.post.newsletter&&this.post.emailSegment||this.defaultRecipientFilter}get defaultRecipientFilter(){const e=this.settings.editorDefaultEmailRecipients,t=this.settings.editorDefaultEmailRecipientsFilter
5866
5866
  return"disabled"===e?null:"visibility"===e||"filter"===e&&null===t?"public"===this.post.visibility||"members"===this.post.visibility?"status:free,status:-free":"paid"===this.post.visibility?"status:-free":"tiers"===this.post.visibility?this.post.visibilitySegment:this.post.visibility:t}get fullRecipientFilter(){let e=this.newsletter.recipientFilter
5867
5867
  return this.recipientFilter&&(e+=`+(${this.recipientFilter})`),e}setNewsletter(e){this.newsletter=e}setRecipientFilter(e){this.selectedRecipientFilter=e}constructor(){let{config:e,limit:t,post:r,settings:i,store:n,user:a}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}
5868
5868
  S(this,"config",null),S(this,"limit",null),S(this,"settings",null),S(this,"store",null),S(this,"post",null),S(this,"user",null),z(this,"publishDisabledError",w,this),z(this,"totalMemberCount",k,this),z(this,"isScheduled",E,this),z(this,"scheduledAtUTC",P,this),z(this,"publishType",O,this),z(this,"emailDisabledError",j,this),S(this,"allNewsletters",[]),z(this,"newsletter",_,this),z(this,"selectedRecipientFilter",T,this),this.config=e,this.limit=t,this.post=r,this.settings=i,this.store=n,this.user=a,this.allNewsletters=this.store.peekAll("newsletter"),this.setupTask.perform()}*setupTask(){yield this.fetchRequiredDataTask.perform(),this.newsletter=this.defaultNewsletter,(this.emailUnavailable||this.emailDisabled)&&(this.publishType="publish"),"filter"===this.settings.editorDefaultEmailRecipients&&null===this.settings.editorDefaultEmailRecipientsFilter&&(this.publishType="publish"),this.post.isSent&&(this.publishType="send")}*fetchRequiredDataTask(){const e=[]
@@ -5989,4 +5989,4 @@ var t=Ember.Component.extend({})
5989
5989
  e.default=t})),define("ghost-admin/config/environment",[],(function(){try{var e="ghost-admin/config/environment",t=document.querySelector('meta[name="'+e+'"]').getAttribute("content"),r={default:JSON.parse(decodeURIComponent(t))}
5990
5990
  return Object.defineProperty(r,"__esModule",{value:!0}),r}catch(i){throw new Error('Could not read config from meta tag with name "'+e+'".')}})),runningTests||require("ghost-admin/app").default.create({version:"5.33",name:"ghost-admin"})
5991
5991
 
5992
- //# sourceMappingURL=ghost-904f203ff1f5f6bff4e55a03f39a4fbf.map
5992
+ //# sourceMappingURL=ghost-872d240189f9b5ff85f4f7cb2ac3ab4c.map
@@ -58,7 +58,7 @@
58
58
 
59
59
  <script src="assets/vendor-0441964c34d58f2aacd5a04bbe240243.js"></script>
60
60
  <script src="assets/chunk.963.e47ead5abeca4cf69fed.js"></script>
61
- <script src="assets/chunk.143.9057a1659075c0ee7336.js"></script>
62
- <script src="assets/ghost-904f203ff1f5f6bff4e55a03f39a4fbf.js"></script>
61
+ <script src="assets/chunk.143.caa7dbd727b76021c31b.js"></script>
62
+ <script src="assets/ghost-872d240189f9b5ff85f4f7cb2ac3ab4c.js"></script>
63
63
  </body>
64
64
  </html>
@@ -5,7 +5,7 @@ const membersService = require('../../../../../services/members');
5
5
  module.exports = {
6
6
  async read(model, apiConfig, frame) {
7
7
  const tiersModels = await membersService.api.productRepository.list({
8
- withRelated: ['monthlyPrice', 'yearlyPrice']
8
+ limit: 'all'
9
9
  });
10
10
  const tiers = tiersModels.data && tiersModels.data.map(tierModel => tierModel.toJSON());
11
11
 
@@ -13,7 +13,7 @@ module.exports = {
13
13
  let pages = [];
14
14
 
15
15
  const tiersModels = await membersService.api.productRepository.list({
16
- withRelated: ['monthlyPrice', 'yearlyPrice']
16
+ limit: 'all'
17
17
  });
18
18
  const tiers = tiersModels.data ? tiersModels.data.map(tierModel => tierModel.toJSON()) : [];
19
19
 
@@ -13,7 +13,7 @@ module.exports = {
13
13
  let posts = [];
14
14
 
15
15
  const tiersModels = await membersService.api.productRepository.list({
16
- withRelated: ['monthlyPrice', 'yearlyPrice']
16
+ limit: 'all'
17
17
  });
18
18
  const tiers = tiersModels.data ? tiersModels.data.map(tierModel => tierModel.toJSON()) : [];
19
19
  if (models.meta) {
@@ -4,7 +4,7 @@ const membersService = require('../../../../../services/members');
4
4
  module.exports = {
5
5
  async all(model, apiConfig, frame) {
6
6
  const tiersModels = await membersService.api.productRepository.list({
7
- withRelated: ['monthlyPrice', 'yearlyPrice']
7
+ limit: 'all'
8
8
  });
9
9
  const tiers = tiersModels.data ? tiersModels.data.map(tierModel => tierModel.toJSON()) : [];
10
10
 
@@ -0,0 +1,22 @@
1
+ /**
2
+ * This is an event that is used to circumvent the job manager that currently isn't able to run scheduled jobs on the main thread (not offloaded).
3
+ * We simply emit this event in the job manager and listen for it on the main thread.
4
+ */
5
+ module.exports = class StartEmailAnalyticsJobEvent {
6
+ /**
7
+ * @param {any} data
8
+ * @param {Date} timestamp
9
+ */
10
+ constructor(data, timestamp) {
11
+ this.data = data;
12
+ this.timestamp = timestamp;
13
+ }
14
+
15
+ /**
16
+ * @param {any} [data]
17
+ * @param {Date} [timestamp]
18
+ */
19
+ static create(data, timestamp) {
20
+ return new StartEmailAnalyticsJobEvent(data, timestamp ?? new Date);
21
+ }
22
+ };
@@ -1,23 +1,3 @@
1
- const config = require('../../../shared/config');
2
- const db = require('../../data/db');
3
- const settings = require('../../../shared/settings-cache');
4
- const {EmailAnalyticsService} = require('@tryghost/email-analytics-service');
5
- const {EmailEventProcessor} = require('@tryghost/email-service');
6
- const MailgunProvider = require('@tryghost/email-analytics-provider-mailgun');
7
- const queries = require('./lib/queries');
8
- const DomainEvents = require('@tryghost/domain-events');
1
+ const EmailAnalyticsServiceWrapper = require('./wrapper');
9
2
 
10
- const eventProcessor = new EmailEventProcessor({
11
- domainEvents: DomainEvents,
12
- db
13
- });
14
-
15
- module.exports = new EmailAnalyticsService({
16
- config,
17
- settings,
18
- eventProcessor,
19
- providers: [
20
- new MailgunProvider({config, settings})
21
- ],
22
- queries
23
- });
3
+ module.exports = new EmailAnalyticsServiceWrapper();
@@ -1,4 +1,5 @@
1
1
  const {parentPort} = require('worker_threads');
2
+ const StartEmailAnalyticsJobEvent = require('../../events/StartEmailAnalyticsJobEvent');
2
3
 
3
4
  // recurring job to fetch analytics since the most recently seen event timestamp
4
5
 
@@ -24,22 +25,15 @@ if (parentPort) {
24
25
  }
25
26
 
26
27
  (async () => {
27
- const {run} = require('./run');
28
- const {eventStats, aggregateEndDate, fetchStartDate} = await run({
29
- domainEvents: {
30
- dispatch(event) {
31
- parentPort.postMessage({
32
- event: {
33
- type: event.constructor.name,
34
- data: event
35
- }
36
- });
37
- }
28
+ // We send an evnet message, so that it is emitted on the main thread by the job manager
29
+ // This will start the email analytics job on the main thread (the wrapper service is listening for this event)
30
+ parentPort.postMessage({
31
+ event: {
32
+ type: StartEmailAnalyticsJobEvent.name
38
33
  }
39
34
  });
40
35
 
41
36
  if (parentPort) {
42
- parentPort.postMessage(`Fetched ${eventStats.totalEvents} events and aggregated stats for ${eventStats.emailIds.length} emails in ${aggregateEndDate - fetchStartDate}ms`);
43
37
  parentPort.postMessage('done');
44
38
  } else {
45
39
  // give the logging pipes time finish writing before exit
@@ -0,0 +1,90 @@
1
+ const logging = require('@tryghost/logging');
2
+ const debug = require('@tryghost/debug')('jobs:email-analytics:fetch-latest');
3
+
4
+ class EmailAnalyticsServiceWrapper {
5
+ init() {
6
+ if (this.service) {
7
+ return;
8
+ }
9
+
10
+ const {EmailAnalyticsService} = require('@tryghost/email-analytics-service');
11
+ const {EmailEventStorage, EmailEventProcessor} = require('@tryghost/email-service');
12
+ const MailgunProvider = require('@tryghost/email-analytics-provider-mailgun');
13
+ const {EmailRecipientFailure, EmailSpamComplaintEvent} = require('../../models');
14
+ const StartEmailAnalyticsJobEvent = require('./events/StartEmailAnalyticsJobEvent');
15
+
16
+ const domainEvents = require('@tryghost/domain-events');
17
+ const config = require('../../../shared/config');
18
+ const settings = require('../../../shared/settings-cache');
19
+ const db = require('../../data/db');
20
+ const queries = require('./lib/queries');
21
+ const membersService = require('../members');
22
+ const membersRepository = membersService.api.members;
23
+
24
+ this.eventStorage = new EmailEventStorage({
25
+ db,
26
+ membersRepository,
27
+ models: {
28
+ EmailRecipientFailure,
29
+ EmailSpamComplaintEvent
30
+ }
31
+ });
32
+
33
+ // Since this is running in a worker thread, we cant dispatch directly
34
+ // So we post the events as a message to the job manager
35
+ const eventProcessor = new EmailEventProcessor({
36
+ domainEvents,
37
+ db,
38
+ eventStorage: this.eventStorage
39
+ });
40
+
41
+ this.service = new EmailAnalyticsService({
42
+ config,
43
+ settings,
44
+ eventProcessor,
45
+ providers: [
46
+ new MailgunProvider({config, settings})
47
+ ],
48
+ queries
49
+ });
50
+
51
+ // We currently cannot trigger a non-offloaded job from the job manager
52
+ // So the email analytics jobs simply emits an event.
53
+ domainEvents.subscribe(StartEmailAnalyticsJobEvent, async () => {
54
+ await this.startFetch();
55
+ });
56
+ }
57
+
58
+ async startFetch() {
59
+ if (this.fetching) {
60
+ logging.info('Email analytics fetch already running, skipping');
61
+ return;
62
+ }
63
+ this.fetching = true;
64
+
65
+ logging.info('Email analytics fetch started');
66
+ try {
67
+ const fetchStartDate = new Date();
68
+ debug('Starting email analytics fetch of latest events');
69
+ const eventStats = await this.service.fetchLatest();
70
+ const fetchEndDate = new Date();
71
+ debug(`Finished fetching ${eventStats.totalEvents} analytics events in ${fetchEndDate.getTime() - fetchStartDate.getTime()}ms`);
72
+
73
+ const aggregateStartDate = new Date();
74
+ debug(`Starting email analytics aggregation for ${eventStats.emailIds.length} emails`);
75
+ await this.service.aggregateStats(eventStats);
76
+ const aggregateEndDate = new Date();
77
+ debug(`Finished aggregating email analytics in ${aggregateEndDate.getTime() - aggregateStartDate.getTime()}ms`);
78
+
79
+ logging.info(`Fetched ${eventStats.totalEvents} events and aggregated stats for ${eventStats.emailIds.length} emails in ${aggregateEndDate.getTime() - fetchStartDate.getTime()}ms`);
80
+
81
+ this.fetching = false;
82
+ return eventStats;
83
+ } catch (e) {
84
+ logging.error(e, 'Error while fetching email analytics');
85
+ }
86
+ this.fetching = false;
87
+ }
88
+ }
89
+
90
+ module.exports = EmailAnalyticsServiceWrapper;
@@ -13,8 +13,8 @@ class EmailServiceWrapper {
13
13
  return;
14
14
  }
15
15
 
16
- const {EmailService, EmailController, EmailRenderer, SendingService, BatchSendingService, EmailSegmenter, EmailEventStorage, MailgunEmailProvider} = require('@tryghost/email-service');
17
- const {Post, Newsletter, Email, EmailBatch, EmailRecipient, Member, EmailRecipientFailure, EmailSpamComplaintEvent} = require('../../models');
16
+ const {EmailService, EmailController, EmailRenderer, SendingService, BatchSendingService, EmailSegmenter, MailgunEmailProvider} = require('@tryghost/email-service');
17
+ const {Post, Newsletter, Email, EmailBatch, EmailRecipient, Member} = require('../../models');
18
18
  const MailgunClient = require('@tryghost/mailgun-client');
19
19
  const configService = require('../../../shared/config');
20
20
  const settingsCache = require('../../../shared/settings-cache');
@@ -25,7 +25,6 @@ class EmailServiceWrapper {
25
25
  const sentry = require('../../../shared/sentry');
26
26
  const membersRepository = membersService.api.members;
27
27
  const limitService = require('../limits');
28
- const domainEvents = require('@tryghost/domain-events');
29
28
 
30
29
  const mobiledocLib = require('../../lib/mobiledoc');
31
30
  const lexicalLib = require('../../lib/lexical');
@@ -116,16 +115,6 @@ class EmailServiceWrapper {
116
115
  Email
117
116
  }
118
117
  });
119
-
120
- this.eventStorage = new EmailEventStorage({
121
- db,
122
- membersRepository,
123
- models: {
124
- EmailRecipientFailure,
125
- EmailSpamComplaintEvent
126
- }
127
- });
128
- this.eventStorage.listen(domainEvents);
129
118
  }
130
119
  }
131
120
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ghost",
3
- "version": "5.33.7",
3
+ "version": "5.33.8",
4
4
  "description": "The professional publishing platform",
5
5
  "author": "Ghost Foundation",
6
6
  "homepage": "https://ghost.org",
@@ -58,36 +58,36 @@
58
58
  "dependencies": {
59
59
  "@sentry/node": "7.11.1",
60
60
  "@tryghost/adapter-base-cache": "0.1.3",
61
- "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.33.7.tgz",
61
+ "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.33.8.tgz",
62
62
  "@tryghost/admin-api-schema": "4.2.1",
63
- "@tryghost/api-framework": "file:components/tryghost-api-framework-5.33.7.tgz",
64
- "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.33.7.tgz",
65
- "@tryghost/audience-feedback": "file:components/tryghost-audience-feedback-5.33.7.tgz",
63
+ "@tryghost/api-framework": "file:components/tryghost-api-framework-5.33.8.tgz",
64
+ "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.33.8.tgz",
65
+ "@tryghost/audience-feedback": "file:components/tryghost-audience-feedback-5.33.8.tgz",
66
66
  "@tryghost/bookshelf-plugins": "0.6.3",
67
- "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.33.7.tgz",
67
+ "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.33.8.tgz",
68
68
  "@tryghost/color-utils": "0.1.22",
69
69
  "@tryghost/config-url-helpers": "1.0.4",
70
- "@tryghost/constants": "file:components/tryghost-constants-5.33.7.tgz",
71
- "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.33.7.tgz",
72
- "@tryghost/data-generator": "file:components/tryghost-data-generator-5.33.7.tgz",
70
+ "@tryghost/constants": "file:components/tryghost-constants-5.33.8.tgz",
71
+ "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.33.8.tgz",
72
+ "@tryghost/data-generator": "file:components/tryghost-data-generator-5.33.8.tgz",
73
73
  "@tryghost/database-info": "0.3.14",
74
74
  "@tryghost/debug": "0.1.21",
75
- "@tryghost/domain-events": "file:components/tryghost-domain-events-5.33.7.tgz",
76
- "@tryghost/dynamic-routing-events": "file:components/tryghost-dynamic-routing-events-5.33.7.tgz",
77
- "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.33.7.tgz",
78
- "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.33.7.tgz",
79
- "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.33.7.tgz",
75
+ "@tryghost/domain-events": "file:components/tryghost-domain-events-5.33.8.tgz",
76
+ "@tryghost/dynamic-routing-events": "file:components/tryghost-dynamic-routing-events-5.33.8.tgz",
77
+ "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.33.8.tgz",
78
+ "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.33.8.tgz",
79
+ "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.33.8.tgz",
80
80
  "@tryghost/email-mock-receiver": "0.1.0",
81
- "@tryghost/email-service": "file:components/tryghost-email-service-5.33.7.tgz",
82
- "@tryghost/email-suppression-list": "file:components/tryghost-email-suppression-list-5.33.7.tgz",
81
+ "@tryghost/email-service": "file:components/tryghost-email-service-5.33.8.tgz",
82
+ "@tryghost/email-suppression-list": "file:components/tryghost-email-suppression-list-5.33.8.tgz",
83
83
  "@tryghost/errors": "1.2.20",
84
- "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.33.7.tgz",
84
+ "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.33.8.tgz",
85
85
  "@tryghost/helpers": "1.1.75",
86
- "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.33.7.tgz",
86
+ "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.33.8.tgz",
87
87
  "@tryghost/http-cache-utils": "0.1.6",
88
88
  "@tryghost/image-transform": "1.2.3",
89
- "@tryghost/importer-revue": "file:components/tryghost-importer-revue-5.33.7.tgz",
90
- "@tryghost/job-manager": "file:components/tryghost-job-manager-5.33.7.tgz",
89
+ "@tryghost/importer-revue": "file:components/tryghost-importer-revue-5.33.8.tgz",
90
+ "@tryghost/job-manager": "file:components/tryghost-job-manager-5.33.8.tgz",
91
91
  "@tryghost/kg-card-factory": "4.0.0",
92
92
  "@tryghost/kg-default-atoms": "4.0.0",
93
93
  "@tryghost/kg-default-cards": "6.0.0",
@@ -95,50 +95,50 @@
95
95
  "@tryghost/kg-lexical-html-renderer": "0.0.11",
96
96
  "@tryghost/kg-mobiledoc-html-renderer": "6.0.0",
97
97
  "@tryghost/limit-service": "1.2.4",
98
- "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.33.7.tgz",
99
- "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.33.7.tgz",
100
- "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.33.7.tgz",
98
+ "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.33.8.tgz",
99
+ "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.33.8.tgz",
100
+ "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.33.8.tgz",
101
101
  "@tryghost/logging": "2.4.0",
102
- "@tryghost/magic-link": "file:components/tryghost-magic-link-5.33.7.tgz",
103
- "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.33.7.tgz",
104
- "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.33.7.tgz",
105
- "@tryghost/member-events": "file:components/tryghost-member-events-5.33.7.tgz",
106
- "@tryghost/members-api": "file:components/tryghost-members-api-5.33.7.tgz",
107
- "@tryghost/members-csv": "file:components/tryghost-members-csv-5.33.7.tgz",
108
- "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.33.7.tgz",
109
- "@tryghost/members-importer": "file:components/tryghost-members-importer-5.33.7.tgz",
110
- "@tryghost/members-offers": "file:components/tryghost-members-offers-5.33.7.tgz",
111
- "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.33.7.tgz",
112
- "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.33.7.tgz",
102
+ "@tryghost/magic-link": "file:components/tryghost-magic-link-5.33.8.tgz",
103
+ "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.33.8.tgz",
104
+ "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.33.8.tgz",
105
+ "@tryghost/member-events": "file:components/tryghost-member-events-5.33.8.tgz",
106
+ "@tryghost/members-api": "file:components/tryghost-members-api-5.33.8.tgz",
107
+ "@tryghost/members-csv": "file:components/tryghost-members-csv-5.33.8.tgz",
108
+ "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.33.8.tgz",
109
+ "@tryghost/members-importer": "file:components/tryghost-members-importer-5.33.8.tgz",
110
+ "@tryghost/members-offers": "file:components/tryghost-members-offers-5.33.8.tgz",
111
+ "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.33.8.tgz",
112
+ "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.33.8.tgz",
113
113
  "@tryghost/metrics": "1.0.20",
114
- "@tryghost/minifier": "file:components/tryghost-minifier-5.33.7.tgz",
115
- "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.33.7.tgz",
116
- "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.33.7.tgz",
117
- "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.33.7.tgz",
118
- "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.33.7.tgz",
119
- "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.33.7.tgz",
114
+ "@tryghost/minifier": "file:components/tryghost-minifier-5.33.8.tgz",
115
+ "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.33.8.tgz",
116
+ "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.33.8.tgz",
117
+ "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.33.8.tgz",
118
+ "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.33.8.tgz",
119
+ "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.33.8.tgz",
120
120
  "@tryghost/nodemailer": "0.3.31",
121
121
  "@tryghost/nql": "0.11.0",
122
- "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.33.7.tgz",
123
- "@tryghost/package-json": "file:components/tryghost-package-json-5.33.7.tgz",
122
+ "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.33.8.tgz",
123
+ "@tryghost/package-json": "file:components/tryghost-package-json-5.33.8.tgz",
124
124
  "@tryghost/pretty-cli": "1.2.33",
125
125
  "@tryghost/promise": "0.2.1",
126
126
  "@tryghost/request": "0.1.34",
127
- "@tryghost/security": "file:components/tryghost-security-5.33.7.tgz",
128
- "@tryghost/session-service": "file:components/tryghost-session-service-5.33.7.tgz",
129
- "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.33.7.tgz",
127
+ "@tryghost/security": "file:components/tryghost-security-5.33.8.tgz",
128
+ "@tryghost/session-service": "file:components/tryghost-session-service-5.33.8.tgz",
129
+ "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.33.8.tgz",
130
130
  "@tryghost/social-urls": "0.1.34",
131
- "@tryghost/staff-service": "file:components/tryghost-staff-service-5.33.7.tgz",
132
- "@tryghost/stats-service": "file:components/tryghost-stats-service-5.33.7.tgz",
131
+ "@tryghost/staff-service": "file:components/tryghost-staff-service-5.33.8.tgz",
132
+ "@tryghost/stats-service": "file:components/tryghost-stats-service-5.33.8.tgz",
133
133
  "@tryghost/string": "0.2.2",
134
- "@tryghost/tiers": "file:components/tryghost-tiers-5.33.7.tgz",
134
+ "@tryghost/tiers": "file:components/tryghost-tiers-5.33.8.tgz",
135
135
  "@tryghost/tpl": "0.1.21",
136
- "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.33.7.tgz",
136
+ "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.33.8.tgz",
137
137
  "@tryghost/url-utils": "4.3.0",
138
138
  "@tryghost/validator": "0.1.31",
139
- "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.33.7.tgz",
139
+ "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.33.8.tgz",
140
140
  "@tryghost/version": "0.1.19",
141
- "@tryghost/webmentions": "file:components/tryghost-webmentions-5.33.7.tgz",
141
+ "@tryghost/webmentions": "file:components/tryghost-webmentions-5.33.8.tgz",
142
142
  "@tryghost/zip": "1.1.31",
143
143
  "amperize": "0.6.1",
144
144
  "analytics-node": "6.2.0",
@@ -233,62 +233,62 @@
233
233
  "@tryghost/logging": "2.4.0",
234
234
  "moment": "2.24.0",
235
235
  "moment-timezone": "0.5.23",
236
- "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.33.7.tgz",
237
- "@tryghost/api-framework": "file:components/tryghost-api-framework-5.33.7.tgz",
238
- "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.33.7.tgz",
239
- "@tryghost/audience-feedback": "file:components/tryghost-audience-feedback-5.33.7.tgz",
240
- "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.33.7.tgz",
241
- "@tryghost/constants": "file:components/tryghost-constants-5.33.7.tgz",
242
- "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.33.7.tgz",
243
- "@tryghost/data-generator": "file:components/tryghost-data-generator-5.33.7.tgz",
244
- "@tryghost/domain-events": "file:components/tryghost-domain-events-5.33.7.tgz",
245
- "@tryghost/dynamic-routing-events": "file:components/tryghost-dynamic-routing-events-5.33.7.tgz",
246
- "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.33.7.tgz",
247
- "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.33.7.tgz",
248
- "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.33.7.tgz",
249
- "@tryghost/email-events": "file:components/tryghost-email-events-5.33.7.tgz",
250
- "@tryghost/email-service": "file:components/tryghost-email-service-5.33.7.tgz",
251
- "@tryghost/email-suppression-list": "file:components/tryghost-email-suppression-list-5.33.7.tgz",
252
- "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.33.7.tgz",
253
- "@tryghost/extract-api-key": "file:components/tryghost-extract-api-key-5.33.7.tgz",
254
- "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.33.7.tgz",
255
- "@tryghost/i18n": "file:components/tryghost-i18n-5.33.7.tgz",
256
- "@tryghost/importer-revue": "file:components/tryghost-importer-revue-5.33.7.tgz",
257
- "@tryghost/job-manager": "file:components/tryghost-job-manager-5.33.7.tgz",
258
- "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.33.7.tgz",
259
- "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.33.7.tgz",
260
- "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.33.7.tgz",
261
- "@tryghost/magic-link": "file:components/tryghost-magic-link-5.33.7.tgz",
262
- "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.33.7.tgz",
263
- "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.33.7.tgz",
264
- "@tryghost/member-events": "file:components/tryghost-member-events-5.33.7.tgz",
265
- "@tryghost/members-api": "file:components/tryghost-members-api-5.33.7.tgz",
266
- "@tryghost/members-csv": "file:components/tryghost-members-csv-5.33.7.tgz",
267
- "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.33.7.tgz",
268
- "@tryghost/members-importer": "file:components/tryghost-members-importer-5.33.7.tgz",
269
- "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.33.7.tgz",
270
- "@tryghost/minifier": "file:components/tryghost-minifier-5.33.7.tgz",
271
- "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.33.7.tgz",
272
- "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.33.7.tgz",
273
- "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.33.7.tgz",
274
- "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.33.7.tgz",
275
- "@tryghost/mw-update-user-last-seen": "file:components/tryghost-mw-update-user-last-seen-5.33.7.tgz",
276
- "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.33.7.tgz",
277
- "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.33.7.tgz",
278
- "@tryghost/members-offers": "file:components/tryghost-members-offers-5.33.7.tgz",
279
- "@tryghost/package-json": "file:components/tryghost-package-json-5.33.7.tgz",
280
- "@tryghost/members-payments": "file:components/tryghost-members-payments-5.33.7.tgz",
281
- "@tryghost/referrers": "file:components/tryghost-referrers-5.33.7.tgz",
282
- "@tryghost/security": "file:components/tryghost-security-5.33.7.tgz",
283
- "@tryghost/session-service": "file:components/tryghost-session-service-5.33.7.tgz",
284
- "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.33.7.tgz",
285
- "@tryghost/staff-service": "file:components/tryghost-staff-service-5.33.7.tgz",
286
- "@tryghost/stats-service": "file:components/tryghost-stats-service-5.33.7.tgz",
287
- "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.33.7.tgz",
288
- "@tryghost/tiers": "file:components/tryghost-tiers-5.33.7.tgz",
289
- "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.33.7.tgz",
290
- "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.33.7.tgz",
291
- "@tryghost/version-notifications-data-service": "file:components/tryghost-version-notifications-data-service-5.33.7.tgz",
292
- "@tryghost/webmentions": "file:components/tryghost-webmentions-5.33.7.tgz"
236
+ "@tryghost/adapter-manager": "file:components/tryghost-adapter-manager-5.33.8.tgz",
237
+ "@tryghost/api-framework": "file:components/tryghost-api-framework-5.33.8.tgz",
238
+ "@tryghost/api-version-compatibility-service": "file:components/tryghost-api-version-compatibility-service-5.33.8.tgz",
239
+ "@tryghost/audience-feedback": "file:components/tryghost-audience-feedback-5.33.8.tgz",
240
+ "@tryghost/bootstrap-socket": "file:components/tryghost-bootstrap-socket-5.33.8.tgz",
241
+ "@tryghost/constants": "file:components/tryghost-constants-5.33.8.tgz",
242
+ "@tryghost/custom-theme-settings-service": "file:components/tryghost-custom-theme-settings-service-5.33.8.tgz",
243
+ "@tryghost/data-generator": "file:components/tryghost-data-generator-5.33.8.tgz",
244
+ "@tryghost/domain-events": "file:components/tryghost-domain-events-5.33.8.tgz",
245
+ "@tryghost/dynamic-routing-events": "file:components/tryghost-dynamic-routing-events-5.33.8.tgz",
246
+ "@tryghost/email-analytics-provider-mailgun": "file:components/tryghost-email-analytics-provider-mailgun-5.33.8.tgz",
247
+ "@tryghost/email-analytics-service": "file:components/tryghost-email-analytics-service-5.33.8.tgz",
248
+ "@tryghost/email-content-generator": "file:components/tryghost-email-content-generator-5.33.8.tgz",
249
+ "@tryghost/email-events": "file:components/tryghost-email-events-5.33.8.tgz",
250
+ "@tryghost/email-service": "file:components/tryghost-email-service-5.33.8.tgz",
251
+ "@tryghost/email-suppression-list": "file:components/tryghost-email-suppression-list-5.33.8.tgz",
252
+ "@tryghost/express-dynamic-redirects": "file:components/tryghost-express-dynamic-redirects-5.33.8.tgz",
253
+ "@tryghost/extract-api-key": "file:components/tryghost-extract-api-key-5.33.8.tgz",
254
+ "@tryghost/html-to-plaintext": "file:components/tryghost-html-to-plaintext-5.33.8.tgz",
255
+ "@tryghost/i18n": "file:components/tryghost-i18n-5.33.8.tgz",
256
+ "@tryghost/importer-revue": "file:components/tryghost-importer-revue-5.33.8.tgz",
257
+ "@tryghost/job-manager": "file:components/tryghost-job-manager-5.33.8.tgz",
258
+ "@tryghost/link-redirects": "file:components/tryghost-link-redirects-5.33.8.tgz",
259
+ "@tryghost/link-replacer": "file:components/tryghost-link-replacer-5.33.8.tgz",
260
+ "@tryghost/link-tracking": "file:components/tryghost-link-tracking-5.33.8.tgz",
261
+ "@tryghost/magic-link": "file:components/tryghost-magic-link-5.33.8.tgz",
262
+ "@tryghost/mailgun-client": "file:components/tryghost-mailgun-client-5.33.8.tgz",
263
+ "@tryghost/member-attribution": "file:components/tryghost-member-attribution-5.33.8.tgz",
264
+ "@tryghost/member-events": "file:components/tryghost-member-events-5.33.8.tgz",
265
+ "@tryghost/members-api": "file:components/tryghost-members-api-5.33.8.tgz",
266
+ "@tryghost/members-csv": "file:components/tryghost-members-csv-5.33.8.tgz",
267
+ "@tryghost/members-events-service": "file:components/tryghost-members-events-service-5.33.8.tgz",
268
+ "@tryghost/members-importer": "file:components/tryghost-members-importer-5.33.8.tgz",
269
+ "@tryghost/members-ssr": "file:components/tryghost-members-ssr-5.33.8.tgz",
270
+ "@tryghost/minifier": "file:components/tryghost-minifier-5.33.8.tgz",
271
+ "@tryghost/mw-api-version-mismatch": "file:components/tryghost-mw-api-version-mismatch-5.33.8.tgz",
272
+ "@tryghost/mw-cache-control": "file:components/tryghost-mw-cache-control-5.33.8.tgz",
273
+ "@tryghost/mw-error-handler": "file:components/tryghost-mw-error-handler-5.33.8.tgz",
274
+ "@tryghost/mw-session-from-token": "file:components/tryghost-mw-session-from-token-5.33.8.tgz",
275
+ "@tryghost/mw-update-user-last-seen": "file:components/tryghost-mw-update-user-last-seen-5.33.8.tgz",
276
+ "@tryghost/mw-vhost": "file:components/tryghost-mw-vhost-5.33.8.tgz",
277
+ "@tryghost/oembed-service": "file:components/tryghost-oembed-service-5.33.8.tgz",
278
+ "@tryghost/members-offers": "file:components/tryghost-members-offers-5.33.8.tgz",
279
+ "@tryghost/package-json": "file:components/tryghost-package-json-5.33.8.tgz",
280
+ "@tryghost/members-payments": "file:components/tryghost-members-payments-5.33.8.tgz",
281
+ "@tryghost/referrers": "file:components/tryghost-referrers-5.33.8.tgz",
282
+ "@tryghost/security": "file:components/tryghost-security-5.33.8.tgz",
283
+ "@tryghost/session-service": "file:components/tryghost-session-service-5.33.8.tgz",
284
+ "@tryghost/settings-path-manager": "file:components/tryghost-settings-path-manager-5.33.8.tgz",
285
+ "@tryghost/staff-service": "file:components/tryghost-staff-service-5.33.8.tgz",
286
+ "@tryghost/stats-service": "file:components/tryghost-stats-service-5.33.8.tgz",
287
+ "@tryghost/members-stripe-service": "file:components/tryghost-members-stripe-service-5.33.8.tgz",
288
+ "@tryghost/tiers": "file:components/tryghost-tiers-5.33.8.tgz",
289
+ "@tryghost/update-check-service": "file:components/tryghost-update-check-service-5.33.8.tgz",
290
+ "@tryghost/verification-trigger": "file:components/tryghost-verification-trigger-5.33.8.tgz",
291
+ "@tryghost/version-notifications-data-service": "file:components/tryghost-version-notifications-data-service-5.33.8.tgz",
292
+ "@tryghost/webmentions": "file:components/tryghost-webmentions-5.33.8.tgz"
293
293
  }
294
294
  }
Binary file
@@ -1,57 +0,0 @@
1
- const debug = require('@tryghost/debug')('jobs:email-analytics:fetch-latest');
2
-
3
- async function run({domainEvents}) {
4
- const config = require('../../../../../shared/config');
5
- const db = require('../../../../data/db');
6
-
7
- const settingsRows = await db.knex('settings')
8
- .whereIn('key', ['mailgun_api_key', 'mailgun_domain', 'mailgun_base_url']);
9
-
10
- const settingsCache = {};
11
-
12
- settingsRows.forEach((row) => {
13
- settingsCache[row.key] = row.value;
14
- });
15
-
16
- const settings = {
17
- get(key) {
18
- return settingsCache[key];
19
- }
20
- };
21
-
22
- const {EmailAnalyticsService} = require('@tryghost/email-analytics-service');
23
- const MailgunProvider = require('@tryghost/email-analytics-provider-mailgun');
24
- const queries = require('../../lib/queries');
25
- const {EmailEventProcessor} = require('@tryghost/email-service');
26
-
27
- // Since this is running in a worker thread, we cant dispatch directly
28
- // So we post the events as a message to the job manager
29
- const eventProcessor = new EmailEventProcessor({
30
- domainEvents,
31
- db
32
- });
33
-
34
- const emailAnalyticsService = new EmailAnalyticsService({
35
- config,
36
- settings,
37
- eventProcessor,
38
- providers: [
39
- new MailgunProvider({config, settings})
40
- ],
41
- queries
42
- });
43
-
44
- const fetchStartDate = new Date();
45
- debug('Starting email analytics fetch of latest events');
46
- const eventStats = await emailAnalyticsService.fetchLatest();
47
- const fetchEndDate = new Date();
48
- debug(`Finished fetching ${eventStats.totalEvents} analytics events in ${fetchEndDate - fetchStartDate}ms`);
49
-
50
- const aggregateStartDate = new Date();
51
- debug(`Starting email analytics aggregation for ${eventStats.emailIds.length} emails`);
52
- await emailAnalyticsService.aggregateStats(eventStats);
53
- const aggregateEndDate = new Date();
54
- debug(`Finished aggregating email analytics in ${aggregateEndDate - aggregateStartDate}ms`);
55
- return {eventStats, fetchStartDate, fetchEndDate, aggregateStartDate, aggregateEndDate};
56
- }
57
- module.exports.run = run;