ghost 6.53.0 → 6.54.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/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-scheduling-0.1.1.tgz +0 -0
- package/components/tryghost-adapter-base-sso-0.1.1.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-converters-1.2.3.tgz +0 -0
- package/components/tryghost-kg-default-nodes-2.1.3.tgz +0 -0
- package/components/tryghost-kg-lexical-html-renderer-1.4.3.tgz +0 -0
- package/core/boot.js +9 -6
- package/core/built/admin/assets/Combination-CJG7Flp-.js +41 -0
- package/core/built/admin/assets/Growth-CSaHoSVD.js +3 -0
- package/core/built/admin/assets/Newsletters-C5cs6FGo.js +1 -0
- package/core/built/admin/assets/Overview-j4NaeUNm.js +1 -0
- package/core/built/admin/assets/{PolarAngleAxis-pciQ0MOy.js → PolarAngleAxis-BGjf7sBu.js} +1 -1
- package/core/built/admin/assets/{RadialBarChart-DWmw2PcX.js → RadialBarChart-zeFf9mBz.js} +1 -1
- package/core/built/admin/assets/Web-_fD935OX.js +2 -0
- package/core/built/admin/assets/account-migration-DLvVA5yq.js +1 -0
- package/core/built/admin/assets/activitypub/{account-migration-BPZG37DJ.js → account-migration-DHbZcxGM.js} +13 -13
- package/core/built/admin/assets/activitypub/activitypub.js +7 -7
- package/core/built/admin/assets/activitypub/{avatar-ZYco0ITb.js → avatar-B3DEDB1l.js} +10 -10
- package/core/built/admin/assets/activitypub/{avatar-flipboard-D541lc4F.js → avatar-flipboard-Cqrg0XMx.js} +3 -3
- package/core/built/admin/assets/activitypub/{bluesky-sharing-NOHUtHjl.js → bluesky-sharing-zfxUey_L.js} +38 -37
- package/core/built/admin/assets/activitypub/{chunk-KS7C4IRE-B-GOFDPZ.js → chunk-KS7C4IRE-D4HEcEwi.js} +716 -710
- package/core/built/admin/assets/activitypub/{content-formatters-bwrp4iEO.js → content-formatters-BpQARh28.js} +229 -181
- package/core/built/admin/assets/activitypub/{copy-C7m7ovHw.js → copy-D9UWIAan.js} +2 -2
- package/core/built/admin/assets/activitypub/{dist-B5ira32t.js → dist-Ba_QxHHl.js} +5 -5
- package/core/built/admin/assets/activitypub/{domain-iqE4YXwD.js → domain-CmwSZLHK.js} +33 -33
- package/core/built/admin/assets/activitypub/{edit-profile-B8MFYh28.js → edit-profile-CXdwNmVG.js} +46 -45
- package/core/built/admin/assets/activitypub/{explore-BbdKodp3.js → explore-DfbjzGM1.js} +20 -20
- package/core/built/admin/assets/activitypub/{feed-Cl3A5owG.js → feed-DSEBJOqf.js} +15 -15
- package/core/built/admin/assets/activitypub/{field-DL6WyR-c.js → field-CY7XVcx6.js} +13 -13
- package/core/built/admin/assets/activitypub/{hash-6G3DzwL9.js → hash-BC9Q0N4c.js} +2 -2
- package/core/built/admin/assets/activitypub/{inbox-YmhuBice.js → inbox-DQ4ZnC1m.js} +2 -2
- package/core/built/admin/assets/activitypub/inbox-DtQ0kytT.js +1221 -0
- package/core/built/admin/assets/activitypub/{label-DGbLjDvE.js → label-Dw96GQ7u.js} +6 -6
- package/core/built/admin/assets/activitypub/layout-IdVq3lRy.js +1 -0
- package/core/built/admin/assets/activitypub/{moderation-qnBtk1zS.js → moderation-Dg_-I-8C.js} +32 -31
- package/core/built/admin/assets/activitypub/{note-C7ZRoSJv.js → note-Cy1-uKMY.js} +21 -21
- package/core/built/admin/assets/activitypub/{notifications-DiEA4b1o.js → notifications-B_fvoLIM.js} +17 -17
- package/core/built/admin/assets/activitypub/{onboarding-_JVgEwgV.js → onboarding-BFDkzeR2.js} +2 -2
- package/core/built/admin/assets/activitypub/{onboarding-DG4zu3qM.js → onboarding-D6rcBdPe.js} +5 -5
- package/core/built/admin/assets/activitypub/{preferences-B3FtocnP.js → preferences-ByJseZp6.js} +1607 -1606
- package/core/built/admin/assets/activitypub/{profile-D8ZJfYXB.js → profile-BFtbnIjz.js} +264 -263
- package/core/built/admin/assets/activitypub/{reply-C1vggenw.js → reply-CpdMeAO5.js} +2 -2
- package/core/built/admin/assets/activitypub/{routes-BOii-V9n.js → routes-Dh3xXfce.js} +1311 -1295
- package/core/built/admin/assets/activitypub/{separator-1gNokN5S.js → separator-BI1FLsYM.js} +4 -4
- package/core/built/admin/assets/activitypub/{settings--9Sb0nbl.js → settings-DTgqJPxM.js} +14 -14
- package/core/built/admin/assets/activitypub/{site-fkMmqv0V.js → site-CdL9ZLqm.js} +10 -10
- package/core/built/admin/assets/activitypub/{step-1-QhivSMw2.js → step-1-DIDg4aHb.js} +15 -15
- package/core/built/admin/assets/activitypub/{step-2-pMk9YwqD.js → step-2-BfGe8BYt.js} +7 -7
- package/core/built/admin/assets/activitypub/{step-3-DvmVC1fo.js → step-3-mE9spAqw.js} +12 -12
- package/core/built/admin/assets/activitypub/{tabs-Dc0FEEYD.js → tabs-ogqwoBlb.js} +241 -237
- package/core/built/admin/assets/activitypub/{topic-filter-CuDyM5bD.js → topic-filter-DLHBZT93.js} +4 -4
- package/core/built/admin/assets/activitypub/use-activity-pub-queries-VzbN99u_.js +1957 -0
- package/core/built/admin/assets/activitypub/{use-navigate-with-base-path-Drx1kdAK.js → use-navigate-with-base-path-CAwXTmqH.js} +165 -175
- package/core/built/admin/assets/activitypub/{use-reply-chain-data-BHkCHcW5.js → use-reply-chain-data-CxonteFD.js} +8 -8
- package/core/built/admin/assets/activitypub/users-BLeiOTHc.js +1464 -0
- package/core/built/admin/assets/activitypub/{x-BHCEe-c2.js → x-C8tAnXly.js} +2 -2
- package/core/built/admin/assets/{audience-adiFehTD.js → audience-BKRdsFmy.js} +1 -1
- package/core/built/admin/assets/{automated-emails-UWM02CMr.js → automated-emails-Cn87L5Md.js} +1 -1
- package/core/built/admin/assets/automations-B7-y3dXt.js +1 -0
- package/core/built/admin/assets/automations-BP_aHamJ.js +1 -0
- package/core/built/admin/assets/{avatar-flipboard-Lz3F9fNT.js → avatar-flipboard-C6Kj3Awu.js} +1 -1
- package/core/built/admin/assets/bluesky-sharing-Bh36XPh4.js +1 -0
- package/core/built/admin/assets/box-BWbhXh21.js +1 -0
- package/core/built/admin/assets/breadcrumb-D34YWnaw.js +1 -0
- package/core/built/admin/assets/card-DGoDJzrn.js +1 -0
- package/core/built/admin/assets/{chart-ChpW-NzQ.js → chart-BuRT2Y6p.js} +14 -14
- package/core/built/admin/assets/chart-helpers-DbklaJw9.js +1 -0
- package/core/built/admin/assets/checkbox-DA4-1UiI.js +1 -0
- package/core/built/admin/assets/chunk.524.45e0875f41b71e46e849.js +25 -0
- package/core/built/admin/assets/chunk.582.51defd4b009f0de8d4d5.js +27 -0
- package/core/built/admin/assets/{chunk.831.0703a12e49f51cec3f3a.js → chunk.589.096f4d0bb775e5229aa9.js} +78 -85
- package/core/built/admin/assets/{chunk.432.c2caa0b20f03e71d1a35.js → chunk.962.b73442b07be930bb5d85.js} +2216 -3188
- package/core/built/admin/assets/{chunk.432.c2caa0b20f03e71d1a35.js.LICENSE.txt → chunk.962.b73442b07be930bb5d85.js.LICENSE.txt} +0 -63
- package/core/built/admin/assets/code-editor-view-BKBrkffZ.js +1 -0
- package/core/built/admin/assets/comments-CzVNIT8b.js +1 -0
- package/core/built/admin/assets/container-BYz2Ed39.js +1 -0
- package/core/built/admin/assets/data-list-16rkJYYi.js +1 -0
- package/core/built/admin/assets/date-range-select-B5vSsrpx.js +1 -0
- package/core/built/admin/assets/disabled-sources-indicator-NkOIoMue.js +1 -0
- package/core/built/admin/assets/{dist-CsekE4FL.js → dist-CQJY6SVY.js} +1 -1
- package/core/built/admin/assets/dist-DGzPJ_bO.js +4 -0
- package/core/built/admin/assets/{dist-BbGrW05X.js → dist-DyViJwIy.js} +1 -1
- package/core/built/admin/assets/dist-Ndy-PuGN.js +1 -0
- package/core/built/admin/assets/dist-P_ohUlTi.js +1 -0
- package/core/built/admin/assets/domain-B7_n5nfx.js +1 -0
- package/core/built/admin/assets/dropzone-DcuJEEUf.js +5 -0
- package/core/built/admin/assets/edit-profile-rvDGrS8J.js +1 -0
- package/core/built/admin/assets/editor-BCiIyFjm.js +8 -0
- package/core/built/admin/assets/empty-indicator-oX1u1Pkn.js +1 -0
- package/core/built/admin/assets/esm-CFX93H5M.js +2 -0
- package/core/built/admin/assets/explore-BZAZOg5X.js +1 -0
- package/core/built/admin/assets/feed-CFV8xDw9.js +1 -0
- package/core/built/admin/assets/field-BW-M2Zwp.js +1 -0
- package/core/built/admin/assets/{filter-sources-v39ihhhV.js → filter-sources-Fx8wiYYw.js} +1 -1
- package/core/built/admin/assets/filters-CGX_pf2N.js +1 -0
- package/core/built/admin/assets/filters-DtcXMZDU.js +1 -0
- package/core/built/admin/assets/framework-provider-CmtnPXIT.js +4 -0
- package/core/built/admin/assets/{ghost-b57f077997b739a8ae9a70772dc016cb.js → ghost-b1dce91ad3232cc259ee5fbbf9526243.js} +294 -290
- package/core/built/admin/assets/ghost-dark-c8d0ab7f515b2010c173e23e9b32ea8a.css +1 -0
- package/core/built/admin/assets/gift-link-modal-Bk8qpnMw.js +1 -0
- package/core/built/admin/assets/{gift-links-CY3GwiVi.js → gift-links-nBxJjZiQ.js} +1 -1
- package/core/built/admin/assets/growth-Ck2s3JjR.js +1 -0
- package/core/built/admin/assets/hooks-BApwwBE0.js +2 -0
- package/core/built/admin/assets/{inbox-TEISAmth.js → inbox-BRp1_aaC.js} +35 -35
- package/core/built/admin/assets/index-BBf502Wg.js +69 -0
- package/core/built/admin/assets/index-BCCZKxP2.css +1 -0
- package/core/built/admin/assets/inline-EMAm3okk.js +1 -0
- package/core/built/admin/assets/input-group-DjuYnNCd.js +1 -0
- package/core/built/admin/assets/{react-dom-C6aoWSfl.js → jsx-runtime-DX3WBWVO.js} +1 -1
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.js +5 -2
- package/core/built/admin/assets/koenig-lexical/koenig-lexical.umd.js +2 -2
- package/core/built/admin/assets/{koenig-lexical-Di7b48ED.js → koenig-lexical-CM7UFNdL.js} +2 -2
- package/core/built/admin/assets/kpi-card-BrGH6FsT.js +1 -0
- package/core/built/admin/assets/kpi-card-CIGyijjx.js +1 -0
- package/core/built/admin/assets/kpi-helpers-_HRRsklE.js +1 -0
- package/core/built/admin/assets/kpi-tabs-BSvh9eoq.js +1 -0
- package/core/built/admin/assets/label-BOR9XdKl.js +1 -0
- package/core/built/admin/assets/label-picker-BdNAWuUX.js +1 -0
- package/core/built/admin/assets/{labels-GbxlXWtf.js → labels-Cyayfd-e.js} +1 -1
- package/core/built/admin/assets/layout-Bw4GnxXp.js +1 -0
- package/core/built/admin/assets/limit-service-9fwD33lU.js +20 -0
- package/core/built/admin/assets/link-helpers-tOlxmuH5.js +1 -0
- package/core/built/admin/assets/list-page-B6ANtzkd.js +1 -0
- package/core/built/admin/assets/mailchimp-Ds_NQ04w.svg +9 -0
- package/core/built/admin/assets/member-custom-fields-DvFyamLu.js +1 -0
- package/core/built/admin/assets/member-detail-Cg2vTqvJ.js +1 -0
- package/core/built/admin/assets/members-DsPxYAVm.js +10 -0
- package/core/built/admin/assets/modals-Bf_fyvHZ.js +31 -0
- package/core/built/admin/assets/moderation-Dlp7M5sa.js +1 -0
- package/core/built/admin/assets/multi-select-combobox-CH1o8XXQ.js +1 -0
- package/core/built/admin/assets/newsletter-CQ5CAYUI.js +1 -0
- package/core/built/admin/assets/{newsletters-DZm3yLj8.js → newsletters-D1jbtV-h.js} +1 -1
- package/core/built/admin/assets/note-BrAZ7Z0o.js +1 -0
- package/core/built/admin/assets/notifications-BnbHLOPC.js +1 -0
- package/core/built/admin/assets/nql-lang-B7faUf8D.js +19 -0
- package/core/built/admin/assets/{offers-D11QtPXX.js → offers-CrY6nSRR.js} +1 -1
- package/core/built/admin/assets/onboarding-route-eU146kuA.js +1 -0
- package/core/built/admin/assets/overview-BpbaK-xu.js +1 -0
- package/core/built/admin/assets/page-header-C0jVxtS8.js +1 -0
- package/core/built/admin/assets/{pages-BnObVRrf.js → pages-BbNWFcGj.js} +1 -1
- package/core/built/admin/assets/pintura-CXOmq-5H.svg +15 -0
- package/core/built/admin/assets/post-analytics-Iw7dk1mT.js +1 -0
- package/core/built/admin/assets/post-analytics-header-D9pJ4iNm.js +1 -0
- package/core/built/admin/assets/{post-analytics-provider-DSfBCtnj.js → post-analytics-provider-BDqcfBor.js} +1 -1
- package/core/built/admin/assets/post-share-modal-DBfKl2GZ.js +1 -0
- package/core/built/admin/assets/{posts-CwH8VJvB.js → posts-EWpZIjkr.js} +1 -1
- package/core/built/admin/assets/preferences-D4EANGoc.js +5 -0
- package/core/built/admin/assets/profile-dJ44Bn_W.js +1 -0
- package/core/built/admin/assets/{referrers-nxR52jPI.js → referrers-BCfFYSHc.js} +1 -1
- package/core/built/admin/assets/router-provider-C1R4AZ2o.js +1 -0
- package/core/built/admin/assets/select--2uVN9_-.js +1 -0
- package/core/built/admin/assets/settings-Bz3RZRmE.js +1 -0
- package/core/built/admin/assets/settings-SD9bxIpt.js +4 -0
- package/core/built/admin/assets/share-modal-CkdTTMJd.js +1 -0
- package/core/built/admin/assets/social-urls-BvFZwYcE.js +8 -0
- package/core/built/admin/assets/sort-button-DZp9Y2r1.js +1 -0
- package/core/built/admin/assets/source-icon-CHr9qJ2Y.js +1 -0
- package/core/built/admin/assets/stack-xiN0eQ6Z.js +1 -0
- package/core/built/admin/assets/stats-DGoXZxWE.js +1 -0
- package/core/built/admin/assets/stats-view-D2-1L0ms.js +1 -0
- package/core/built/admin/assets/step-1-RdahbwyG.js +1 -0
- package/core/built/admin/assets/step-2-D83PeRwd.js +1 -0
- package/core/built/admin/assets/step-3-p_Op4wv4.js +2 -0
- package/core/built/admin/assets/switch-qp518gFQ.js +1 -0
- package/core/built/admin/assets/table-B8LgTQJZ.js +1 -0
- package/core/built/admin/assets/tabs-D3ZOYkM7.js +1 -0
- package/core/built/admin/assets/tags-B4l891z2.js +1 -0
- package/core/built/admin/assets/text-DwtjwGkh.js +1 -0
- package/core/built/admin/assets/textarea-CTlb3Uu6.js +1 -0
- package/core/built/admin/assets/{tiers-EghDzCKc.js → tiers-BgYLWRJv.js} +1 -1
- package/core/built/admin/assets/toggle-group-DNXDkAwf.js +1 -0
- package/core/built/admin/assets/topic-filter-DZGjEcz3.js +1 -0
- package/core/built/admin/assets/{use-analytics-data-0l_OHtnR.js → use-analytics-data-CaT8RirX.js} +1 -1
- package/core/built/admin/assets/use-filter-params-DeQ8sX4N.js +1 -0
- package/core/built/admin/assets/use-growth-stats-9Db2CuJe.js +1 -0
- package/core/built/admin/assets/{use-post-referrers-DwI31Ril.js → use-post-referrers-BV54YcQS.js} +1 -1
- package/core/built/admin/assets/use-reply-chain-data-DuYZGDan.js +1 -0
- package/core/built/admin/assets/use-simple-pagination-8fTua9Nt.js +1 -0
- package/core/built/admin/assets/{use-tinybird-query-DvZBBMG7.js → use-tinybird-query-Dz156HvZ.js} +1 -1
- package/core/built/admin/assets/{use-tinybird-token-CQtebkvU.js → use-tinybird-token-C9RUdL_n.js} +1 -1
- package/core/built/admin/assets/{users-Pc8IRjk9.js → users-CcSCQFcQ.js} +1 -1
- package/core/built/admin/assets/virtual-list-BCvP0YF-.js +1 -0
- package/core/built/admin/assets/web-DTZnnUGr.js +1 -0
- package/core/built/admin/index.html +18 -22
- package/core/frontend/apps/private-blogging/index.js +1 -1
- package/core/frontend/apps/private-blogging/lib/middleware.js +1 -1
- package/core/frontend/helpers/split.js +2 -1
- package/core/frontend/meta/asset-url.js +1 -1
- package/core/frontend/meta/author-image.js +1 -1
- package/core/frontend/meta/blog-logo.js +1 -1
- package/core/frontend/meta/canonical-url.js +1 -1
- package/core/frontend/meta/cover-image.js +1 -1
- package/core/frontend/meta/get-meta.js +1 -1
- package/core/frontend/meta/og-image.js +1 -1
- package/core/frontend/meta/paginated-url.js +1 -1
- package/core/frontend/meta/twitter-image.js +1 -1
- package/core/frontend/meta/url.js +1 -1
- package/core/frontend/services/assets-minification/admin-auth-assets.js +1 -1
- package/core/frontend/services/llms/handler.js +1 -1
- package/core/frontend/services/proxy.js +31 -2
- package/core/frontend/services/routing/collection-router.js +1 -1
- package/core/frontend/services/routing/controllers/email-post.js +1 -1
- package/core/frontend/services/routing/controllers/entry/markdown.js +1 -1
- package/core/frontend/services/routing/controllers/entry/markdown.ts +1 -1
- package/core/frontend/services/routing/controllers/entry.js +1 -1
- package/core/frontend/services/routing/controllers/entry.ts +1 -1
- package/core/frontend/services/routing/controllers/previews.js +6 -7
- package/core/frontend/services/routing/controllers/unsubscribe.js +7 -3
- package/core/frontend/services/routing/email-router.js +1 -1
- package/core/frontend/services/routing/events.js +12 -0
- package/core/frontend/services/routing/middleware/page-param.js +1 -1
- package/core/frontend/services/routing/parent-router.js +1 -1
- package/core/frontend/services/routing/preview-router.js +1 -1
- package/core/frontend/services/routing/router-manager.js +4 -8
- package/core/frontend/services/routing/rss-router.js +1 -1
- package/core/frontend/services/routing/static-pages-router.js +1 -1
- package/core/frontend/services/routing/static-routes-router.js +1 -1
- package/core/frontend/services/routing/taxonomy-router.js +1 -1
- package/core/frontend/services/rss/generate-feed.js +1 -1
- package/core/frontend/services/sitemap/base-site-map-generator.js +23 -4
- package/core/frontend/services/sitemap/site-map-index-generator.js +1 -1
- package/core/frontend/services/sitemap/site-map-manager.js +14 -8
- package/core/frontend/services/sitemap/utils.js +1 -1
- package/core/frontend/services/theme-engine/middleware/update-global-template-options.js +1 -1
- package/core/frontend/services/theme-engine/middleware/update-local-template-options.js +1 -1
- package/core/frontend/utils/images.js +1 -1
- package/core/frontend/web/middleware/admin-toolbar.js +1 -1
- package/core/frontend/web/middleware/handle-image-sizes.js +2 -2
- package/core/frontend/web/middleware/redirect-ghost-to-admin.js +1 -1
- package/core/frontend/web/routers/serve-favicon.js +1 -1
- package/core/frontend/web/routers/serve-public-file.js +1 -1
- package/core/frontend/web/site.js +5 -5
- package/core/server/adapters/cache/AdapterCacheMemoryTTL.js +2 -2
- package/core/server/adapters/cache/MemoryCache.js +2 -2
- package/core/server/adapters/cache/Redis.js +1 -1
- package/core/server/adapters/cache/index.js +1 -1
- package/core/server/adapters/lib/redis/AdapterCacheRedis.js +2 -2
- package/core/server/adapters/route-settings/FileStore.js +2 -8
- package/core/server/adapters/route-settings/FileStore.ts +1 -6
- package/core/server/adapters/route-settings/S3RouteSettingsStore.js +206 -0
- package/core/server/adapters/route-settings/S3RouteSettingsStore.ts +199 -0
- package/core/server/adapters/route-settings/utils.js +13 -0
- package/core/server/adapters/route-settings/utils.ts +7 -0
- package/core/server/adapters/scheduling/deps.d.ts +0 -2
- package/core/server/adapters/scheduling/error-capture.js +76 -0
- package/core/server/adapters/scheduling/error-capture.ts +91 -0
- package/core/server/adapters/scheduling/utils.js +18 -34
- package/core/server/adapters/scheduling/utils.ts +36 -0
- package/core/server/adapters/storage/LocalFilesStorage.js +1 -1
- package/core/server/adapters/storage/LocalImagesStorage.js +1 -1
- package/core/server/adapters/storage/LocalMediaStorage.js +1 -1
- package/core/server/adapters/storage/LocalStorageBase.js +3 -3
- package/core/server/adapters/storage/S3Storage.js +2 -2
- package/core/server/adapters/storage/S3Storage.ts +1 -1
- package/core/server/adapters/storage/utils.js +1 -1
- package/core/server/api/endpoints/authentication.js +1 -1
- package/core/server/api/endpoints/featurebase.js +1 -1
- package/core/server/api/endpoints/files.js +2 -2
- package/core/server/api/endpoints/images.js +2 -2
- package/core/server/api/endpoints/libraries.d.ts +0 -1
- package/core/server/api/endpoints/media.js +8 -5
- package/core/server/api/endpoints/member-custom-fields.js +4 -1
- package/core/server/api/endpoints/member-custom-fields.ts +4 -1
- package/core/server/api/endpoints/posts.js +17 -1
- package/core/server/api/endpoints/search-index-public.js +4 -3
- package/core/server/api/endpoints/search-index.js +5 -4
- package/core/server/api/endpoints/settings-public.js +1 -1
- package/core/server/api/endpoints/settings.js +3 -1
- package/core/server/api/endpoints/utils/serializers/input/utils/url.js +9 -1
- package/core/server/api/endpoints/utils/serializers/output/default.js +7 -0
- package/core/server/api/endpoints/utils/serializers/output/files.js +1 -1
- package/core/server/api/endpoints/utils/serializers/output/media.js +1 -1
- package/core/server/api/endpoints/utils/serializers/output/member-custom-fields.js +7 -4
- package/core/server/api/endpoints/utils/serializers/output/member-custom-fields.ts +8 -4
- package/core/server/api/endpoints/utils/serializers/output/members.js +16 -26
- package/core/server/api/endpoints/utils/serializers/output/pages.js +7 -0
- package/core/server/api/endpoints/utils/serializers/output/posts.js +13 -0
- package/core/server/api/endpoints/utils/serializers/output/utils/url.js +1 -1
- package/core/server/api/endpoints/utils/validators/input/members.js +2 -52
- package/core/server/data/db/backup.js +1 -1
- package/core/server/data/importer/handlers/image.js +3 -3
- package/core/server/data/importer/import-manager.js +6 -4
- package/core/server/data/importer/importers/content-file-importer.js +2 -2
- package/core/server/data/migrations/utils/schema.js +4 -2
- package/core/server/data/migrations/versions/6.54/2026-07-19-16-59-00-add-content-import-permission.js +10 -0
- package/core/server/data/migrations/versions/6.54/2026-07-20-13-59-21-drop-email-tracked-sent-count-from-automation-action-revisions.js +7 -0
- package/core/server/data/migrations/versions/6.54/2026-07-21-01-58-20-add-automation-run-steps-poller-index.js +3 -0
- package/core/server/data/migrations/versions/6.54/2026-07-21-21-08-15-add-automated-email-recipients-mailgun-message-id-index.js +3 -0
- package/core/server/data/migrations/versions/6.54/2026-07-22-10-41-08-add-click-tracking-to-automated-email-recipients.js +13 -0
- package/core/server/data/migrations/versions/6.54/2026-07-22-15-10-30-add-email-clicked-count-to-automation-action-revisions.js +7 -0
- package/core/server/data/migrations/versions/6.54/2026-07-23-10-24-18-add-automation-action-revision-to-redirects.js +9 -0
- package/core/server/data/schema/commands.js +37 -3
- package/core/server/data/schema/fixtures/fixtures.json +7 -0
- package/core/server/data/schema/lib/default-index-name.js +20 -0
- package/core/server/data/schema/schema.js +40 -17
- package/core/server/data/seeders/data-generator.js +4 -2
- package/core/server/lib/image/image-size.js +5 -7
- package/core/server/lib/image/image-utils.js +2 -2
- package/core/server/lib/image/index.js +4 -4
- package/core/server/lib/lexical.js +3 -3
- package/core/server/lib/mobiledoc.js +2 -2
- package/core/server/lib/validate-password.js +1 -1
- package/core/server/models/action.js +9 -0
- package/core/server/models/base/plugins/generate-slug.js +1 -1
- package/core/server/models/collection.js +1 -1
- package/core/server/models/custom-theme-setting.js +1 -1
- package/core/server/models/member.js +73 -0
- package/core/server/models/newsletter.js +1 -1
- package/core/server/models/post.js +19 -5
- package/core/server/models/posts-meta.js +1 -1
- package/core/server/models/redirect.js +1 -1
- package/core/server/models/settings.js +1 -1
- package/core/server/models/snippet.js +1 -1
- package/core/server/models/tag.js +1 -1
- package/core/server/models/user.js +1 -1
- package/core/server/models/welcome-email-automated-email.js +1 -1
- package/core/server/services/activitypub/activity-pub-service-wrapper.js +1 -1
- package/core/server/services/adapter-manager/adapter-manager.js +5 -1
- package/core/server/services/adapter-manager/adapter-manager.ts +7 -2
- package/core/server/services/adapter-manager/index.js +18 -15
- package/core/server/services/adapter-manager/index.ts +23 -17
- package/core/server/services/adapter-manager/utils.js +124 -14
- package/core/server/services/adapter-manager/utils.ts +130 -14
- package/core/server/services/api-version-compatibility/mw-version-rewrites.js +1 -1
- package/core/server/services/audience-feedback/index.js +1 -1
- package/core/server/services/auth/passwordreset.js +1 -1
- package/core/server/services/auth/session/express-session.js +1 -1
- package/core/server/services/auth/session/index.js +2 -2
- package/core/server/services/auth/session/session-service.js +1 -1
- package/core/server/services/automations/automations-api.js +2 -19
- package/core/server/services/automations/automations-api.ts +2 -31
- package/core/server/services/automations/automations-repository.ts +15 -0
- package/core/server/services/automations/database-automations-repository.js +30 -2
- package/core/server/services/automations/database-automations-repository.ts +33 -2
- package/core/server/services/automations/poll.js +16 -12
- package/core/server/services/automations/poll.ts +17 -15
- package/core/server/services/automations/service.js +1 -1
- package/core/server/services/automations/service.ts +3 -13
- package/core/server/services/automations/welcome-email-automation-poll.js +2 -1
- package/core/server/services/comments/index.js +1 -1
- package/core/server/services/custom-redirects/index.js +2 -2
- package/core/server/services/email-analytics/email-analytics-service-wrapper.js +14 -13
- package/core/server/services/email-analytics/email-analytics-service.js +1 -1
- package/core/server/services/email-analytics/events/start-email-analytics-job-event.js +11 -15
- package/core/server/services/email-analytics/events/start-email-analytics-job-event.ts +15 -0
- package/core/server/services/email-analytics/index.js +2 -3
- package/core/server/services/email-analytics/index.ts +1 -2
- package/core/server/services/email-analytics/jobs/email-analytics-job-scheduler.js +1 -6
- package/core/server/services/email-analytics/jobs/email-analytics-job-scheduler.ts +0 -9
- package/core/server/services/email-analytics/jobs/fetch-latest/index.js +1 -1
- package/core/server/services/email-analytics/jobs/index.js +0 -2
- package/core/server/services/email-service/email-service-wrapper.js +1 -1
- package/core/server/services/email-service/email-service.js +20 -4
- package/core/server/services/explore-ping/explore-ping-service.js +24 -39
- package/core/server/services/explore-ping/explore-ping-service.ts +198 -0
- package/core/server/services/explore-ping/index.js +11 -11
- package/core/server/services/explore-ping/index.ts +42 -0
- package/core/server/services/gifts/gift-reminder-scheduler.js +1 -1
- package/core/server/services/gifts/gift-reminder-scheduler.ts +1 -1
- package/core/server/services/gifts/gift-service-wrapper.js +1 -1
- package/core/server/services/identity-tokens/identity-token-service-wrapper.js +1 -1
- package/core/server/services/indexnow-ping/constants.js +30 -0
- package/core/server/services/indexnow-ping/constants.ts +32 -0
- package/core/server/services/indexnow-ping/index.js +29 -253
- package/core/server/services/indexnow-ping/index.ts +37 -0
- package/core/server/services/indexnow-ping/indexnow-ping-service.js +229 -0
- package/core/server/services/indexnow-ping/indexnow-ping-service.ts +319 -0
- package/core/server/services/invites/index.js +1 -1
- package/core/server/services/lib/mailgun-client.js +3 -3
- package/core/server/services/link-redirection/index.js +2 -2
- package/core/server/services/link-redirection/link-redirect-repository.js +1 -1
- package/core/server/services/link-redirection/link-redirect.js +12 -13
- package/core/server/services/link-redirection/link-redirect.ts +22 -0
- package/core/server/services/link-redirection/link-redirects-service.js +1 -1
- package/core/server/services/link-tracking/full-post-link.js +2 -2
- package/core/server/services/link-tracking/index.js +1 -1
- package/core/server/services/mail/ghost-mailer.js +1 -1
- package/core/server/services/mail/index.js +1 -1
- package/core/server/services/media-inliner/external-media-inliner.js +2 -2
- package/core/server/services/media-inliner/service.js +4 -3
- package/core/server/services/member-attribution/index.js +1 -1
- package/core/server/services/member-welcome-emails/service.js +1 -1
- package/core/server/services/members/api.js +8 -2
- package/core/server/services/members/csv/index.js +10 -0
- package/core/server/services/members/csv/index.ts +3 -0
- package/core/server/services/members/csv/parse.js +94 -0
- package/core/server/services/members/csv/parse.ts +111 -0
- package/core/server/services/members/csv/types.js +2 -0
- package/core/server/services/members/csv/types.ts +39 -0
- package/core/server/services/members/csv/unparse.js +69 -0
- package/core/server/services/members/csv/unparse.ts +79 -0
- package/core/server/services/members/exporter/query.js +35 -8
- package/core/server/services/members/importer/config.js +35 -0
- package/core/server/services/members/importer/config.ts +39 -0
- package/core/server/services/members/importer/members-csv-importer.js +31 -13
- package/core/server/services/members/members-api/members-api.js +4 -2
- package/core/server/services/members/members-api/repositories/event-repository.js +13 -2
- package/core/server/services/members/members-api/services/member-bread-service.js +42 -19
- package/core/server/services/members/middleware.js +1 -1
- package/core/server/services/members/service.js +15 -2
- package/core/server/services/members/stripe-connect.js +1 -1
- package/core/server/services/members-custom-fields/actions.js +3 -0
- package/core/server/services/members-custom-fields/actions.ts +6 -2
- package/core/server/services/members-custom-fields/config.js +34 -0
- package/core/server/services/members-custom-fields/config.ts +38 -0
- package/core/server/services/members-custom-fields/definitions-service.js +156 -21
- package/core/server/services/members-custom-fields/definitions-service.ts +170 -25
- package/core/server/services/members-custom-fields/index.js +16 -3
- package/core/server/services/members-custom-fields/index.ts +17 -3
- package/core/server/services/members-custom-fields/values-service.js +56 -10
- package/core/server/services/members-custom-fields/values-service.ts +62 -10
- package/core/server/services/mentions/mention-sending-service.js +22 -2
- package/core/server/services/mentions/service.js +21 -5
- package/core/server/services/newsletters/index.js +1 -1
- package/core/server/services/oembed/oembed-service.js +122 -33
- package/core/server/services/oembed/service.js +4 -2
- package/core/server/services/offers/service.js +1 -1
- package/core/server/services/post-scheduling/index.js +4 -3
- package/core/server/services/post-scheduling/index.ts +4 -3
- package/core/server/services/post-scheduling/post-scheduling.js +1 -1
- package/core/server/services/post-scheduling/post-scheduling.ts +1 -1
- package/core/server/services/posts/post-email-handler.js +13 -6
- package/core/server/services/posts/post-scheduling.js +1 -1
- package/core/server/services/posts/posts-service-instance.js +1 -1
- package/core/server/services/posts/posts-service.js +2 -2
- package/core/server/services/posts-public/service.js +1 -1
- package/core/server/services/public-config/site.js +1 -1
- package/core/server/services/recommendations/recommendation-service-wrapper.js +1 -1
- package/core/server/services/recommendations/service/libraries.d.ts +0 -2
- package/core/server/services/route-settings/dynamic-routing-service.js +2 -3
- package/core/server/services/route-settings/index.js +1 -1
- package/core/server/services/route-settings/route-settings-parser.js +134 -124
- package/core/server/services/route-settings/route-settings-parser.ts +160 -125
- package/core/server/services/route-settings/validation-errors.js +178 -0
- package/core/server/services/route-settings/validation-errors.ts +196 -0
- package/core/server/services/settings/settings-service.js +2 -2
- package/core/server/services/settings-helpers/index.js +1 -1
- package/core/server/services/slack-notifications/service.js +1 -1
- package/core/server/services/slack-ping/constants.js +16 -0
- package/core/server/services/slack-ping/constants.ts +15 -0
- package/core/server/services/slack-ping/index.js +26 -204
- package/core/server/services/slack-ping/index.ts +35 -0
- package/core/server/services/slack-ping/slack-ping-service.js +214 -0
- package/core/server/services/slack-ping/slack-ping-service.ts +296 -0
- package/core/server/services/staff/index.js +1 -1
- package/core/server/services/stats/posts-stats-service.js +1 -1
- package/core/server/services/stats/service.js +1 -1
- package/core/server/services/stripe/service.js +1 -1
- package/core/server/services/tags-public/service.js +1 -1
- package/core/server/services/themes/validate.js +1 -1
- package/core/server/services/update-check/index.js +1 -1
- package/core/server/services/url/lazy-url-service.js +66 -6
- package/core/server/services/url/lazy-url-service.ts +73 -6
- package/core/server/services/url/url-generator.js +1 -1
- package/core/server/services/url/url-service-facade.js +68 -3
- package/core/server/services/url/url-service-facade.ts +79 -4
- package/core/server/services/url/url-service.js +1 -1
- package/core/server/services/url/urls.js +1 -1
- package/core/server/services/webhooks/index.js +19 -2
- package/core/server/services/webhooks/listen.js +6 -11
- package/core/server/services/webhooks/payload.js +1 -3
- package/core/server/services/webhooks/serialize.js +16 -1
- package/core/server/web/admin/app.js +1 -1
- package/core/server/web/admin/middleware/redirect-admin-urls.js +1 -1
- package/core/server/web/api/endpoints/admin/routes.js +1 -0
- package/core/server/web/api/middleware/cors.js +1 -1
- package/core/server/web/api/middleware/upload.js +4 -0
- package/core/server/web/gift-preview/controller.js +1 -1
- package/core/server/web/shared/middleware/redirect-amp-urls.js +1 -1
- package/core/server/web/shared/middleware/uncapitalise.js +2 -2
- package/core/server/web/shared/middleware/url-redirects.js +1 -1
- package/core/shared/config/defaults.json +8 -1
- package/core/shared/config/overrides.json +4 -0
- package/core/shared/url-utils.js +19 -15
- package/core/shared/url-utils.ts +20 -0
- package/ghost.js +0 -1
- package/package.json +26 -31
- package/pnpm-lock.yaml +681 -2789
- package/pnpm-workspace.yaml +31 -17
- package/components/tryghost-adapter-base-scheduling-0.0.0.tgz +0 -0
- package/components/tryghost-adapter-base-sso-0.0.0.tgz +0 -0
- package/core/built/admin/assets/Combination--5EZGaDs.js +0 -43
- package/core/built/admin/assets/Growth-C0NoKcHQ.js +0 -3
- package/core/built/admin/assets/Newsletters-Ed8kDjdy.js +0 -1
- package/core/built/admin/assets/Overview-CArPgRZt.js +0 -1
- package/core/built/admin/assets/Web-CjjYoVM3.js +0 -2
- package/core/built/admin/assets/account-migration-mfa5mNI9.js +0 -1
- package/core/built/admin/assets/activitypub/inbox-B3rjKMTv.js +0 -1221
- package/core/built/admin/assets/activitypub/layout-jcurg3rU.js +0 -1
- package/core/built/admin/assets/activitypub/use-activity-pub-queries-yqGRcnLn.js +0 -2569
- package/core/built/admin/assets/activitypub/users-CfyHIsTG.js +0 -1316
- package/core/built/admin/assets/automations-DkUnxNdv.js +0 -1
- package/core/built/admin/assets/automations-vjXofmV_.js +0 -1
- package/core/built/admin/assets/bluesky-sharing-T-pO3RcP.js +0 -1
- package/core/built/admin/assets/breadcrumb-CekPYTCn.js +0 -1
- package/core/built/admin/assets/button--i2uMDDn.js +0 -4
- package/core/built/admin/assets/card-CSWz_BXq.js +0 -1
- package/core/built/admin/assets/chart-helpers-C_4Ka_vT.js +0 -1
- package/core/built/admin/assets/chunk.524.8ce2c741473e2f0929dc.js +0 -25
- package/core/built/admin/assets/chunk.582.453459d6228d2955408b.js +0 -27
- package/core/built/admin/assets/code-editor-view-BfkwQto2.js +0 -1
- package/core/built/admin/assets/command-K75Jzs0G.js +0 -1
- package/core/built/admin/assets/comments-BEIi1DH-.js +0 -1
- package/core/built/admin/assets/container-BNXvlcjA.js +0 -1
- package/core/built/admin/assets/data-list-BmK5QMab.js +0 -1
- package/core/built/admin/assets/date-range-select-5sKzwbt7.js +0 -1
- package/core/built/admin/assets/disabled-sources-indicator-L_ssJTNr.js +0 -1
- package/core/built/admin/assets/dist-BBIJuyPg.js +0 -1
- package/core/built/admin/assets/dist-BHE0dp6o.js +0 -1
- package/core/built/admin/assets/dist-DJ6c4_De.js +0 -1
- package/core/built/admin/assets/dist-DW0QXQO3.js +0 -1
- package/core/built/admin/assets/dist-DxFLceO5.js +0 -1
- package/core/built/admin/assets/dist-QcACAOAD.js +0 -1
- package/core/built/admin/assets/dist-duxRDcQu.js +0 -177
- package/core/built/admin/assets/domain-CLaPZ9Rc.js +0 -1
- package/core/built/admin/assets/dropzone-E0bSX4_a.js +0 -5
- package/core/built/admin/assets/edit-profile-DqNPKaA4.js +0 -1
- package/core/built/admin/assets/editor-CkLXQDRp.js +0 -8
- package/core/built/admin/assets/empty-indicator-BTtOlgIo.js +0 -1
- package/core/built/admin/assets/esm-TSfGW7nz.js +0 -2
- package/core/built/admin/assets/explore-BEstLxKr.js +0 -1
- package/core/built/admin/assets/feed-C58p2voG.js +0 -1
- package/core/built/admin/assets/field-BSbDUHPv.js +0 -1
- package/core/built/admin/assets/filters-BgYv8Gt7.js +0 -1
- package/core/built/admin/assets/filters-DvenFkmK.js +0 -1
- package/core/built/admin/assets/framework-provider-jQktxm9P.js +0 -4
- package/core/built/admin/assets/ghost-dark-8590dea6cd695ff90f27d262c4464538.css +0 -1
- package/core/built/admin/assets/gift-link-modal-BPjXkEFt.js +0 -1
- package/core/built/admin/assets/growth-D4JNiVTe.js +0 -1
- package/core/built/admin/assets/hooks-Cjxexi_I.js +0 -2
- package/core/built/admin/assets/index-BacwlcOy.js +0 -67
- package/core/built/admin/assets/index-DxRNHH0o.css +0 -1
- package/core/built/admin/assets/inline-C22rnPro.js +0 -1
- package/core/built/admin/assets/input-group-CKfrILLP.js +0 -1
- package/core/built/admin/assets/jsx-runtime-CtMZ-PAS.js +0 -1
- package/core/built/admin/assets/kpi-card-DZxQKAIb.js +0 -1
- package/core/built/admin/assets/kpi-card-FidQ5zg3.js +0 -1
- package/core/built/admin/assets/kpi-helpers-C5T8Vaf1.js +0 -1
- package/core/built/admin/assets/kpi-tabs-_VRK6hGV.js +0 -1
- package/core/built/admin/assets/label-Cza7hPgn.js +0 -1
- package/core/built/admin/assets/label-picker-DgC_zLaw.js +0 -1
- package/core/built/admin/assets/layout-BxsXnKFX.js +0 -1
- package/core/built/admin/assets/limit-service-CTurluJQ.js +0 -20
- package/core/built/admin/assets/link-helpers-C3Gqy2cz.js +0 -1
- package/core/built/admin/assets/list-page-BtqCnow_.js +0 -1
- package/core/built/admin/assets/member-custom-fields-9uXFBqSt.js +0 -1
- package/core/built/admin/assets/member-detail-Dq6ZDIxo.js +0 -1
- package/core/built/admin/assets/members-CUWD9jal.js +0 -10
- package/core/built/admin/assets/modals-CIdwHVga.js +0 -31
- package/core/built/admin/assets/moderation-DTt04UDA.js +0 -1
- package/core/built/admin/assets/newsletter-cC8vcc9h.js +0 -1
- package/core/built/admin/assets/note-DZU0IY9e.js +0 -1
- package/core/built/admin/assets/notifications-NoHpBHJ4.js +0 -1
- package/core/built/admin/assets/nql-lang-CvCSOQG3.js +0 -19
- package/core/built/admin/assets/onboarding-route-Deg2hNm8.js +0 -1
- package/core/built/admin/assets/overview-BQPt_9w3.js +0 -1
- package/core/built/admin/assets/page-header-D6bEqPo2.js +0 -1
- package/core/built/admin/assets/post-analytics-header-BPw_B2_D.js +0 -1
- package/core/built/admin/assets/post-analytics-kp2_--XO.js +0 -1
- package/core/built/admin/assets/post-share-modal-Cave3Z4W.js +0 -1
- package/core/built/admin/assets/preferences-C7h3j_uy.js +0 -5
- package/core/built/admin/assets/profile-B2x4q2oB.js +0 -1
- package/core/built/admin/assets/router-provider-5fsX1CYn.js +0 -1
- package/core/built/admin/assets/select-PhPjIBBT.js +0 -1
- package/core/built/admin/assets/settings-D5P9Gwgo.js +0 -6
- package/core/built/admin/assets/settings-zUOzQV5I.js +0 -1
- package/core/built/admin/assets/share-modal-EfpfbuWF.js +0 -1
- package/core/built/admin/assets/social-urls-DgAF08Xc.js +0 -18
- package/core/built/admin/assets/sort-button-WOQYJm2H.js +0 -1
- package/core/built/admin/assets/source-icon-hm8Cj-Gx.js +0 -1
- package/core/built/admin/assets/stats-CnQDb62m.js +0 -1
- package/core/built/admin/assets/stats-view-CCfTJgSe.js +0 -1
- package/core/built/admin/assets/step-1-BGlhY4DS.js +0 -1
- package/core/built/admin/assets/step-2-D3sDEyFH.js +0 -1
- package/core/built/admin/assets/step-3-CvZoUdsc.js +0 -2
- package/core/built/admin/assets/switch-CNjkOmwz.js +0 -1
- package/core/built/admin/assets/table-C5nZYPnW.js +0 -1
- package/core/built/admin/assets/tabs-dtOcExye.js +0 -1
- package/core/built/admin/assets/tags-Dhm0FB_g.js +0 -1
- package/core/built/admin/assets/textarea-CeKw3wmV.js +0 -1
- package/core/built/admin/assets/toggle-group-DfhZIMTW.js +0 -1
- package/core/built/admin/assets/topic-filter-Cxe1Il41.js +0 -1
- package/core/built/admin/assets/typeof-Ca-duI-z.js +0 -1
- package/core/built/admin/assets/use-filter-params-Bub6BqNy.js +0 -1
- package/core/built/admin/assets/use-growth-stats-BJORomv0.js +0 -1
- package/core/built/admin/assets/use-reply-chain-data-B89YjVoo.js +0 -1
- package/core/built/admin/assets/use-simple-pagination-BL2SYXKi.js +0 -1
- package/core/built/admin/assets/virtual-list-DNJOSK9I.js +0 -1
- package/core/built/admin/assets/web-BHUE3YQc.js +0 -1
- package/core/server/adapters/scheduling/scheduling-base.js +0 -5
- package/core/server/adapters/sso/SSOBase.js +0 -5
- package/core/server/adapters/storage/index.js +0 -17
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const path = require('path');
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
const adapterManager = require('../../services/adapter-manager').default;
|
|
3
4
|
|
|
4
5
|
/** @type {import('@tryghost/api-framework').Controller} */
|
|
5
6
|
const controller = {
|
|
@@ -11,12 +12,14 @@ const controller = {
|
|
|
11
12
|
},
|
|
12
13
|
permissions: false,
|
|
13
14
|
async query(frame) {
|
|
15
|
+
const storage = adapterManager.getAdapter('storage:media');
|
|
16
|
+
|
|
14
17
|
let thumbnailPath = null;
|
|
15
18
|
if (frame.files.thumbnail && frame.files.thumbnail[0]) {
|
|
16
|
-
thumbnailPath = await storage.
|
|
19
|
+
thumbnailPath = await storage.save(frame.files.thumbnail[0]);
|
|
17
20
|
}
|
|
18
21
|
|
|
19
|
-
const filePath = await storage.
|
|
22
|
+
const filePath = await storage.save(frame.files.file[0]);
|
|
20
23
|
|
|
21
24
|
return {
|
|
22
25
|
filePath,
|
|
@@ -35,12 +38,12 @@ const controller = {
|
|
|
35
38
|
'ref'
|
|
36
39
|
],
|
|
37
40
|
async query(frame) {
|
|
38
|
-
const mediaStorage =
|
|
41
|
+
const mediaStorage = adapterManager.getAdapter('storage:media');
|
|
39
42
|
const targetDir = path.dirname(mediaStorage.urlToPath(frame.data.url));
|
|
40
43
|
|
|
41
44
|
// NOTE: need to cleanup otherwise the parent media name won't match thumb name
|
|
42
45
|
// due to "unique name" generation during save
|
|
43
|
-
if (mediaStorage.exists(frame.file.name, targetDir)) {
|
|
46
|
+
if (await mediaStorage.exists(frame.file.name, targetDir)) {
|
|
44
47
|
await mediaStorage.delete(frame.file.name, targetDir);
|
|
45
48
|
}
|
|
46
49
|
|
|
@@ -53,8 +53,11 @@ const controller = {
|
|
|
53
53
|
permissions(frame) {
|
|
54
54
|
return canThis(frame).add.member_custom_field();
|
|
55
55
|
},
|
|
56
|
+
// The whole array is passed through: create is a batch, applied
|
|
57
|
+
// all-or-nothing. A client sending a single definition (as Admin does)
|
|
58
|
+
// is just the one-item case and sees no change.
|
|
56
59
|
query(frame) {
|
|
57
|
-
return members_custom_fields_1.definitions.add(requestContextFromFrame(frame), frame.data.members_custom_fields
|
|
60
|
+
return members_custom_fields_1.definitions.add(requestContextFromFrame(frame), frame.data.members_custom_fields);
|
|
58
61
|
}
|
|
59
62
|
},
|
|
60
63
|
edit: {
|
|
@@ -67,8 +67,11 @@ const controller = {
|
|
|
67
67
|
permissions(frame: Frame) {
|
|
68
68
|
return canThis(frame).add.member_custom_field();
|
|
69
69
|
},
|
|
70
|
+
// The whole array is passed through: create is a batch, applied
|
|
71
|
+
// all-or-nothing. A client sending a single definition (as Admin does)
|
|
72
|
+
// is just the one-item case and sees no change.
|
|
70
73
|
query(frame: Frame) {
|
|
71
|
-
return definitions!.add(requestContextFromFrame(frame), frame.data.members_custom_fields
|
|
74
|
+
return definitions!.add(requestContextFromFrame(frame), frame.data.members_custom_fields);
|
|
72
75
|
}
|
|
73
76
|
},
|
|
74
77
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const urlUtils = require('../../../shared/url-utils');
|
|
1
|
+
const urlUtils = require('../../../shared/url-utils').default;
|
|
2
2
|
const models = require('../../models');
|
|
3
3
|
const {getCSVExportFileName} = require('./utils/csv-export-filename');
|
|
4
4
|
const getPostServiceInstance = require('../../services/posts/posts-service-instance');
|
|
@@ -113,6 +113,22 @@ const controller = {
|
|
|
113
113
|
}
|
|
114
114
|
},
|
|
115
115
|
|
|
116
|
+
importCSV: {
|
|
117
|
+
statusCode: 202,
|
|
118
|
+
headers: {
|
|
119
|
+
cacheInvalidate: false
|
|
120
|
+
},
|
|
121
|
+
permissions: {
|
|
122
|
+
docName: 'content_imports',
|
|
123
|
+
method: 'importContent'
|
|
124
|
+
},
|
|
125
|
+
async query() {
|
|
126
|
+
// CSV processing lands in a later milestone — for now the endpoint
|
|
127
|
+
// only accepts the upload (gated by the csvContentImporter flag)
|
|
128
|
+
return {};
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
|
|
116
132
|
read: {
|
|
117
133
|
headers: {
|
|
118
134
|
cacheInvalidate: false
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const models = require('../../models');
|
|
2
2
|
const urlService = require('../../services/url');
|
|
3
|
+
const {requiredUrlColumns} = require('./utils/serializers/input/utils/url');
|
|
3
4
|
const getPostServiceInstance = require('../../services/posts/posts-service-instance');
|
|
4
5
|
const postsService = getPostServiceInstance();
|
|
5
6
|
|
|
@@ -21,7 +22,7 @@ const controller = {
|
|
|
21
22
|
filter: 'type:post',
|
|
22
23
|
limit: '10000',
|
|
23
24
|
order: 'updated_at DESC',
|
|
24
|
-
columns: ['id', 'slug', 'title', 'excerpt', 'url', 'updated_at', 'visibility'],
|
|
25
|
+
columns: requiredUrlColumns('posts', ['id', 'slug', 'title', 'excerpt', 'url', 'updated_at', 'visibility']),
|
|
25
26
|
...urlRelationsWhenLazyRouting()
|
|
26
27
|
};
|
|
27
28
|
|
|
@@ -37,7 +38,7 @@ const controller = {
|
|
|
37
38
|
const options = {
|
|
38
39
|
limit: '10000',
|
|
39
40
|
order: 'updated_at DESC',
|
|
40
|
-
columns: ['id', 'slug', 'name', 'url', 'profile_image']
|
|
41
|
+
columns: requiredUrlColumns('authors', ['id', 'slug', 'name', 'url', 'profile_image'])
|
|
41
42
|
};
|
|
42
43
|
|
|
43
44
|
return models.Author.findPage(options);
|
|
@@ -52,7 +53,7 @@ const controller = {
|
|
|
52
53
|
const options = {
|
|
53
54
|
limit: '10000',
|
|
54
55
|
order: 'updated_at DESC',
|
|
55
|
-
columns: ['id', 'slug', 'name', 'url'],
|
|
56
|
+
columns: requiredUrlColumns('tags', ['id', 'slug', 'name', 'url']),
|
|
56
57
|
filter: 'visibility:public'
|
|
57
58
|
};
|
|
58
59
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const models = require('../../models');
|
|
2
2
|
const urlService = require('../../services/url');
|
|
3
|
+
const {requiredUrlColumns} = require('./utils/serializers/input/utils/url');
|
|
3
4
|
const getPostServiceInstance = require('../../services/posts/posts-service-instance');
|
|
4
5
|
const postsService = getPostServiceInstance();
|
|
5
6
|
|
|
@@ -24,7 +25,7 @@ const controller = {
|
|
|
24
25
|
filter: 'type:post+status:[draft,published,scheduled,sent]',
|
|
25
26
|
limit: '10000',
|
|
26
27
|
order: 'updated_at DESC',
|
|
27
|
-
columns: ['id', 'uuid', 'url', 'title', 'slug', 'status', 'published_at', 'visibility'],
|
|
28
|
+
columns: requiredUrlColumns('posts', ['id', 'uuid', 'url', 'title', 'slug', 'status', 'published_at', 'visibility']),
|
|
28
29
|
...urlRelationsWhenLazyRouting()
|
|
29
30
|
};
|
|
30
31
|
|
|
@@ -44,7 +45,7 @@ const controller = {
|
|
|
44
45
|
filter: 'type:page+status:[draft,published,scheduled]',
|
|
45
46
|
limit: '10000',
|
|
46
47
|
order: 'updated_at DESC',
|
|
47
|
-
columns: ['id', 'uuid', 'url', 'title', 'slug', 'status', 'published_at', 'visibility'],
|
|
48
|
+
columns: requiredUrlColumns('pages', ['id', 'uuid', 'url', 'title', 'slug', 'status', 'published_at', 'visibility']),
|
|
48
49
|
...urlRelationsWhenLazyRouting()
|
|
49
50
|
};
|
|
50
51
|
|
|
@@ -63,7 +64,7 @@ const controller = {
|
|
|
63
64
|
const options = {
|
|
64
65
|
limit: '10000',
|
|
65
66
|
order: 'updated_at DESC',
|
|
66
|
-
columns: ['id', 'slug', 'name', 'url']
|
|
67
|
+
columns: requiredUrlColumns('tags', ['id', 'slug', 'name', 'url'])
|
|
67
68
|
};
|
|
68
69
|
|
|
69
70
|
return models.Tag.findPage(options);
|
|
@@ -81,7 +82,7 @@ const controller = {
|
|
|
81
82
|
const options = {
|
|
82
83
|
limit: '10000',
|
|
83
84
|
order: 'updated_at DESC',
|
|
84
|
-
columns: ['id', 'slug', 'url', 'name', 'profile_image']
|
|
85
|
+
columns: requiredUrlColumns('authors', ['id', 'slug', 'url', 'name', 'profile_image'])
|
|
85
86
|
};
|
|
86
87
|
|
|
87
88
|
return models.User.findPage(options);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const settingsCache = require('../../../shared/settings-cache');
|
|
2
2
|
const labs = require('../../../shared/labs');
|
|
3
|
-
const urlUtils = require('../../../shared/url-utils');
|
|
3
|
+
const urlUtils = require('../../../shared/url-utils').default;
|
|
4
4
|
const ghostVersion = require('@tryghost/version');
|
|
5
5
|
|
|
6
6
|
/** @type {import('@tryghost/api-framework').Controller} */
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const _ = require('lodash');
|
|
2
|
+
const fs = require('fs-extra');
|
|
2
3
|
const models = require('../../models');
|
|
3
4
|
const routeSettings = require('../../services/route-settings');
|
|
4
5
|
const {BadRequestError} = require('@tryghost/errors');
|
|
@@ -171,7 +172,8 @@ const controller = {
|
|
|
171
172
|
method: 'edit'
|
|
172
173
|
},
|
|
173
174
|
async query(frame) {
|
|
174
|
-
await
|
|
175
|
+
const content = await fs.readFile(frame.file.path, 'utf8');
|
|
176
|
+
await routeSettings.api.upload(content);
|
|
175
177
|
const getRoutesHash = () => routeSettings.api.getCurrentHash();
|
|
176
178
|
await settingsService.syncRoutesHash(getRoutesHash);
|
|
177
179
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const urlUtils = require('../../../../../../../shared/url-utils');
|
|
1
|
+
const urlUtils = require('../../../../../../../shared/url-utils').default;
|
|
2
2
|
const urlService = require('../../../../../../services/url');
|
|
3
3
|
const localUtils = require('../../../index');
|
|
4
4
|
|
|
@@ -108,7 +108,15 @@ const forceUrlRelationsWhenLazy = (frame, routerType) => {
|
|
|
108
108
|
forceUrlColumnsWhenLazy(frame, routerType);
|
|
109
109
|
};
|
|
110
110
|
|
|
111
|
+
// Options-object variant of forceUrlColumnsWhenLazy for endpoints that build
|
|
112
|
+
// their query options directly (search index).
|
|
113
|
+
const requiredUrlColumns = (routerType, columns) => {
|
|
114
|
+
const required = urlService.facade.getRequiredFields(routerType).filter(field => !columns.includes(field));
|
|
115
|
+
return required.length ? [...columns, ...required] : columns;
|
|
116
|
+
};
|
|
117
|
+
|
|
111
118
|
module.exports.forPost = forPost;
|
|
119
|
+
module.exports.requiredUrlColumns = requiredUrlColumns;
|
|
112
120
|
module.exports.forUser = forUser;
|
|
113
121
|
module.exports.forTag = forTag;
|
|
114
122
|
module.exports.forSetting = forSetting;
|
|
@@ -12,6 +12,13 @@ const mapResponse = (docName, mappable, frame) => {
|
|
|
12
12
|
};
|
|
13
13
|
|
|
14
14
|
module.exports = {
|
|
15
|
+
// 204 No Content — see posts.js destroy
|
|
16
|
+
destroy(response, apiConfig, frame) {
|
|
17
|
+
debug('destroy', apiConfig.docName);
|
|
18
|
+
|
|
19
|
+
frame.response = {[apiConfig.docName]: []};
|
|
20
|
+
},
|
|
21
|
+
|
|
15
22
|
all(response, apiConfig, frame) {
|
|
16
23
|
const {docName, method} = apiConfig;
|
|
17
24
|
debug('serializing', docName, method);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const config = require('../../../../../../shared/config');
|
|
2
|
-
const urlUtils = require('../../../../../../shared/url-utils');
|
|
2
|
+
const urlUtils = require('../../../../../../shared/url-utils').default;
|
|
3
3
|
|
|
4
4
|
function getURL(urlPath) {
|
|
5
5
|
const media = new RegExp('^' + config.getSubdir() + '/' + urlUtils.STATIC_FILES_URL_PREFIX);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const config = require('../../../../../../shared/config');
|
|
2
|
-
const urlUtils = require('../../../../../../shared/url-utils');
|
|
2
|
+
const urlUtils = require('../../../../../../shared/url-utils').default;
|
|
3
3
|
|
|
4
4
|
function getURL(urlPath) {
|
|
5
5
|
const media = new RegExp('^' + config.getSubdir() + '/' + urlUtils.STATIC_MEDIA_URL_PREFIX);
|
|
@@ -4,13 +4,16 @@ const serializers_1 = require("../../../../../services/members-custom-fields/ser
|
|
|
4
4
|
const serializeOne = (field, _apiConfig, frame) => {
|
|
5
5
|
frame.response = serializers_1.toCustomFieldsResponse.parse([field]);
|
|
6
6
|
};
|
|
7
|
+
const serializeMany = (fields, _apiConfig, frame) => {
|
|
8
|
+
frame.response = serializers_1.toCustomFieldsResponse.parse(fields);
|
|
9
|
+
};
|
|
7
10
|
// module.exports (not export): the API framework loads serializers via require(). The endpoint ->
|
|
8
11
|
// serializer mapping lives here; the response shaping lives with the members-custom-fields service.
|
|
9
12
|
module.exports = {
|
|
10
|
-
browse
|
|
11
|
-
frame.response = serializers_1.toCustomFieldsResponse.parse(fields);
|
|
12
|
-
},
|
|
13
|
+
browse: serializeMany,
|
|
13
14
|
read: serializeOne,
|
|
14
|
-
|
|
15
|
+
// Create is a batch, so it returns every definition it made. The response is
|
|
16
|
+
// already an array, so a one-item create looks exactly as it did before.
|
|
17
|
+
add: serializeMany,
|
|
15
18
|
edit: serializeOne
|
|
16
19
|
};
|
|
@@ -9,13 +9,17 @@ const serializeOne = (field: CustomField, _apiConfig: unknown, frame: Frame): vo
|
|
|
9
9
|
frame.response = toCustomFieldsResponse.parse([field]);
|
|
10
10
|
};
|
|
11
11
|
|
|
12
|
+
const serializeMany = (fields: CustomField[], _apiConfig: unknown, frame: Frame): void => {
|
|
13
|
+
frame.response = toCustomFieldsResponse.parse(fields);
|
|
14
|
+
};
|
|
15
|
+
|
|
12
16
|
// module.exports (not export): the API framework loads serializers via require(). The endpoint ->
|
|
13
17
|
// serializer mapping lives here; the response shaping lives with the members-custom-fields service.
|
|
14
18
|
module.exports = {
|
|
15
|
-
browse
|
|
16
|
-
frame.response = toCustomFieldsResponse.parse(fields);
|
|
17
|
-
},
|
|
19
|
+
browse: serializeMany,
|
|
18
20
|
read: serializeOne,
|
|
19
|
-
|
|
21
|
+
// Create is a batch, so it returns every definition it made. The response is
|
|
22
|
+
// already an array, so a one-item create looks exactly as it did before.
|
|
23
|
+
add: serializeMany,
|
|
20
24
|
edit: serializeOne
|
|
21
25
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
//@ts-check
|
|
2
2
|
const _ = require('lodash');
|
|
3
3
|
const debug = require('@tryghost/debug')('api:endpoints:utils:serializers:output:members');
|
|
4
|
-
const {unparse} = require('
|
|
4
|
+
const {unparse} = require('../../../../../services/members/csv');
|
|
5
5
|
const mappers = require('./mappers');
|
|
6
6
|
const {Transform} = require('stream');
|
|
7
7
|
const papaparse = require('papaparse');
|
|
@@ -25,22 +25,6 @@ module.exports = {
|
|
|
25
25
|
activityFeed: createSerializer('activityFeed', activityFeed)
|
|
26
26
|
};
|
|
27
27
|
|
|
28
|
-
// Columns to export in CSV
|
|
29
|
-
const CSV_HEADERS = [
|
|
30
|
-
'id',
|
|
31
|
-
'email',
|
|
32
|
-
'name',
|
|
33
|
-
'note',
|
|
34
|
-
'subscribed_to_emails',
|
|
35
|
-
'complimentary_plan',
|
|
36
|
-
'stripe_customer_id',
|
|
37
|
-
'created_at',
|
|
38
|
-
'deleted_at',
|
|
39
|
-
'labels',
|
|
40
|
-
'tiers',
|
|
41
|
-
'gift_id'
|
|
42
|
-
];
|
|
43
|
-
|
|
44
28
|
/**
|
|
45
29
|
* Formats a single member for CSV export
|
|
46
30
|
* @param {Object} member - Member object
|
|
@@ -84,7 +68,10 @@ function formatMemberForCSV(member) {
|
|
|
84
68
|
deleted_at: member.deleted_at || null,
|
|
85
69
|
labels: labels,
|
|
86
70
|
tiers: tiers,
|
|
87
|
-
gift_id: giftId
|
|
71
|
+
gift_id: giftId,
|
|
72
|
+
// The exporter flattens custom field values into their CSV columns, since
|
|
73
|
+
// which columns exist is a per-site question only the database can answer.
|
|
74
|
+
...member.custom_field_cells
|
|
88
75
|
};
|
|
89
76
|
}
|
|
90
77
|
|
|
@@ -429,38 +416,41 @@ function serializeNewsletters(newsletters) {
|
|
|
429
416
|
* @returns {Transform} Transform stream that converts objects to CSV
|
|
430
417
|
*/
|
|
431
418
|
function createCSVTransform() {
|
|
432
|
-
|
|
433
|
-
|
|
419
|
+
// Locked in from the first row rather than declared up front: custom fields
|
|
420
|
+
// add a column per site, so the column set isn't known until a row arrives.
|
|
421
|
+
// Every row carries the same keys, so the first is representative.
|
|
422
|
+
let fields = null;
|
|
423
|
+
|
|
434
424
|
return new Transform({
|
|
435
425
|
objectMode: true,
|
|
436
426
|
transform(member, encoding, callback) {
|
|
437
427
|
try {
|
|
438
428
|
// Format the member data for CSV
|
|
439
429
|
const formattedMember = formatMemberForCSV(member);
|
|
440
|
-
|
|
430
|
+
|
|
441
431
|
// For first chunk, include the headers
|
|
442
|
-
if (
|
|
432
|
+
if (fields === null) {
|
|
433
|
+
fields = Object.keys(formattedMember);
|
|
443
434
|
const csv = papaparse.unparse({
|
|
444
|
-
fields
|
|
435
|
+
fields,
|
|
445
436
|
data: [formattedMember]
|
|
446
437
|
}, {
|
|
447
438
|
header: true,
|
|
448
439
|
escapeFormulae: true,
|
|
449
440
|
newline: '\r\n' // Explicitly set Windows-style line endings for compatibility
|
|
450
441
|
});
|
|
451
|
-
isFirstChunk = false;
|
|
452
442
|
callback(null, csv);
|
|
453
443
|
} else {
|
|
454
444
|
// For subsequent chunks, don't include headers, just the data
|
|
455
445
|
const csv = papaparse.unparse({
|
|
456
|
-
fields
|
|
446
|
+
fields,
|
|
457
447
|
data: [formattedMember]
|
|
458
448
|
}, {
|
|
459
449
|
header: false,
|
|
460
450
|
escapeFormulae: true,
|
|
461
451
|
newline: '\r\n' // Explicitly set Windows-style line endings for compatibility
|
|
462
452
|
});
|
|
463
|
-
|
|
453
|
+
|
|
464
454
|
// Make sure each row starts with a newline to ensure separation between rows
|
|
465
455
|
// Ensure consistent line endings by using explicit CR+LF sequence
|
|
466
456
|
callback(null, '\r\n' + csv.replace(/^\r?\n+/, ''));
|
|
@@ -3,6 +3,13 @@ const mappers = require('./mappers');
|
|
|
3
3
|
const tiersService = require('../../../../../services/tiers');
|
|
4
4
|
|
|
5
5
|
module.exports = {
|
|
6
|
+
// 204 No Content — see posts.js destroy
|
|
7
|
+
destroy(models, apiConfig, frame) {
|
|
8
|
+
debug('destroy');
|
|
9
|
+
|
|
10
|
+
frame.response = {pages: []};
|
|
11
|
+
},
|
|
12
|
+
|
|
6
13
|
async all(models, apiConfig, frame) {
|
|
7
14
|
debug('all');
|
|
8
15
|
|
|
@@ -5,6 +5,15 @@ const {createCSVTransform} = require('./posts-csv-transform');
|
|
|
5
5
|
const {createCSVStreamResponse} = require('./stream-csv-response');
|
|
6
6
|
|
|
7
7
|
module.exports = {
|
|
8
|
+
// 204 No Content — bookshelf clears the destroyed model's attributes
|
|
9
|
+
// (only relations remain), so there is nothing serializable left and
|
|
10
|
+
// computing its URL would hand the URL service a relations-only resource.
|
|
11
|
+
destroy(models, apiConfig, frame) {
|
|
12
|
+
debug('destroy');
|
|
13
|
+
|
|
14
|
+
frame.response = {posts: []};
|
|
15
|
+
},
|
|
16
|
+
|
|
8
17
|
async all(models, apiConfig, frame) {
|
|
9
18
|
debug('all');
|
|
10
19
|
|
|
@@ -62,6 +71,10 @@ module.exports = {
|
|
|
62
71
|
});
|
|
63
72
|
},
|
|
64
73
|
|
|
74
|
+
importCSV(result, apiConfig, frame) {
|
|
75
|
+
frame.response = result;
|
|
76
|
+
},
|
|
77
|
+
|
|
65
78
|
bulkEdit(bulkActionResult, _apiConfig, frame) {
|
|
66
79
|
frame.response = {
|
|
67
80
|
bulk: {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const urlService = require('../../../../../../services/url');
|
|
2
|
-
const urlUtils = require('../../../../../../../shared/url-utils');
|
|
2
|
+
const urlUtils = require('../../../../../../../shared/url-utils').default;
|
|
3
3
|
const localUtils = require('../../../index');
|
|
4
4
|
|
|
5
5
|
const forPost = (id, attrs, frame, type = 'posts') => {
|
|
@@ -1,56 +1,6 @@
|
|
|
1
|
-
const errors = require('@tryghost/errors');
|
|
2
1
|
const jsonSchema = require('../utils/json-schema');
|
|
3
|
-
const labs = require('../../../../../../shared/labs');
|
|
4
|
-
|
|
5
|
-
// The members JSON schemas live in @tryghost/admin-api-schema and set
|
|
6
|
-
// `additionalProperties: false`, so ajv strips `custom_fields` out of the body
|
|
7
|
-
// before it reaches the service — silently, with no error to explain where the
|
|
8
|
-
// values went. Stash the key across validation and restore it afterwards, so
|
|
9
|
-
// values can ride the member body while the rest of it stays schema-validated.
|
|
10
|
-
//
|
|
11
|
-
// Gated on the flag: with the flag off, the key is stripped exactly as it is
|
|
12
|
-
// today. The lasting fix is declaring `custom_fields` in the schema package
|
|
13
|
-
// upstream, which is a separate release; this holds the seam until then.
|
|
14
|
-
function preserveCustomFields(validate) {
|
|
15
|
-
return async function validateWithCustomFields(apiConfig, frame) {
|
|
16
|
-
if (!labs.isSet('membersCustomFields') || !Array.isArray(frame.data.members)) {
|
|
17
|
-
return validate(apiConfig, frame);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const stashed = frame.data.members.map(member => member && member.custom_fields);
|
|
21
|
-
|
|
22
|
-
await validate(apiConfig, frame);
|
|
23
|
-
|
|
24
|
-
frame.data.members.forEach((member, index) => {
|
|
25
|
-
if (member && stashed[index] !== undefined) {
|
|
26
|
-
member.custom_fields = stashed[index];
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// Setting values while *creating* a member is a later vertical, not this one. On
|
|
33
|
-
// add, ajv would silently strip `custom_fields` (a value that appears to vanish),
|
|
34
|
-
// so reject it explicitly instead — the gap is then legible rather than a mystery.
|
|
35
|
-
// Flag-gated, so with the flag off the key is stripped exactly as before.
|
|
36
|
-
function rejectCustomFieldsOnAdd(validate) {
|
|
37
|
-
return function validateWithoutCustomFields(apiConfig, frame) {
|
|
38
|
-
const hasCustomFields = labs.isSet('membersCustomFields')
|
|
39
|
-
&& Array.isArray(frame.data.members)
|
|
40
|
-
&& frame.data.members.some(member => member && member.custom_fields !== undefined);
|
|
41
|
-
|
|
42
|
-
if (hasCustomFields) {
|
|
43
|
-
throw new errors.ValidationError({
|
|
44
|
-
message: 'Custom field values cannot be set while creating a member. Create the member, then set values with an edit.',
|
|
45
|
-
property: 'custom_fields'
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return validate(apiConfig, frame);
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
2
|
|
|
53
3
|
module.exports = {
|
|
54
|
-
add:
|
|
55
|
-
edit:
|
|
4
|
+
add: jsonSchema.validate,
|
|
5
|
+
edit: jsonSchema.validate
|
|
56
6
|
};
|
|
@@ -5,7 +5,7 @@ const fs = require('fs-extra');
|
|
|
5
5
|
const path = require('path');
|
|
6
6
|
const config = require('../../../shared/config');
|
|
7
7
|
const logging = require('@tryghost/logging');
|
|
8
|
-
const urlUtils = require('../../../shared/url-utils');
|
|
8
|
+
const urlUtils = require('../../../shared/url-utils').default;
|
|
9
9
|
const exporter = require('../exporter');
|
|
10
10
|
|
|
11
11
|
/**
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
const _ = require('lodash');
|
|
2
2
|
const path = require('path');
|
|
3
3
|
const config = require('../../../../shared/config');
|
|
4
|
-
const urlUtils = require('../../../../shared/url-utils');
|
|
5
|
-
const
|
|
4
|
+
const urlUtils = require('../../../../shared/url-utils').default;
|
|
5
|
+
const adapterManager = require('../../../services/adapter-manager').default;
|
|
6
6
|
let ImageHandler;
|
|
7
7
|
|
|
8
8
|
ImageHandler = {
|
|
@@ -12,7 +12,7 @@ ImageHandler = {
|
|
|
12
12
|
directories: ['images', 'content'],
|
|
13
13
|
|
|
14
14
|
loadFile: function (files, baseDir) {
|
|
15
|
-
const store =
|
|
15
|
+
const store = adapterManager.getAdapter('storage:images');
|
|
16
16
|
const baseDirRegex = baseDir ? new RegExp('^' + baseDir + '/') : new RegExp('');
|
|
17
17
|
|
|
18
18
|
const imageFolderRegexes = _.map(store.staticFileURLPrefix.split('/'), function (dir) {
|
|
@@ -18,12 +18,14 @@ const MarkdownHandler = require('./handlers/markdown');
|
|
|
18
18
|
const ContentFileImporter = require('./importers/content-file-importer');
|
|
19
19
|
const RevueImporter = require('./importers/importer-revue');
|
|
20
20
|
const DataImporter = require('./importers/data');
|
|
21
|
-
const urlUtils = require('../../../shared/url-utils');
|
|
21
|
+
const urlUtils = require('../../../shared/url-utils').default;
|
|
22
22
|
const {GhostMailer} = require('../../services/mail');
|
|
23
23
|
const jobManager = require('../../services/jobs');
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
const
|
|
24
|
+
const adapterManager = require('../../services/adapter-manager').default;
|
|
25
|
+
|
|
26
|
+
const mediaStorage = adapterManager.getAdapter('storage:media');
|
|
27
|
+
const imageStorage = adapterManager.getAdapter('storage:images');
|
|
28
|
+
const fileStorage = adapterManager.getAdapter('storage:files');
|
|
27
29
|
|
|
28
30
|
const {emailTemplate} = require('./email-template');
|
|
29
31
|
const ghostMailer = new GhostMailer();
|
|
@@ -57,14 +57,14 @@ class ContentFileImporter {
|
|
|
57
57
|
/** @property {string} */
|
|
58
58
|
type;
|
|
59
59
|
|
|
60
|
-
/** @property {import('ghost-storage-base')} */
|
|
60
|
+
/** @property {import('ghost-storage-base').StorageBase} */
|
|
61
61
|
#store;
|
|
62
62
|
|
|
63
63
|
/**
|
|
64
64
|
*
|
|
65
65
|
* @param {Object} deps
|
|
66
66
|
* @param {'images' | 'media' | 'files'} deps.type - importer type
|
|
67
|
-
* @param {import('ghost-storage-base')} deps.store
|
|
67
|
+
* @param {import('ghost-storage-base').StorageBase} deps.store
|
|
68
68
|
*/
|
|
69
69
|
constructor(deps) {
|
|
70
70
|
this.type = deps.type;
|
|
@@ -191,12 +191,14 @@ function createSetNullableMigration(table, column, options = {}) {
|
|
|
191
191
|
/**
|
|
192
192
|
* @param {string} table
|
|
193
193
|
* @param {string[]|string} columns One or multiple columns (in case the index should be for multiple columns)
|
|
194
|
+
* @param {object} [options]
|
|
195
|
+
* @param {number} [options.length] MySQL only: create a prefix index of this many characters
|
|
194
196
|
* @returns {Migration}
|
|
195
197
|
*/
|
|
196
|
-
function createAddIndexMigration(table, columns) {
|
|
198
|
+
function createAddIndexMigration(table, columns, options = {}) {
|
|
197
199
|
return createTransactionalMigration(
|
|
198
200
|
async function up(knex) {
|
|
199
|
-
await commands.addIndex(table, columns, knex);
|
|
201
|
+
await commands.addIndex(table, columns, knex, options);
|
|
200
202
|
},
|
|
201
203
|
async function down(knex) {
|
|
202
204
|
await commands.dropIndex(table, columns, knex);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const {addPermissionWithRoles} = require('../../utils');
|
|
2
|
+
|
|
3
|
+
// Content import (the CSV posts importer) is restricted to Administrators
|
|
4
|
+
// (the Owner bypasses permission checks) and the self-serve migrator's
|
|
5
|
+
// integration, mirroring the existing db importContent permissions.
|
|
6
|
+
module.exports = addPermissionWithRoles({
|
|
7
|
+
name: 'Import content',
|
|
8
|
+
action: 'importContent',
|
|
9
|
+
object: 'content_import'
|
|
10
|
+
}, ['Administrator', 'Self-Serve Migration Integration']);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const {combineNonTransactionalMigrations, createAddColumnMigration} = require('../../utils');
|
|
2
|
+
|
|
3
|
+
module.exports = combineNonTransactionalMigrations(
|
|
4
|
+
createAddColumnMigration('automated_email_recipients', 'track_clicks', {
|
|
5
|
+
type: 'boolean',
|
|
6
|
+
nullable: false,
|
|
7
|
+
defaultTo: false
|
|
8
|
+
}, {algorithm: 'auto'}),
|
|
9
|
+
createAddColumnMigration('automated_email_recipients', 'clicked_at', {
|
|
10
|
+
type: 'dateTime',
|
|
11
|
+
nullable: true
|
|
12
|
+
}, {algorithm: 'auto'})
|
|
13
|
+
);
|