ghost 6.58.0 → 6.59.0
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.
- package/components/tryghost-adapter-base-scheduling-0.2.2.tgz +0 -0
- package/components/tryghost-adapter-base-sso-0.1.2.tgz +0 -0
- package/components/tryghost-i18n-0.0.0.tgz +0 -0
- package/components/tryghost-kg-default-nodes-2.2.0.tgz +0 -0
- package/components/tryghost-kg-html-to-lexical-1.4.0.tgz +0 -0
- package/components/tryghost-kg-lexical-html-renderer-1.5.0.tgz +0 -0
- package/content/themes/casper/.github/workflows/test.yml +11 -1
- package/content/themes/casper/AGENTS.md +25 -0
- package/content/themes/casper/assets/built/screen.css +1 -1
- package/content/themes/casper/assets/css/screen.css +15 -1
- package/content/themes/casper/gulpfile.js +3 -0
- package/content/themes/casper/package.json +8 -8
- package/content/themes/source/.gitattributes +5 -0
- package/content/themes/source/.github/workflows/test.yml +39 -0
- package/content/themes/source/AGENTS.md +25 -0
- package/content/themes/source/README.md +33 -4
- package/content/themes/source/assets/built/screen.css +1 -1
- package/content/themes/source/assets/css/screen.css +15 -0
- package/content/themes/source/gulpfile.js +6 -3
- package/content/themes/source/package.json +13 -10
- package/content/themes/source/pnpm-workspace.yaml +3 -0
- package/core/boot.js +11 -4
- package/core/built/admin/assets/Combination-BCm9FL4o.js +41 -0
- package/core/built/admin/assets/about-BdSCpjXG.js +1 -0
- package/core/built/admin/assets/account-migration-BpKAqo8k.js +1 -0
- package/core/built/admin/assets/activitypub/{account-migration-BpDeIF3G.js → account-migration-DVnYS1XG.js} +8 -8
- package/core/built/admin/assets/activitypub/activitypub.js +2 -2
- package/core/built/admin/assets/activitypub/{bluesky-sharing-aPMtrS3L.js → bluesky-sharing-DLVeE9ii.js} +31 -31
- package/core/built/admin/assets/activitypub/{content-formatters-BORfuA9G.js → content-formatters-DCsVic-t.js} +2 -2
- package/core/built/admin/assets/activitypub/{dist-ByFmDSNP2.js → dist-ByFmDSNP.js} +1 -1
- package/core/built/admin/assets/activitypub/{domain-CPdiB27_.js → domain-rrvDLfnK.js} +8 -8
- package/core/built/admin/assets/activitypub/{edit-profile-BY2PawIe.js → edit-profile-VT-piVxq.js} +23 -23
- package/core/built/admin/assets/activitypub/{explore-Sp9bgAwq.js → explore-DZg3m48P.js} +14 -14
- package/core/built/admin/assets/activitypub/{feed-BjtF4ohL.js → feed-BJqQvDMI.js} +41 -41
- package/core/built/admin/assets/activitypub/{field-BDOYVTg6.js → field-BezS4-1J.js} +2 -2
- package/core/built/admin/assets/activitypub/inbox-Uf0GVrI_.js +1284 -0
- package/core/built/admin/assets/activitypub/{label-1jhN-qhD.js → label-CZ6if4zK.js} +2 -2
- package/core/built/admin/assets/activitypub/layout-DNuYT4Gu.js +1 -0
- package/core/built/admin/assets/activitypub/moderation-CP6mDVky.js +340 -0
- package/core/built/admin/assets/activitypub/{note-nr_m_5yb.js → note-BlFkye2g.js} +16 -16
- package/core/built/admin/assets/activitypub/{notifications-BdcyivbT.js → notifications-GGTrGEdu.js} +163 -126
- package/core/built/admin/assets/activitypub/{preferences-CNqy1x9C.js → preferences-CjZXrZqr.js} +1550 -1551
- package/core/built/admin/assets/activitypub/{profile-DlY4rhbO.js → profile-CcXYxydm.js} +248 -248
- package/core/built/admin/assets/activitypub/{routes-CEHdEZzS.js → routes-nHCKlZl-.js} +1971 -1747
- package/core/built/admin/assets/activitypub/settings-pDzybcb3.js +315 -0
- package/core/built/admin/assets/activitypub/{site-CtBUCPBz.js → site-BZF0F8LN.js} +101 -101
- package/core/built/admin/assets/activitypub/{step-1-D9jGWyAy.js → step-1-C-Ns1Tfg.js} +3 -3
- package/core/built/admin/assets/activitypub/{step-3-KpUqpGWi.js → step-3-rDMNGmLg.js} +8 -8
- package/core/built/admin/assets/activitypub/{tabs-DvlsxTCI.js → tabs-CDjh3_Jp.js} +198 -198
- package/core/built/admin/assets/activitypub/{topic-filter-CIN1E2jg.js → topic-filter-CmTc8hpN.js} +2 -2
- package/core/built/admin/assets/activitypub/{use-activity-pub-queries-CATFd6YV.js → use-activity-pub-queries-DUDEdSdR.js} +286 -243
- package/core/built/admin/assets/activitypub/{use-reply-chain-data-DJ0vhA8V.js → use-reply-chain-data-TunGtmJl.js} +14 -14
- package/core/built/admin/assets/add-integration-modal-CXRQi1x0.js +1 -0
- package/core/built/admin/assets/add-newsletter-modal-t447KRYz.js +1 -0
- package/core/built/admin/assets/add-recommendation-modal-D882MdnR.js +1 -0
- package/core/built/admin/assets/{analytics-BC2oR8ay.js → analytics-Dj-WlzPf.js} +1 -1
- package/core/built/admin/assets/announcement-bar-modal-CwHKKw-a.js +1 -0
- package/core/built/admin/assets/api-keys-Boy5pLbD.js +1 -0
- package/core/built/admin/assets/audience-Cc40y7zQ.js +1 -0
- package/core/built/admin/assets/automations-DNLK5Udr.js +1 -0
- package/core/built/admin/assets/bluesky-sharing-Cm4aFaOl.js +1 -0
- package/core/built/admin/assets/breadcrumb-CcFr_ltt.js +1 -0
- package/core/built/admin/assets/button-BshWPHvn.js +1 -0
- package/core/built/admin/assets/chart-helpers-BsbzoWhK.js +1 -0
- package/core/built/admin/assets/{checkbox-LmClhqcS.js → checkbox-1G6KfK2q.js} +1 -1
- package/core/built/admin/assets/chunk-KS7C4IRE-DCsL4i4D.js +4 -0
- package/core/built/admin/assets/{chunk.408.1a258af360eb8d905508.js → chunk.301.5673a0caf7c49bb00212.js} +3 -3
- package/core/built/admin/assets/{chunk.524.4c693c3a00ac91df34fa.js → chunk.524.86db0d945468c852374b.js} +4 -4
- package/core/built/admin/assets/{chunk.582.20b600e329e58d12d7c2.js → chunk.582.c2f6216d3c4af303e236.js} +6 -6
- package/core/built/admin/assets/{code-editor-view-DqTOUnbM.js → code-editor-view-BVjtWyst.js} +1 -1
- package/core/built/admin/assets/{code-editor-view-bA0lfxUL.js → code-editor-view-y_zVfmCa.js} +1 -1
- package/core/built/admin/assets/color-picker-XEMPgNJE.js +3 -0
- package/core/built/admin/assets/{color-picker-field-Cv9GOJQZ.js → color-picker-field-BhplXcy5.js} +1 -1
- package/core/built/admin/assets/combobox-CRMJrvcQ.js +1 -0
- package/core/built/admin/assets/command-151T2eRx.js +1 -0
- package/core/built/admin/assets/comments-Bjbl9toF.js +1 -0
- package/core/built/admin/assets/confirmation-context-QmFxSjWy.js +1 -0
- package/core/built/admin/assets/{content-api-modal-BOFWRUkC.js → content-api-modal-CpeABXne.js} +1 -1
- package/core/built/admin/assets/{copy-field-8biQvNMD.js → copy-field-CglgRZyG.js} +1 -1
- package/core/built/admin/assets/custom-field-type-option-DSyJw4T4.js +1 -0
- package/core/built/admin/assets/custom-integration-modal-DWB9bRVp.js +1 -0
- package/core/built/admin/assets/date-range-select-kaKtab5O.js +1 -0
- package/core/built/admin/assets/design-and-theme-modal-86s2AaZ-.js +23 -0
- package/core/built/admin/assets/dirty-confirm-dialog-CTFdXXy7.js +1 -0
- package/core/built/admin/assets/disabled-sources-indicator-BFyCxUOx.js +1 -0
- package/core/built/admin/assets/dist-C1-Oy3Db.js +1 -0
- package/core/built/admin/assets/dist-CJJqYPep.js +1 -0
- package/core/built/admin/assets/dist-CNlMj7ML.js +1 -0
- package/core/built/admin/assets/dist-Kll2twSG.js +1 -0
- package/core/built/admin/assets/domain-BOoMvBG3.js +1 -0
- package/core/built/admin/assets/{dropzone-B21Entqz.js → dropzone-B6KWzsrb.js} +2 -2
- package/core/built/admin/assets/edit-profile-BagrYOrN.js +1 -0
- package/core/built/admin/assets/editor-AaJjqbpk.js +8 -0
- package/core/built/admin/assets/embed-signup-form-modal-B8L95KwR.js +8 -0
- package/core/built/admin/assets/explore-xbykZTlO.js +1 -0
- package/core/built/admin/assets/feed-BAHSipWv.js +1 -0
- package/core/built/admin/assets/{field-BQqLTgHM.js → field-kJYZ2T3C.js} +1 -1
- package/core/built/admin/assets/{filter-sources-FgqoUIL7.js → filter-sources-QeqFGNRB.js} +1 -1
- package/core/built/admin/assets/{filters-D0uIMD8n.js → filters-By5KQeV6.js} +1 -1
- package/core/built/admin/assets/filters-DtYpAkDd.js +1 -0
- package/core/built/admin/assets/first-promoter-modal-8A02oyjA.js +1 -0
- package/core/built/admin/assets/{ghost-ba408063a5922b458b4a8f216cf23251.js → ghost-f110822e67868c9fdf9a6c23754b2559.js} +9 -8
- package/core/built/admin/assets/gift-link-modal-DbYCyuhF.js +1 -0
- package/core/built/admin/assets/global-data-context-gAMDH9u1.js +1 -0
- package/core/built/admin/assets/growth-BSOxJGey.js +3 -0
- package/core/built/admin/assets/growth-BZTjURq5.js +1 -0
- package/core/built/admin/assets/history-modal-CCgWtlZE.js +1 -0
- package/core/built/admin/assets/html-field-BQC7XyLA.js +1 -0
- package/core/built/admin/assets/iframe-buffering-DnOlWTD4.js +1 -0
- package/core/built/admin/assets/{images-3cQgwfTD.js → images-D5UKr2SG.js} +1 -1
- package/core/built/admin/assets/{inbox-Dz_JblyJ.js → inbox-DvN15_YH.js} +45 -39
- package/core/built/admin/assets/index-BJz9Zlsc.js +67 -0
- package/core/built/admin/assets/index-Dg8cdR8E.css +1 -0
- package/core/built/admin/assets/{input-group-DpogNUIt.js → input-group-BPAxETpQ.js} +1 -1
- package/core/built/admin/assets/invite-user-modal-jcUaaNkW.js +1 -0
- package/core/built/admin/assets/{koenig-lexical-2KuqRwZI.js → koenig-lexical-CfXTYeli.js} +1 -1
- package/core/built/admin/assets/koenig-loader-DktFM3Uh.js +1 -0
- package/core/built/admin/assets/{kpi-card-Ck3tT2Wg.js → kpi-card-fUHZlzBX.js} +1 -1
- package/core/built/admin/assets/{kpi-card-DDIxptaS.js → kpi-card-o0urVtNL.js} +1 -1
- package/core/built/admin/assets/kpi-helpers-2FTF4a3-.js +1 -0
- package/core/built/admin/assets/kpi-tabs-B8-_k2dQ.js +1 -0
- package/core/built/admin/assets/{label-DodDsMzn.js → label-CiRS3i_f.js} +1 -1
- package/core/built/admin/assets/label-picker-ao7tuPaK.js +1 -0
- package/core/built/admin/assets/layout-DC6QGDaw.js +1 -0
- package/core/built/admin/assets/member-custom-fields-BW756-EV.js +1 -0
- package/core/built/admin/assets/member-detail-CGGgUTSl.js +1 -0
- package/core/built/admin/assets/members-ZcPthwG0.js +11 -0
- package/core/built/admin/assets/moderation-24bElWs3.js +1 -0
- package/core/built/admin/assets/multi-select-combobox-CZPrgz-Z.js +1 -0
- package/core/built/admin/assets/navigation-modal-BiTP4U_J.js +1 -0
- package/core/built/admin/assets/newsletter-B3Ihwizp.js +1 -0
- package/core/built/admin/assets/newsletter-detail-modal-CYsu4qhl.js +1 -0
- package/core/built/admin/assets/newsletter-emails-CDPR4-SP.js +1 -0
- package/core/built/admin/assets/newsletters-bJiYLJWl.js +1 -0
- package/core/built/admin/assets/note-7f6urVVA.js +1 -0
- package/core/built/admin/assets/notifications-rosQCyXH.js +1 -0
- package/core/built/admin/assets/offers-container-modal-J2j6NpDL.js +1 -0
- package/core/built/admin/assets/onboarding-route-DTjcThKl.js +1 -0
- package/core/built/admin/assets/overview-BxvWzGaf.js +1 -0
- package/core/built/admin/assets/overview-D6JG0hkZ.js +1 -0
- package/core/built/admin/assets/{page-header-VLPJfj_d.js → page-header-l7vXmLIw.js} +1 -1
- package/core/built/admin/assets/pintura-modal-BGHmudVB.js +1 -0
- package/core/built/admin/assets/portal-frame-DVc4VHX_.js +1 -0
- package/core/built/admin/assets/portal-modal-BCOcdiRi.js +1 -0
- package/core/built/admin/assets/{post-analytics-Gv81eN_g.js → post-analytics-CTSZMK6I.js} +1 -1
- package/core/built/admin/assets/post-analytics-header-Dt4RQGq0.js +1 -0
- package/core/built/admin/assets/{post-analytics-provider-O2YjZMhN.js → post-analytics-provider-C4ydiboO.js} +1 -1
- package/core/built/admin/assets/post-share-modal-DjH_a_1L.js +1 -0
- package/core/built/admin/assets/preferences-BLo6VJUS.js +5 -0
- package/core/built/admin/assets/preview-modal-BOgjgsJL.js +1 -0
- package/core/built/admin/assets/profile-DG6iCdRH.js +1 -0
- package/core/built/admin/assets/radio-group-ChHD4EQJ.js +1 -0
- package/core/built/admin/assets/router-provider-Bexg1t-V.js +1 -0
- package/core/built/admin/assets/select-ChxknEcT.js +1 -0
- package/core/built/admin/assets/settings-B0VDAhgV.js +1 -0
- package/core/built/admin/assets/settings-Dwo3CeAD.js +4 -0
- package/core/built/admin/assets/settings-breadcrumbs-sLDNedBW.js +1 -0
- package/core/built/admin/assets/share-modal-BDb2nacg.js +1 -0
- package/core/built/admin/assets/skeleton-D7hwjdry.js +1 -0
- package/core/built/admin/assets/slack-modal-CwNAD69x.js +1 -0
- package/core/built/admin/assets/sort-button-DhqpxkrO.js +1 -0
- package/core/built/admin/assets/source-icon-BPsD5ees.js +1 -0
- package/core/built/admin/assets/stats-WdDJ8c_1.js +1 -0
- package/core/built/admin/assets/stats-view-J3PI2eT_.js +1 -0
- package/core/built/admin/assets/step-1-2q1SjerQ.js +1 -0
- package/core/built/admin/assets/step-2-D5mJB3Uu.js +1 -0
- package/core/built/admin/assets/step-3-BpAuYTGZ.js +2 -0
- package/core/built/admin/assets/{stripe-button-Bh4p6Wud.js → stripe-button-DDoUKN5a.js} +1 -1
- package/core/built/admin/assets/stripe-connect-modal-pMdF3t4S.js +1 -0
- package/core/built/admin/assets/switch-B_1yU3Aw.js +1 -0
- package/core/built/admin/assets/{table-DghJxZMH.js → table-CrqQtkR2.js} +1 -1
- package/core/built/admin/assets/tabs-BhzVdh5p.js +1 -0
- package/core/built/admin/assets/tag-detail-CwJhI4qg.js +2 -0
- package/core/built/admin/assets/tags-CvJ0PgrB.js +1 -0
- package/core/built/admin/assets/testimonials-modal-CV82IAnI.js +1 -0
- package/core/built/admin/assets/tier-detail-modal-pLzCOfeg.js +1 -0
- package/core/built/admin/assets/toggle-group-BW_T4yn6.js +1 -0
- package/core/built/admin/assets/topic-filter-DkXjDejV.js +1 -0
- package/core/built/admin/assets/transistor-modal-TMRvHZ6B.js +1 -0
- package/core/built/admin/assets/unsplash-modal-CV92RdPw.js +1 -0
- package/core/built/admin/assets/{use-analytics-data-IxJcSjc9.js → use-analytics-data-BM_uV9SU.js} +1 -1
- package/core/built/admin/assets/use-check-theme-limit-error-DkBnXMSY.js +1 -0
- package/core/built/admin/assets/use-confirm-unload-SzlkOIpm.js +1 -0
- package/core/built/admin/assets/use-feature-flag-cahOlMva.js +1 -0
- package/core/built/admin/assets/use-filter-params-BX5qf0Cg.js +1 -0
- package/core/built/admin/assets/{use-growth-stats-1NW-8eEZ.js → use-growth-stats-D0LlWBe6.js} +1 -1
- package/core/built/admin/assets/{use-hash-link-navigation-guard-B9j6HIrV.js → use-hash-link-navigation-guard-B_Y3FhYH.js} +1 -1
- package/core/built/admin/assets/use-limiter-D3DHSoAj.js +2 -0
- package/core/built/admin/assets/{use-pintura-config-BjFChXV1.js → use-pintura-config-D63Xu0SG.js} +1 -1
- package/core/built/admin/assets/use-pintura-editor-Z51aFnC8.js +1 -0
- package/core/built/admin/assets/{use-post-referrers-Dp1BnTAK.js → use-post-referrers-Cvymr3gt.js} +1 -1
- package/core/built/admin/assets/use-query-params-BfzuqbcD.js +1 -0
- package/core/built/admin/assets/use-reply-chain-data-Dc18Ujqo.js +1 -0
- package/core/built/admin/assets/use-setting-group-DYRIzqC0.js +1 -0
- package/core/built/admin/assets/use-settings-navigation-aDSLtmEl.js +1 -0
- package/core/built/admin/assets/{use-simple-pagination-DsEGSJhe.js → use-simple-pagination-B2TdNX67.js} +1 -1
- package/core/built/admin/assets/{use-tinybird-query-Ci_DiPkX.js → use-tinybird-query-BvQIVuRc.js} +1 -1
- package/core/built/admin/assets/{use-tinybird-token-CsUwc722.js → use-tinybird-token-COQTPIwL.js} +1 -1
- package/core/built/admin/assets/use-upgrade-route-BZf1g59m.js +1 -0
- package/core/built/admin/assets/{use-url-input-BEZJpVgN.js → use-url-input-PcqZadXa.js} +1 -1
- package/core/built/admin/assets/user-detail-modal-DeO3SAZq.js +1 -0
- package/core/built/admin/assets/{virtual-list-D5ugXyZY.js → virtual-list-D3MfPNOh.js} +1 -1
- package/core/built/admin/assets/web-CDdyG7z1.js +2 -0
- package/core/built/admin/assets/web-CwQ8_QUc.js +1 -0
- package/core/built/admin/assets/zapier-modal-a7t75iNI.js +1 -0
- package/core/built/admin/index.html +15 -12
- package/core/frontend/apps/private-blogging/lib/helpers/input_password.js +2 -1
- package/core/frontend/helpers/body_class.js +2 -1
- package/core/frontend/helpers/cancel_link.js +2 -1
- package/core/frontend/helpers/color_to_rgba.js +2 -1
- package/core/frontend/helpers/content_api_key.js +2 -1
- package/core/frontend/helpers/content_api_url.js +2 -1
- package/core/frontend/helpers/contrast_text_color.js +2 -1
- package/core/frontend/helpers/facebook_url.js +2 -1
- package/core/frontend/helpers/ghost_foot.js +2 -1
- package/core/frontend/helpers/ghost_head.js +2 -1
- package/core/frontend/helpers/has.js +4 -2
- package/core/frontend/helpers/link_class.js +2 -1
- package/core/frontend/helpers/meta_description.js +2 -1
- package/core/frontend/helpers/meta_title.js +2 -1
- package/core/frontend/helpers/navigation.js +113 -22
- package/core/frontend/helpers/page_url.js +2 -1
- package/core/frontend/helpers/post_class.js +2 -1
- package/core/frontend/helpers/reading_time.js +2 -1
- package/core/frontend/helpers/social_accounts.js +2 -1
- package/core/frontend/helpers/social_url.js +2 -1
- package/core/frontend/helpers/total_members.js +2 -1
- package/core/frontend/helpers/total_paid_members.js +2 -1
- package/core/frontend/helpers/tpl/navigation.hbs +1 -1
- package/core/frontend/helpers/twitter_url.js +2 -1
- package/core/frontend/public/cards.manifest.json +1 -1
- package/core/server/api/endpoints/posts.js +7 -4
- package/core/server/api/endpoints/utils/permissions.js +2 -1
- package/core/server/api/endpoints/utils/validators/input/settings.js +83 -1
- package/core/server/data/exporter/table-lists.js +1 -0
- package/core/server/data/importer/handlers/json.js +2 -1
- package/core/server/data/migrations/versions/5.19/2022-09-02-20-52-backfill-new-product-columns.js +2 -1
- package/core/server/data/migrations/versions/5.21/2022-10-26-04-50-member-subscription-created-batch-id.js +4 -2
- package/core/server/data/migrations/versions/5.22/2022-10-31-12-03-backfill-new-product-columns.js +2 -1
- package/core/server/data/migrations/versions/6.58/2026-08-11-21-22-48-rename-email-batches-provider-id.js +1 -1
- package/core/server/data/migrations/versions/6.59/2026-08-18-17-06-46-add-gift-delivery-fields-to-gifts.js +26 -0
- package/core/server/data/migrations/versions/6.59/2026-08-18-17-07-01-add-gift-deliveries.js +20 -0
- package/core/server/data/schema/commands.js +48 -24
- package/core/server/data/schema/schema.js +28 -7
- package/core/server/data/seeders/importers/automation-action-revisions-importer.js +3 -36
- package/core/server/data/seeders/importers/automation-actions-importer.js +5 -41
- package/core/server/data/seeders/importers/automation-run-steps-importer.js +3 -36
- package/core/server/data/seeders/importers/automation-runs-importer.js +7 -42
- package/core/server/data/seeders/importers/automations-importer.js +3 -36
- package/core/server/data/seeders/importers/comment-reports-importer.js +5 -5
- package/core/server/data/seeders/importers/comments-importer.js +5 -5
- package/core/server/data/seeders/importers/email-batches-importer.js +5 -4
- package/core/server/data/seeders/importers/email-recipients-importer.js +12 -20
- package/core/server/data/seeders/importers/emails-importer.js +6 -6
- package/core/server/data/seeders/importers/labels-importer.js +3 -3
- package/core/server/data/seeders/importers/members-click-events-importer.js +5 -5
- package/core/server/data/seeders/importers/members-created-events-importer.js +13 -12
- package/core/server/data/seeders/importers/members-feedback-importer.js +7 -7
- package/core/server/data/seeders/importers/members-importer.js +4 -4
- package/core/server/data/seeders/importers/members-login-events-importer.js +3 -3
- package/core/server/data/seeders/importers/members-products-importer.js +2 -2
- package/core/server/data/seeders/importers/members-status-events-importer.js +4 -3
- package/core/server/data/seeders/importers/members-stripe-customers-importer.js +2 -2
- package/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js +7 -7
- package/core/server/data/seeders/importers/members-subscribe-events-importer.js +3 -3
- package/core/server/data/seeders/importers/members-subscription-created-events-importer.js +3 -3
- package/core/server/data/seeders/importers/offer-redemptions-importer.js +7 -7
- package/core/server/data/seeders/importers/offers-importer.js +3 -3
- package/core/server/data/seeders/importers/posts-importer.js +4 -4
- package/core/server/data/seeders/importers/table-importer.js +2 -35
- package/core/server/data/seeders/importers/tags-importer.js +2 -2
- package/core/server/data/seeders/importers/users-importer.js +2 -2
- package/core/server/data/seeders/importers/web-mentions-importer.js +2 -2
- package/core/server/data/seeders/utils/random.js +7 -0
- package/core/server/ghost-server.js +19 -5
- package/core/server/lib/db-date.js +72 -3
- package/core/server/models/gift-delivery.js +23 -0
- package/core/server/models/gift.js +9 -0
- package/core/server/models/index.js +3 -2
- package/core/server/models/settings.js +43 -4
- package/core/server/services/automations/database-automations-repository.js +38 -31
- package/core/server/services/automations/poll.js +1 -1
- package/core/server/services/content-import/csv/index.js +8 -0
- package/core/server/services/content-import/csv/parse.js +60 -0
- package/core/server/services/content-import/import/importer.js +222 -0
- package/core/server/services/content-import/import/post-data.js +52 -0
- package/core/server/services/content-import/import/reader.js +15 -0
- package/core/server/services/content-import/import/row.js +50 -0
- package/core/server/services/content-import/import/store.js +71 -0
- package/core/server/services/content-import/index.js +67 -0
- package/core/server/services/email-analytics/automation-email-analytics-batch-processor.js +1 -1
- package/core/server/services/email-analytics/index.js +3 -1
- package/core/server/services/email-analytics/jobs/index.js +2 -2
- package/core/server/services/email-service/email-service-wrapper.js +1 -1
- package/core/server/services/email-suppression-list/email-suppression-list.js +4 -2
- package/core/server/services/gifts/CONTEXT.md +27 -3
- package/core/server/services/gifts/README.md +8 -4
- package/core/server/services/gifts/constants.js +2 -1
- package/core/server/services/gifts/email-templates/gift-delivery.hbs +20 -0
- package/core/server/services/gifts/email-templates/gift-delivery.js +39 -0
- package/core/server/services/gifts/email-templates/gift-purchase-confirmation.hbs +2 -2
- package/core/server/services/gifts/email-templates/gift-purchase-confirmation.js +19 -4
- package/core/server/services/gifts/events/send-gift-delivery-event.js +15 -0
- package/core/server/services/gifts/gift-bookshelf-repository.js +23 -3
- package/core/server/services/gifts/gift-checkout-adapter.js +5 -3
- package/core/server/services/gifts/gift-codec.js +8 -0
- package/core/server/services/gifts/gift-delivery-bookshelf-repository.js +107 -0
- package/core/server/services/gifts/gift-delivery-codec.js +12 -0
- package/core/server/services/gifts/gift-delivery-schema.js +15 -0
- package/core/server/services/gifts/gift-delivery-service.js +209 -0
- package/core/server/services/gifts/gift-email-renderer.js +13 -1
- package/core/server/services/gifts/gift-email-service.js +97 -17
- package/core/server/services/gifts/gift-schema.js +10 -6
- package/core/server/services/gifts/gift-service.js +259 -34
- package/core/server/services/gifts/gift.js +59 -5
- package/core/server/services/gifts/index.js +69 -3
- package/core/server/services/lib/mailgun-client.js +5 -2
- package/core/server/services/mail/ghost-mailer.js +9 -1
- package/core/server/services/member-welcome-emails/service.js +6 -1
- package/core/server/services/members/members-api/controllers/router-controller.js +26 -8
- package/core/server/services/stripe/services/webhook/checkout-session-event-service.js +100 -12
- package/core/server/services/stripe/stripe-api.js +3 -2
- package/core/server/services/stripe/webhook-controller.js +6 -3
- package/core/server/services/stripe/webhook-manager.js +2 -0
- package/core/shared/labs.js +1 -0
- package/package.json +9 -8
- package/pnpm-lock.yaml +26 -11
- package/pnpm-workspace.yaml +5 -6
- package/content/themes/source/yarn.lock +0 -6232
- package/core/built/admin/assets/Combination-BDvCdg1t.js +0 -41
- package/core/built/admin/assets/about-B_BvSyLF.js +0 -1
- package/core/built/admin/assets/account-migration-oJUGxnzT.js +0 -1
- package/core/built/admin/assets/activitypub/dist-Dqggkccr.js +0 -215
- package/core/built/admin/assets/activitypub/inbox-z1o2j1Tb.js +0 -1221
- package/core/built/admin/assets/activitypub/layout-BRMezuty.js +0 -1
- package/core/built/admin/assets/activitypub/moderation-CZudJi8N.js +0 -160
- package/core/built/admin/assets/activitypub/settings-CrSV1cux.js +0 -107
- package/core/built/admin/assets/add-integration-modal-BW23PDYs.js +0 -1
- package/core/built/admin/assets/add-newsletter-modal-M0ls8BKO.js +0 -1
- package/core/built/admin/assets/add-recommendation-modal-B0NeBMzl.js +0 -1
- package/core/built/admin/assets/announcement-bar-modal-pXBqjQE_.js +0 -1
- package/core/built/admin/assets/api-keys-Df6uv1dT.js +0 -1
- package/core/built/admin/assets/audience-BY8od8If.js +0 -1
- package/core/built/admin/assets/automations-DCs6Wady.js +0 -1
- package/core/built/admin/assets/bluesky-sharing-D0P42Cws.js +0 -1
- package/core/built/admin/assets/breadcrumb-MTj_cKLb.js +0 -1
- package/core/built/admin/assets/chart-helpers-DcO3k_vA.js +0 -1
- package/core/built/admin/assets/chunk-KS7C4IRE-DG9HTHQ3.js +0 -4
- package/core/built/admin/assets/color-picker-CBlJMv3y.js +0 -3
- package/core/built/admin/assets/combobox-BbPJzjCp.js +0 -1
- package/core/built/admin/assets/command-BrhXIlDr.js +0 -1
- package/core/built/admin/assets/comments-Cu4rD1aJ.js +0 -1
- package/core/built/admin/assets/confirmation-provider-BEdrnHns.js +0 -1
- package/core/built/admin/assets/custom-field-type-option-CNhAgHbJ.js +0 -1
- package/core/built/admin/assets/custom-integration-modal-CrGOI8IB.js +0 -1
- package/core/built/admin/assets/date-range-select-Bsh4gIek.js +0 -1
- package/core/built/admin/assets/design-and-theme-modal-DWZguwWX.js +0 -23
- package/core/built/admin/assets/dirty-confirm-dialog-DmdMpgyN.js +0 -1
- package/core/built/admin/assets/disabled-sources-indicator-BLnmyWgt.js +0 -1
- package/core/built/admin/assets/dist-DMFGvqqU.js +0 -1
- package/core/built/admin/assets/dist-DlCyLrOC.js +0 -1
- package/core/built/admin/assets/dist-j1xxxnY8.js +0 -1
- package/core/built/admin/assets/domain-Dp9TRrFp.js +0 -1
- package/core/built/admin/assets/edit-profile-DG6lpMsr.js +0 -1
- package/core/built/admin/assets/editor-CPQOrhrn.js +0 -8
- package/core/built/admin/assets/embed-signup-form-modal-CgWniDha.js +0 -9
- package/core/built/admin/assets/explore-C3rzONJv.js +0 -1
- package/core/built/admin/assets/feed-DpUwS1cU.js +0 -1
- package/core/built/admin/assets/filters-DZJT29GW.js +0 -1
- package/core/built/admin/assets/first-promoter-modal-DJhQQheG.js +0 -1
- package/core/built/admin/assets/gift-link-modal-sdFLjND9.js +0 -1
- package/core/built/admin/assets/global-data-provider-CixmTX00.js +0 -1
- package/core/built/admin/assets/growth-0YYkBEeS.js +0 -1
- package/core/built/admin/assets/growth-DpjAPeQT.js +0 -3
- package/core/built/admin/assets/history-modal-BWJ4-cJ0.js +0 -1
- package/core/built/admin/assets/html-field-C-oa5DEl.js +0 -1
- package/core/built/admin/assets/iframe-buffering-Ba9sDpi2.js +0 -1
- package/core/built/admin/assets/index-BOJzlYiz.js +0 -67
- package/core/built/admin/assets/index-Bid6LAyc.css +0 -1
- package/core/built/admin/assets/invite-user-modal-DCiQSiuD.js +0 -1
- package/core/built/admin/assets/koenig-editor-base-BApy8Q7C.js +0 -1
- package/core/built/admin/assets/kpi-helpers-ssbuy-hD.js +0 -1
- package/core/built/admin/assets/kpi-tabs-BqoIM6bI.js +0 -1
- package/core/built/admin/assets/label-picker-Cvvbmzb5.js +0 -1
- package/core/built/admin/assets/layout-DkkGyev2.js +0 -1
- package/core/built/admin/assets/member-custom-fields-CvGcpaiW.js +0 -1
- package/core/built/admin/assets/member-detail-CMCMZ47_.js +0 -1
- package/core/built/admin/assets/members-sRl6fNfq.js +0 -11
- package/core/built/admin/assets/moderation-KhKwGqI1.js +0 -1
- package/core/built/admin/assets/multi-select-combobox-nhCff0_K.js +0 -1
- package/core/built/admin/assets/navigation-modal-MDJExWDJ.js +0 -1
- package/core/built/admin/assets/newsletter-BIBHumfV.js +0 -1
- package/core/built/admin/assets/newsletter-detail-modal-CfjBMH3v.js +0 -1
- package/core/built/admin/assets/newsletter-emails-ClDL-7dA.js +0 -1
- package/core/built/admin/assets/newsletters-CBe-IPzK.js +0 -1
- package/core/built/admin/assets/note-HnNUOt4d.js +0 -1
- package/core/built/admin/assets/notifications-Cj5e-258.js +0 -1
- package/core/built/admin/assets/offers-container-modal-BHwHtixC.js +0 -1
- package/core/built/admin/assets/onboarding-route-D_4jp7Nq.js +0 -1
- package/core/built/admin/assets/overview-CezDdg-F.js +0 -1
- package/core/built/admin/assets/overview-D5mM51Lj.js +0 -1
- package/core/built/admin/assets/pintura-modal-BXXJ8Iaa.js +0 -1
- package/core/built/admin/assets/portal-frame-BLCvF8f-.js +0 -1
- package/core/built/admin/assets/portal-modal-DN80tAcy.js +0 -1
- package/core/built/admin/assets/post-analytics-header-_ydSY8qO.js +0 -1
- package/core/built/admin/assets/post-share-modal-CzYak_a5.js +0 -1
- package/core/built/admin/assets/preferences-gneLb6LV.js +0 -5
- package/core/built/admin/assets/preview-modal-Bkq-tgVm.js +0 -1
- package/core/built/admin/assets/profile-CzXmCNTC.js +0 -1
- package/core/built/admin/assets/radio-group-Dsq5ZEbV.js +0 -1
- package/core/built/admin/assets/router-provider-CkB_ArLF.js +0 -1
- package/core/built/admin/assets/select-xuZAuDyS.js +0 -1
- package/core/built/admin/assets/settings-Ct8pabhr.js +0 -1
- package/core/built/admin/assets/settings-KSWWQanQ.js +0 -4
- package/core/built/admin/assets/settings-breadcrumbs-DbPGu-Tu.js +0 -1
- package/core/built/admin/assets/share-modal-CdiUx9WM.js +0 -1
- package/core/built/admin/assets/slack-modal-BP--Z3jE.js +0 -1
- package/core/built/admin/assets/sort-button-CjfKdlsL.js +0 -1
- package/core/built/admin/assets/source-icon-DHj1h6Ts.js +0 -1
- package/core/built/admin/assets/stats-C615kulJ.js +0 -1
- package/core/built/admin/assets/stats-view-BSMRdYiN.js +0 -1
- package/core/built/admin/assets/step-1-pSdGYtIF.js +0 -1
- package/core/built/admin/assets/step-2-T9Uy4eBD.js +0 -1
- package/core/built/admin/assets/step-3-D4uXe_XG.js +0 -2
- package/core/built/admin/assets/stripe-connect-modal-C2vTvepi.js +0 -1
- package/core/built/admin/assets/switch-CE2NuMn-.js +0 -1
- package/core/built/admin/assets/tabs-l9c7FjzI.js +0 -1
- package/core/built/admin/assets/tag-detail-DBw_M2-p.js +0 -2
- package/core/built/admin/assets/tags-DoWsAG6l.js +0 -1
- package/core/built/admin/assets/testimonials-modal-BZKePE2T.js +0 -1
- package/core/built/admin/assets/tier-detail-modal-D65pVWsN.js +0 -1
- package/core/built/admin/assets/toggle-group-uJnl42w3.js +0 -1
- package/core/built/admin/assets/topic-filter-BM7hz0kW.js +0 -1
- package/core/built/admin/assets/transistor-modal-VZOGN3od.js +0 -1
- package/core/built/admin/assets/unsplash-modal-CKGfACxF.js +0 -1
- package/core/built/admin/assets/use-check-theme-limit-error-CGp3CGT5.js +0 -1
- package/core/built/admin/assets/use-feature-flag-CSq2Lwzt.js +0 -1
- package/core/built/admin/assets/use-filter-params-0hcJJuEJ.js +0 -1
- package/core/built/admin/assets/use-limiter-ffwpsZPp.js +0 -2
- package/core/built/admin/assets/use-pintura-editor-Cb41oJyL.js +0 -1
- package/core/built/admin/assets/use-query-params-DHhhu8wi.js +0 -1
- package/core/built/admin/assets/use-reply-chain-data-C0ZUTkfk.js +0 -1
- package/core/built/admin/assets/use-setting-group-Bx8M6FL2.js +0 -1
- package/core/built/admin/assets/use-settings-navigation-BOZcat_V.js +0 -1
- package/core/built/admin/assets/use-upgrade-route-B3_DUiuT.js +0 -1
- package/core/built/admin/assets/user-detail-modal-595z1N5r.js +0 -1
- package/core/built/admin/assets/web-CAta3lRE.js +0 -1
- package/core/built/admin/assets/web-Ds9_wWJK.js +0 -2
- package/core/built/admin/assets/zapier-modal-CcfDZY53.js +0 -1
- package/core/server/data/seeders/utils/database-date.js +0 -28
- package/core/server/services/automations/database-date.js +0 -59
- /package/core/built/admin/assets/{dist-CqO2lWS02.js → dist-CqO2lWS0.js} +0 -0
- /package/core/server/services/{automations → lib}/mailgun-message-id.js +0 -0
|
@@ -1421,8 +1421,11 @@ module.exports = {
|
|
|
1421
1421
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
1422
1422
|
token: {type: 'string', maxlength: 48, nullable: false, unique: true},
|
|
1423
1423
|
|
|
1424
|
-
buyer_email: {type: 'string', maxlength: 191, nullable:
|
|
1424
|
+
buyer_email: {type: 'string', maxlength: 191, nullable: true, validations: {isEmail: true}},
|
|
1425
1425
|
buyer_member_id: {type: 'string', maxlength: 24, nullable: true, unique: false, references: 'members.id', setNullDelete: true},
|
|
1426
|
+
buyer_name: {type: 'string', maxlength: 191, nullable: true},
|
|
1427
|
+
recipient_name: {type: 'string', maxlength: 191, nullable: true},
|
|
1428
|
+
personal_message: {type: 'text', maxlength: 500, nullable: true},
|
|
1426
1429
|
|
|
1427
1430
|
redeemer_member_id: {type: 'string', maxlength: 24, nullable: true, unique: false, references: 'members.id', setNullDelete: true},
|
|
1428
1431
|
|
|
@@ -1437,18 +1440,19 @@ module.exports = {
|
|
|
1437
1440
|
currency: {type: 'string', maxlength: 50, nullable: false},
|
|
1438
1441
|
amount: {type: 'integer', nullable: false, unsigned: true},
|
|
1439
1442
|
|
|
1440
|
-
stripe_checkout_session_id: {type: 'string', maxlength: 255, nullable:
|
|
1441
|
-
stripe_payment_intent_id: {type: 'string', maxlength: 255, nullable:
|
|
1443
|
+
stripe_checkout_session_id: {type: 'string', maxlength: 255, nullable: true, unique: true},
|
|
1444
|
+
stripe_payment_intent_id: {type: 'string', maxlength: 255, nullable: true, unique: true},
|
|
1442
1445
|
|
|
1446
|
+
checkout_started_at: {type: 'dateTime', nullable: true},
|
|
1443
1447
|
consumes_at: {type: 'dateTime', nullable: true},
|
|
1444
|
-
expires_at: {type: 'dateTime', nullable:
|
|
1448
|
+
expires_at: {type: 'dateTime', nullable: true},
|
|
1445
1449
|
|
|
1446
1450
|
status: {
|
|
1447
1451
|
type: 'string', maxlength: 50, nullable: false, validations: {
|
|
1448
|
-
isIn: [['purchased', 'redeemed', 'consumed', 'expired', 'refunded']]
|
|
1452
|
+
isIn: [['payment_pending', 'purchased', 'redeemed', 'consumed', 'expired', 'refunded']]
|
|
1449
1453
|
}
|
|
1450
1454
|
},
|
|
1451
|
-
purchased_at: {type: 'dateTime', nullable:
|
|
1455
|
+
purchased_at: {type: 'dateTime', nullable: true},
|
|
1452
1456
|
redeemed_at: {type: 'dateTime', nullable: true},
|
|
1453
1457
|
consumed_at: {type: 'dateTime', nullable: true},
|
|
1454
1458
|
expired_at: {type: 'dateTime', nullable: true},
|
|
@@ -1456,7 +1460,24 @@ module.exports = {
|
|
|
1456
1460
|
consumes_soon_reminder_sent_at: {type: 'dateTime', nullable: true},
|
|
1457
1461
|
'@@INDEXES@@': [
|
|
1458
1462
|
['status', 'consumes_at'],
|
|
1459
|
-
['status', 'expires_at']
|
|
1463
|
+
['status', 'expires_at'],
|
|
1464
|
+
['status', 'checkout_started_at']
|
|
1465
|
+
]
|
|
1466
|
+
},
|
|
1467
|
+
gift_deliveries: {
|
|
1468
|
+
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
1469
|
+
gift_id: {type: 'string', maxlength: 24, nullable: false, unique: true, references: 'gifts.id', cascadeDelete: true},
|
|
1470
|
+
recipient_email: {type: 'string', maxlength: 191, nullable: false, validations: {isEmail: true}},
|
|
1471
|
+
status: {
|
|
1472
|
+
type: 'string', maxlength: 50, nullable: false, defaultTo: 'pending', validations: {
|
|
1473
|
+
isIn: [['pending', 'sending', 'sent', 'failed', 'cancelled']]
|
|
1474
|
+
}
|
|
1475
|
+
},
|
|
1476
|
+
started_at: {type: 'dateTime', nullable: true},
|
|
1477
|
+
email_sent_at: {type: 'dateTime', nullable: true},
|
|
1478
|
+
email_provider_message_id: {type: 'string', maxlength: 1000, nullable: true},
|
|
1479
|
+
'@@INDEXES@@': [
|
|
1480
|
+
['status', 'started_at']
|
|
1460
1481
|
]
|
|
1461
1482
|
}
|
|
1462
1483
|
};
|
|
@@ -1,37 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
4
|
};
|
|
@@ -40,7 +7,7 @@ exports.AutomationActionRevisionsImporter = void 0;
|
|
|
40
7
|
const faker_1 = require("@faker-js/faker");
|
|
41
8
|
const errors_1 = __importDefault(require("@tryghost/errors"));
|
|
42
9
|
const table_importer_1 = require("./table-importer");
|
|
43
|
-
const
|
|
10
|
+
const db_date_1 = require("../../../lib/db-date");
|
|
44
11
|
const constants_1 = require("../../../services/member-welcome-emails/constants");
|
|
45
12
|
class AutomationActionRevisionsImporter extends table_importer_1.TableImporter {
|
|
46
13
|
static table = 'automation_action_revisions';
|
|
@@ -75,12 +42,12 @@ class AutomationActionRevisionsImporter extends table_importer_1.TableImporter {
|
|
|
75
42
|
if (!this.#action) {
|
|
76
43
|
throw new errors_1.default.IncorrectUsageError({ message: 'Cannot generate automation action revision without an action' });
|
|
77
44
|
}
|
|
78
|
-
const createdAt =
|
|
45
|
+
const createdAt = (0, db_date_1.fromDatabaseDate)(this.#action.created_at);
|
|
79
46
|
createdAt.setSeconds(createdAt.getSeconds() + this.#revisionIndex);
|
|
80
47
|
this.#revisionIndex += 1;
|
|
81
48
|
const common = {
|
|
82
49
|
id: this.fastFakeObjectId(),
|
|
83
|
-
created_at:
|
|
50
|
+
created_at: (0, db_date_1.toDatabaseDate)(createdAt),
|
|
84
51
|
action_id: this.#action.id,
|
|
85
52
|
email_sent_count: null,
|
|
86
53
|
email_opened_count: null,
|
|
@@ -1,46 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
4
|
};
|
|
38
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
6
|
exports.AutomationActionsImporter = void 0;
|
|
40
|
-
const faker_1 = require("@faker-js/faker");
|
|
41
7
|
const errors_1 = __importDefault(require("@tryghost/errors"));
|
|
42
8
|
const table_importer_1 = require("./table-importer");
|
|
43
|
-
const
|
|
9
|
+
const db_date_1 = require("../../../lib/db-date");
|
|
10
|
+
const random_1 = require("../utils/random");
|
|
44
11
|
class AutomationActionsImporter extends table_importer_1.TableImporter {
|
|
45
12
|
static table = 'automation_actions';
|
|
46
13
|
static dependencies = ['automations'];
|
|
@@ -65,16 +32,13 @@ class AutomationActionsImporter extends table_importer_1.TableImporter {
|
|
|
65
32
|
if (!this.#automation) {
|
|
66
33
|
throw new errors_1.default.IncorrectUsageError({ message: 'Cannot generate automation action without an automation' });
|
|
67
34
|
}
|
|
68
|
-
const createdAt =
|
|
69
|
-
from: databaseDate.parse(this.#automation.created_at),
|
|
70
|
-
to: new Date()
|
|
71
|
-
});
|
|
35
|
+
const createdAt = (0, random_1.randomDateBetween)(this.#automation.created_at, new Date());
|
|
72
36
|
const type = this.#actionIndex % 2 === 0 ? 'wait' : 'send_email';
|
|
73
37
|
this.#actionIndex += 1;
|
|
74
38
|
return {
|
|
75
39
|
id: this.fastFakeObjectId(),
|
|
76
|
-
created_at:
|
|
77
|
-
updated_at:
|
|
40
|
+
created_at: (0, db_date_1.toDatabaseDate)(createdAt),
|
|
41
|
+
updated_at: (0, db_date_1.toDatabaseDate)(createdAt),
|
|
78
42
|
deleted_at: null,
|
|
79
43
|
automation_id: this.#automation.id,
|
|
80
44
|
type
|
|
@@ -1,37 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
4
|
};
|
|
@@ -41,7 +8,7 @@ const faker_1 = require("@faker-js/faker");
|
|
|
41
8
|
const errors_1 = __importDefault(require("@tryghost/errors"));
|
|
42
9
|
const lodash_1 = require("lodash");
|
|
43
10
|
const table_importer_1 = require("./table-importer");
|
|
44
|
-
const
|
|
11
|
+
const db_date_1 = require("../../../lib/db-date");
|
|
45
12
|
class AutomationRunStepsImporter extends table_importer_1.TableImporter {
|
|
46
13
|
static table = 'automation_run_steps';
|
|
47
14
|
static dependencies = ['automation_runs', 'automation_action_revisions', 'automation_action_edges'];
|
|
@@ -102,12 +69,12 @@ class AutomationRunStepsImporter extends table_importer_1.TableImporter {
|
|
|
102
69
|
const requestedStepCount = (0, lodash_1.clamp)(Math.floor(stepsPerRun) + extraStep, 1, actionCount);
|
|
103
70
|
const runStepCount = fullPathGeneratedForAutomation.has(run.automation_id) ? requestedStepCount : actionCount;
|
|
104
71
|
fullPathGeneratedForAutomation.add(run.automation_id);
|
|
105
|
-
const runCreatedAt =
|
|
72
|
+
const runCreatedAt = (0, db_date_1.fromDatabaseDate)(run.created_at);
|
|
106
73
|
const lastStepStatus = faker_1.faker.helpers.arrayElement(['pending', 'finished', 'failed']);
|
|
107
74
|
for (let index = 0; index < runStepCount; index += 1) {
|
|
108
75
|
const createdAt = new Date(runCreatedAt);
|
|
109
76
|
createdAt.setHours(createdAt.getHours() + index);
|
|
110
|
-
const createdAtString =
|
|
77
|
+
const createdAtString = (0, db_date_1.toDatabaseDate)(createdAt);
|
|
111
78
|
const status = index === runStepCount - 1 ? lastStepStatus : 'finished';
|
|
112
79
|
const isTerminal = status !== 'pending';
|
|
113
80
|
steps.push({
|
|
@@ -1,37 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
4
|
};
|
|
@@ -42,7 +9,8 @@ const errors_1 = __importDefault(require("@tryghost/errors"));
|
|
|
42
9
|
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
43
10
|
const table_importer_1 = require("./table-importer");
|
|
44
11
|
const parse_email_address_1 = require("@tryghost/parse-email-address");
|
|
45
|
-
const
|
|
12
|
+
const db_date_1 = require("../../../lib/db-date");
|
|
13
|
+
const random_1 = require("../utils/random");
|
|
46
14
|
const assertExampleEmailDomain = (email) => {
|
|
47
15
|
const { domain } = (0, parse_email_address_1.parseEmailAddress)(email) ?? {};
|
|
48
16
|
(0, strict_1.default)(domain, 'Refusing to seed an automation run for a member with no email');
|
|
@@ -77,17 +45,14 @@ class AutomationRunsImporter extends table_importer_1.TableImporter {
|
|
|
77
45
|
throw new errors_1.default.IncorrectUsageError({ message: 'Cannot generate automation run without an automation' });
|
|
78
46
|
}
|
|
79
47
|
const member = faker_1.faker.helpers.arrayElement(this.#members);
|
|
80
|
-
const automationCreatedAt =
|
|
81
|
-
const memberCreatedAt =
|
|
82
|
-
const createdAt =
|
|
83
|
-
from: new Date(Math.max(automationCreatedAt.valueOf(), memberCreatedAt.valueOf())),
|
|
84
|
-
to: new Date()
|
|
85
|
-
});
|
|
48
|
+
const automationCreatedAt = (0, db_date_1.fromDatabaseDate)(this.#automation.created_at);
|
|
49
|
+
const memberCreatedAt = (0, db_date_1.fromDatabaseDate)(member.created_at);
|
|
50
|
+
const createdAt = (0, random_1.randomDateBetween)(new Date(Math.max(automationCreatedAt.valueOf(), memberCreatedAt.valueOf())), new Date());
|
|
86
51
|
assertExampleEmailDomain(member.email);
|
|
87
52
|
return {
|
|
88
53
|
id: this.fastFakeObjectId(),
|
|
89
|
-
created_at:
|
|
90
|
-
updated_at:
|
|
54
|
+
created_at: (0, db_date_1.toDatabaseDate)(createdAt),
|
|
55
|
+
updated_at: (0, db_date_1.toDatabaseDate)(createdAt),
|
|
91
56
|
automation_id: this.#automation.id,
|
|
92
57
|
member_id: member.id,
|
|
93
58
|
member_email: member.email
|
|
@@ -1,37 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
3
|
exports.AutomationsImporter = void 0;
|
|
37
4
|
const faker_1 = require("@faker-js/faker");
|
|
@@ -40,7 +7,7 @@ const string_1 = require("@tryghost/string");
|
|
|
40
7
|
const table_importer_1 = require("./table-importer");
|
|
41
8
|
// @ts-expect-error This module currently lacks type definitions.
|
|
42
9
|
const blog_info_1 = require("../utils/blog-info");
|
|
43
|
-
const
|
|
10
|
+
const db_date_1 = require("../../../lib/db-date");
|
|
44
11
|
const constants_1 = require("../../../services/member-welcome-emails/constants");
|
|
45
12
|
const defaultAutomations = [{
|
|
46
13
|
name: 'Free member welcome flow',
|
|
@@ -70,8 +37,8 @@ class AutomationsImporter extends table_importer_1.TableImporter {
|
|
|
70
37
|
status: faker_1.faker.helpers.arrayElement(['active', 'inactive']),
|
|
71
38
|
name,
|
|
72
39
|
slug,
|
|
73
|
-
created_at:
|
|
74
|
-
updated_at:
|
|
40
|
+
created_at: (0, db_date_1.toDatabaseDate)(createdAt),
|
|
41
|
+
updated_at: (0, db_date_1.toDatabaseDate)(createdAt)
|
|
75
42
|
};
|
|
76
43
|
}
|
|
77
44
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const {TableImporter} = require('./table-importer');
|
|
2
2
|
const {faker} = require('@faker-js/faker');
|
|
3
|
-
const {luck} = require('../utils/random');
|
|
4
|
-
const
|
|
3
|
+
const {luck, randomDateBetween} = require('../utils/random');
|
|
4
|
+
const {toDatabaseDate} = require('../../../lib/db-date');
|
|
5
5
|
|
|
6
6
|
class CommentReportsImporter extends TableImporter {
|
|
7
7
|
static table = 'comment_reports';
|
|
@@ -49,7 +49,7 @@ class CommentReportsImporter extends TableImporter {
|
|
|
49
49
|
return null;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
const reportTime =
|
|
52
|
+
const reportTime = randomDateBetween(this.model.created_at, new Date());
|
|
53
53
|
|
|
54
54
|
const reporter = this.possibleReporters[faker.number.int(this.possibleReporters.length - 1)];
|
|
55
55
|
|
|
@@ -57,8 +57,8 @@ class CommentReportsImporter extends TableImporter {
|
|
|
57
57
|
id: this.fastFakeObjectId(),
|
|
58
58
|
comment_id: this.model.id,
|
|
59
59
|
member_id: reporter.id,
|
|
60
|
-
created_at:
|
|
61
|
-
updated_at:
|
|
60
|
+
created_at: toDatabaseDate(reportTime),
|
|
61
|
+
updated_at: toDatabaseDate(reportTime)
|
|
62
62
|
};
|
|
63
63
|
}
|
|
64
64
|
}
|
|
@@ -2,7 +2,7 @@ const {faker} = require('@faker-js/faker');
|
|
|
2
2
|
const {TableImporter} = require('./table-importer');
|
|
3
3
|
const {luck} = require('../utils/random');
|
|
4
4
|
const generateEvents = require('../utils/event-generator');
|
|
5
|
-
const
|
|
5
|
+
const {fromDatabaseDate, toDatabaseDate} = require('../../../lib/db-date');
|
|
6
6
|
|
|
7
7
|
class CommentsImporter extends TableImporter {
|
|
8
8
|
static table = 'comments';
|
|
@@ -24,7 +24,7 @@ class CommentsImporter extends TableImporter {
|
|
|
24
24
|
|
|
25
25
|
setReferencedModel(model) {
|
|
26
26
|
this.model = model;
|
|
27
|
-
const publishedAt =
|
|
27
|
+
const publishedAt = fromDatabaseDate(model.published_at);
|
|
28
28
|
|
|
29
29
|
this.commentIds = []; // Store [id, parent_id, timestamp] tuples for reply-to-reply
|
|
30
30
|
|
|
@@ -37,7 +37,7 @@ class CommentsImporter extends TableImporter {
|
|
|
37
37
|
endTime: new Date()
|
|
38
38
|
}).sort((a, b) => a.getTime() - b.getTime()); // Sort chronologically so replies always come after their targets
|
|
39
39
|
|
|
40
|
-
this.possibleMembers = this.members.filter(member =>
|
|
40
|
+
this.possibleMembers = this.members.filter(member => fromDatabaseDate(member.created_at) < publishedAt);
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
generate() {
|
|
@@ -97,8 +97,8 @@ class CommentsImporter extends TableImporter {
|
|
|
97
97
|
parent_id: parentId,
|
|
98
98
|
in_reply_to_id: inReplyToId,
|
|
99
99
|
status: 'published',
|
|
100
|
-
created_at:
|
|
101
|
-
updated_at:
|
|
100
|
+
created_at: toDatabaseDate(timestamp),
|
|
101
|
+
updated_at: toDatabaseDate(timestamp),
|
|
102
102
|
html: `<p>${faker.lorem.sentence().replace(/[&<>"']/g, c => `&#${c.charCodeAt(0)};`)}</p>`
|
|
103
103
|
};
|
|
104
104
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const {TableImporter} = require('./table-importer');
|
|
2
2
|
const {faker} = require('@faker-js/faker');
|
|
3
|
-
const
|
|
3
|
+
const {randomDateBetween} = require('../utils/random');
|
|
4
|
+
const {fromDatabaseDate, toDatabaseDate} = require('../../../lib/db-date');
|
|
4
5
|
|
|
5
6
|
class EmailBatchesImporter extends TableImporter {
|
|
6
7
|
static table = 'email_batches';
|
|
@@ -21,8 +22,8 @@ class EmailBatchesImporter extends TableImporter {
|
|
|
21
22
|
}
|
|
22
23
|
|
|
23
24
|
generate() {
|
|
24
|
-
const emailSentDate =
|
|
25
|
-
const latestUpdatedDate =
|
|
25
|
+
const emailSentDate = fromDatabaseDate(this.model.created_at);
|
|
26
|
+
const latestUpdatedDate = new Date(emailSentDate);
|
|
26
27
|
latestUpdatedDate.setHours(latestUpdatedDate.getHours() + 1);
|
|
27
28
|
|
|
28
29
|
return {
|
|
@@ -31,7 +32,7 @@ class EmailBatchesImporter extends TableImporter {
|
|
|
31
32
|
mailgun_message_id: `${new Date().toISOString().split('.')[0].replace(/[^0-9]/g, '')}.${faker.string.hexadecimal({length: 16, prefix: '', casing: 'lower'})}@m.example.com`,
|
|
32
33
|
status: 'submitted', // TODO: introduce failures
|
|
33
34
|
created_at: this.model.created_at,
|
|
34
|
-
updated_at:
|
|
35
|
+
updated_at: toDatabaseDate(randomDateBetween(emailSentDate, latestUpdatedDate))
|
|
35
36
|
};
|
|
36
37
|
}
|
|
37
38
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
const {TableImporter} = require('./table-importer');
|
|
2
2
|
const {faker} = require('@faker-js/faker');
|
|
3
3
|
const generateEvents = require('../utils/event-generator');
|
|
4
|
-
const
|
|
4
|
+
const {randomDateBetween} = require('../utils/random');
|
|
5
|
+
const {fromDatabaseDate, toDatabaseDate} = require('../../../lib/db-date');
|
|
5
6
|
const debug = require('@tryghost/debug')('EmailRecipientsImporter');
|
|
6
7
|
|
|
7
8
|
const emailStatus = {
|
|
@@ -109,11 +110,7 @@ class EmailRecipientsImporter extends TableImporter {
|
|
|
109
110
|
this.membersSubscribeEventsCreatedAtsByNewsletterId.set(memberSubscribeEvent.newsletter_id, []);
|
|
110
111
|
}
|
|
111
112
|
|
|
112
|
-
|
|
113
|
-
// SQLite fix
|
|
114
|
-
memberSubscribeEvent.created_at = databaseDate.parse(memberSubscribeEvent.created_at);
|
|
115
|
-
}
|
|
116
|
-
this.membersSubscribeEventsCreatedAtsByNewsletterId.get(memberSubscribeEvent.newsletter_id).push(memberSubscribeEvent.created_at.getTime());
|
|
113
|
+
this.membersSubscribeEventsCreatedAtsByNewsletterId.get(memberSubscribeEvent.newsletter_id).push(fromDatabaseDate(memberSubscribeEvent.created_at).getTime());
|
|
117
114
|
}
|
|
118
115
|
|
|
119
116
|
await this.importForEach(this.emailBatches, quantity ? quantity / emails.length : 1000);
|
|
@@ -123,15 +120,12 @@ class EmailRecipientsImporter extends TableImporter {
|
|
|
123
120
|
this.batch = model;
|
|
124
121
|
this.model = this.emails.get(this.batch.email_id);
|
|
125
122
|
this.batchIndex = this.batch.index;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
const earliestOpenTime = databaseDate.parse(this.batch.updated_at);
|
|
129
|
-
const latestOpenTime = databaseDate.parse(this.batch.updated_at);
|
|
130
|
-
latestOpenTime.setDate(latestOpenTime.getDate() + 14);
|
|
123
|
+
this.batchUpdatedAt = fromDatabaseDate(this.batch.updated_at);
|
|
124
|
+
this.batchProcessedAt = toDatabaseDate(this.batchUpdatedAt);
|
|
131
125
|
|
|
132
126
|
// Get all members that were subscribed to this newsletter BEFORE the batch was sent
|
|
133
127
|
// We use binary search to speed up it up
|
|
134
|
-
const lastIndex = findFirstHigherIndex(this.membersSubscribeEventsCreatedAtsByNewsletterId.get(this.model.newsletter_id),
|
|
128
|
+
const lastIndex = findFirstHigherIndex(this.membersSubscribeEventsCreatedAtsByNewsletterId.get(this.model.newsletter_id), this.batchUpdatedAt);
|
|
135
129
|
|
|
136
130
|
this.membersList = this.membersSubscribeEventsByNewsletterId.get(this.model.newsletter_id).slice(0, Math.max(0, lastIndex - 1))
|
|
137
131
|
.slice(this.batchIndex * 1000, (this.batchIndex + 1) * 1000)
|
|
@@ -164,7 +158,7 @@ class EmailRecipientsImporter extends TableImporter {
|
|
|
164
158
|
}
|
|
165
159
|
|
|
166
160
|
// The events are generated for a different time, so we need to move them to the batch time
|
|
167
|
-
timestamp = new Date(timestamp.getTime() - this.eventStartTimeUsed.getTime() +
|
|
161
|
+
timestamp = new Date(timestamp.getTime() - this.eventStartTimeUsed.getTime() + this.batchUpdatedAt.getTime());
|
|
168
162
|
|
|
169
163
|
if (timestamp > new Date()) {
|
|
170
164
|
timestamp = new Date();
|
|
@@ -187,9 +181,7 @@ class EmailRecipientsImporter extends TableImporter {
|
|
|
187
181
|
|
|
188
182
|
let deliveredTime;
|
|
189
183
|
if (status === emailStatus.opened) {
|
|
190
|
-
|
|
191
|
-
const endDate = timestamp;
|
|
192
|
-
deliveredTime = databaseDate.randomBetween(startDate, endDate);
|
|
184
|
+
deliveredTime = randomDateBetween(this.batchUpdatedAt, timestamp);
|
|
193
185
|
}
|
|
194
186
|
|
|
195
187
|
return {
|
|
@@ -198,10 +190,10 @@ class EmailRecipientsImporter extends TableImporter {
|
|
|
198
190
|
email_id: this.model.id,
|
|
199
191
|
batch_id: this.batch.id,
|
|
200
192
|
member_id: member.id,
|
|
201
|
-
processed_at:
|
|
202
|
-
delivered_at: status === emailStatus.opened ?
|
|
203
|
-
opened_at: status === emailStatus.opened ?
|
|
204
|
-
failed_at: status === emailStatus.failed ?
|
|
193
|
+
processed_at: this.batchProcessedAt,
|
|
194
|
+
delivered_at: status === emailStatus.opened ? toDatabaseDate(deliveredTime) : status === emailStatus.delivered ? toDatabaseDate(timestamp) : null,
|
|
195
|
+
opened_at: status === emailStatus.opened ? toDatabaseDate(timestamp) : null,
|
|
196
|
+
failed_at: status === emailStatus.failed ? toDatabaseDate(timestamp) : null,
|
|
205
197
|
member_uuid: member.uuid,
|
|
206
198
|
member_email: member.email,
|
|
207
199
|
member_name: member.name
|
|
@@ -2,7 +2,7 @@ const {TableImporter} = require('./table-importer');
|
|
|
2
2
|
const {faker} = require('@faker-js/faker');
|
|
3
3
|
const generateEvents = require('../utils/event-generator');
|
|
4
4
|
const {luck} = require('../utils/random');
|
|
5
|
-
const
|
|
5
|
+
const {fromDatabaseDate, toDatabaseDate} = require('../../../lib/db-date');
|
|
6
6
|
|
|
7
7
|
class EmailsImporter extends TableImporter {
|
|
8
8
|
static table = 'emails';
|
|
@@ -42,7 +42,7 @@ class EmailsImporter extends TableImporter {
|
|
|
42
42
|
: this.newsletters[1];
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
const publishedAt =
|
|
45
|
+
const publishedAt = fromDatabaseDate(this.model.published_at);
|
|
46
46
|
const timestamp = luck(60)
|
|
47
47
|
? publishedAt
|
|
48
48
|
: generateEvents({
|
|
@@ -55,7 +55,7 @@ class EmailsImporter extends TableImporter {
|
|
|
55
55
|
|
|
56
56
|
const recipientCount = this.membersSubscribeEvents
|
|
57
57
|
.filter(entry => entry.newsletter_id === newsletter.id)
|
|
58
|
-
.filter(entry =>
|
|
58
|
+
.filter(entry => fromDatabaseDate(entry.created_at) < timestamp).length;
|
|
59
59
|
const deliveredCount = Math.ceil(recipientCount * faker.number.float({
|
|
60
60
|
max: 1,
|
|
61
61
|
min: 0.9,
|
|
@@ -87,10 +87,10 @@ class EmailsImporter extends TableImporter {
|
|
|
87
87
|
track_opens: true,
|
|
88
88
|
track_clicks: true,
|
|
89
89
|
feedback_enabled: true,
|
|
90
|
-
submitted_at:
|
|
90
|
+
submitted_at: toDatabaseDate(timestamp),
|
|
91
91
|
newsletter_id: newsletter.id,
|
|
92
|
-
created_at:
|
|
93
|
-
updated_at:
|
|
92
|
+
created_at: toDatabaseDate(timestamp),
|
|
93
|
+
updated_at: toDatabaseDate(timestamp)
|
|
94
94
|
};
|
|
95
95
|
}
|
|
96
96
|
}
|
|
@@ -2,7 +2,7 @@ const {TableImporter} = require('./table-importer');
|
|
|
2
2
|
const {faker} = require('@faker-js/faker');
|
|
3
3
|
const {slugify} = require('@tryghost/string');
|
|
4
4
|
const {blogStartDate} = require('../utils/blog-info');
|
|
5
|
-
const
|
|
5
|
+
const {toDatabaseDate} = require('../../../lib/db-date');
|
|
6
6
|
|
|
7
7
|
class LabelsImporter extends TableImporter {
|
|
8
8
|
static table = 'labels';
|
|
@@ -30,8 +30,8 @@ class LabelsImporter extends TableImporter {
|
|
|
30
30
|
id: this.fastFakeObjectId(),
|
|
31
31
|
name: name,
|
|
32
32
|
slug: `${slugify(name)}`,
|
|
33
|
-
created_at:
|
|
34
|
-
updated_at:
|
|
33
|
+
created_at: toDatabaseDate(blogStartDate),
|
|
34
|
+
updated_at: toDatabaseDate(blogStartDate)
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
37
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const {TableImporter} = require('./table-importer');
|
|
2
2
|
const {faker} = require('@faker-js/faker');
|
|
3
|
-
const {luck} = require('../utils/random');
|
|
4
|
-
const
|
|
3
|
+
const {luck, randomDateBetween} = require('../utils/random');
|
|
4
|
+
const {fromDatabaseDate, toDatabaseDate} = require('../../../lib/db-date');
|
|
5
5
|
|
|
6
6
|
class MembersClickEventsImporter extends TableImporter {
|
|
7
7
|
static table = 'members_click_events';
|
|
@@ -50,9 +50,9 @@ class MembersClickEventsImporter extends TableImporter {
|
|
|
50
50
|
}
|
|
51
51
|
this.amount -= 1;
|
|
52
52
|
|
|
53
|
-
const openedAt =
|
|
53
|
+
const openedAt = fromDatabaseDate(this.model.opened_at);
|
|
54
54
|
const laterOn = new Date(openedAt.getTime() + 1000 * 60 * 15);
|
|
55
|
-
const clickTime =
|
|
55
|
+
const clickTime = randomDateBetween(openedAt, laterOn);
|
|
56
56
|
|
|
57
57
|
return {
|
|
58
58
|
id: this.fastFakeObjectId(),
|
|
@@ -61,7 +61,7 @@ class MembersClickEventsImporter extends TableImporter {
|
|
|
61
61
|
min: 0,
|
|
62
62
|
max: this.redirectList.length - 1
|
|
63
63
|
}))].id,
|
|
64
|
-
created_at:
|
|
64
|
+
created_at: toDatabaseDate(clickTime)
|
|
65
65
|
};
|
|
66
66
|
}
|
|
67
67
|
}
|