ghost 5.130.2 → 6.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/tryghost-i18n-6.0.0-alpha.2.tgz +0 -0
- package/core/boot.js +0 -2
- package/core/built/admin/assets/admin-x-activitypub/admin-x-activitypub.js +1 -1
- package/core/built/admin/assets/admin-x-activitypub/{index-B8te98RZ.mjs → index-BZDwG-OG.mjs} +7397 -7385
- package/core/built/admin/assets/admin-x-activitypub/{index-C8qwgKWF.mjs → index-DTlSQCGz.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/{CodeEditorView-CAtv7MlN.mjs → CodeEditorView-CCUvrZhe.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/admin-x-settings.js +3 -3
- package/core/built/admin/assets/admin-x-settings/{index-BVxh86CD.mjs → index-Cubs_8W6.mjs} +8088 -8532
- package/core/built/admin/assets/admin-x-settings/{index-DUhmXSBR.mjs → index-D0ejKdD5.mjs} +2 -2
- package/core/built/admin/assets/admin-x-settings/{modals-B5dtfzsB.mjs → modals-DSxs9dLy.mjs} +1676 -1614
- package/core/built/admin/assets/{chunk.524.1f2faf572078e5b86b09.js → chunk.524.0953dd72ae1efbabe0de.js} +7 -7
- package/core/built/admin/assets/{chunk.582.675905fe8f9be138fb19.js → chunk.582.3caa825c2a91efc48f1d.js} +8 -8
- package/core/built/admin/assets/{ghost-280b83af263b51bc4d6ce5bd8f536096.js → ghost-db0f84981913aec8a672c57aa22da07a.js} +40 -45
- package/core/built/admin/assets/posts/posts.js +6549 -6537
- package/core/built/admin/assets/stats/stats.js +8824 -8812
- package/core/built/admin/index.html +3 -3
- package/core/frontend/helpers/get.js +4 -2
- package/core/frontend/helpers/ghost_head.js +71 -77
- package/core/frontend/meta/canonical-url.js +1 -7
- package/core/frontend/meta/context-object.js +1 -1
- package/core/frontend/meta/get-meta.js +1 -4
- package/core/frontend/meta/og-image.js +1 -1
- package/core/frontend/meta/og-type.js +0 -2
- package/core/frontend/meta/schema.js +1 -1
- package/core/frontend/meta/twitter-image.js +1 -1
- package/core/frontend/meta/url.js +1 -12
- package/core/frontend/services/rendering/context.js +0 -8
- package/core/frontend/web/middleware/static-theme.js +20 -1
- package/core/server/api/endpoints/index.js +0 -4
- package/core/server/api/endpoints/session.js +0 -9
- package/core/server/api/endpoints/utils/serializers/input/settings.js +0 -2
- package/core/server/api/endpoints/utils/serializers/input/utils/settings-filter-type-group-mapper.js +0 -1
- package/core/server/api/endpoints/utils/serializers/input/utils/settings-key-group-mapper.js +0 -1
- package/core/server/api/endpoints/utils/serializers/input/utils/settings-key-type-mapper.js +0 -1
- package/core/server/api/endpoints/utils/serializers/output/all.js +1 -1
- package/core/server/api/endpoints/utils/serializers/output/index.js +0 -4
- package/core/server/api/endpoints/utils/serializers/output/mappers/snippets.js +1 -5
- package/core/server/api/endpoints/utils/serializers/output/members.js +0 -2
- package/core/server/api/endpoints/utils/validators/input/index.js +0 -4
- package/core/server/data/importer/importers/data/Base.js +1 -3
- package/core/server/data/importer/importers/data/SettingsImporter.js +1 -3
- package/core/server/data/migrations/utils/index.js +1 -4
- package/core/server/data/migrations/utils/permissions.js +14 -6
- package/core/server/data/migrations/utils/settings.js +39 -22
- package/core/server/data/migrations/versions/4.47/2022-05-03-15-30-final-v4.js +2 -0
- package/core/server/data/migrations/versions/4.47/2022-05-04-10-03-no-op.js +6 -0
- package/core/server/data/migrations/versions/5.100/2024-11-06-04-45-15-add-activitypub-integration.js +4 -2
- package/core/server/data/migrations/versions/5.113/2025-03-07-12-24-00-add-super-editor.js +4 -2
- package/core/server/data/migrations/versions/5.3/2022-07-06-07-58-add-ghost-explore-integration-role.js +4 -2
- package/core/server/data/migrations/versions/5.3/2022-07-06-09-17-add-ghost-explore-integration.js +4 -2
- package/core/server/data/migrations/versions/5.3/2022-07-06-09-26-add-ghost-explore-integration-api-key.js +4 -2
- package/core/server/data/migrations/versions/5.40/2023-03-21-18-42-add-self-serve-integration-role.js +4 -2
- package/core/server/data/migrations/versions/5.40/2023-03-21-18-52-add-self-serve-integration.js +4 -2
- package/core/server/data/migrations/versions/5.40/2023-03-21-19-02-add-self-serve-integration-api-key.js +4 -2
- package/core/server/data/migrations/versions/5.63/2023-09-13-13-03-10-add-ghost-core-content-integration.js +4 -2
- package/core/server/data/migrations/versions/5.63/2023-09-13-13-34-11-add-ghost-core-content-integration-key.js +4 -2
- package/core/server/data/migrations/versions/6.0/2025-06-20-01-41-54-remove-updated-by-column.js +46 -0
- package/core/server/data/migrations/versions/6.0/2025-06-20-13-41-55-remove-created-by-column.js +47 -0
- package/core/server/data/migrations/versions/6.0/2025-06-23-09-49-25-add-missing-member-uuids.js +22 -0
- package/core/server/data/migrations/versions/6.0/2025-06-23-10-03-26-members-nullable-uuid.js +5 -0
- package/core/server/data/migrations/versions/6.0/2025-06-24-09-19-42-use-object-id-for-hardcoded-user-id.js +95 -0
- package/core/server/data/migrations/versions/6.0/2025-06-25-15-03-29-remove-amp-from-settings.js +6 -0
- package/core/server/data/migrations/versions/6.0/2025-06-30-13-59-10-remove-mail-events-table.js +3 -0
- package/core/server/data/migrations/versions/6.0/2025-06-30-14-00-00-update-feature-image-alt-length.js +25 -0
- package/core/server/data/schema/default-settings/default-settings.json +0 -13
- package/core/server/data/schema/fixtures/FixtureManager.js +128 -5
- package/core/server/data/schema/fixtures/fixtures.json +4 -6
- package/core/server/data/schema/fixtures/index.js +3 -1
- package/core/server/data/schema/schema.js +20 -65
- package/core/server/data/seeders/DataGenerator.js +11 -2
- package/core/server/data/seeders/importers/EmailsImporter.js +1 -3
- package/core/server/data/seeders/importers/LabelsImporter.js +1 -3
- package/core/server/data/seeders/importers/MembersImporter.js +0 -1
- package/core/server/data/seeders/importers/MembersStripeCustomersImporter.js +1 -2
- package/core/server/data/seeders/importers/MembersStripeCustomersSubscriptionsImporter.js +0 -1
- package/core/server/data/seeders/importers/PostsImporter.js +0 -1
- package/core/server/data/seeders/importers/RolesUsersImporter.js +6 -1
- package/core/server/data/seeders/importers/TagsImporter.js +1 -2
- package/core/server/data/seeders/importers/UsersImporter.js +1 -2
- package/core/server/data/tinybird/ARCHITECTURE.md +0 -4
- package/core/server/data/tinybird/DOCS.md +0 -4
- package/core/server/models/base/bookshelf.js +8 -1
- package/core/server/models/base/plugins/events.js +0 -28
- package/core/server/models/base/plugins/user-type.js +10 -36
- package/core/server/models/post.js +25 -10
- package/core/server/models/relations/authors.js +2 -2
- package/core/server/models/settings.js +1 -14
- package/core/server/models/user.js +33 -6
- package/core/server/services/activitypub/ActivityPubService.js +1 -2
- package/core/server/services/activitypub/ActivityPubService.ts +1 -2
- package/core/server/services/explore-ping/ExplorePingService.js +3 -1
- package/core/server/services/link-redirection/README.md +1 -1
- package/core/server/services/mentions/MentionSendingService.js +1 -1
- package/core/server/services/settings/SettingsBREADService.js +5 -1
- package/core/server/services/settings/settings-service.js +3 -1
- package/core/server/services/settings-helpers/SettingsHelpers.js +0 -12
- package/core/server/services/update-check/UpdateCheckService.js +18 -2
- package/core/server/services/url/config.js +0 -2
- package/core/server/web/api/app.js +4 -0
- package/core/server/web/api/endpoints/admin/middleware.js +8 -9
- package/core/server/web/api/endpoints/admin/routes.js +0 -2
- package/core/server/web/comments/routes.js +3 -0
- package/core/server/web/shared/middleware/index.js +4 -0
- package/core/server/web/shared/middleware/max-limit-cap.js +27 -0
- package/core/server/web/shared/middleware/pretty-urls.js +3 -1
- package/core/server/web/shared/middleware/redirect-amp-urls.js +36 -0
- package/core/shared/config/defaults.json +2 -0
- package/core/shared/config/overrides.json +1 -4
- package/core/shared/labs.js +2 -6
- package/core/shared/max-limit-cap.js +61 -0
- package/package.json +5 -6
- package/tsconfig.tsbuildinfo +1 -1
- package/yarn.lock +18 -107
- package/components/tryghost-i18n-5.130.2.tgz +0 -0
- package/core/built/admin/assets/img/amp-d7b72aae3315fda95921fb575dfca100.svg +0 -4
- package/core/frontend/apps/amp/index.js +0 -30
- package/core/frontend/apps/amp/lib/helpers/amp_analytics.js +0 -32
- package/core/frontend/apps/amp/lib/helpers/amp_components.js +0 -48
- package/core/frontend/apps/amp/lib/helpers/amp_content.js +0 -214
- package/core/frontend/apps/amp/lib/helpers/amp_style.js +0 -8
- package/core/frontend/apps/amp/lib/router.js +0 -95
- package/core/frontend/apps/amp/lib/views/amp.hbs +0 -1046
- package/core/frontend/meta/amp-url.js +0 -14
- package/core/server/api/endpoints/mail-events.js +0 -17
- package/core/server/api/endpoints/utils/serializers/output/mail-events.js +0 -9
- package/core/server/api/endpoints/utils/validators/input/mail-events.js +0 -7
- package/core/server/data/migrations/utils/constants.js +0 -3
- package/core/server/data/migrations/versions/4.0/01-update-mobiledoc.js +0 -61
- package/core/server/data/migrations/versions/4.0/02-add-status-column-to-members.js +0 -11
- package/core/server/data/migrations/versions/4.0/03-populate-status-column-for-members.js +0 -81
- package/core/server/data/migrations/versions/4.0/04-drop-apps-related-tables.js +0 -10
- package/core/server/data/migrations/versions/4.0/05-add-members-subscribe-events-table.js +0 -9
- package/core/server/data/migrations/versions/4.0/06-populate-members-subscribe-events-table.js +0 -53
- package/core/server/data/migrations/versions/4.0/07-alter-unique-constraint-for-posts-slug.js +0 -7
- package/core/server/data/migrations/versions/4.0/08-add-members-login-events-table.js +0 -7
- package/core/server/data/migrations/versions/4.0/09-add-members-email-change-events-table.js +0 -9
- package/core/server/data/migrations/versions/4.0/10-add-members-status-events-table.js +0 -9
- package/core/server/data/migrations/versions/4.0/11-add-members-paid-subscription-events-table.js +0 -12
- package/core/server/data/migrations/versions/4.0/12-delete-apps-related-settings-keys.js +0 -16
- package/core/server/data/migrations/versions/4.0/13-add-members-payment-events-table.js +0 -10
- package/core/server/data/migrations/versions/4.0/14-remove-orphaned-stripe-records.js +0 -36
- package/core/server/data/migrations/versions/4.0/15-add-frontmatter-column-to-meta.js +0 -7
- package/core/server/data/migrations/versions/4.0/16-refactor-slack-setting.js +0 -96
- package/core/server/data/migrations/versions/4.0/17-populate-members-status-events-table.js +0 -41
- package/core/server/data/migrations/versions/4.0/18-transform-urls-absolute-to-transform-ready.js +0 -201
- package/core/server/data/migrations/versions/4.0/19-remove-labs-members-setting.js +0 -10
- package/core/server/data/migrations/versions/4.0/20-refactor-unsplash-setting.js +0 -41
- package/core/server/data/migrations/versions/4.0/21-sanitize-email-batches-provider-id.js +0 -8
- package/core/server/data/migrations/versions/4.0/22-solve-orphaned-webhooks.js +0 -87
- package/core/server/data/migrations/versions/4.0/23-regenerate-posts-html.js +0 -66
- package/core/server/data/migrations/versions/4.0/24-add-missing-email-permissions.js +0 -36
- package/core/server/data/migrations/versions/4.0/25-populate-members-paid-subscription-events-table.js +0 -129
- package/core/server/data/migrations/versions/4.0/26-add-cascade-on-delete.js +0 -76
- package/core/server/data/migrations/versions/4.0/27-add-primary-key-brute-migrations-lock.js +0 -9
- package/core/server/data/migrations/versions/4.0/28-add-webhook-intergrations-foreign-key.js +0 -16
- package/core/server/data/migrations/versions/4.0/29-fix-foreign-key-for-members-stripe-customers-subscriptions.js +0 -35
- package/core/server/data/migrations/versions/4.0/30-set-default-accent-color.js +0 -21
- package/core/server/data/migrations/versions/4.1/01-fix-backup-content-permission-typo.js +0 -15
- package/core/server/data/migrations/versions/4.1/02-add-unique-constraint-for-member-stripe-tables.js +0 -21
- package/core/server/data/migrations/versions/4.11/01-add-oauth-user-data.js +0 -12
- package/core/server/data/migrations/versions/4.11/02-add-email-verification-required-setting.js +0 -43
- package/core/server/data/migrations/versions/4.12/01-add-email-only-column-to-posts-meta-table.js +0 -7
- package/core/server/data/migrations/versions/4.12/02-fix-member-statuses.js +0 -39
- package/core/server/data/migrations/versions/4.13/01-add-members-stripe-connect-auth-permission-to-administrators.js +0 -6
- package/core/server/data/migrations/versions/4.13/02-add-members-products-events-table.js +0 -33
- package/core/server/data/migrations/versions/4.14/01-fix-comped-member-statuses.js +0 -73
- package/core/server/data/migrations/versions/4.14/02-fix-free-members-status-events.js +0 -61
- package/core/server/data/migrations/versions/4.15/01-add-temp-members-analytic-events-table.js +0 -12
- package/core/server/data/migrations/versions/4.16/01-add-custom-theme-settings-table.js +0 -9
- package/core/server/data/migrations/versions/4.17/01-add-custom-theme-settings-permissions.js +0 -21
- package/core/server/data/migrations/versions/4.17/02-add-offers-table.js +0 -19
- package/core/server/data/migrations/versions/4.17/03-add-offers-permissions.js +0 -35
- package/core/server/data/migrations/versions/4.19/01-add-active-column-to-offers.js +0 -7
- package/core/server/data/migrations/versions/4.19/02-add-offer-redemptions-table.js +0 -8
- package/core/server/data/migrations/versions/4.2/01-fix-incorrect-mrr-delta-events.js +0 -13
- package/core/server/data/migrations/versions/4.20/01-remove-offer-redemptions-table.js +0 -19
- package/core/server/data/migrations/versions/4.20/02-remove-offers-table.js +0 -30
- package/core/server/data/migrations/versions/4.20/03-add-offers-table.js +0 -21
- package/core/server/data/migrations/versions/4.20/04-add-offer-redemptions-table.js +0 -9
- package/core/server/data/migrations/versions/4.20/05-remove-not-null-constraint-from-portal-title.js +0 -44
- package/core/server/data/migrations/versions/4.22/01-add-is-launch-complete-setting.js +0 -8
- package/core/server/data/migrations/versions/4.22/02-update-launch-complete-setting-from-user-data.js +0 -39
- package/core/server/data/migrations/versions/4.23/01-truncate-offer-names.js +0 -59
- package/core/server/data/migrations/versions/4.3/01-add-products-table.js +0 -9
- package/core/server/data/migrations/versions/4.3/02-add-members-products-table.js +0 -8
- package/core/server/data/migrations/versions/4.3/03-add-default-product.js +0 -39
- package/core/server/data/migrations/versions/4.3/04-attach-members-to-product.js +0 -50
- package/core/server/data/migrations/versions/4.3/05-add-stripe-products-table.js +0 -9
- package/core/server/data/migrations/versions/4.3/06-add-stripe-prices-table.js +0 -15
- package/core/server/data/migrations/versions/4.3/07-add-products-permissions.js +0 -29
- package/core/server/data/migrations/versions/4.3/08-migrate-members-signup-setting.js +0 -109
- package/core/server/data/migrations/versions/4.3/09-add-price-id-column-to-subscriptions-table.js +0 -10
- package/core/server/data/migrations/versions/4.3/10-populate-stripe-price-id-in-subscriptions.js +0 -20
- package/core/server/data/migrations/versions/4.33/2022-01-14-11-50-add-type-column-to-products.js +0 -12
- package/core/server/data/migrations/versions/4.33/2022-01-14-11-51-add-default-free-tier.js +0 -40
- package/core/server/data/migrations/versions/4.33/2022-01-18-09-07-remove-duplicate-offer-redemptions.js +0 -46
- package/core/server/data/migrations/versions/4.33/2022-01-19-10-43-add-active-column-to-products-table.js +0 -7
- package/core/server/data/migrations/versions/4.34/2022-01-25-13-53-add-welcome-page-url-column-to-products.js +0 -7
- package/core/server/data/migrations/versions/4.35/2022-01-20-05-55-add-post-products-table.js +0 -8
- package/core/server/data/migrations/versions/4.35/2022-01-30-15-17-set-welcome-page-url-from-settings.js +0 -45
- package/core/server/data/migrations/versions/4.35/2022-02-01-11-48-update-email-recipient-filter-column-type.js +0 -19
- package/core/server/data/migrations/versions/4.35/2022-02-01-12-03-update-recipient-filter-column-type.js +0 -19
- package/core/server/data/migrations/versions/4.35/2022-02-02-10-38-add-default-content-visibility-tiers-setting.js +0 -8
- package/core/server/data/migrations/versions/4.35/2022-02-02-13-10-transform-specific-tiers-default-content-visibility.js +0 -147
- package/core/server/data/migrations/versions/4.35/2022-02-04-04-34-populate-empty-portal-products.js +0 -60
- package/core/server/data/migrations/versions/4.36/2022-02-07-14-34-add-last-seen-at-column-to-members.js +0 -10
- package/core/server/data/migrations/versions/4.37/2022-02-21-09-53-backfill-members-last-seen-at-column.js +0 -32
- package/core/server/data/migrations/versions/4.38/2022-03-01-08-46-add-visibility-to-tiers.js +0 -11
- package/core/server/data/migrations/versions/4.38/2022-03-03-16-12-add-visibility-to-tiers.js +0 -8
- package/core/server/data/migrations/versions/4.38/2022-03-03-16-17-drop-tiers-visible-column.js +0 -7
- package/core/server/data/migrations/versions/4.39/2022-03-07-10-57-update-free-products-visibility-column.js +0 -66
- package/core/server/data/migrations/versions/4.39/2022-03-07-10-57-update-products-visibility-column.js +0 -36
- package/core/server/data/migrations/versions/4.4/01-restore-free-members-signup-setting-from-backup.js +0 -99
- package/core/server/data/migrations/versions/4.4/02-migrate-members-signup-access.js +0 -126
- package/core/server/data/migrations/versions/4.40/2022-03-07-14-37-add-members-cancel-events-table.js +0 -8
- package/core/server/data/migrations/versions/4.40/2022-03-15-06-40-add-offers-admin-integration-permission-roles.js +0 -23
- package/core/server/data/migrations/versions/4.40/2022-03-15-06-40-add-tiers-admin-integration-permission-roles.js +0 -20
- package/core/server/data/migrations/versions/4.42/2022-03-21-17-17-add.js +0 -25
- package/core/server/data/migrations/versions/4.42/2022-03-30-15-44-add-newsletter-permissions.js +0 -28
- package/core/server/data/migrations/versions/4.43/2022-03-28-19-26-recreate-newsletter-table.js +0 -29
- package/core/server/data/migrations/versions/4.43/2022-03-29-14-45-add-members-newsletters-table.js +0 -7
- package/core/server/data/migrations/versions/4.43/2022-04-01-10-13-add-post-newsletter-relation.js +0 -108
- package/core/server/data/migrations/versions/4.43/2022-04-06-09-47-add-type-column-to-paid-subscription-events.js +0 -7
- package/core/server/data/migrations/versions/4.43/2022-04-06-14-56-add-email-newsletter-relation.js +0 -8
- package/core/server/data/migrations/versions/4.43/2022-04-08-10-45-add-subscription-id-to-mrr-events.js +0 -7
- package/core/server/data/migrations/versions/4.44/2022-04-06-15-22-populate-type-column-for-paid-subscription-events.js +0 -21
- package/core/server/data/migrations/versions/4.44/2022-04-08-11-54-add-cancelled-events.js +0 -51
- package/core/server/data/migrations/versions/4.44/2022-04-11-08-24-add-newsletter-permissions.js +0 -33
- package/core/server/data/migrations/versions/4.44/2022-04-11-10-54-add-mrr-to-subscriptions.js +0 -8
- package/core/server/data/migrations/versions/4.44/2022-04-12-07-33-fill-mrr.js +0 -29
- package/core/server/data/migrations/versions/4.44/2022-04-13-12-00-remove-newsletter-sender-name-not-null-constraint.js +0 -33
- package/core/server/data/migrations/versions/4.44/2022-04-15-07-53-add-offer-id-to-subscriptions.js +0 -9
- package/core/server/data/migrations/versions/4.45/2022-04-19-12-23-backfill-subscriptions-offers.js +0 -60
- package/core/server/data/migrations/versions/4.45/2022-04-20-11-25-add-newsletter-read-permission.js +0 -9
- package/core/server/data/migrations/versions/4.45/2022-04-21-02-55-add-notifications-key-entry-to-settings-table.js +0 -8
- package/core/server/data/migrations/versions/4.46/2022-04-13-12-00-add-created-at-newsletters.js +0 -6
- package/core/server/data/migrations/versions/4.46/2022-04-13-12-01-add-updated-at-newsletters.js +0 -6
- package/core/server/data/migrations/versions/4.46/2022-04-13-12-02-fill-created-at-newsletters.js +0 -19
- package/core/server/data/migrations/versions/4.46/2022-04-13-12-03-drop-nullable-created-at-newsletters.js +0 -3
- package/core/server/data/migrations/versions/4.46/2022-04-13-12-08-newsletters-show-header-name.js +0 -7
- package/core/server/data/migrations/versions/4.46/2022-04-13-12-57-add-uuid-column-to-newsletters.js +0 -8
- package/core/server/data/migrations/versions/4.46/2022-04-13-12-58-fill-uuid-for-newsletters.js +0 -19
- package/core/server/data/migrations/versions/4.46/2022-04-13-12-59-drop-nullable-uuid-newsletters.js +0 -3
- package/core/server/data/migrations/versions/4.46/2022-04-13-13-00-add-default-newsletter.js +0 -92
- package/core/server/data/migrations/versions/4.46/2022-04-20-08-39-map-subscribers-to-default-newsletter.js +0 -66
- package/core/server/data/migrations/versions/4.46/2022-04-22-07-43-add-newsletter-id-to-subscribe-events.js +0 -9
- package/core/server/data/migrations/versions/4.46/2022-04-27-07-59-set-newsletter-id-subscribe-events.js +0 -31
- package/core/server/data/migrations/versions/4.47/2022-05-03-15-30-update-newsletter-sending-options.js +0 -34
- package/core/server/data/migrations/versions/4.47/2022-05-04-10-03-transform-newsletter-header-image.js +0 -26
- package/core/server/data/migrations/versions/4.5/01-add-stripe-price-description-column.js +0 -7
- package/core/server/data/migrations/versions/4.5/02-add-product-description-column.js +0 -7
- package/core/server/data/migrations/versions/4.5/03-give-label-read-permissions-to-editors.js +0 -14
- package/core/server/data/migrations/versions/4.5/04-remove-unique-constraint-from-product-name.js +0 -13
- package/core/server/data/migrations/versions/4.5/05-rename-default-product-to-site-title.js +0 -38
- package/core/server/data/migrations/versions/4.6/01-remove-comped-status.js +0 -47
- package/core/server/data/migrations/versions/4.7/01-add-monthly-price-column-to-products.js +0 -7
- package/core/server/data/migrations/versions/4.7/02-add-yearly-price-column-to-products.js +0 -7
- package/core/server/data/migrations/versions/4.7/03-add-labs-setting.js +0 -42
- package/core/server/data/migrations/versions/4.8/01-add-feature-image-alt-column-to-posts-meta.js +0 -7
- package/core/server/data/migrations/versions/4.8/02-add-feature-image-caption-column-to-posts-meta.js +0 -7
- package/core/server/data/migrations/versions/4.8/03-add-default-product-portal-products.js +0 -69
- package/core/server/data/migrations/versions/4.8/04-migrate-show-newsletter-header-setting.js +0 -124
- package/core/server/data/migrations/versions/4.9/01-add-reset-all-passwords-permission.js +0 -11
- package/core/server/data/migrations/versions/4.9/02-add-benefits-table.js +0 -9
- package/core/server/data/migrations/versions/4.9/03-add-products-benefits-table.js +0 -8
- package/core/server/data/migrations/versions/4.9/04-add-member-segment-to-email-batches.js +0 -7
- package/core/server/data/migrations/versions/4.9/05-fix-missed-mobiledoc-url-transforms.js +0 -87
- package/core/server/data/migrations/versions/4.9/06-add-comped-status.js +0 -47
- package/core/server/data/migrations/versions/4.9/07-update-comped-members-status-events.js +0 -39
- package/core/server/models/mail-event.js +0 -12
- package/core/server/services/mail-events/BookshelfMailEventRepository.js +0 -40
- package/core/server/services/mail-events/InMemoryMailEventRepository.js +0 -10
- package/core/server/services/mail-events/InMemoryMailEventRepository.ts +0 -8
- package/core/server/services/mail-events/MailEvent.js +0 -20
- package/core/server/services/mail-events/MailEvent.ts +0 -10
- package/core/server/services/mail-events/MailEventRepository.js +0 -2
- package/core/server/services/mail-events/MailEventRepository.ts +0 -5
- package/core/server/services/mail-events/MailEventService.js +0 -124
- package/core/server/services/mail-events/MailEventService.ts +0 -169
- package/core/server/services/mail-events/index.js +0 -21
- package/core/server/services/mail-events/libraries.d.ts +0 -2
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
const logging = require('@tryghost/logging');
|
|
2
|
-
|
|
3
|
-
const {createTransactionalMigration} = require('../../utils');
|
|
4
|
-
|
|
5
|
-
module.exports = createTransactionalMigration(
|
|
6
|
-
async function up(knex) {
|
|
7
|
-
logging.info('Checking default_content_visibility for specific tiers');
|
|
8
|
-
|
|
9
|
-
const settings = await knex('settings')
|
|
10
|
-
.select()
|
|
11
|
-
.whereIn('key', ['default_content_visibility', 'default_content_visibility_tiers']);
|
|
12
|
-
const contentVisibilitySetting = settings.find(d => d.key === 'default_content_visibility');
|
|
13
|
-
const visibilityTiersSetting = settings.find(d => d.key === 'default_content_visibility_tiers');
|
|
14
|
-
if (!contentVisibilitySetting) {
|
|
15
|
-
logging.warn('No default_content_visibility setting found.');
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
if (!visibilityTiersSetting) {
|
|
20
|
-
logging.warn('No default_content_visibility_tiers setting found.');
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const contentVisibility = contentVisibilitySetting.value;
|
|
25
|
-
|
|
26
|
-
if (['public', 'members', 'paid'].includes(contentVisibility)) {
|
|
27
|
-
logging.info(`Ignoring default_content_visibility change as already set to ${contentVisibility}.`);
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
// Transform visibility to tiers when stored as nql string
|
|
31
|
-
const isValidProductNqlFilter = /^(?:product:[\w-]+,?)+$/.test(contentVisibility);
|
|
32
|
-
const now = knex.raw('CURRENT_TIMESTAMP');
|
|
33
|
-
// Reset visibility value to paid if invalid string/filter
|
|
34
|
-
if (!isValidProductNqlFilter) {
|
|
35
|
-
logging.warn(`Found invalid default_content_visibility value - ${contentVisibility}, resetting to paid`);
|
|
36
|
-
await knex('settings')
|
|
37
|
-
.where({
|
|
38
|
-
key: 'default_content_visibility'
|
|
39
|
-
})
|
|
40
|
-
.update({
|
|
41
|
-
value: 'paid',
|
|
42
|
-
updated_at: now
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
logging.info(`Resetting default_content_visibility_tiers to []`);
|
|
46
|
-
await knex('settings')
|
|
47
|
-
.where({
|
|
48
|
-
key: 'default_content_visibility_tiers'
|
|
49
|
-
})
|
|
50
|
-
.update({
|
|
51
|
-
value: JSON.stringify([]),
|
|
52
|
-
updated_at: now
|
|
53
|
-
});
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// fetch product slugs from nql filter
|
|
58
|
-
const productSlugs = contentVisibility.split(',').map((segment) => {
|
|
59
|
-
return segment.replace('product:', '');
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
// get product ids for slugs
|
|
63
|
-
const products = await knex('products')
|
|
64
|
-
.select('id')
|
|
65
|
-
.whereIn('slug', productSlugs);
|
|
66
|
-
const productList = products.map((product) => {
|
|
67
|
-
return product.id;
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
logging.info(`Updating default_content_visibility to tiers`);
|
|
71
|
-
await knex('settings')
|
|
72
|
-
.where({
|
|
73
|
-
key: 'default_content_visibility'
|
|
74
|
-
})
|
|
75
|
-
.update({
|
|
76
|
-
value: 'tiers',
|
|
77
|
-
updated_at: now
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
logging.info(`Updating default_content_visibility_tiers to ${productList}`);
|
|
81
|
-
await knex('settings')
|
|
82
|
-
.where({
|
|
83
|
-
key: 'default_content_visibility_tiers'
|
|
84
|
-
})
|
|
85
|
-
.update({
|
|
86
|
-
value: JSON.stringify(productList),
|
|
87
|
-
updated_at: now
|
|
88
|
-
});
|
|
89
|
-
},
|
|
90
|
-
async function down(knex) {
|
|
91
|
-
logging.info('Reverting default_content_visibility for specific tiers');
|
|
92
|
-
|
|
93
|
-
const settings = await knex('settings')
|
|
94
|
-
.select()
|
|
95
|
-
.whereIn('key', ['default_content_visibility', 'default_content_visibility_tiers']);
|
|
96
|
-
const contentVisibilitySetting = settings.find(d => d.key === 'default_content_visibility');
|
|
97
|
-
const visibilityTiersSetting = settings.find(d => d.key === 'default_content_visibility_tiers');
|
|
98
|
-
|
|
99
|
-
const visibilityValue = contentVisibilitySetting && contentVisibilitySetting.value;
|
|
100
|
-
const visibilityTiersValue = visibilityTiersSetting && visibilityTiersSetting.value;
|
|
101
|
-
|
|
102
|
-
if (visibilityValue !== 'tiers') {
|
|
103
|
-
logging.info(`Ignoring default_content_visibility as is set to ${visibilityValue}.`);
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (!visibilityTiersValue) {
|
|
108
|
-
logging.warn(`Ignoring, found empty default_content_visibility_tiers value`);
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
try {
|
|
113
|
-
const parsedTiersValue = JSON.parse(visibilityTiersValue);
|
|
114
|
-
const products = await knex('products')
|
|
115
|
-
.select('slug')
|
|
116
|
-
.whereIn('id', parsedTiersValue);
|
|
117
|
-
const productSlugs = products.map((product) => {
|
|
118
|
-
return `product:${product.slug}`;
|
|
119
|
-
}).join(',');
|
|
120
|
-
const now = knex.raw('CURRENT_TIMESTAMP');
|
|
121
|
-
|
|
122
|
-
logging.info(`Setting default_content_visibility to ${productSlugs}`);
|
|
123
|
-
await knex('settings')
|
|
124
|
-
.where({
|
|
125
|
-
key: 'default_content_visibility'
|
|
126
|
-
})
|
|
127
|
-
.update({
|
|
128
|
-
value: productSlugs,
|
|
129
|
-
updated_at: now
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
logging.info(`Setting default_content_visibility_tiers to []`);
|
|
133
|
-
await knex('settings')
|
|
134
|
-
.where({
|
|
135
|
-
key: 'default_content_visibility_tiers'
|
|
136
|
-
})
|
|
137
|
-
.update({
|
|
138
|
-
value: JSON.stringify([]),
|
|
139
|
-
updated_at: now
|
|
140
|
-
});
|
|
141
|
-
} catch (e) {
|
|
142
|
-
logging.warn(`Invalid default_content_visibility_tiers value - ${visibilityTiersValue}`);
|
|
143
|
-
logging.warn(e);
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
);
|
package/core/server/data/migrations/versions/4.35/2022-02-04-04-34-populate-empty-portal-products.js
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
const {createTransactionalMigration} = require('../../utils');
|
|
2
|
-
const logging = require('@tryghost/logging');
|
|
3
|
-
|
|
4
|
-
module.exports = createTransactionalMigration(
|
|
5
|
-
async function up(knex) {
|
|
6
|
-
const products = await knex
|
|
7
|
-
.select('id')
|
|
8
|
-
.where({
|
|
9
|
-
type: 'paid'
|
|
10
|
-
})
|
|
11
|
-
.from('products');
|
|
12
|
-
|
|
13
|
-
if (products.length === 0) {
|
|
14
|
-
logging.warn(`Skipping updating portal_products, no product exists`);
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
if (products.length > 1) {
|
|
19
|
-
logging.warn(`Skipping updating portal_products, tiers beta is enabled`);
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const portalProductsSetting = await knex('settings')
|
|
24
|
-
.where('key', 'portal_products')
|
|
25
|
-
.select('value')
|
|
26
|
-
.first();
|
|
27
|
-
|
|
28
|
-
if (!portalProductsSetting) {
|
|
29
|
-
logging.warn(`Missing portal_products setting`);
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
try {
|
|
33
|
-
const currPortalProductsValue = JSON.parse(portalProductsSetting.value);
|
|
34
|
-
|
|
35
|
-
if (currPortalProductsValue.length > 0) {
|
|
36
|
-
logging.warn(`Ignoring - portal_products setting is not empty, - ${currPortalProductsValue}`);
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const defaultProduct = products[0];
|
|
41
|
-
const portalProductsValue = [defaultProduct.id];
|
|
42
|
-
|
|
43
|
-
logging.info(`Setting portal_products setting to have product - ${defaultProduct.id}`);
|
|
44
|
-
|
|
45
|
-
const now = knex.raw('CURRENT_TIMESTAMP');
|
|
46
|
-
|
|
47
|
-
await knex('settings')
|
|
48
|
-
.where('key', 'portal_products')
|
|
49
|
-
.update({
|
|
50
|
-
value: JSON.stringify(portalProductsValue),
|
|
51
|
-
updated_at: now
|
|
52
|
-
});
|
|
53
|
-
} catch (e) {
|
|
54
|
-
logging.warn(`Ignoring, unable to parse portal_products setting value - ${portalProductsSetting.value}`);
|
|
55
|
-
logging.warn(e);
|
|
56
|
-
}
|
|
57
|
-
},
|
|
58
|
-
// no-op - we don't want to return to invalid state
|
|
59
|
-
async function down() {}
|
|
60
|
-
);
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
const logging = require('@tryghost/logging');
|
|
2
|
-
const {createTransactionalMigration} = require('../../utils');
|
|
3
|
-
const DatabaseInfo = require('@tryghost/database-info');
|
|
4
|
-
|
|
5
|
-
module.exports = createTransactionalMigration(
|
|
6
|
-
async function up(knex) {
|
|
7
|
-
if (DatabaseInfo.isSQLite(knex)) {
|
|
8
|
-
logging.warn('Skipping migration for SQLite3');
|
|
9
|
-
return;
|
|
10
|
-
}
|
|
11
|
-
logging.info('Backfilling the members.last_seen_at column from members_login_events.');
|
|
12
|
-
await knex.raw(`
|
|
13
|
-
UPDATE members
|
|
14
|
-
INNER JOIN (SELECT member_id as id, MAX(created_at) as last_seen_at
|
|
15
|
-
FROM members_login_events
|
|
16
|
-
GROUP BY member_id) as logins ON logins.id = members.id
|
|
17
|
-
SET
|
|
18
|
-
members.last_seen_at = logins.last_seen_at
|
|
19
|
-
WHERE
|
|
20
|
-
members.last_seen_at IS NULL
|
|
21
|
-
OR members.last_seen_at < logins.last_seen_at
|
|
22
|
-
`);
|
|
23
|
-
},
|
|
24
|
-
async function down(knex) {
|
|
25
|
-
if (DatabaseInfo.isSQLite(knex)) {
|
|
26
|
-
logging.warn('Skipping migration for SQLite3');
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
logging.info('Rolling back the backfilling of the members.last_seen_at column from members_login_events.');
|
|
30
|
-
await knex('members').update({last_seen_at: null});
|
|
31
|
-
}
|
|
32
|
-
);
|
package/core/server/data/migrations/versions/4.38/2022-03-01-08-46-add-visibility-to-tiers.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
const {createAddColumnMigration} = require('../../utils');
|
|
2
|
-
|
|
3
|
-
module.exports = createAddColumnMigration('products', 'visible', {
|
|
4
|
-
type: 'boolean',
|
|
5
|
-
nullable: false,
|
|
6
|
-
defaultTo: false
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
module.exports.up = async () => {
|
|
10
|
-
// noop - column will be replaced with `visibility` instead
|
|
11
|
-
};
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
const logging = require('@tryghost/logging');
|
|
2
|
-
const {createTransactionalMigration} = require('../../utils');
|
|
3
|
-
|
|
4
|
-
module.exports = createTransactionalMigration(
|
|
5
|
-
async function up(knex) {
|
|
6
|
-
const portalPlanSetting = await knex('settings').select('value').where('key', 'portal_plans').first();
|
|
7
|
-
|
|
8
|
-
if (!portalPlanSetting) {
|
|
9
|
-
logging.warn('Could not find portal_plans setting - skipping migration');
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
try {
|
|
14
|
-
const settingData = JSON.parse(portalPlanSetting.value);
|
|
15
|
-
|
|
16
|
-
if (!settingData.includes('free')) {
|
|
17
|
-
logging.warn(`portal_plans does not include "free" - skipping migration`);
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
logging.info(`Updating free products to visible`);
|
|
22
|
-
await knex('products').update('visibility', 'public').where('type', 'free');
|
|
23
|
-
} catch (err) {
|
|
24
|
-
logging.error(err);
|
|
25
|
-
logging.warn('portal_plans setting is invalid - skipping migration');
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
async function down(knex) {
|
|
30
|
-
const freeTier = await knex('products').select('id').where('type', 'free').first();
|
|
31
|
-
const portalPlanSetting = await knex('settings').select('value').where('key', 'portal_plans').first();
|
|
32
|
-
|
|
33
|
-
if (!freeTier) {
|
|
34
|
-
logging.info('Free tier is not visible, not updating portal_plans');
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (!portalPlanSetting) {
|
|
39
|
-
logging.warn('Could not find portal_plans setting - skipping migration');
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
try {
|
|
44
|
-
const existingSettingData = JSON.parse(portalPlanSetting.value);
|
|
45
|
-
let settingData;
|
|
46
|
-
|
|
47
|
-
if (freeTier.visibility === 'public') {
|
|
48
|
-
if (existingSettingData.includes('free')) {
|
|
49
|
-
logging.info('portal_plans setting already contains "free" - skipping update');
|
|
50
|
-
return;
|
|
51
|
-
} else {
|
|
52
|
-
settingData = JSON.stringify(existingSettingData.concat('free'));
|
|
53
|
-
}
|
|
54
|
-
} else {
|
|
55
|
-
settingData = JSON.stringify(existingSettingData.filter(value => value !== 'free'));
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
logging.info(`Updating portal_plans to ${settingData}`);
|
|
59
|
-
await knex('settings').update('value', settingData).where('key', 'portal_plans');
|
|
60
|
-
} catch (err) {
|
|
61
|
-
logging.error(err);
|
|
62
|
-
logging.warn('portal_plans setting is invalid - skipping migration');
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
);
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
const logging = require('@tryghost/logging');
|
|
2
|
-
const {createTransactionalMigration} = require('../../utils');
|
|
3
|
-
|
|
4
|
-
module.exports = createTransactionalMigration(
|
|
5
|
-
async function up(knex) {
|
|
6
|
-
const portalProductSetting = await knex('settings').select('value').where('key', 'portal_products').first();
|
|
7
|
-
|
|
8
|
-
if (!portalProductSetting) {
|
|
9
|
-
logging.warn('Could not find portal_products setting - skipping migration');
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
try {
|
|
14
|
-
const settingData = JSON.parse(portalProductSetting.value);
|
|
15
|
-
|
|
16
|
-
if (settingData.length === 0) {
|
|
17
|
-
logging.warn(`portal_product is empty, skipping migrations`);
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
logging.info(`Updating ${settingData.length} products to visible, ${settingData}`);
|
|
22
|
-
await knex('products').update('visibility', 'public').whereIn('id', settingData);
|
|
23
|
-
} catch (err) {
|
|
24
|
-
logging.warn('portal_products setting is invalid - skipping migration');
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
async function down(knex) {
|
|
29
|
-
const visibleTiers = await knex('products').select('id').where('visibility', 'public');
|
|
30
|
-
|
|
31
|
-
const settingData = JSON.stringify(visibleTiers.map(obj => obj.id));
|
|
32
|
-
|
|
33
|
-
logging.info(`Updating portal_products to ${settingData}`);
|
|
34
|
-
await knex('settings').update('value', settingData).where('key', 'portal_products');
|
|
35
|
-
}
|
|
36
|
-
);
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
const logging = require('@tryghost/logging');
|
|
2
|
-
const {createTransactionalMigration} = require('../../utils');
|
|
3
|
-
const config = require('../../../../../shared/config');
|
|
4
|
-
const fs = require('fs-extra');
|
|
5
|
-
const path = require('path');
|
|
6
|
-
const semver = require('semver');
|
|
7
|
-
|
|
8
|
-
// 4.3.0 contained a buggy migration for members_allow_free_signup -> members_signup_access
|
|
9
|
-
// meaning all sites switched to allowing free member signup.
|
|
10
|
-
//
|
|
11
|
-
// This migration attempts to fix that by finding the original value from the db backup file
|
|
12
|
-
// created during migration and updating the new setting value to match
|
|
13
|
-
|
|
14
|
-
// we only care about backups created since the bad release was published
|
|
15
|
-
const MIN_DATE = new Date('2021-04-21T00:00:00.000Z');
|
|
16
|
-
|
|
17
|
-
module.exports = createTransactionalMigration(
|
|
18
|
-
async function up(connection) {
|
|
19
|
-
const currentSetting = await connection('settings')
|
|
20
|
-
.where({key: 'members_signup_access'})
|
|
21
|
-
.select('value')
|
|
22
|
-
.first();
|
|
23
|
-
|
|
24
|
-
if (!currentSetting) {
|
|
25
|
-
logging.info('Skipping restore of "allow free signups", `members_signup_access` setting doesn\'t exist');
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
if (currentSetting.value !== 'all') {
|
|
30
|
-
logging.info('Skipping restore of "allow free signups", setting changed since bad migration');
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// 1. find any backup files that have a date of 2021-04-21 or later
|
|
35
|
-
// 2. loop through backup files to find first one exported on 4.3.0 or later
|
|
36
|
-
// 3. load JSON and get correct value
|
|
37
|
-
// 4. update database if necessary
|
|
38
|
-
const contentPath = config.get('paths').contentPath;
|
|
39
|
-
const dataPath = path.join(contentPath, 'data');
|
|
40
|
-
const backupFileRegex = /ghost\.([\d]{4}-[\d]{2}-[\d]{2})-([\d]{2}-[\d]{2}-[\d]{2})\.json$/;
|
|
41
|
-
|
|
42
|
-
const backupFileDate = function (filename) {
|
|
43
|
-
const dateMatch = filename.match(backupFileRegex);
|
|
44
|
-
return new Date(`${dateMatch[1]}T${dateMatch[2].replace(/-/g, ':')}.000Z`);
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
logging.info('Restoring "allow free signups" value from backup files if needed');
|
|
48
|
-
|
|
49
|
-
let files;
|
|
50
|
-
|
|
51
|
-
try {
|
|
52
|
-
files = await fs.readdir(dataPath);
|
|
53
|
-
} catch (error) {
|
|
54
|
-
logging.info('Skipping restore, unable to read backup files');
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// filter to known backup files, later than min date, ordered earliest to latest
|
|
59
|
-
const backupFiles = files
|
|
60
|
-
.filter(filename => backupFileRegex.test(filename))
|
|
61
|
-
.filter(filename => backupFileDate(filename) > MIN_DATE)
|
|
62
|
-
.sort((a, b) => backupFileDate(a) - backupFileDate(b));
|
|
63
|
-
|
|
64
|
-
let hasRestored = false;
|
|
65
|
-
|
|
66
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
67
|
-
for (const backupFile of backupFiles) {
|
|
68
|
-
try {
|
|
69
|
-
const backup = require(path.join(dataPath, backupFile));
|
|
70
|
-
|
|
71
|
-
if (semver.satisfies(backup.meta.version, '4.3.x')) {
|
|
72
|
-
const oldValue = backup.data.settings.find(s => s.key === 'members_allow_free_signup');
|
|
73
|
-
|
|
74
|
-
if (oldValue && oldValue.value === 'false') {
|
|
75
|
-
logging.info('Setting `members_signup_access` to \'invite\' to match previous `members_allow_free_signup` setting');
|
|
76
|
-
|
|
77
|
-
await connection('settings')
|
|
78
|
-
.where({key: 'members_signup_access'})
|
|
79
|
-
.update({value: 'invite'});
|
|
80
|
-
|
|
81
|
-
// found earliest backup we care about, don't check any more files
|
|
82
|
-
hasRestored = true;
|
|
83
|
-
break;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
} catch (error) {
|
|
87
|
-
// noop, move on to next file
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
if (!hasRestored) {
|
|
92
|
-
logging.info('Skipping restore, not necessary');
|
|
93
|
-
}
|
|
94
|
-
},
|
|
95
|
-
|
|
96
|
-
async function down() {
|
|
97
|
-
// noop
|
|
98
|
-
}
|
|
99
|
-
);
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
const logging = require('@tryghost/logging');
|
|
2
|
-
const {createTransactionalMigration} = require('../../utils');
|
|
3
|
-
const MembersConfigProvider = require('../../../../services/members/MembersConfigProvider');
|
|
4
|
-
const settingsCache = require('../../../../../shared/settings-cache');
|
|
5
|
-
const config = require('../../../../../shared/config');
|
|
6
|
-
|
|
7
|
-
// members_allow_free_signup was migrated to members_signup_access in 4.3/08-migrate-members-signup-setting
|
|
8
|
-
// using a direct binary migration of true=all and false=invite based on new setting behaviour matching the
|
|
9
|
-
// old setting. That was innacurate and the behaviour is changing to a proper invite-only toggle which
|
|
10
|
-
// requires a more nuanced migration.
|
|
11
|
-
//
|
|
12
|
-
// 'all' - no need to change, matches expected behaviour
|
|
13
|
-
// 'invite' - change to 'all' based on members usage
|
|
14
|
-
// 'none' - no need to change, it's a completely new option that wasn't previously migrated to
|
|
15
|
-
//
|
|
16
|
-
// For the majority of cases 'invite' should actually be 'all'. The true invite-only case is:
|
|
17
|
-
// - stripe not configured
|
|
18
|
-
// - portal configured with no plans
|
|
19
|
-
//
|
|
20
|
-
// When switching from signup access from 'invite' to 'all' we also need to remove the 'free' plan from
|
|
21
|
-
// portal settings to avoid paid-only sites suddenly offering free plan signups
|
|
22
|
-
|
|
23
|
-
module.exports = createTransactionalMigration(
|
|
24
|
-
async function up(connection) {
|
|
25
|
-
const currentSetting = await connection('settings')
|
|
26
|
-
.where('key', 'members_signup_access')
|
|
27
|
-
.select('value')
|
|
28
|
-
.first();
|
|
29
|
-
|
|
30
|
-
if (!currentSetting) {
|
|
31
|
-
logging.info('Skipping update of members_signup_access setting. Does not exist');
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
if (currentSetting.value !== 'invite') {
|
|
36
|
-
logging.info(`Skipping update of members_signup_access setting. Not set to 'invite', keeping current value`);
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const membersConfig = new MembersConfigProvider({
|
|
41
|
-
settingsCache,
|
|
42
|
-
config
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
const hasStripe = membersConfig.isStripeConnected();
|
|
46
|
-
|
|
47
|
-
if (!hasStripe) {
|
|
48
|
-
logging.info('Skipping update of members_signup_access setting. Stripe is not configured, staying as invite-only');
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const portalPlansSetting = await connection('settings')
|
|
53
|
-
.where('key', 'portal_plans')
|
|
54
|
-
.select('value')
|
|
55
|
-
.first();
|
|
56
|
-
|
|
57
|
-
if (!portalPlansSetting) {
|
|
58
|
-
// shouldn't be reachable because members_signup_access wouldn't exist either for a clean install but better to be safe
|
|
59
|
-
logging.info('Skipping update of members_signup_access setting. Portal plans setting does not exist');
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
let currentPlans = JSON.parse(portalPlansSetting.value);
|
|
64
|
-
|
|
65
|
-
if (currentPlans.length === 0) {
|
|
66
|
-
logging.info('Skipping update of members_signup_access setting. Portal configured as invite-only, staying as invite-only');
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
logging.info(`Updating members_signup_access setting to 'all'`);
|
|
71
|
-
await connection('settings')
|
|
72
|
-
.where('key', 'members_signup_access')
|
|
73
|
-
.update({value: 'all'});
|
|
74
|
-
|
|
75
|
-
if (currentPlans.includes('free')) {
|
|
76
|
-
currentPlans.splice(currentPlans.indexOf('free'), 1);
|
|
77
|
-
|
|
78
|
-
logging.info(`Removing free plan from portal plans setting to match "allow free members signup = false" behaviour`);
|
|
79
|
-
await connection('settings')
|
|
80
|
-
.where('key', 'portal_plans')
|
|
81
|
-
.update({value: JSON.stringify(currentPlans)});
|
|
82
|
-
}
|
|
83
|
-
},
|
|
84
|
-
|
|
85
|
-
async function down(connection) {
|
|
86
|
-
const accessSetting = await connection('settings')
|
|
87
|
-
.where('key', 'members_signup_access')
|
|
88
|
-
.select('value')
|
|
89
|
-
.first();
|
|
90
|
-
|
|
91
|
-
if (!accessSetting) {
|
|
92
|
-
logging.info('Skipping rollback of members_signup_access setting. Does not exist.');
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
if (accessSetting.value !== 'all') {
|
|
97
|
-
logging.info(`Skipping rollback of members_signup_access setting. Not set 'all', nothing to roll back`);
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const portalPlansSetting = await connection('settings')
|
|
102
|
-
.where('key', 'portal_plans')
|
|
103
|
-
.select('value')
|
|
104
|
-
.first();
|
|
105
|
-
|
|
106
|
-
const membersConfig = new MembersConfigProvider({
|
|
107
|
-
settingsCache,
|
|
108
|
-
config
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
const hasStripe = membersConfig.isStripeConnected();
|
|
112
|
-
|
|
113
|
-
if (hasStripe && JSON.parse(portalPlansSetting.value).length === 0) {
|
|
114
|
-
logging.info(`Reverting members_signup_access setting to 'invite'`);
|
|
115
|
-
await connection('settings')
|
|
116
|
-
.where('key', 'members_signup_access')
|
|
117
|
-
.update({value: 'invite'});
|
|
118
|
-
|
|
119
|
-
// free plan removal is not rolled back because we can't be 100% sure of it's previous state
|
|
120
|
-
// this won't have any detrimental effect because the free plan was already hidden by the
|
|
121
|
-
// "allow free members signup = false" or 4.3.x "members_signup_access = 'invite'" settings
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
logging.info(`Skipping rollback of members_signup_access setting. Value did not match \`up\` requirements`);
|
|
125
|
-
}
|
|
126
|
-
);
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
const {addTable} = require('../../utils');
|
|
2
|
-
|
|
3
|
-
module.exports = addTable('members_cancel_events', {
|
|
4
|
-
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
5
|
-
member_id: {type: 'string', maxlength: 24, nullable: false, references: 'members.id', cascadeDelete: true},
|
|
6
|
-
from_plan: {type: 'string', maxlength: 255, nullable: false},
|
|
7
|
-
created_at: {type: 'dateTime', nullable: false}
|
|
8
|
-
});
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
const {
|
|
2
|
-
combineTransactionalMigrations,
|
|
3
|
-
addPermissionToRole
|
|
4
|
-
} = require('../../utils');
|
|
5
|
-
|
|
6
|
-
module.exports = combineTransactionalMigrations(
|
|
7
|
-
addPermissionToRole({
|
|
8
|
-
permission: 'Browse offers',
|
|
9
|
-
role: 'Admin Integration'
|
|
10
|
-
}),
|
|
11
|
-
addPermissionToRole({
|
|
12
|
-
permission: 'Read offers',
|
|
13
|
-
role: 'Admin Integration'
|
|
14
|
-
}),
|
|
15
|
-
addPermissionToRole({
|
|
16
|
-
permission: 'Edit offers',
|
|
17
|
-
role: 'Admin Integration'
|
|
18
|
-
}),
|
|
19
|
-
addPermissionToRole({
|
|
20
|
-
permission: 'Add offers',
|
|
21
|
-
role: 'Admin Integration'
|
|
22
|
-
})
|
|
23
|
-
);
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
const {combineTransactionalMigrations, addPermissionToRole} = require('../../utils');
|
|
2
|
-
|
|
3
|
-
module.exports = combineTransactionalMigrations(
|
|
4
|
-
addPermissionToRole({
|
|
5
|
-
permission: 'Browse Products',
|
|
6
|
-
role: 'Admin Integration'
|
|
7
|
-
}),
|
|
8
|
-
addPermissionToRole({
|
|
9
|
-
permission: 'Read Products',
|
|
10
|
-
role: 'Admin Integration'
|
|
11
|
-
}),
|
|
12
|
-
addPermissionToRole({
|
|
13
|
-
permission: 'Edit Products',
|
|
14
|
-
role: 'Admin Integration'
|
|
15
|
-
}),
|
|
16
|
-
addPermissionToRole({
|
|
17
|
-
permission: 'Add Products',
|
|
18
|
-
role: 'Admin Integration'
|
|
19
|
-
})
|
|
20
|
-
);
|