ghost 6.57.1 → 6.58.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/LICENSE +22 -0
- package/bin/validate-adapters.js +1 -5
- package/components/ghost-storage-base-3.0.0.tgz +0 -0
- package/components/tryghost-adapter-base-cache-0.2.0.tgz +0 -0
- package/components/tryghost-adapter-base-jobs-0.0.0.tgz +0 -0
- package/components/tryghost-adapter-base-redirects-0.0.0.tgz +0 -0
- package/components/tryghost-adapter-base-route-settings-0.0.0.tgz +0 -0
- 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-admin-api-schema-0.0.0.tgz +0 -0
- package/components/tryghost-custom-field-types-0.0.0.tgz +0 -0
- package/components/tryghost-i18n-0.0.0.tgz +0 -0
- package/components/tryghost-kg-card-factory-5.2.4.tgz +0 -0
- package/components/tryghost-kg-clean-basic-html-4.3.4.tgz +0 -0
- package/components/tryghost-kg-converters-1.2.5.tgz +0 -0
- package/components/tryghost-kg-default-cards-10.3.5.tgz +0 -0
- package/components/tryghost-kg-default-nodes-2.2.0.tgz +0 -0
- package/components/tryghost-kg-default-transforms-1.3.4.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/components/tryghost-kg-markdown-html-renderer-7.2.4.tgz +0 -0
- package/components/tryghost-kg-utils-1.1.4.tgz +0 -0
- package/components/tryghost-nql-string-0.0.0.tgz +0 -0
- package/components/tryghost-parse-email-address-0.0.0.tgz +0 -0
- package/core/boot.js +35 -3
- package/core/built/admin/assets/{about-BNojRaxf.js → about-B_BvSyLF.js} +1 -1
- package/core/built/admin/assets/{account-migration-DMS8JsM-.js → account-migration-oJUGxnzT.js} +1 -1
- package/core/built/admin/assets/activitypub/{account-migration-DHFbePl6.js → account-migration-BpDeIF3G.js} +8 -8
- package/core/built/admin/assets/activitypub/activitypub.js +4 -4
- package/core/built/admin/assets/activitypub/{avatar-CT4tS2_S.js → avatar-B0SpBPVL.js} +3 -3
- package/core/built/admin/assets/activitypub/{avatar-flipboard-ByYWKipo.js → avatar-flipboard-DKt1LGcE.js} +3 -3
- package/core/built/admin/assets/activitypub/{bluesky-sharing-srVnSHDz.js → bluesky-sharing-aPMtrS3L.js} +10 -10
- package/core/built/admin/assets/activitypub/{chunk-KS7C4IRE-D4HEcEwi.js → chunk-KS7C4IRE-CnTrsgmM.js} +26 -15
- package/core/built/admin/assets/activitypub/{content-formatters-C2sos5Ht.js → content-formatters-BORfuA9G.js} +318 -284
- package/core/built/admin/assets/activitypub/{copy-B1UBTOoZ.js → copy-D-YvNi2E.js} +2 -2
- package/core/built/admin/assets/activitypub/{dist-MPsb2WZ1.js → dist-Dqggkccr.js} +5 -5
- package/core/built/admin/assets/activitypub/{domain-DzcM9Dzo.js → domain-CPdiB27_.js} +10 -10
- package/core/built/admin/assets/activitypub/{edit-profile-CsQ_4xAk.js → edit-profile-BY2PawIe.js} +7 -7
- package/core/built/admin/assets/activitypub/{explore-CJe0DZBK.js → explore-Sp9bgAwq.js} +11 -11
- package/core/built/admin/assets/activitypub/{feed-CKV3qWON.js → feed-BjtF4ohL.js} +10 -10
- package/core/built/admin/assets/activitypub/{field-DckHfDJf.js → field-BDOYVTg6.js} +4 -4
- package/core/built/admin/assets/activitypub/{hash-Dlp8RM55.js → hash-DqXYHgzG.js} +2 -2
- package/core/built/admin/assets/activitypub/{inbox-CsPy4R0M.js → inbox-CZ7IOAMn.js} +2 -2
- package/core/built/admin/assets/activitypub/{inbox-DAsjzUUe.js → inbox-z1o2j1Tb.js} +11 -11
- package/core/built/admin/assets/activitypub/{label-DWyo9E5T.js → label-1jhN-qhD.js} +4 -4
- package/core/built/admin/assets/activitypub/layout-BRMezuty.js +1 -0
- package/core/built/admin/assets/activitypub/{moderation-B0Inc03M.js → moderation-CZudJi8N.js} +9 -9
- package/core/built/admin/assets/activitypub/{note-CSE54lER.js → note-nr_m_5yb.js} +8 -8
- package/core/built/admin/assets/activitypub/{notifications-RSwbKqdh.js → notifications-BdcyivbT.js} +10 -10
- package/core/built/admin/assets/activitypub/{onboarding-BFDkzeR2.js → onboarding-B4kwav9u.js} +2 -2
- package/core/built/admin/assets/activitypub/{onboarding-D6rcBdPe.js → onboarding-DZNElJYP.js} +3 -3
- package/core/built/admin/assets/activitypub/{preferences-CE231n2_.js → preferences-CNqy1x9C.js} +13 -13
- package/core/built/admin/assets/activitypub/{profile-aaQ1j1Eo.js → profile-DlY4rhbO.js} +15 -15
- package/core/built/admin/assets/activitypub/{reply-Cjb0Vs3m.js → reply-DASIN0Ec.js} +2 -2
- package/core/built/admin/assets/activitypub/{routes-Djb0mc9k.js → routes-CEHdEZzS.js} +31 -31
- package/core/built/admin/assets/activitypub/{separator-D8pROI5n.js → separator-B3k35sUV.js} +4 -4
- package/core/built/admin/assets/activitypub/{settings-DMc32IQl.js → settings-CrSV1cux.js} +6 -6
- package/core/built/admin/assets/activitypub/{site-DVIcsohX.js → site-CtBUCPBz.js} +6 -6
- package/core/built/admin/assets/activitypub/{step-1-9Yey9usF.js → step-1-D9jGWyAy.js} +7 -7
- package/core/built/admin/assets/activitypub/{step-2-DdYmKRXV.js → step-2-Jz_enuo9.js} +7 -7
- package/core/built/admin/assets/activitypub/{step-3-hdSkcjZU.js → step-3-KpUqpGWi.js} +12 -12
- package/core/built/admin/assets/activitypub/{tabs-CUqseYzQ.js → tabs-DvlsxTCI.js} +7 -7
- package/core/built/admin/assets/activitypub/{topic-filter-Coni6OXM.js → topic-filter-CIN1E2jg.js} +4 -4
- package/core/built/admin/assets/activitypub/{use-activity-pub-queries-MeHTPMQv.js → use-activity-pub-queries-CATFd6YV.js} +4 -4
- package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-B046AM38.js → use-navigate-with-base-path-iCkcbMGk.js} +2 -2
- package/core/built/admin/assets/activitypub/{use-reply-chain-data-1AO-Xob6.js → use-reply-chain-data-DJ0vhA8V.js} +6 -6
- package/core/built/admin/assets/activitypub/{users-BLeiOTHc.js → users-sgJ6GNZX.js} +12 -11
- package/core/built/admin/assets/activitypub/{x-BRfRYd16.js → x-Cy2jUiYM.js} +2 -2
- package/core/built/admin/assets/add-integration-modal-BW23PDYs.js +1 -0
- package/core/built/admin/assets/add-newsletter-modal-M0ls8BKO.js +1 -0
- package/core/built/admin/assets/{add-recommendation-modal-D-3LOrdd.js → add-recommendation-modal-B0NeBMzl.js} +1 -1
- package/core/built/admin/assets/{analytics-DTIMRhWw.js → analytics-BC2oR8ay.js} +1 -1
- package/core/built/admin/assets/announcement-bar-modal-pXBqjQE_.js +1 -0
- package/core/built/admin/assets/{api-keys-_iCT4dxr.js → api-keys-BgKr003d.js} +1 -1
- package/core/built/admin/assets/{api-keys-Dx4NeNpK.js → api-keys-Df6uv1dT.js} +1 -1
- package/core/built/admin/assets/{audience-DkknNqhZ.js → audience-BY8od8If.js} +1 -1
- package/core/built/admin/assets/{automated-emails-PayPCT8L.js → automated-emails-28c2Lbb3.js} +1 -1
- package/core/built/admin/assets/{automations-DvSU7QhW.js → automations-DCs6Wady.js} +1 -1
- package/core/built/admin/assets/{automations-162q5HjL.js → automations-Dzp_QnON.js} +1 -1
- package/core/built/admin/assets/{bluesky-sharing-yZ9A_jL8.js → bluesky-sharing-D0P42Cws.js} +1 -1
- package/core/built/admin/assets/{breadcrumb-CjOH7LCU.js → breadcrumb-MTj_cKLb.js} +1 -1
- package/core/built/admin/assets/card-CiiE7QfM.js +1 -0
- package/core/built/admin/assets/{chart-helpers-DGxvWnBT.js → chart-helpers-DcO3k_vA.js} +1 -1
- package/core/built/admin/assets/{checkbox-BSUcnNq_.js → checkbox-LmClhqcS.js} +1 -1
- package/core/built/admin/assets/{chunk.424.4a27628efdade15c2dab.js → chunk.408.1a258af360eb8d905508.js} +40 -37
- package/core/built/admin/assets/{chunk.571.40f093ed6d883993714e.js → chunk.492.a9da46ca956b10116774.js} +1342 -1342
- package/core/built/admin/assets/{chunk.571.40f093ed6d883993714e.js.LICENSE.txt → chunk.492.a9da46ca956b10116774.js.LICENSE.txt} +1 -1
- package/core/built/admin/assets/chunk.524.4c693c3a00ac91df34fa.js +25 -0
- package/core/built/admin/assets/chunk.582.20b600e329e58d12d7c2.js +27 -0
- package/core/built/admin/assets/code-editor-view-DqTOUnbM.js +1 -0
- package/core/built/admin/assets/code-editor-view-bA0lfxUL.js +1 -0
- package/core/built/admin/assets/{debounce-Cx5B_9OI.js → color-picker-CBlJMv3y.js} +2 -2
- package/core/built/admin/assets/color-picker-field-Cv9GOJQZ.js +1 -0
- package/core/built/admin/assets/{combobox-5rdgDrDV.js → combobox-BbPJzjCp.js} +1 -1
- package/core/built/admin/assets/command-BrhXIlDr.js +1 -0
- package/core/built/admin/assets/comments-Cu4rD1aJ.js +1 -0
- package/core/built/admin/assets/confirmation-provider-BEdrnHns.js +1 -0
- package/core/built/admin/assets/{content-api-modal-BtW4Z1-1.js → content-api-modal-BOFWRUkC.js} +1 -1
- package/core/built/admin/assets/{copy-field-CEp_XieW.js → copy-field-8biQvNMD.js} +1 -1
- package/core/built/admin/assets/custom-field-type-option-CNhAgHbJ.js +1 -0
- package/core/built/admin/assets/custom-integration-modal-CrGOI8IB.js +1 -0
- package/core/built/admin/assets/{date-range-select-B3Ij1Rqg.js → date-range-select-Bsh4gIek.js} +1 -1
- package/core/built/admin/assets/debounce-pscB46sW.js +1 -0
- package/core/built/admin/assets/design-and-theme-modal-DWZguwWX.js +23 -0
- package/core/built/admin/assets/{dirty-confirm-dialog-YE9L21gY.js → dirty-confirm-dialog-DmdMpgyN.js} +1 -1
- package/core/built/admin/assets/{disabled-sources-indicator-uIzbWL7K.js → disabled-sources-indicator-BLnmyWgt.js} +1 -1
- package/core/built/admin/assets/dist-4m6pHdc0.js +23 -0
- package/core/built/admin/assets/{dist-DCk0UkGx.js → dist-B6bJuxL3.js} +1 -1
- package/core/built/admin/assets/{dist-CbHbGtQ-.js → dist-BtaTA7Ii.js} +1 -1
- package/core/built/admin/assets/{dist-Q1p9iXwH.js → dist-CZgIBXQN.js} +1 -1
- package/core/built/admin/assets/dist-CiHx7vA5.js +6 -0
- package/core/built/admin/assets/{dist-ARN6XTcR.js → dist-ECAUrdGc.js} +1 -1
- package/core/built/admin/assets/dist-Z97pCNqS.js +11 -0
- package/core/built/admin/assets/{dist-t6AXpf_4.js → dist-zwwGt8Yf.js} +1 -1
- package/core/built/admin/assets/{domain-DzrOAPY8.js → domain-Dp9TRrFp.js} +1 -1
- package/core/built/admin/assets/{dropzone-CzhP33wa.js → dropzone-B21Entqz.js} +1 -1
- package/core/built/admin/assets/{edit-profile-oufs4R4n.js → edit-profile-DG6lpMsr.js} +1 -1
- package/core/built/admin/assets/editor-CPQOrhrn.js +8 -0
- package/core/built/admin/assets/{editor-DtxX27Jz.css → editor-DLioOiRN.css} +1 -1
- package/core/built/admin/assets/{embed-signup-form-modal-Ch3s6lqA.js → embed-signup-form-modal-CgWniDha.js} +2 -2
- package/core/built/admin/assets/esm-CXo5SEPy.js +2 -0
- package/core/built/admin/assets/{explore-CA-R01Br.js → explore-C3rzONJv.js} +1 -1
- package/core/built/admin/assets/{feed-ClC8_Gld.js → feed-DpUwS1cU.js} +1 -1
- package/core/built/admin/assets/{field-B3OPenbP.js → field-BQqLTgHM.js} +1 -1
- package/core/built/admin/assets/{filter-sources-CiPLnG9A.js → filter-sources-FgqoUIL7.js} +1 -1
- package/core/built/admin/assets/{filters-yFvybRMe.js → filters-D0uIMD8n.js} +1 -1
- package/core/built/admin/assets/filters-DZJT29GW.js +1 -0
- package/core/built/admin/assets/{first-promoter-modal-BC0UpYCD.js → first-promoter-modal-DJhQQheG.js} +1 -1
- package/core/built/admin/assets/framework-provider-CFLwK5uS.js +4 -0
- package/core/built/admin/assets/{ghost-d38c30b866e59f2e06a357b5eb844fe5.css → ghost-68f447a1796b93a1f128b649bac8506d.css} +1 -1
- package/core/built/admin/assets/{ghost-d683fbeb945b13155ea669caa5d8db41.js → ghost-ba408063a5922b458b4a8f216cf23251.js} +124 -342
- package/core/built/admin/assets/{ghost-dark-1bffd5099ba7a749303133efacf8480b.css → ghost-dark-28ae4899c92022857f3584694bcb50ef.css} +1 -1
- package/core/built/admin/assets/{gift-link-modal-BKRuqo-k.js → gift-link-modal-sdFLjND9.js} +1 -1
- package/core/built/admin/assets/{gift-links-CVuqLhsZ.js → gift-links-D7BJ9qfe.js} +1 -1
- package/core/built/admin/assets/{global-data-provider-RzW6Bnlf.js → global-data-provider-CixmTX00.js} +1 -1
- package/core/built/admin/assets/{growth-ClNAldfL.js → growth-0YYkBEeS.js} +1 -1
- package/core/built/admin/assets/{growth-Dz8OSG06.js → growth-DpjAPeQT.js} +2 -2
- package/core/built/admin/assets/{history-modal-DIVuQ5Ct.js → history-modal-BWJ4-cJ0.js} +1 -1
- package/core/built/admin/assets/{hooks-D6EE7BIt.js → hooks-CJepWnbB.js} +1 -1
- package/core/built/admin/assets/{html-field-CVZ2sMxw.js → html-field-C-oa5DEl.js} +1 -1
- package/core/built/admin/assets/{iframe-buffering-e8vH4-Qn.js → iframe-buffering-Ba9sDpi2.js} +1 -1
- package/core/built/admin/assets/{images-Ok8FFJ3A.js → images-3cQgwfTD.js} +1 -1
- package/core/built/admin/assets/{inbox-CMUVI6qb.js → inbox-Dz_JblyJ.js} +6 -6
- package/core/built/admin/assets/index-BOJzlYiz.js +67 -0
- package/core/built/admin/assets/index-Bid6LAyc.css +1 -0
- package/core/built/admin/assets/{input-group-2XU-iuh_.js → input-group-DpogNUIt.js} +1 -1
- package/core/built/admin/assets/{integrations-BT6_iJvu.js → integrations-B9yYgci5.js} +1 -1
- package/core/built/admin/assets/{invite-user-modal-DrZ7xxrZ.js → invite-user-modal-DCiQSiuD.js} +1 -1
- package/core/built/admin/assets/{koenig-editor-base-BPj4S760.js → koenig-editor-base-BApy8Q7C.js} +1 -1
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +8328 -8294
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +84 -84
- package/core/built/admin/assets/{koenig-lexical-Cdjv-m3_.js → koenig-lexical-2KuqRwZI.js} +33 -33
- package/core/built/admin/assets/{kpi-card-J8Mj1sDX.js → kpi-card-Ck3tT2Wg.js} +1 -1
- package/core/built/admin/assets/{kpi-card-awos0BMH.js → kpi-card-DDIxptaS.js} +1 -1
- package/core/built/admin/assets/{kpi-helpers-SEhvH-8E.js → kpi-helpers-ssbuy-hD.js} +1 -1
- package/core/built/admin/assets/{kpi-tabs-R6BjsKhd.js → kpi-tabs-BqoIM6bI.js} +1 -1
- package/core/built/admin/assets/{label-BMC3dzLI.js → label-DodDsMzn.js} +1 -1
- package/core/built/admin/assets/label-picker-Cvvbmzb5.js +1 -0
- package/core/built/admin/assets/{labels-DAPjKPy2.js → labels-DqvSR6JF.js} +1 -1
- package/core/built/admin/assets/layout-DkkGyev2.js +1 -0
- package/core/built/admin/assets/limit-service-BhiEvqcP.js +20 -0
- package/core/built/admin/assets/{link-helpers-Bzkk68GD.js → link-helpers-kpbU8TWh.js} +1 -1
- package/core/built/admin/assets/luxon-D1RVjjpq.js +1 -0
- package/core/built/admin/assets/member-custom-fields-CvGcpaiW.js +1 -0
- package/core/built/admin/assets/member-detail-CMCMZ47_.js +1 -0
- package/core/built/admin/assets/members-sRl6fNfq.js +11 -0
- package/core/built/admin/assets/{moderation-mPjYHgZW.js → moderation-KhKwGqI1.js} +1 -1
- package/core/built/admin/assets/{multi-select-combobox-CsoyHAiX.js → multi-select-combobox-nhCff0_K.js} +1 -1
- package/core/built/admin/assets/{navigation-modal-D_c0badj.js → navigation-modal-MDJExWDJ.js} +1 -1
- package/core/built/admin/assets/newsletter-BIBHumfV.js +1 -0
- package/core/built/admin/assets/newsletter-detail-modal-CfjBMH3v.js +1 -0
- package/core/built/admin/assets/{newsletter-emails-B-OLfrvr.js → newsletter-emails-ClDL-7dA.js} +1 -1
- package/core/built/admin/assets/newsletters-CBe-IPzK.js +1 -0
- package/core/built/admin/assets/{newsletters-Du0lzskS.js → newsletters-ILsexy-5.js} +1 -1
- package/core/built/admin/assets/{note-CSVsUKBm.js → note-HnNUOt4d.js} +1 -1
- package/core/built/admin/assets/{notifications-DV9FRtDw.js → notifications-Cj5e-258.js} +1 -1
- package/core/built/admin/assets/nql-lang-CaWrLesS.js +19 -0
- package/core/built/admin/assets/{offers-Um6ab71O.js → offers-DMxebaoK.js} +1 -1
- package/core/built/admin/assets/offers-container-modal-BHwHtixC.js +1 -0
- package/core/built/admin/assets/{onboarding-route--jL5KLPD.js → onboarding-route-D_4jp7Nq.js} +1 -1
- package/core/built/admin/assets/overview-CezDdg-F.js +1 -0
- package/core/built/admin/assets/overview-D5mM51Lj.js +1 -0
- package/core/built/admin/assets/{page-header-DAvDYKO9.js → page-header-VLPJfj_d.js} +1 -1
- package/core/built/admin/assets/{pages-BVMnpI2O.js → pages-Gchxp5c7.js} +1 -1
- package/core/built/admin/assets/{pintura-modal-jiUCxX0Q.js → pintura-modal-BXXJ8Iaa.js} +1 -1
- package/core/built/admin/assets/{portal-frame-D4D4nEO6.js → portal-frame-BLCvF8f-.js} +1 -1
- package/core/built/admin/assets/portal-modal-DN80tAcy.js +1 -0
- package/core/built/admin/assets/{post-analytics-BhAtiFJp.js → post-analytics-Gv81eN_g.js} +1 -1
- package/core/built/admin/assets/post-analytics-header-_ydSY8qO.js +1 -0
- package/core/built/admin/assets/{post-analytics-provider-DGg0FUqs.js → post-analytics-provider-O2YjZMhN.js} +1 -1
- package/core/built/admin/assets/{post-share-modal-DtFAC132.js → post-share-modal-CzYak_a5.js} +1 -1
- package/core/built/admin/assets/{posts-CxG7v0-M.js → posts-DgcUi2rc.js} +1 -1
- package/core/built/admin/assets/preferences-gneLb6LV.js +5 -0
- package/core/built/admin/assets/{preview-modal-DctYx20m.js → preview-modal-Bkq-tgVm.js} +1 -1
- package/core/built/admin/assets/profile-CzXmCNTC.js +1 -0
- package/core/built/admin/assets/{radio-group-CI5_Kf_d.js → radio-group-Dsq5ZEbV.js} +1 -1
- package/core/built/admin/assets/{referrers-B9QDAfYm.js → referrers-C3a2K8qB.js} +1 -1
- package/core/built/admin/assets/{router-provider-DSQfprxH.js → router-provider-CkB_ArLF.js} +1 -1
- package/core/built/admin/assets/{select-CkXqNJDJ.js → select-xuZAuDyS.js} +1 -1
- package/core/built/admin/assets/{settings-ZCj-W56o.js → settings-Ct8pabhr.js} +1 -1
- package/core/built/admin/assets/settings-KSWWQanQ.js +4 -0
- package/core/built/admin/assets/{settings-breadcrumbs-DIq31FwA.js → settings-breadcrumbs-DbPGu-Tu.js} +1 -1
- package/core/built/admin/assets/{share-modal-BNj14g79.js → share-modal-CdiUx9WM.js} +1 -1
- package/core/built/admin/assets/{slack-modal-C6SpMQ-q.js → slack-modal-BP--Z3jE.js} +1 -1
- package/core/built/admin/assets/{sort-button-B-k54ow2.js → sort-button-CjfKdlsL.js} +1 -1
- package/core/built/admin/assets/{source-icon-Cej3sZM6.js → source-icon-DHj1h6Ts.js} +1 -1
- package/core/built/admin/assets/{stats-B2KW8E2y.js → stats-C615kulJ.js} +1 -1
- package/core/built/admin/assets/{stats-view-CVzU2-p5.js → stats-view-BSMRdYiN.js} +1 -1
- package/core/built/admin/assets/{step-1-Dbn1iIMU.js → step-1-pSdGYtIF.js} +1 -1
- package/core/built/admin/assets/{step-2-BahnSuN6.js → step-2-T9Uy4eBD.js} +1 -1
- package/core/built/admin/assets/{step-3-CW04e2ZJ.js → step-3-D4uXe_XG.js} +2 -2
- package/core/built/admin/assets/{stripe-button-BkBZqaGG.js → stripe-button-Bh4p6Wud.js} +1 -1
- package/core/built/admin/assets/stripe-connect-modal-C2vTvepi.js +1 -0
- package/core/built/admin/assets/{table-BtLcEi1M.js → table-DghJxZMH.js} +1 -1
- package/core/built/admin/assets/{tabs-BaWRfg8j.js → tabs-l9c7FjzI.js} +1 -1
- package/core/built/admin/assets/tag-detail-DBw_M2-p.js +2 -0
- package/core/built/admin/assets/{tags-BbygUvNB.js → tags-DoWsAG6l.js} +1 -1
- package/core/built/admin/assets/{tags-BwCgmr5v.js → tags-EmEvJN75.js} +1 -1
- package/core/built/admin/assets/{testimonials-modal--bdzppyh.js → testimonials-modal-BZKePE2T.js} +1 -1
- package/core/built/admin/assets/tier-detail-modal-D65pVWsN.js +1 -0
- package/core/built/admin/assets/{tiers-Da6kxHQP.js → tiers-8iTFjJWg.js} +1 -1
- package/core/built/admin/assets/{toggle-group-CVl-Xigr.js → toggle-group-uJnl42w3.js} +1 -1
- package/core/built/admin/assets/{topic-filter-BoRHRbL1.js → topic-filter-BM7hz0kW.js} +1 -1
- package/core/built/admin/assets/transistor-modal-VZOGN3od.js +1 -0
- package/core/built/admin/assets/{unsplash-modal-CixoRAO2.js → unsplash-modal-CKGfACxF.js} +1 -1
- package/core/built/admin/assets/{use-analytics-data-BiWvcf1u.js → use-analytics-data-IxJcSjc9.js} +1 -1
- package/core/built/admin/assets/use-check-theme-limit-error-CGp3CGT5.js +1 -0
- package/core/built/admin/assets/use-feature-flag-CSq2Lwzt.js +1 -0
- package/core/built/admin/assets/use-filter-params-0hcJJuEJ.js +1 -0
- package/core/built/admin/assets/{use-filterable-api-iMpDZBxD.js → use-filterable-api-CQBtVG-l.js} +1 -1
- package/core/built/admin/assets/{use-growth-stats-Dom8xVzo.js → use-growth-stats-1NW-8eEZ.js} +1 -1
- package/core/built/admin/assets/use-limiter-ffwpsZPp.js +2 -0
- package/core/built/admin/assets/{use-pintura-config-Bj4QmiVk.js → use-pintura-config-BjFChXV1.js} +1 -1
- package/core/built/admin/assets/{use-pintura-editor-DvrslmPE.js → use-pintura-editor-Cb41oJyL.js} +1 -1
- package/core/built/admin/assets/{use-post-referrers-pxIHTXFs.js → use-post-referrers-Dp1BnTAK.js} +1 -1
- package/core/built/admin/assets/{use-reply-chain-data-CmFe0N6F.js → use-reply-chain-data-C0ZUTkfk.js} +1 -1
- package/core/built/admin/assets/{use-setting-group-Cmp_sy-d.js → use-setting-group-Bx8M6FL2.js} +1 -1
- package/core/built/admin/assets/{use-settings-navigation-BmROPrls.js → use-settings-navigation-BOZcat_V.js} +1 -1
- package/core/built/admin/assets/{use-simple-pagination-D5rL3YwO.js → use-simple-pagination-DsEGSJhe.js} +1 -1
- package/core/built/admin/assets/{use-tinybird-query-DP2dMaq7.js → use-tinybird-query-Ci_DiPkX.js} +1 -1
- package/core/built/admin/assets/{use-tinybird-token-DrK_skPQ.js → use-tinybird-token-CsUwc722.js} +1 -1
- package/core/built/admin/assets/use-upgrade-route-B3_DUiuT.js +1 -0
- package/core/built/admin/assets/{use-url-input-ChrUZBFf.js → use-url-input-BEZJpVgN.js} +2 -2
- package/core/built/admin/assets/user-detail-modal-595z1N5r.js +1 -0
- package/core/built/admin/assets/{users-B6hIds6n.js → users-DmGMPfw7.js} +1 -1
- package/core/built/admin/assets/virtual-list-D5ugXyZY.js +1 -0
- package/core/built/admin/assets/{web-D71mjB2r.js → web-CAta3lRE.js} +1 -1
- package/core/built/admin/assets/web-Ds9_wWJK.js +2 -0
- package/core/built/admin/assets/zapier-modal-CcfDZY53.js +1 -0
- package/core/built/admin/index.html +12 -12
- package/core/frontend/apps/private-blogging/lib/middleware.js +5 -58
- package/core/frontend/helpers/ghost_head.js +52 -0
- package/core/frontend/meta/asset-url.js +20 -9
- package/core/frontend/public/cards.manifest.json +1 -0
- package/core/frontend/public/ghost-stats.min.js +1 -1
- package/core/frontend/services/assets-minification/card-assets.js +121 -46
- package/core/frontend/services/assets-minification/index.js +13 -4
- package/core/frontend/services/data/fetch-data.js +7 -14
- package/core/frontend/services/llms/service.js +27 -6
- package/core/frontend/services/proxy.js +1 -0
- package/core/frontend/services/routing/api-adapter.js +11 -5
- package/core/frontend/services/routing/collection-router.js +1 -2
- package/core/frontend/services/routing/controllers/entry/markdown.js +63 -5
- package/core/frontend/services/routing/controllers/entry.js +1 -1
- package/core/frontend/services/routing/controllers/previews.js +0 -3
- package/core/frontend/services/routing/events.js +2 -1
- package/core/frontend/services/routing/parent-router.js +0 -22
- package/core/frontend/services/routing/router-manager.js +2 -2
- package/core/frontend/services/routing/static-pages-router.js +0 -1
- package/core/frontend/services/sitemap/handler.js +3 -4
- package/core/frontend/services/sitemap/site-map-manager.js +1 -2
- package/core/frontend/services/theme-engine/i18n/i18n.js +0 -33
- package/core/frontend/web/middleware/llms-discovery.js +2 -2
- package/core/frontend/web/routers/serve-public-file.js +33 -3
- package/core/frontend/web/site.js +5 -4
- package/core/server/adapters/jobs/InMemoryJobsBackend.js +113 -0
- package/core/server/adapters/redirects/S3RedirectsStore.js +33 -13
- package/core/server/adapters/route-settings/S3RouteSettingsStore.js +33 -13
- package/core/server/adapters/scheduling/scheduling-default.js +6 -7
- package/core/server/adapters/storage/LocalStorageBase.js +1 -3
- package/core/server/api/endpoints/index.js +0 -4
- package/core/server/api/endpoints/member-custom-fields.js +15 -4
- package/core/server/api/endpoints/pages.js +3 -11
- package/core/server/api/endpoints/posts.js +3 -11
- package/core/server/api/endpoints/utils/api-filter-utils.js +15 -1
- package/core/server/api/endpoints/utils/serializers/input/settings.js +4 -0
- package/core/server/api/endpoints/utils/serializers/output/index.js +0 -4
- package/core/server/api/endpoints/utils/serializers/output/mappers/email-batches.js +1 -1
- package/core/server/api/endpoints/utils/serializers/output/mappers/snippets.js +0 -1
- package/core/server/api/endpoints/utils/serializers/output/member-custom-fields.js +1 -0
- package/core/server/data/exporter/table-lists.js +4 -1
- package/core/server/data/migrations/utils/schema.js +5 -3
- package/core/server/data/migrations/versions/6.57/2026-08-04-18-00-00-store-custom-field-values-as-leaf-rows.js +19 -7
- package/core/server/data/migrations/versions/6.58/2026-08-10-08-20-50-add-machine-payments-settings.js +41 -0
- package/core/server/data/migrations/versions/6.58/2026-08-10-08-21-00-add-machine-payment-events-table.js +18 -0
- package/core/server/data/migrations/versions/6.58/2026-08-10-15-24-09-reset-custom-field-definitions-for-underscored-keys.js +66 -0
- package/core/server/data/migrations/versions/6.58/2026-08-11-10-00-00-swap-custom-field-values-to-key-fk.js +65 -0
- package/core/server/data/migrations/versions/6.58/2026-08-11-10-34-25-remove-legacy-explore-integration.js +131 -0
- package/core/server/data/migrations/versions/6.58/2026-08-11-16-00-00-add-sort-order-to-members-custom-fields.js +13 -0
- package/core/server/data/migrations/versions/6.58/2026-08-11-21-22-48-rename-email-batches-provider-id.js +8 -0
- package/core/server/data/migrations/versions/6.58/2026-08-13-16-07-33-add-automation-runs-automation-id-created-at-index.js +28 -0
- package/core/server/data/schema/README.md +87 -0
- package/core/server/data/schema/commands.js +5 -2
- package/core/server/data/schema/default-settings/default-settings.json +27 -0
- package/core/server/data/schema/fixtures/fixtures.json +0 -21
- package/core/server/data/schema/schema.js +37 -9
- package/core/server/data/seeders/data-generator.js +3 -1
- package/core/server/data/seeders/importers/automation-action-edges-importer.js +38 -0
- package/core/server/data/seeders/importers/automation-action-revisions-importer.js +139 -0
- package/core/server/data/seeders/importers/automation-actions-importer.js +84 -0
- package/core/server/data/seeders/importers/automation-run-steps-importer.js +134 -0
- package/core/server/data/seeders/importers/automation-runs-importer.js +97 -0
- package/core/server/data/seeders/importers/automations-importer.js +78 -0
- package/core/server/data/seeders/importers/benefits-importer.js +1 -1
- package/core/server/data/seeders/importers/comment-reports-importer.js +5 -5
- package/core/server/data/seeders/importers/comments-importer.js +6 -6
- package/core/server/data/seeders/importers/email-batches-importer.js +9 -8
- package/core/server/data/seeders/importers/email-recipient-failures-importer.js +1 -1
- package/core/server/data/seeders/importers/email-recipients-importer.js +12 -12
- package/core/server/data/seeders/importers/emails-importer.js +7 -7
- package/core/server/data/seeders/importers/index.js +6 -0
- package/core/server/data/seeders/importers/labels-importer.js +4 -4
- package/core/server/data/seeders/importers/members-click-events-importer.js +4 -4
- package/core/server/data/seeders/importers/members-created-events-importer.js +5 -5
- package/core/server/data/seeders/importers/members-feedback-importer.js +7 -7
- package/core/server/data/seeders/importers/members-importer.js +5 -5
- package/core/server/data/seeders/importers/members-labels-importer.js +1 -1
- package/core/server/data/seeders/importers/members-login-events-importer.js +4 -4
- package/core/server/data/seeders/importers/members-newsletters-importer.js +1 -1
- package/core/server/data/seeders/importers/members-paid-subscription-events-importer.js +1 -1
- package/core/server/data/seeders/importers/members-products-importer.js +3 -3
- package/core/server/data/seeders/importers/members-status-events-importer.js +4 -4
- package/core/server/data/seeders/importers/members-stripe-customers-importer.js +3 -3
- package/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js +8 -8
- 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 +4 -4
- package/core/server/data/seeders/importers/newsletters-importer.js +1 -1
- package/core/server/data/seeders/importers/offer-redemptions-importer.js +6 -6
- package/core/server/data/seeders/importers/offers-importer.js +4 -4
- package/core/server/data/seeders/importers/posts-authors-importer.js +1 -1
- package/core/server/data/seeders/importers/posts-importer.js +5 -5
- package/core/server/data/seeders/importers/posts-products-importer.js +1 -1
- package/core/server/data/seeders/importers/posts-tags-importer.js +1 -1
- package/core/server/data/seeders/importers/products-benefits-importer.js +1 -1
- package/core/server/data/seeders/importers/products-importer.js +1 -1
- package/core/server/data/seeders/importers/recommendation-click-events-importer.js +1 -1
- package/core/server/data/seeders/importers/recommendation-subscribe-events-importer.js +1 -1
- package/core/server/data/seeders/importers/recommendations-importer.js +1 -1
- package/core/server/data/seeders/importers/redirects-importer.js +1 -1
- package/core/server/data/seeders/importers/roles-users-importer.js +1 -1
- package/core/server/data/seeders/importers/stripe-prices-importer.js +1 -1
- package/core/server/data/seeders/importers/stripe-products-importer.js +1 -1
- package/core/server/data/seeders/importers/table-importer.js +92 -91
- package/core/server/data/seeders/importers/tags-importer.js +3 -3
- package/core/server/data/seeders/importers/users-importer.js +3 -3
- package/core/server/data/seeders/importers/web-mentions-importer.js +3 -3
- package/core/server/data/seeders/utils/database-date.js +14 -18
- package/core/server/data/seeders/utils/json-importer.js +1 -1
- package/core/server/data/seeders/utils/random.js +8 -7
- package/core/server/data/seeders/utils/topological-sort.js +5 -3
- package/core/server/data/tinybird/ARCHITECTURE.md +1 -2
- package/core/server/models/base/plugins/crud.js +0 -5
- package/core/server/models/index.js +2 -0
- package/core/server/models/machine-payment-event.js +18 -0
- package/core/server/models/member.js +24 -0
- package/core/server/models/settings.js +32 -3
- package/core/server/models/user.js +1 -1
- package/core/server/services/README.md +30 -0
- package/core/server/services/activitypub/activity-pub-service.js +2 -3
- package/core/server/services/adapter-manager/base-classes.js +3 -1
- package/core/server/services/auth/passwordreset.js +47 -51
- package/core/server/services/automations/database-automations-repository.js +19 -3
- package/core/server/services/automations/poll.js +2 -8
- package/core/server/services/comments/comments-service.js +4 -16
- package/core/server/services/comments/index.js +1 -3
- package/core/server/services/email-analytics/email-analytics-service-wrapper.js +68 -119
- package/core/server/services/email-analytics/email-analytics-service.js +73 -229
- package/core/server/services/email-analytics/event-processing-result.js +0 -10
- package/core/server/services/email-analytics/fetch-mailgun-events.js +25 -0
- package/core/server/services/email-analytics/index.js +35 -67
- package/core/server/services/email-analytics/lib/queries.js +88 -51
- package/core/server/services/email-analytics/newsletter-email-analytics-batch-processor.js +4 -1
- package/core/server/services/email-service/batch-sending-service.js +1 -1
- package/core/server/services/email-service/email-event-processor.js +12 -12
- package/core/server/services/email-service/events/email-bounced-event.js +8 -46
- package/core/server/services/email-service/events/email-delivered-event.js +8 -36
- package/core/server/services/email-service/events/email-opened-event.js +8 -36
- package/core/server/services/email-service/events/email-temporary-bounced-event.js +8 -46
- package/core/server/services/email-service/events/email-unsubscribed-event.js +8 -31
- package/core/server/services/email-service/events/spam-complaint-event.js +8 -31
- package/core/server/services/email-service/newsletter-email-event-storage.js +8 -7
- package/core/server/services/email-service/sending-service.js +1 -1
- package/core/server/services/email-suppression-list/mailgun-email-suppression-list.js +2 -2
- package/core/server/services/email-suppression-list/service.js +1 -3
- package/core/server/services/explore-ping/explore-ping-service.js +1 -6
- package/core/server/services/explore-ping/index.js +0 -2
- package/core/server/services/gifts/index.js +109 -3
- package/core/server/services/gifts/jobs/clean-gifts-job.js +1 -1
- package/core/server/services/gifts/jobs/send-gift-reminders-job.js +1 -1
- package/core/server/services/jobs-service/index.js +36 -0
- package/core/server/services/jobs-service/job.js +6 -0
- package/core/server/services/jobs-service/jobs-service.js +91 -0
- package/core/server/services/jobs-service/register-job-handlers.js +6 -0
- package/core/server/services/lib/mailgun-client.js +1 -1
- package/core/server/services/machine-payments/README.md +23 -0
- package/core/server/services/machine-payments/adapters/mpp-adapter.js +195 -0
- package/core/server/services/machine-payments/content-loader.js +89 -0
- package/core/server/services/machine-payments/eligibility.js +6 -0
- package/core/server/services/machine-payments/events/machine-payment-event-repository.js +58 -0
- package/core/server/services/machine-payments/events/machine-payment-event.js +46 -0
- package/core/server/services/machine-payments/index.js +87 -0
- package/core/server/services/machine-payments/pricing.js +54 -0
- package/core/server/services/machine-payments/service.js +275 -0
- package/core/server/services/machine-payments/stripe/deposit-address-store.js +157 -0
- package/core/server/services/machine-payments/stripe/payment-recorder.js +85 -0
- package/core/server/services/machine-payments/stripe/stripe-client-options.js +25 -0
- package/core/server/services/machine-payments/types.js +2 -0
- package/core/server/services/members/import-export/csv/parse.js +9 -1
- package/core/server/services/members/import-export/import/completion-email.js +61 -27
- package/core/server/services/members/import-export/import/email-template.js +28 -15
- package/core/server/services/members/import-export/import/importer.js +99 -51
- package/core/server/services/members/import-export/import/spool.js +1 -1
- package/core/server/services/members/import-export/index.js +24 -1
- package/core/server/services/members/members-api/services/member-bread-service.js +2 -2
- package/core/server/services/members/members-config-provider.js +12 -2
- package/core/server/services/members-custom-fields/actions.js +2 -1
- package/core/server/services/members-custom-fields/definitions-service.js +109 -27
- package/core/server/services/members-custom-fields/filter.js +199 -0
- package/core/server/services/members-custom-fields/key.js +37 -0
- package/core/server/services/members-custom-fields/queries.js +15 -0
- package/core/server/services/members-custom-fields/schema.js +1 -1
- package/core/server/services/members-custom-fields/values-service.js +18 -14
- package/core/server/services/members-events/last-seen-at-updater.js +1 -1
- package/core/server/services/oembed/oembed-service.js +8 -2
- package/core/server/services/permissions/can-this.js +4 -1
- package/core/server/services/posts/posts-service.js +18 -16
- package/core/server/services/public-config/config.js +1 -1
- package/core/server/services/route-settings/dynamic-routing-service.js +2 -0
- package/core/server/services/settings-helpers/settings-helpers.js +0 -1
- package/core/server/services/stats/posts-stats-service.js +0 -2
- package/core/server/services/stripe/stripe-api.js +2 -9
- package/core/server/web/api/endpoints/admin/middleware.js +0 -1
- package/core/server/web/api/endpoints/admin/routes.js +2 -3
- package/core/server/web/comments/routes.js +31 -8
- package/core/shared/config/defaults.json +17 -2
- package/core/shared/config/loader.js +11 -2
- package/core/shared/config/overrides.json +2 -0
- package/core/shared/config/secrets.js +71 -0
- package/core/shared/labs.js +4 -13
- package/core/shared/machine-payments.js +30 -0
- package/core/shared/private-site-access/index.js +68 -0
- package/package.json +48 -43
- package/pnpm-lock.yaml +1412 -1583
- package/pnpm-workspace.yaml +85 -48
- package/bin/validate-adapters.ts +0 -87
- package/components/tryghost-adapter-base-scheduling-0.2.1.tgz +0 -0
- package/components/tryghost-adapter-base-sso-0.1.1.tgz +0 -0
- package/components/tryghost-kg-card-factory-5.2.3.tgz +0 -0
- package/components/tryghost-kg-clean-basic-html-4.3.3.tgz +0 -0
- package/components/tryghost-kg-converters-1.2.4.tgz +0 -0
- package/components/tryghost-kg-default-cards-10.3.4.tgz +0 -0
- package/components/tryghost-kg-default-nodes-2.1.5.tgz +0 -0
- package/components/tryghost-kg-default-transforms-1.3.3.tgz +0 -0
- package/components/tryghost-kg-html-to-lexical-1.3.3.tgz +0 -0
- package/components/tryghost-kg-lexical-html-renderer-1.4.3.tgz +0 -0
- package/components/tryghost-kg-markdown-html-renderer-7.2.3.tgz +0 -0
- package/components/tryghost-kg-utils-1.1.3.tgz +0 -0
- package/content/themes/casper/assets/built/casper.js.map +0 -1
- package/content/themes/casper/assets/built/global.css.map +0 -1
- package/content/themes/casper/assets/built/screen.css.map +0 -1
- package/content/themes/source/assets/built/screen.css.map +0 -1
- package/content/themes/source/assets/built/source.js.map +0 -1
- package/core/built/admin/assets/activitypub/layout-DM_3pqsU.js +0 -1
- package/core/built/admin/assets/add-integration-modal-DU9ghGLS.js +0 -1
- package/core/built/admin/assets/add-newsletter-modal-DFxuQrYu.js +0 -1
- package/core/built/admin/assets/announcement-bar-modal-DGCcezB6.js +0 -1
- package/core/built/admin/assets/card-aUHX0hyR.js +0 -1
- package/core/built/admin/assets/chunk.524.dce1c51e0bc30fb2718e.js +0 -25
- package/core/built/admin/assets/chunk.582.3a430d5c6a744fd475b6.js +0 -27
- package/core/built/admin/assets/code-editor-view-BcyKABrG.js +0 -1
- package/core/built/admin/assets/color-picker-field-8NoSnhNI.js +0 -1
- package/core/built/admin/assets/command-BOYMbZa_.js +0 -1
- package/core/built/admin/assets/comments-BhNM5CYl.js +0 -1
- package/core/built/admin/assets/confirmation-modal-CYD7x3UQ.js +0 -1
- package/core/built/admin/assets/custom-integration-modal-bk3lNEuQ.js +0 -1
- package/core/built/admin/assets/design-and-theme-modal-B2xYKS1I.js +0 -23
- package/core/built/admin/assets/dist-Bg8bSvLA.js +0 -6
- package/core/built/admin/assets/dist-BnFdlebk.js +0 -11
- package/core/built/admin/assets/dist-CsvXCJSe.js +0 -23
- package/core/built/admin/assets/editor-BBKrunMK.js +0 -8
- package/core/built/admin/assets/filters-Bz0HsRie.js +0 -1
- package/core/built/admin/assets/framework-provider-CmtnPXIT.js +0 -4
- package/core/built/admin/assets/index-DUXM0NlS.js +0 -67
- package/core/built/admin/assets/index-Ds2iUoF6.css +0 -1
- package/core/built/admin/assets/label-picker-Bnlru5tO.js +0 -1
- package/core/built/admin/assets/layout-yR9rlvEw.js +0 -1
- package/core/built/admin/assets/limit-modal-COmLevuY.js +0 -1
- package/core/built/admin/assets/limit-service-9fwD33lU.js +0 -20
- package/core/built/admin/assets/member-custom-fields-BvFKEpxJ.js +0 -1
- package/core/built/admin/assets/member-detail-CWdPAe3p.js +0 -1
- package/core/built/admin/assets/members-Bnt0ih2R.js +0 -11
- package/core/built/admin/assets/newsletter-DR49NyGS.js +0 -1
- package/core/built/admin/assets/newsletter-detail-modal-B45pL1pb.js +0 -1
- package/core/built/admin/assets/newsletters-DGs5BaKH.js +0 -1
- package/core/built/admin/assets/nql-lang-B7faUf8D.js +0 -19
- package/core/built/admin/assets/offers-container-modal-B0hFS8nk.js +0 -1
- package/core/built/admin/assets/overview-B-ZPNqMo.js +0 -1
- package/core/built/admin/assets/overview-D96iwoJi.js +0 -1
- package/core/built/admin/assets/portal-modal-BLFdYeDH.js +0 -1
- package/core/built/admin/assets/post-analytics-header-DK27VjJm.js +0 -1
- package/core/built/admin/assets/preferences-CuWLISHa.js +0 -5
- package/core/built/admin/assets/profile-BsKYYtuL.js +0 -1
- package/core/built/admin/assets/settings-B4vM-rgV.js +0 -4
- package/core/built/admin/assets/stripe-connect-modal-CYDDrSJm.js +0 -1
- package/core/built/admin/assets/tag-detail-CmqiC32L.js +0 -1
- package/core/built/admin/assets/tier-detail-modal-BZmAsIy4.js +0 -1
- package/core/built/admin/assets/transistor-modal-CBPDqEGy.js +0 -1
- package/core/built/admin/assets/use-check-theme-limit-error-B14lZukR.js +0 -2
- package/core/built/admin/assets/use-feature-flag-BmJoc5WN.js +0 -1
- package/core/built/admin/assets/use-filter-params-ChoV72Hw.js +0 -1
- package/core/built/admin/assets/use-limiter-Dwg8ivgQ.js +0 -2
- package/core/built/admin/assets/user-detail-modal-XODpOqNC.js +0 -1
- package/core/built/admin/assets/virtual-list-Dnoafqbk.js +0 -1
- package/core/built/admin/assets/web-z71lA1Y3.js +0 -2
- package/core/built/admin/assets/zapier-modal-Bp507Um7.js +0 -1
- package/core/frontend/meta/og-type.ts +0 -13
- package/core/frontend/services/routing/api-adapter.ts +0 -157
- package/core/frontend/services/routing/config.ts +0 -59
- package/core/frontend/services/routing/controllers/entry/canonical-url.ts +0 -14
- package/core/frontend/services/routing/controllers/entry/gift-links.ts +0 -56
- package/core/frontend/services/routing/controllers/entry/markdown.ts +0 -72
- package/core/frontend/services/routing/controllers/entry.ts +0 -120
- package/core/frontend/services/routing/controllers/rss.ts +0 -66
- package/core/frontend/services/routing/permalink-adapter.ts +0 -10
- package/core/frontend/src/utils/privacy.ts +0 -66
- package/core/server/adapters/redirects/FileStore.ts +0 -113
- package/core/server/adapters/redirects/S3RedirectsStore.ts +0 -185
- package/core/server/adapters/route-settings/FileStore.ts +0 -144
- package/core/server/adapters/route-settings/S3RouteSettingsStore.ts +0 -199
- package/core/server/adapters/route-settings/utils.ts +0 -17
- package/core/server/adapters/scheduling/deps.d.ts +0 -1
- package/core/server/adapters/scheduling/error-capture.ts +0 -91
- package/core/server/adapters/scheduling/scheduling-default.ts +0 -248
- package/core/server/adapters/scheduling/utils.ts +0 -36
- package/core/server/adapters/sso/DefaultSSOAdapter.ts +0 -15
- package/core/server/adapters/storage/LocalFilesStorage.ts +0 -24
- package/core/server/adapters/storage/LocalImagesStorage.ts +0 -24
- package/core/server/adapters/storage/LocalMediaStorage.ts +0 -24
- package/core/server/adapters/storage/LocalStorageBase.ts +0 -342
- package/core/server/adapters/storage/S3Storage.ts +0 -506
- package/core/server/adapters/storage/utils.ts +0 -60
- package/core/server/api/endpoints/automation-action-links.ts +0 -46
- package/core/server/api/endpoints/explore.js +0 -18
- package/core/server/api/endpoints/gift-links.ts +0 -87
- package/core/server/api/endpoints/libraries.d.ts +0 -2
- package/core/server/api/endpoints/member-commenting.ts +0 -92
- package/core/server/api/endpoints/member-custom-fields.ts +0 -106
- package/core/server/api/endpoints/utils/api-filter-utils.ts +0 -22
- package/core/server/api/endpoints/utils/gift-link-access.ts +0 -82
- package/core/server/api/endpoints/utils/public-cache-keys.ts +0 -47
- package/core/server/api/endpoints/utils/serializers/input/member-commenting.ts +0 -29
- package/core/server/api/endpoints/utils/serializers/output/explore.js +0 -11
- package/core/server/api/endpoints/utils/serializers/output/gift-links.ts +0 -21
- package/core/server/api/endpoints/utils/serializers/output/member-commenting.ts +0 -8
- package/core/server/api/endpoints/utils/serializers/output/member-custom-fields.ts +0 -25
- package/core/server/api/endpoints/utils/serializers/output/members.d.ts +0 -20
- package/core/server/api/endpoints/utils/serializers/output/posts-csv-transform.ts +0 -46
- package/core/server/api/endpoints/utils/serializers/output/stream-csv-response.ts +0 -47
- package/core/server/api/endpoints/utils/validate-email-sender-fields.ts +0 -42
- package/core/server/data/importer/email-template.ts +0 -213
- package/core/server/data/seeders/utils/topological-sort.ts +0 -48
- package/core/server/lib/auto-filling-map.ts +0 -23
- package/core/server/lib/bootstrap-socket.ts +0 -114
- package/core/server/lib/case-keys.ts +0 -30
- package/core/server/lib/common/to-plain.ts +0 -25
- package/core/server/lib/db-date.ts +0 -8
- package/core/server/lib/get-inbox-links.ts +0 -276
- package/core/server/lib/post-revisions.ts +0 -152
- package/core/server/lib/soonest-timer.ts +0 -57
- package/core/server/models/base/plugins/bulk-filters.ts +0 -35
- package/core/server/models/role-utils.ts +0 -56
- package/core/server/services/activitypub/activity-pub-service.ts +0 -216
- package/core/server/services/adapter-manager/adapter-manager.ts +0 -253
- package/core/server/services/adapter-manager/adapter-paths.ts +0 -26
- package/core/server/services/adapter-manager/base-classes.ts +0 -22
- package/core/server/services/adapter-manager/index.ts +0 -16
- package/core/server/services/adapter-manager/types.ts +0 -45
- package/core/server/services/adapter-manager/utils.ts +0 -308
- package/core/server/services/auth/reset-authentication.ts +0 -72
- package/core/server/services/automations/automations-api.ts +0 -396
- package/core/server/services/automations/automations-repository.ts +0 -218
- package/core/server/services/automations/constants.ts +0 -4
- package/core/server/services/automations/database-automations-repository.ts +0 -1513
- package/core/server/services/automations/database-date.ts +0 -26
- package/core/server/services/automations/fake-wait-hours-multiplier.ts +0 -12
- package/core/server/services/automations/get-scheduler-idempotency-key.ts +0 -8
- package/core/server/services/automations/mailgun-message-id.ts +0 -27
- package/core/server/services/automations/poll.ts +0 -325
- package/core/server/services/automations/scheduler-poll-time.ts +0 -38
- package/core/server/services/automations/service.ts +0 -131
- package/core/server/services/automations/stale-lock-cutoff.ts +0 -5
- package/core/server/services/comments/email-templates/new-comment-reply.txt.ts +0 -25
- package/core/server/services/comments/email-templates/new-comment.txt.ts +0 -25
- package/core/server/services/comments/email-templates/report.txt.ts +0 -34
- package/core/server/services/custom-redirects/redirect-config-parser.ts +0 -148
- package/core/server/services/custom-redirects/redirects-service.ts +0 -181
- package/core/server/services/custom-redirects/utils.ts +0 -7
- package/core/server/services/donations/donation-bookshelf-repository.ts +0 -63
- package/core/server/services/donations/donation-payment-event.ts +0 -51
- package/core/server/services/email-address/email-address-parser.d.ts +0 -12
- package/core/server/services/email-address/email-address-service.ts +0 -241
- package/core/server/services/email-analytics/automation-email-analytics-batch-processor.ts +0 -130
- package/core/server/services/email-analytics/batch-event-processor.ts +0 -18
- package/core/server/services/email-analytics/email-analytics-provider-mailgun.js +0 -57
- package/core/server/services/email-analytics/event-processing-result.ts +0 -66
- package/core/server/services/email-analytics/events/start-automation-email-analytics-job-event.ts +0 -14
- package/core/server/services/email-analytics/events/start-email-analytics-job-event.ts +0 -15
- package/core/server/services/email-analytics/index.ts +0 -109
- package/core/server/services/email-analytics/jobs/email-analytics-job-scheduler.ts +0 -126
- package/core/server/services/email-analytics/lib/queries.ts +0 -341
- package/core/server/services/email-service/domain-warming-service.ts +0 -91
- package/core/server/services/explore/explore-service.js +0 -59
- package/core/server/services/explore/index.js +0 -18
- package/core/server/services/explore-ping/explore-ping-service.ts +0 -198
- package/core/server/services/explore-ping/index.ts +0 -42
- package/core/server/services/files/file-type-utils.ts +0 -56
- package/core/server/services/gift-links/actions.ts +0 -51
- package/core/server/services/gift-links/codec.ts +0 -16
- package/core/server/services/gift-links/index.ts +0 -20
- package/core/server/services/gift-links/models.ts +0 -22
- package/core/server/services/gift-links/schema.ts +0 -33
- package/core/server/services/gift-links/serializers.ts +0 -20
- package/core/server/services/gift-links/service.ts +0 -95
- package/core/server/services/gifts/constants.ts +0 -3
- package/core/server/services/gifts/email-templates/gift-purchase-confirmation.ts +0 -43
- package/core/server/services/gifts/email-templates/gift-reminder.ts +0 -50
- package/core/server/services/gifts/gift-bookshelf-repository.ts +0 -366
- package/core/server/services/gifts/gift-checkout-offer.ts +0 -127
- package/core/server/services/gifts/gift-codec.ts +0 -62
- package/core/server/services/gifts/gift-controller.ts +0 -51
- package/core/server/services/gifts/gift-email-renderer.ts +0 -97
- package/core/server/services/gifts/gift-email-service.ts +0 -158
- package/core/server/services/gifts/gift-reminder-scheduler.ts +0 -107
- package/core/server/services/gifts/gift-schema.ts +0 -39
- package/core/server/services/gifts/gift-service-wrapper.js +0 -142
- package/core/server/services/gifts/gift-service.ts +0 -1034
- package/core/server/services/gifts/gift.ts +0 -234
- package/core/server/services/identity-tokens/identity-token-service.ts +0 -36
- package/core/server/services/indexnow-ping/constants.ts +0 -32
- package/core/server/services/indexnow-ping/index.ts +0 -35
- package/core/server/services/indexnow-ping/indexnow-ping-service.ts +0 -311
- package/core/server/services/internal-keys/index.ts +0 -53
- package/core/server/services/lib/dynamic-redirect-manager.d.ts +0 -20
- package/core/server/services/lib/in-memory-repository.ts +0 -78
- package/core/server/services/lib/member-signup-contexts.ts +0 -22
- package/core/server/services/link-redirection/link-redirect.ts +0 -24
- package/core/server/services/member-welcome-emails/constants.ts +0 -35
- package/core/server/services/members/commenting/index.ts +0 -2
- package/core/server/services/members/commenting/member-commenting-codec.ts +0 -73
- package/core/server/services/members/commenting/member-commenting.ts +0 -69
- package/core/server/services/members/create-paid-member-shim.ts +0 -40
- package/core/server/services/members/import-export/config.ts +0 -34
- package/core/server/services/members/import-export/csv/formula.ts +0 -14
- package/core/server/services/members/import-export/csv/index.ts +0 -3
- package/core/server/services/members/import-export/csv/parse.ts +0 -69
- package/core/server/services/members/import-export/csv/serialize.ts +0 -18
- package/core/server/services/members/import-export/export/exporter.ts +0 -325
- package/core/server/services/members/import-export/import/completion-email.ts +0 -146
- package/core/server/services/members/import-export/import/importer.ts +0 -489
- package/core/server/services/members/import-export/import/reader.ts +0 -33
- package/core/server/services/members/import-export/import/row.ts +0 -56
- package/core/server/services/members/import-export/import/spool.ts +0 -38
- package/core/server/services/members/import-export/index.ts +0 -143
- package/core/server/services/members/index.d.ts +0 -32
- package/core/server/services/members-custom-fields/actions.ts +0 -62
- package/core/server/services/members-custom-fields/codec.ts +0 -13
- package/core/server/services/members-custom-fields/config.ts +0 -38
- package/core/server/services/members-custom-fields/definitions-service.ts +0 -413
- package/core/server/services/members-custom-fields/index.ts +0 -50
- package/core/server/services/members-custom-fields/models.ts +0 -15
- package/core/server/services/members-custom-fields/queries.ts +0 -13
- package/core/server/services/members-custom-fields/schema.ts +0 -71
- package/core/server/services/members-custom-fields/serializers.ts +0 -22
- package/core/server/services/members-custom-fields/storage.ts +0 -122
- package/core/server/services/members-custom-fields/values-service.ts +0 -269
- package/core/server/services/notifications/notification-email.ts +0 -66
- package/core/server/services/notifications/sanitize-email-html.ts +0 -35
- package/core/server/services/post-scheduling/index.ts +0 -13
- package/core/server/services/post-scheduling/post-scheduling.ts +0 -133
- package/core/server/services/recommendations/service/bookshelf-click-event-repository.ts +0 -49
- package/core/server/services/recommendations/service/bookshelf-recommendation-repository.ts +0 -117
- package/core/server/services/recommendations/service/bookshelf-repository.ts +0 -192
- package/core/server/services/recommendations/service/bookshelf-subscribe-event-repository.ts +0 -49
- package/core/server/services/recommendations/service/click-event.ts +0 -32
- package/core/server/services/recommendations/service/in-memory-recommendation-repository.ts +0 -20
- package/core/server/services/recommendations/service/incoming-recommendation-controller.ts +0 -51
- package/core/server/services/recommendations/service/incoming-recommendation-email-renderer.ts +0 -37
- package/core/server/services/recommendations/service/incoming-recommendation-service.ts +0 -159
- package/core/server/services/recommendations/service/index.ts +0 -15
- package/core/server/services/recommendations/service/libraries.d.ts +0 -2
- package/core/server/services/recommendations/service/recommendation-controller.ts +0 -257
- package/core/server/services/recommendations/service/recommendation-metadata-service.ts +0 -132
- package/core/server/services/recommendations/service/recommendation-repository.ts +0 -13
- package/core/server/services/recommendations/service/recommendation-service.ts +0 -285
- package/core/server/services/recommendations/service/recommendation.ts +0 -200
- package/core/server/services/recommendations/service/subscribe-event.ts +0 -32
- package/core/server/services/recommendations/service/unsafe-data.ts +0 -217
- package/core/server/services/recommendations/service/well-known-service.ts +0 -47
- package/core/server/services/remote-flags/index.ts +0 -101
- package/core/server/services/remote-flags/remote-flags-service.ts +0 -236
- package/core/server/services/remote-flags/resolve.ts +0 -108
- package/core/server/services/route-settings/route-settings-parser.ts +0 -455
- package/core/server/services/route-settings/validation-errors.ts +0 -271
- package/core/server/services/route-settings/yaml-parser.d.ts +0 -4
- package/core/server/services/slack-ping/constants.ts +0 -15
- package/core/server/services/slack-ping/index.ts +0 -35
- package/core/server/services/slack-ping/slack-ping-service.ts +0 -295
- package/core/server/services/staff/email-templates/donation.txt.ts +0 -26
- package/core/server/services/staff/email-templates/gift.txt.ts +0 -27
- package/core/server/services/staff/email-templates/new-free-signup.txt.ts +0 -15
- package/core/server/services/staff/email-templates/new-gift-subscription.txt.ts +0 -26
- package/core/server/services/staff/email-templates/new-milestone-received.txt.ts +0 -20
- package/core/server/services/staff/email-templates/new-paid-cancellation.txt.ts +0 -15
- package/core/server/services/staff/email-templates/new-paid-started.txt.ts +0 -15
- package/core/server/services/staff/email-templates/recommendation-received.txt.ts +0 -23
- package/core/server/services/staff/email-templates/types.ts +0 -13
- package/core/server/services/url/lazy-find-resource.ts +0 -104
- package/core/server/services/url/lazy-url-service.ts +0 -647
- package/core/server/services/url/permalink-matcher.ts +0 -119
- package/core/server/services/url/router-filter.ts +0 -80
- package/core/server/services/verification/verification-webhook-service.ts +0 -137
- package/core/shared/config/helpers.ts +0 -133
- package/core/shared/config/index.ts +0 -12
- package/core/shared/config/loader.ts +0 -87
- package/core/shared/config/utils.ts +0 -104
- package/core/shared/errify.ts +0 -31
- package/core/shared/events-ts/index.ts +0 -8
- package/core/shared/events-ts/post-deleted-event.ts +0 -15
- package/core/shared/events-ts/posts-bulk-add-tags-event.ts +0 -13
- package/core/shared/events-ts/posts-bulk-destroyed-event.ts +0 -13
- package/core/shared/events-ts/posts-bulk-featured-event.ts +0 -13
- package/core/shared/events-ts/posts-bulk-unfeatured-event.ts +0 -13
- package/core/shared/events-ts/posts-bulk-unpublished-event.ts +0 -13
- package/core/shared/events-ts/posts-bulk-unscheduled-event.ts +0 -13
- package/core/shared/labs-flag-overrides.ts +0 -35
- package/core/shared/one-at-a-time.ts +0 -47
- package/core/shared/url-utils.ts +0 -20
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const logging = require('@tryghost/logging');
|
|
2
|
+
const {createNonTransactionalMigration} = require('../../utils');
|
|
3
|
+
const commands = require('../../../schema/commands');
|
|
4
|
+
|
|
5
|
+
const TABLE = 'members_custom_field_values';
|
|
6
|
+
|
|
7
|
+
// The table keyed by the field's key, as it is now. `custom_field_key` is a foreign key
|
|
8
|
+
// to the definition's immutable, unique `key`.
|
|
9
|
+
const KEY_SHAPE = {
|
|
10
|
+
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
11
|
+
custom_field_key: {type: 'string', maxlength: 191, nullable: false, references: 'members_custom_fields.key', cascadeDelete: true},
|
|
12
|
+
member_id: {type: 'string', maxlength: 24, nullable: false, references: 'members.id', cascadeDelete: true},
|
|
13
|
+
path: {type: 'string', maxlength: 191, nullable: false, defaultTo: ''},
|
|
14
|
+
value_text: {type: 'text', maxlength: 65535, nullable: true},
|
|
15
|
+
created_at: {type: 'dateTime', nullable: false},
|
|
16
|
+
updated_at: {type: 'dateTime', nullable: true},
|
|
17
|
+
'@@UNIQUE_CONSTRAINTS@@': [
|
|
18
|
+
{columns: ['member_id', 'custom_field_key', 'path'], indexName: 'members_custom_field_values_leaf_unique'}
|
|
19
|
+
],
|
|
20
|
+
'@@INDEXES@@': [
|
|
21
|
+
['custom_field_key', 'path']
|
|
22
|
+
]
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// The prior shape, keyed by the field's id. Rebuilding it exactly is what makes the
|
|
26
|
+
// rollback reversible: the earlier leaf-rows migration's `down` alters `custom_field_id`
|
|
27
|
+
// (re-adding its indexes), so that column has to be back before this migration hands the
|
|
28
|
+
// rollback on. Identical to KEY_SHAPE apart from the foreign key column.
|
|
29
|
+
const ID_SHAPE = {
|
|
30
|
+
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
31
|
+
custom_field_id: {type: 'string', maxlength: 24, nullable: false, references: 'members_custom_fields.id', cascadeDelete: true},
|
|
32
|
+
member_id: {type: 'string', maxlength: 24, nullable: false, references: 'members.id', cascadeDelete: true},
|
|
33
|
+
path: {type: 'string', maxlength: 191, nullable: false, defaultTo: ''},
|
|
34
|
+
value_text: {type: 'text', maxlength: 65535, nullable: true},
|
|
35
|
+
created_at: {type: 'dateTime', nullable: false},
|
|
36
|
+
updated_at: {type: 'dateTime', nullable: true},
|
|
37
|
+
'@@UNIQUE_CONSTRAINTS@@': [
|
|
38
|
+
{columns: ['member_id', 'custom_field_id', 'path'], indexName: 'members_custom_field_values_leaf_unique'}
|
|
39
|
+
],
|
|
40
|
+
'@@INDEXES@@': [
|
|
41
|
+
['custom_field_id', 'path']
|
|
42
|
+
]
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// SQLite cannot alter a foreign key in place, so the column swap is a drop-and-recreate
|
|
46
|
+
// rather than an ALTER. Existing rows are discarded either way: the feature is behind the
|
|
47
|
+
// `membersCustomFields` flag with no released data, so a wipe is cheaper than a backfill.
|
|
48
|
+
// Re-running after a mid-migration crash is safe — the table is dropped first if present.
|
|
49
|
+
async function rebuild(knex, shape) {
|
|
50
|
+
if (await knex.schema.hasTable(TABLE)) {
|
|
51
|
+
await commands.deleteTable(TABLE, knex);
|
|
52
|
+
}
|
|
53
|
+
await commands.createTable(TABLE, knex, shape);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
module.exports = createNonTransactionalMigration(
|
|
57
|
+
async function up(knex) {
|
|
58
|
+
logging.info('Keying members_custom_field_values by custom_field_key');
|
|
59
|
+
await rebuild(knex, KEY_SHAPE);
|
|
60
|
+
},
|
|
61
|
+
async function down(knex) {
|
|
62
|
+
logging.info('Reverting members_custom_field_values to custom_field_id');
|
|
63
|
+
await rebuild(knex, ID_SHAPE);
|
|
64
|
+
}
|
|
65
|
+
);
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
const logging = require('@tryghost/logging');
|
|
2
|
+
const ObjectID = require('bson-objectid').default;
|
|
3
|
+
const {
|
|
4
|
+
createTransactionalMigration,
|
|
5
|
+
combineTransactionalMigrations,
|
|
6
|
+
createRemovePermissionMigration
|
|
7
|
+
} = require('../../utils');
|
|
8
|
+
|
|
9
|
+
const INTEGRATION = {
|
|
10
|
+
type: 'core',
|
|
11
|
+
name: 'Ghost Explore',
|
|
12
|
+
slug: 'ghost-explore',
|
|
13
|
+
description: 'Built-in Ghost Explore integration'
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const ROLE = {
|
|
17
|
+
name: 'Ghost Explore Integration',
|
|
18
|
+
description: 'Internal Integration for the Ghost Explore directory'
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const PERMISSION = {
|
|
22
|
+
name: 'Read explore data',
|
|
23
|
+
action: 'read',
|
|
24
|
+
object: 'explore'
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// Mirrors the roles the permission was originally granted to in 5.3
|
|
28
|
+
const PERMISSION_ROLES = ['Administrator', 'Admin Integration', ROLE.name];
|
|
29
|
+
|
|
30
|
+
// `createRemovePermissionMigration` only unlinks the permission from roles, so any direct
|
|
31
|
+
// user grant would be left pointing at a deleted permission. Ghost only ever grants this
|
|
32
|
+
// via roles, so there is nothing to restore on the way back down.
|
|
33
|
+
const removeDirectUserGrants = createTransactionalMigration(
|
|
34
|
+
async function up(knex) {
|
|
35
|
+
const permission = await knex('permissions').where({
|
|
36
|
+
name: PERMISSION.name,
|
|
37
|
+
action_type: PERMISSION.action,
|
|
38
|
+
object_type: PERMISSION.object
|
|
39
|
+
}).first();
|
|
40
|
+
|
|
41
|
+
if (!permission) {
|
|
42
|
+
logging.warn(`Skipping cleanup of direct "${PERMISSION.name}" user grants - the permission does not exist`);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const removed = await knex('permissions_users').where('permission_id', permission.id).del();
|
|
47
|
+
logging.info(`Removed ${removed} direct "${PERMISSION.name}" user grants`);
|
|
48
|
+
},
|
|
49
|
+
async function down() {
|
|
50
|
+
logging.info(`Skipping restore of direct "${PERMISSION.name}" user grants - Ghost only grants it via roles`);
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
const removeIntegration = createTransactionalMigration(
|
|
55
|
+
async function up(knex) {
|
|
56
|
+
const integration = await knex('integrations').select('id').where('slug', INTEGRATION.slug).first();
|
|
57
|
+
|
|
58
|
+
if (!integration) {
|
|
59
|
+
logging.warn(`Skipping removal of ${INTEGRATION.slug} integration - it does not exist`);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
await knex('api_keys').where('integration_id', integration.id).del();
|
|
64
|
+
await knex('integrations').where('id', integration.id).del();
|
|
65
|
+
logging.info(`Removed ${INTEGRATION.slug} integration and API keys`);
|
|
66
|
+
},
|
|
67
|
+
async function down(knex) {
|
|
68
|
+
const existing = await knex('integrations').select('id').where('slug', INTEGRATION.slug).first();
|
|
69
|
+
|
|
70
|
+
if (existing) {
|
|
71
|
+
logging.warn(`Skipping restore of ${INTEGRATION.slug} integration - it already exists`);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
await knex('integrations').insert({
|
|
76
|
+
id: new ObjectID().toHexString(),
|
|
77
|
+
...INTEGRATION,
|
|
78
|
+
created_at: knex.raw('CURRENT_TIMESTAMP'),
|
|
79
|
+
updated_at: knex.raw('CURRENT_TIMESTAMP')
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
// Deliberately no API key: the original secret is unrecoverable, and a rollback is
|
|
83
|
+
// about getting the schema back to what the previous version expects rather than
|
|
84
|
+
// reconnecting Explore - ghost.org stopped calling this endpoint long ago. Anyone
|
|
85
|
+
// who needs Admin API access should create a custom integration instead.
|
|
86
|
+
logging.info(`Restored ${INTEGRATION.slug} integration without an API key`);
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
const removeRole = createTransactionalMigration(
|
|
91
|
+
async function up(knex) {
|
|
92
|
+
const role = await knex('roles').select('id').where('name', ROLE.name).first();
|
|
93
|
+
|
|
94
|
+
if (!role) {
|
|
95
|
+
logging.warn(`Skipping removal of ${ROLE.name} role - it does not exist`);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
await knex('api_keys').where('role_id', role.id).del();
|
|
100
|
+
await knex('permissions_roles').where('role_id', role.id).del();
|
|
101
|
+
await knex('roles_users').where('role_id', role.id).del();
|
|
102
|
+
await knex('roles').where('id', role.id).del();
|
|
103
|
+
logging.info(`Removed ${ROLE.name} role`);
|
|
104
|
+
},
|
|
105
|
+
async function down(knex) {
|
|
106
|
+
const existing = await knex('roles').select('id').where('name', ROLE.name).first();
|
|
107
|
+
|
|
108
|
+
if (existing) {
|
|
109
|
+
logging.warn(`Skipping restore of ${ROLE.name} role - it already exists`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
await knex('roles').insert({
|
|
114
|
+
id: new ObjectID().toHexString(),
|
|
115
|
+
...ROLE,
|
|
116
|
+
created_at: knex.raw('CURRENT_TIMESTAMP'),
|
|
117
|
+
updated_at: knex.raw('CURRENT_TIMESTAMP')
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
logging.info(`Restored ${ROLE.name} role`);
|
|
121
|
+
}
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
// Down migrations run in reverse, so the role is restored before the permission that has
|
|
125
|
+
// to be linked back to it
|
|
126
|
+
module.exports = combineTransactionalMigrations(
|
|
127
|
+
removeDirectUserGrants,
|
|
128
|
+
createRemovePermissionMigration(PERMISSION, PERMISSION_ROLES),
|
|
129
|
+
removeIntegration,
|
|
130
|
+
removeRole
|
|
131
|
+
);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const {createAddColumnMigration} = require('../../utils');
|
|
2
|
+
|
|
3
|
+
// The publisher's order for their custom fields. Every existing row takes the
|
|
4
|
+
// default, so a site that has never reordered ends up with one value repeated —
|
|
5
|
+
// which is why the read order tie-breaks on created_at: until the first reorder
|
|
6
|
+
// writes real ranks, the fields still come out in the order they were created.
|
|
7
|
+
// That is what makes this a column addition rather than a backfill.
|
|
8
|
+
module.exports = createAddColumnMigration('members_custom_fields', 'sort_order', {
|
|
9
|
+
type: 'integer',
|
|
10
|
+
nullable: false,
|
|
11
|
+
unsigned: true,
|
|
12
|
+
defaultTo: 0
|
|
13
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const {createNonTransactionalMigration} = require('../../utils');
|
|
2
|
+
const {addIndex, dropIndex, getIndexes} = require('../../../schema/commands');
|
|
3
|
+
|
|
4
|
+
const table = 'automation_runs';
|
|
5
|
+
const compositeIndexColumns = ['automation_id', 'created_at'];
|
|
6
|
+
const foreignKeyIndexColumns = ['automation_id'];
|
|
7
|
+
const foreignKeyIndexName = 'automation_runs_automation_id_index';
|
|
8
|
+
|
|
9
|
+
module.exports = createNonTransactionalMigration(
|
|
10
|
+
async function up(knex) {
|
|
11
|
+
await addIndex(table, compositeIndexColumns, knex);
|
|
12
|
+
|
|
13
|
+
// If this migration was rolled back (see `down`), we need to drop the
|
|
14
|
+
// index it created.
|
|
15
|
+
const indexes = await getIndexes(table, knex);
|
|
16
|
+
if (indexes.includes(foreignKeyIndexName)) {
|
|
17
|
+
await dropIndex(table, foreignKeyIndexColumns, knex);
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
async function down(knex) {
|
|
21
|
+
// Before this whole migration, MySQL had an implicit index on
|
|
22
|
+
// `automation_id` because it was referenced by foreign keys. Adding the
|
|
23
|
+
// composite index in `up` removes that, so we need to add it back if we
|
|
24
|
+
// reverse the migration.
|
|
25
|
+
await addIndex(table, foreignKeyIndexColumns, knex);
|
|
26
|
+
await dropIndex(table, compositeIndexColumns, knex);
|
|
27
|
+
}
|
|
28
|
+
);
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Schema and default data
|
|
2
|
+
|
|
3
|
+
This directory defines the database shape and the records a new Ghost database
|
|
4
|
+
starts with.
|
|
5
|
+
|
|
6
|
+
## Sources of truth
|
|
7
|
+
|
|
8
|
+
- `schema.js` is the final table and index structure expected after every
|
|
9
|
+
migration has run.
|
|
10
|
+
- `fixtures/fixtures.json` contains durable records and relationships required
|
|
11
|
+
by a new site, including roles, permissions, the owner, starter content,
|
|
12
|
+
tiers, and a newsletter.
|
|
13
|
+
- `default-settings/default-settings.json` defines the settings a site starts
|
|
14
|
+
with, grouped by responsibility.
|
|
15
|
+
|
|
16
|
+
The initialization migrations create the tables and then use the fixture
|
|
17
|
+
manager to add missing fixture records. The settings model flattens the grouped
|
|
18
|
+
default-settings file and inserts settings missing from the database. Some
|
|
19
|
+
values, such as signing keys and secrets, are generated when the defaults are
|
|
20
|
+
populated rather than stored in the JSON file.
|
|
21
|
+
|
|
22
|
+
Fixtures and default settings are different mechanisms. Fixtures create model
|
|
23
|
+
records and relationships; default settings describe rows in the `settings`
|
|
24
|
+
table.
|
|
25
|
+
|
|
26
|
+
## Fixtures
|
|
27
|
+
|
|
28
|
+
Fixture entries are added through their Bookshelf models. The fixture manager
|
|
29
|
+
checks for an existing record before inserting it, adds roles and the owner
|
|
30
|
+
before dependent records, and then creates the declared relationships.
|
|
31
|
+
|
|
32
|
+
Use fixtures only for records every new Ghost installation requires. Sample
|
|
33
|
+
development data belongs in the data generator, not in `fixtures.json`.
|
|
34
|
+
|
|
35
|
+
When changing fixtures:
|
|
36
|
+
|
|
37
|
+
1. Update `fixtures/fixtures.json`.
|
|
38
|
+
2. Add a database migration when existing installations need the same change.
|
|
39
|
+
3. Update affected models, exporter lists, and tests.
|
|
40
|
+
4. Run the schema integrity test documented in the
|
|
41
|
+
[database migrations guide](../../../../../../docs/practices/database-migrations.md).
|
|
42
|
+
|
|
43
|
+
## Default settings
|
|
44
|
+
|
|
45
|
+
The top-level keys in `default-settings/default-settings.json` become setting
|
|
46
|
+
groups. Each setting has a `defaultValue` and `type`, and may also declare
|
|
47
|
+
validation and flags. The settings model adds the group and key when it
|
|
48
|
+
flattens the file.
|
|
49
|
+
|
|
50
|
+
Supported setting types include `string`, `number`, `boolean`, `array`, and
|
|
51
|
+
`object`. Values are stored in the database in the representation expected by
|
|
52
|
+
the settings model and cache.
|
|
53
|
+
|
|
54
|
+
The flags used by settings migrations are:
|
|
55
|
+
|
|
56
|
+
- `PUBLIC`: identifies a setting intended for a public settings surface.
|
|
57
|
+
- `RO`: identifies a read-only setting.
|
|
58
|
+
- `PUBLIC,RO`: applies both flags.
|
|
59
|
+
|
|
60
|
+
Flags are part of the setting's stored contract, but each API surface still
|
|
61
|
+
controls which settings it selects and how they may be changed. Check the
|
|
62
|
+
relevant endpoint and serializer rather than assuming the flag alone grants
|
|
63
|
+
access.
|
|
64
|
+
|
|
65
|
+
The `core` group is restricted to internal access. Other groups organize
|
|
66
|
+
settings that are commonly read or edited together; they do not by themselves
|
|
67
|
+
make a setting public.
|
|
68
|
+
|
|
69
|
+
When adding or changing a default setting:
|
|
70
|
+
|
|
71
|
+
1. Update `default-settings/default-settings.json` for new installations.
|
|
72
|
+
2. Add a migration for existing installations. Use the settings migration
|
|
73
|
+
utilities rather than inserting a row by hand.
|
|
74
|
+
3. Update validation, API serializers, and tests when the setting's behaviour
|
|
75
|
+
requires it.
|
|
76
|
+
4. Run the schema integrity test.
|
|
77
|
+
|
|
78
|
+
Do not put environment-specific configuration in default settings. Runtime
|
|
79
|
+
configuration belongs in Ghost's configuration system; see the
|
|
80
|
+
[configuration guide](../../../../../../docs/codebase/configuration.md).
|
|
81
|
+
|
|
82
|
+
## Schema changes
|
|
83
|
+
|
|
84
|
+
Changing `schema.js` alone does not update an existing database. Every schema
|
|
85
|
+
change needs a migration that moves an installed database to the new shape.
|
|
86
|
+
Follow the [database migrations guide](../../../../../../docs/practices/database-migrations.md)
|
|
87
|
+
for generation, iteration, testing, and review requirements.
|
|
@@ -183,13 +183,16 @@ async function dropColumn(tableName, column, transaction = db.knex, columnSpec =
|
|
|
183
183
|
* @param {string} from
|
|
184
184
|
* @param {string} to
|
|
185
185
|
* @param {import('knex').Knex.Transaction} [transaction]
|
|
186
|
+
* @param {object} [options]
|
|
187
|
+
* @param {'instant'|'inplace'|'copy'|'auto'} [options.algorithm] - MySQL only
|
|
186
188
|
*/
|
|
187
|
-
async function renameColumn(tableName, from, to, transaction = db.knex) {
|
|
189
|
+
async function renameColumn(tableName, from, to, transaction = db.knex, options = {}) {
|
|
188
190
|
logging.info(`Renaming column '${from}' to '${to}' in table '${tableName}'`);
|
|
189
191
|
|
|
190
192
|
if (DatabaseInfo.isMySQL(transaction)) {
|
|
191
193
|
// The knex helper does a lot of interesting things with foreign keys that are slow on bigger MySQL clusters
|
|
192
|
-
|
|
194
|
+
const algorithm = options.algorithm && options.algorithm !== 'auto' ? `, algorithm=${options.algorithm}` : '';
|
|
195
|
+
return await transaction.raw(`ALTER TABLE \`${tableName}\` RENAME COLUMN \`${from}\` TO \`${to}\`${algorithm};`);
|
|
193
196
|
}
|
|
194
197
|
|
|
195
198
|
return await transaction.schema.table(tableName, function (table) {
|
|
@@ -60,6 +60,14 @@
|
|
|
60
60
|
"defaultValue": null,
|
|
61
61
|
"type": "string"
|
|
62
62
|
},
|
|
63
|
+
"machine_payments_secret": {
|
|
64
|
+
"defaultValue": null,
|
|
65
|
+
"type": "string"
|
|
66
|
+
},
|
|
67
|
+
"machine_payments_deposit_address": {
|
|
68
|
+
"defaultValue": null,
|
|
69
|
+
"type": "string"
|
|
70
|
+
},
|
|
63
71
|
"site_uuid": {
|
|
64
72
|
"defaultValue": null,
|
|
65
73
|
"type": "string",
|
|
@@ -194,6 +202,25 @@
|
|
|
194
202
|
"validations": {},
|
|
195
203
|
"type": "boolean"
|
|
196
204
|
},
|
|
205
|
+
"machine_payments_enabled": {
|
|
206
|
+
"defaultValue": "false",
|
|
207
|
+
"type": "boolean"
|
|
208
|
+
},
|
|
209
|
+
"machine_payments_currency": {
|
|
210
|
+
"defaultValue": null,
|
|
211
|
+
"type": "string"
|
|
212
|
+
},
|
|
213
|
+
"machine_payments_amount": {
|
|
214
|
+
"defaultValue": 100,
|
|
215
|
+
"validations": {
|
|
216
|
+
"isEmpty": false
|
|
217
|
+
},
|
|
218
|
+
"type": "number"
|
|
219
|
+
},
|
|
220
|
+
"machine_payments_stripe_profile_id": {
|
|
221
|
+
"defaultValue": null,
|
|
222
|
+
"type": "string"
|
|
223
|
+
},
|
|
197
224
|
"meta_title": {
|
|
198
225
|
"defaultValue": null,
|
|
199
226
|
"validations": {
|
|
@@ -99,10 +99,6 @@
|
|
|
99
99
|
"name": "Admin Integration",
|
|
100
100
|
"description": "External Apps"
|
|
101
101
|
},
|
|
102
|
-
{
|
|
103
|
-
"name": "Ghost Explore Integration",
|
|
104
|
-
"description": "Internal Integration for the Ghost Explore directory"
|
|
105
|
-
},
|
|
106
102
|
{
|
|
107
103
|
"name": "Self-Serve Migration Integration",
|
|
108
104
|
"description": "Internal Integration for the Self-Serve migration tool"
|
|
@@ -124,11 +120,6 @@
|
|
|
124
120
|
{
|
|
125
121
|
"name": "Permission",
|
|
126
122
|
"entries": [
|
|
127
|
-
{
|
|
128
|
-
"name": "Read explore data",
|
|
129
|
-
"action_type": "read",
|
|
130
|
-
"object_type": "explore"
|
|
131
|
-
},
|
|
132
123
|
{
|
|
133
124
|
"name": "Export database",
|
|
134
125
|
"action_type": "exportContent",
|
|
@@ -900,13 +891,6 @@
|
|
|
900
891
|
"type": "builtin",
|
|
901
892
|
"api_keys": [{"type": "admin"}]
|
|
902
893
|
},
|
|
903
|
-
{
|
|
904
|
-
"slug": "ghost-explore",
|
|
905
|
-
"name": "Ghost Explore",
|
|
906
|
-
"description": "Built-in Ghost Explore integration",
|
|
907
|
-
"type": "core",
|
|
908
|
-
"api_keys": [{"type": "admin", "role": "Ghost Explore Integration"}]
|
|
909
|
-
},
|
|
910
894
|
{
|
|
911
895
|
"slug": "self-serve-migration",
|
|
912
896
|
"name": "Self-Serve Migration Integration",
|
|
@@ -1002,7 +986,6 @@
|
|
|
1002
986
|
"authentication": "reset",
|
|
1003
987
|
"members_stripe_connect": "auth",
|
|
1004
988
|
"newsletter": "all",
|
|
1005
|
-
"explore": "read",
|
|
1006
989
|
"comment": "all",
|
|
1007
990
|
"link": "all",
|
|
1008
991
|
"mention": "browse",
|
|
@@ -1021,9 +1004,6 @@
|
|
|
1021
1004
|
"automation": "poll",
|
|
1022
1005
|
"gift": "flushReminders"
|
|
1023
1006
|
},
|
|
1024
|
-
"Ghost Explore Integration": {
|
|
1025
|
-
"explore": "read"
|
|
1026
|
-
},
|
|
1027
1007
|
"Self-Serve Migration Integration": {
|
|
1028
1008
|
"db": "importContent",
|
|
1029
1009
|
"content_import": "importContent",
|
|
@@ -1055,7 +1035,6 @@
|
|
|
1055
1035
|
"product": ["browse", "read", "add", "edit"],
|
|
1056
1036
|
"offer": ["browse", "read", "add", "edit"],
|
|
1057
1037
|
"newsletter": ["browse", "read", "add", "edit"],
|
|
1058
|
-
"explore": "read",
|
|
1059
1038
|
"comment": "all",
|
|
1060
1039
|
"link": "all",
|
|
1061
1040
|
"mention": "browse",
|
|
@@ -675,12 +675,23 @@ module.exports = {
|
|
|
675
675
|
}
|
|
676
676
|
},
|
|
677
677
|
status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'active', validations: {isIn: [['active', 'archived']]}},
|
|
678
|
+
// The publisher's order for the list, rewritten across every row whenever the
|
|
679
|
+
// list is reordered. Only the relative order carries meaning: creates append past
|
|
680
|
+
// the highest rank and deletes leave gaps, so the values are not a dense
|
|
681
|
+
// sequence. The default leaves a site that has never reordered with one value
|
|
682
|
+
// repeated, so reads tie-break on created_at and fall back to the order the
|
|
683
|
+
// fields were created in.
|
|
684
|
+
sort_order: {type: 'integer', nullable: false, unsigned: true, defaultTo: 0},
|
|
678
685
|
created_at: {type: 'dateTime', nullable: false},
|
|
679
686
|
updated_at: {type: 'dateTime', nullable: true}
|
|
680
687
|
},
|
|
681
688
|
members_custom_field_values: {
|
|
682
689
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
683
|
-
|
|
690
|
+
// The field's stable key, not its id: a value is addressed by key everywhere it
|
|
691
|
+
// matters (the write names it, a filter names it, the key is immutable), so the row
|
|
692
|
+
// carries it directly and the read and filter paths skip an id-to-key join. Matches
|
|
693
|
+
// the referenced column's 191, as a foreign key must.
|
|
694
|
+
custom_field_key: {type: 'string', maxlength: 191, nullable: false, references: 'members_custom_fields.key', cascadeDelete: true},
|
|
684
695
|
member_id: {type: 'string', maxlength: 24, nullable: false, references: 'members.id', cascadeDelete: true},
|
|
685
696
|
// Which part of the field's value this row carries. A scalar has one part and
|
|
686
697
|
// stores it under the empty path; a composite stores one row per sub-field it
|
|
@@ -696,12 +707,12 @@ module.exports = {
|
|
|
696
707
|
value_text: {type: 'text', maxlength: 65535, nullable: true},
|
|
697
708
|
created_at: {type: 'dateTime', nullable: false},
|
|
698
709
|
updated_at: {type: 'dateTime', nullable: true},
|
|
699
|
-
// Named, because the name knex derives from the table and all three columns
|
|
700
|
-
//
|
|
701
|
-
// table already shortened a column for the same reason; a third
|
|
702
|
-
// what headroom that bought.
|
|
710
|
+
// Named, because the name knex derives from the table and all three columns
|
|
711
|
+
// overruns MySQL's 64-character identifier limit. The migration that first
|
|
712
|
+
// created this table already shortened a column for the same reason; a third
|
|
713
|
+
// column spends what headroom that bought.
|
|
703
714
|
'@@UNIQUE_CONSTRAINTS@@': [
|
|
704
|
-
{columns: ['member_id', '
|
|
715
|
+
{columns: ['member_id', 'custom_field_key', 'path'], indexName: 'members_custom_field_values_leaf_unique'}
|
|
705
716
|
],
|
|
706
717
|
// What a segment filter looks up: every member holding a given value for a
|
|
707
718
|
// given part of a given field. The value itself is not in the index — it is
|
|
@@ -709,7 +720,7 @@ module.exports = {
|
|
|
709
720
|
// applies one length to every column in a composite index rather than to a
|
|
710
721
|
// single chosen one.
|
|
711
722
|
'@@INDEXES@@': [
|
|
712
|
-
['
|
|
723
|
+
['custom_field_key', 'path']
|
|
713
724
|
]
|
|
714
725
|
},
|
|
715
726
|
members_stripe_customers: {
|
|
@@ -838,6 +849,20 @@ module.exports = {
|
|
|
838
849
|
['newsletter_id', 'created_at']
|
|
839
850
|
]
|
|
840
851
|
},
|
|
852
|
+
machine_payment_events: {
|
|
853
|
+
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
854
|
+
post_id: {type: 'string', maxlength: 24, nullable: false, references: 'posts.id', cascadeDelete: true},
|
|
855
|
+
amount: {type: 'integer', nullable: false},
|
|
856
|
+
currency: {type: 'string', maxlength: 50, nullable: false},
|
|
857
|
+
protocol: {type: 'string', maxlength: 50, nullable: false},
|
|
858
|
+
method: {type: 'string', maxlength: 50, nullable: false},
|
|
859
|
+
stripe_payment_intent_id: {type: 'string', maxlength: 255, nullable: true, unique: true},
|
|
860
|
+
reference: {type: 'string', maxlength: 255, nullable: false},
|
|
861
|
+
created_at: {type: 'dateTime', nullable: false},
|
|
862
|
+
'@@UNIQUE_CONSTRAINTS@@': [
|
|
863
|
+
['protocol', 'reference']
|
|
864
|
+
]
|
|
865
|
+
},
|
|
841
866
|
donation_payment_events: {
|
|
842
867
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
843
868
|
name: {type: 'string', maxlength: 191, nullable: true},
|
|
@@ -949,7 +974,7 @@ module.exports = {
|
|
|
949
974
|
email_batches: {
|
|
950
975
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
951
976
|
email_id: {type: 'string', maxlength: 24, nullable: false, references: 'emails.id'},
|
|
952
|
-
|
|
977
|
+
mailgun_message_id: {type: 'string', maxlength: 255, nullable: true},
|
|
953
978
|
fallback_sending_domain: {type: 'boolean', nullable: false, defaultTo: false},
|
|
954
979
|
status: {
|
|
955
980
|
type: 'string',
|
|
@@ -1306,7 +1331,10 @@ module.exports = {
|
|
|
1306
1331
|
updated_at: {type: 'dateTime', nullable: false},
|
|
1307
1332
|
automation_id: {type: 'string', maxlength: 24, nullable: false, references: 'automations.id', restrictDelete: true},
|
|
1308
1333
|
member_id: {type: 'string', maxlength: 24, nullable: true, references: 'members.id', setNullDelete: true, index: true},
|
|
1309
|
-
member_email: {type: 'string', maxlength: 191, nullable: false, validations: {isEmail: true}}
|
|
1334
|
+
member_email: {type: 'string', maxlength: 191, nullable: false, validations: {isEmail: true}},
|
|
1335
|
+
'@@INDEXES@@': [
|
|
1336
|
+
['automation_id', 'created_at']
|
|
1337
|
+
]
|
|
1310
1338
|
},
|
|
1311
1339
|
automation_run_steps: {
|
|
1312
1340
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
@@ -61,7 +61,9 @@ class DataGenerator {
|
|
|
61
61
|
const referencedTable = data.references.split('.')[0];
|
|
62
62
|
// Some nullable relationships point to tables the generator does not populate.
|
|
63
63
|
// Generated redirects belong to posts, so automation revisions are not a seed dependency.
|
|
64
|
-
const isUnsupportedOptionalDependency = referencedTable === 'subscriptions'
|
|
64
|
+
const isUnsupportedOptionalDependency = referencedTable === 'subscriptions'
|
|
65
|
+
|| (referencedTable === 'automation_action_revisions' && data.nullable)
|
|
66
|
+
|| (table.name === 'automation_action_revisions' && referencedTable === 'email_design_settings' && data.nullable);
|
|
65
67
|
if (!acc.includes(referencedTable) && !isUnsupportedOptionalDependency) {
|
|
66
68
|
acc.push(referencedTable);
|
|
67
69
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AutomationActionEdgesImporter = void 0;
|
|
4
|
+
const table_importer_1 = require("./table-importer");
|
|
5
|
+
class AutomationActionEdgesImporter extends table_importer_1.TableImporter {
|
|
6
|
+
static table = 'automation_action_edges';
|
|
7
|
+
static dependencies = ['automation_actions'];
|
|
8
|
+
constructor(knex, transaction) {
|
|
9
|
+
super(AutomationActionEdgesImporter.table, knex, transaction);
|
|
10
|
+
}
|
|
11
|
+
async import() {
|
|
12
|
+
const actions = await this.transaction
|
|
13
|
+
.select('id', 'automation_id', 'created_at')
|
|
14
|
+
.from('automation_actions')
|
|
15
|
+
.orderBy('automation_id')
|
|
16
|
+
.orderBy('created_at')
|
|
17
|
+
.orderBy('id');
|
|
18
|
+
const actionsByAutomation = new Map();
|
|
19
|
+
for (const action of actions) {
|
|
20
|
+
const automationActions = actionsByAutomation.get(action.automation_id) ?? [];
|
|
21
|
+
automationActions.push(action);
|
|
22
|
+
actionsByAutomation.set(action.automation_id, automationActions);
|
|
23
|
+
}
|
|
24
|
+
const edges = [];
|
|
25
|
+
for (const automationActions of actionsByAutomation.values()) {
|
|
26
|
+
for (let index = 1; index < automationActions.length; index += 1) {
|
|
27
|
+
edges.push({
|
|
28
|
+
source_action_id: automationActions[index - 1].id,
|
|
29
|
+
target_action_id: automationActions[index].id
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (edges.length > 0) {
|
|
34
|
+
await this.batchInsert(edges);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.AutomationActionEdgesImporter = AutomationActionEdgesImporter;
|