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
|
@@ -8,8 +8,39 @@ const baseUtils = require('../../../models/base/utils');
|
|
|
8
8
|
const moment = require('moment');
|
|
9
9
|
|
|
10
10
|
class FixtureManager {
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Create a new FixtureManager instance
|
|
13
|
+
*
|
|
14
|
+
* @param {Object} fixtures - The fixture data
|
|
15
|
+
* @param {Object<string, Function>} placeholderMap - Map of placeholder
|
|
16
|
+
* strings to replacement functions that will be called with the models
|
|
17
|
+
* object. The replacement function will be called with the models object
|
|
18
|
+
* and should return the replacement value. The replacement function will
|
|
19
|
+
* only be called once and its value will be cached for subsequent calls.
|
|
20
|
+
* The placeholder string will be replaced with the replacement value in
|
|
21
|
+
* the fixtures.
|
|
22
|
+
* @example
|
|
23
|
+
* new FixtureManager(fixtures, {
|
|
24
|
+
* __OWNER_USER_ID__: (models) => models.User.generateId()
|
|
25
|
+
* })
|
|
26
|
+
*/
|
|
27
|
+
constructor(fixtures, placeholderMap = {}) {
|
|
28
|
+
this._fixtures = fixtures;
|
|
29
|
+
this.placeholderMap = placeholderMap;
|
|
30
|
+
this.hasProcessedFixtures = false;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Lazily get the fixtures, processing placeholders on first access
|
|
35
|
+
* @returns {Object}
|
|
36
|
+
*/
|
|
37
|
+
get fixtures() {
|
|
38
|
+
if (!this.hasProcessedFixtures) {
|
|
39
|
+
this._fixtures = this.processFixtures(this._fixtures, this.placeholderMap);
|
|
40
|
+
this.hasProcessedFixtures = true;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return this._fixtures;
|
|
13
44
|
}
|
|
14
45
|
|
|
15
46
|
/**
|
|
@@ -68,9 +99,17 @@ class FixtureManager {
|
|
|
68
99
|
* @returns
|
|
69
100
|
*/
|
|
70
101
|
async addAllFixtures(options) {
|
|
102
|
+
const ownerUserId = this.findOwnerUserId();
|
|
103
|
+
|
|
71
104
|
const localOptions = _.merge({
|
|
72
105
|
autoRefresh: false,
|
|
73
|
-
context: {
|
|
106
|
+
context: {
|
|
107
|
+
internal: true,
|
|
108
|
+
// Ensure the owner user is set in the context when creating
|
|
109
|
+
// the fixtures so that attribution gets correctly set (i.e
|
|
110
|
+
// the owner user is set as the `published_by` user on posts)
|
|
111
|
+
user: ownerUserId
|
|
112
|
+
},
|
|
74
113
|
migrating: true
|
|
75
114
|
}, options);
|
|
76
115
|
|
|
@@ -85,7 +124,6 @@ class FixtureManager {
|
|
|
85
124
|
|
|
86
125
|
await sequence(this.fixtures.models.filter(m => !['User', 'Role'].includes(m.name)).map(model => () => {
|
|
87
126
|
logging.info('Model: ' + model.name);
|
|
88
|
-
|
|
89
127
|
return this.addFixturesForModel(model, localOptions);
|
|
90
128
|
}));
|
|
91
129
|
|
|
@@ -175,9 +213,94 @@ class FixtureManager {
|
|
|
175
213
|
return foundRelation;
|
|
176
214
|
}
|
|
177
215
|
|
|
216
|
+
/**
|
|
217
|
+
* ### Find Owner User ID
|
|
218
|
+
* Find the owner user ID from the relation fixture
|
|
219
|
+
* @returns {string}
|
|
220
|
+
*/
|
|
221
|
+
findOwnerUserId() {
|
|
222
|
+
const relation = this.findRelationFixture('User', 'Role');
|
|
223
|
+
|
|
224
|
+
return Object.keys(relation.entries).find(
|
|
225
|
+
key => relation.entries[key].includes('Owner')
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
|
|
178
229
|
/******************************************************
|
|
179
230
|
* From here down, the methods require access to models
|
|
180
|
-
|
|
231
|
+
******************************************************/
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Process fixtures by replacing placeholder strings with dynamic values
|
|
235
|
+
*
|
|
236
|
+
* @param {Object} fixtures - The fixture data to process
|
|
237
|
+
* @param {Object<string, Function>} placeholderMap - Map of placeholder
|
|
238
|
+
* strings to replacement functions that will be called with the models
|
|
239
|
+
* object. The replacement function will be called with the models object
|
|
240
|
+
* and should return the replacement value. The replacement function will
|
|
241
|
+
* only be called once and its value will be cached for subsequent calls.
|
|
242
|
+
* The placeholder string will be replaced with the replacement value in
|
|
243
|
+
* the fixtures.
|
|
244
|
+
* @returns {Object}
|
|
245
|
+
*/
|
|
246
|
+
processFixtures(fixtures, placeholderMap) {
|
|
247
|
+
const cache = new Map();
|
|
248
|
+
|
|
249
|
+
const processString = (str, replacements) => {
|
|
250
|
+
let result = str;
|
|
251
|
+
|
|
252
|
+
for (const placeholder in replacements) {
|
|
253
|
+
if (result.includes(placeholder)) {
|
|
254
|
+
if (!cache.has(placeholder)) {
|
|
255
|
+
cache.set(placeholder, replacements[placeholder](models));
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const processedValue = cache.get(placeholder);
|
|
259
|
+
|
|
260
|
+
result = result.replaceAll(placeholder, processedValue);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
return result;
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
const replacePlaceholders = (obj, replacements) => {
|
|
268
|
+
if (obj === null || obj === undefined) {
|
|
269
|
+
return obj;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
if (typeof obj === 'string') {
|
|
273
|
+
return processString(obj, replacements);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if (Array.isArray(obj)) {
|
|
277
|
+
return obj.map(item => replacePlaceholders(item, replacements));
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if (typeof obj === 'object') {
|
|
281
|
+
const result = {};
|
|
282
|
+
|
|
283
|
+
for (const key in obj) {
|
|
284
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
285
|
+
// Process the key itself for placeholders
|
|
286
|
+
const newKey = processString(key, replacements);
|
|
287
|
+
|
|
288
|
+
result[newKey] = replacePlaceholders(obj[key], replacements);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
return result;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
return obj;
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
return replacePlaceholders(fixtures, placeholderMap);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/******************************************************
|
|
302
|
+
* From here down, the methods aren't dependent on
|
|
303
|
+
* this.fixtures
|
|
181
304
|
******************************************************/
|
|
182
305
|
|
|
183
306
|
/**
|
|
@@ -722,7 +722,7 @@
|
|
|
722
722
|
"name": "User",
|
|
723
723
|
"entries": [
|
|
724
724
|
{
|
|
725
|
-
"id":
|
|
725
|
+
"id": "__OWNER_USER_ID__",
|
|
726
726
|
"name": "Ghost",
|
|
727
727
|
"email": "ghost@example.com",
|
|
728
728
|
"status": "inactive",
|
|
@@ -746,8 +746,7 @@
|
|
|
746
746
|
"type": "post",
|
|
747
747
|
"status": "published",
|
|
748
748
|
"visibility": "public",
|
|
749
|
-
"
|
|
750
|
-
"published_by": "1"
|
|
749
|
+
"published_by": "__OWNER_USER_ID__"
|
|
751
750
|
},
|
|
752
751
|
{
|
|
753
752
|
"title": "About this site",
|
|
@@ -757,8 +756,7 @@
|
|
|
757
756
|
"type": "page",
|
|
758
757
|
"status": "published",
|
|
759
758
|
"visibility": "public",
|
|
760
|
-
"
|
|
761
|
-
"published_by": "1"
|
|
759
|
+
"published_by": "__OWNER_USER_ID__"
|
|
762
760
|
}
|
|
763
761
|
]
|
|
764
762
|
},
|
|
@@ -1023,7 +1021,7 @@
|
|
|
1023
1021
|
"match": "name"
|
|
1024
1022
|
},
|
|
1025
1023
|
"entries": {
|
|
1026
|
-
"
|
|
1024
|
+
"__OWNER_USER_ID__": ["Owner"]
|
|
1027
1025
|
}
|
|
1028
1026
|
}
|
|
1029
1027
|
]
|
|
@@ -5,4 +5,6 @@ const fixturePath = config.get('paths').fixtures;
|
|
|
5
5
|
const fixtures = require(fixturePath);
|
|
6
6
|
|
|
7
7
|
module.exports.FixtureManager = FixtureManager;
|
|
8
|
-
module.exports.fixtureManager = new FixtureManager(fixtures
|
|
8
|
+
module.exports.fixtureManager = new FixtureManager(fixtures, {
|
|
9
|
+
__OWNER_USER_ID__: models => models.User.generateId()
|
|
10
|
+
});
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/* String Column Sizes Information
|
|
2
2
|
* (From: https://github.com/TryGhost/Ghost/pull/7932)
|
|
3
|
-
*
|
|
3
|
+
* New/Updated column maxlengths should meet these guidlines
|
|
4
|
+
*
|
|
4
5
|
* Small strings = length 50
|
|
5
6
|
* Medium strings = length 191
|
|
6
|
-
* Large strings = length
|
|
7
|
+
* Large strings = length 2000 (use soft limits via validation for 191-2000)
|
|
7
8
|
* Text = length 65535 (64 KiB)
|
|
8
9
|
* Long text = length 1,000,000,000
|
|
9
10
|
*/
|
|
@@ -85,14 +86,7 @@ module.exports = {
|
|
|
85
86
|
nullable: false
|
|
86
87
|
},
|
|
87
88
|
created_at: {type: 'dateTime', nullable: false},
|
|
88
|
-
/**
|
|
89
|
-
* @deprecated: https://github.com/TryGhost/Ghost/issues/10286
|
|
90
|
-
*
|
|
91
|
-
* This is valid for all x_by fields.
|
|
92
|
-
*/
|
|
93
|
-
created_by: {type: 'string', maxlength: 24, nullable: false},
|
|
94
89
|
updated_at: {type: 'dateTime', nullable: true, index: true},
|
|
95
|
-
updated_by: {type: 'string', maxlength: 24, nullable: true},
|
|
96
90
|
published_at: {type: 'dateTime', nullable: true, index: true},
|
|
97
91
|
published_by: {type: 'string', maxlength: 24, nullable: true},
|
|
98
92
|
custom_excerpt: {type: 'string', maxlength: 2000, nullable: true, validations: {isLength: {max: 300}}},
|
|
@@ -122,7 +116,7 @@ module.exports = {
|
|
|
122
116
|
meta_description: {type: 'string', maxlength: 2000, nullable: true, validations: {isLength: {max: 500}}},
|
|
123
117
|
email_subject: {type: 'string', maxlength: 300, nullable: true},
|
|
124
118
|
frontmatter: {type: 'text', maxlength: 65535, nullable: true},
|
|
125
|
-
feature_image_alt: {type: 'string', maxlength:
|
|
119
|
+
feature_image_alt: {type: 'string', maxlength: 2000, nullable: true, validations: {isLength: {max: 191}}},
|
|
126
120
|
feature_image_caption: {type: 'text', maxlength: 65535, nullable: true},
|
|
127
121
|
email_only: {type: 'boolean', nullable: false, defaultTo: false}
|
|
128
122
|
},
|
|
@@ -188,9 +182,7 @@ module.exports = {
|
|
|
188
182
|
milestone_notifications: {type: 'boolean', nullable: false, defaultTo: true},
|
|
189
183
|
donation_notifications: {type: 'boolean', nullable: false, defaultTo: true},
|
|
190
184
|
created_at: {type: 'dateTime', nullable: false},
|
|
191
|
-
|
|
192
|
-
updated_at: {type: 'dateTime', nullable: true},
|
|
193
|
-
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
185
|
+
updated_at: {type: 'dateTime', nullable: true}
|
|
194
186
|
},
|
|
195
187
|
posts_authors: {
|
|
196
188
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
@@ -203,9 +195,7 @@ module.exports = {
|
|
|
203
195
|
name: {type: 'string', maxlength: 50, nullable: false, unique: true},
|
|
204
196
|
description: {type: 'string', maxlength: 2000, nullable: true},
|
|
205
197
|
created_at: {type: 'dateTime', nullable: false},
|
|
206
|
-
|
|
207
|
-
updated_at: {type: 'dateTime', nullable: true},
|
|
208
|
-
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
198
|
+
updated_at: {type: 'dateTime', nullable: true}
|
|
209
199
|
},
|
|
210
200
|
roles_users: {
|
|
211
201
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
@@ -219,9 +209,7 @@ module.exports = {
|
|
|
219
209
|
action_type: {type: 'string', maxlength: 50, nullable: false},
|
|
220
210
|
object_id: {type: 'string', maxlength: 24, nullable: true},
|
|
221
211
|
created_at: {type: 'dateTime', nullable: false},
|
|
222
|
-
|
|
223
|
-
updated_at: {type: 'dateTime', nullable: true},
|
|
224
|
-
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
212
|
+
updated_at: {type: 'dateTime', nullable: true}
|
|
225
213
|
},
|
|
226
214
|
permissions_users: {
|
|
227
215
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
@@ -242,7 +230,6 @@ module.exports = {
|
|
|
242
230
|
defaultTo: 'core',
|
|
243
231
|
validations: {
|
|
244
232
|
isIn: [[
|
|
245
|
-
'amp',
|
|
246
233
|
'core',
|
|
247
234
|
'email',
|
|
248
235
|
'labs',
|
|
@@ -276,9 +263,7 @@ module.exports = {
|
|
|
276
263
|
},
|
|
277
264
|
flags: {type: 'string', maxlength: 50, nullable: true},
|
|
278
265
|
created_at: {type: 'dateTime', nullable: false},
|
|
279
|
-
|
|
280
|
-
updated_at: {type: 'dateTime', nullable: true},
|
|
281
|
-
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
266
|
+
updated_at: {type: 'dateTime', nullable: true}
|
|
282
267
|
},
|
|
283
268
|
tags: {
|
|
284
269
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
@@ -307,9 +292,7 @@ module.exports = {
|
|
|
307
292
|
canonical_url: {type: 'string', maxlength: 2000, nullable: true},
|
|
308
293
|
accent_color: {type: 'string', maxlength: 50, nullable: true},
|
|
309
294
|
created_at: {type: 'dateTime', nullable: false},
|
|
310
|
-
|
|
311
|
-
updated_at: {type: 'dateTime', nullable: true},
|
|
312
|
-
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
295
|
+
updated_at: {type: 'dateTime', nullable: true}
|
|
313
296
|
},
|
|
314
297
|
posts_tags: {
|
|
315
298
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
@@ -334,9 +317,7 @@ module.exports = {
|
|
|
334
317
|
email: {type: 'string', maxlength: 191, nullable: false, unique: true, validations: {isEmail: true}},
|
|
335
318
|
expires: {type: 'bigInteger', nullable: false},
|
|
336
319
|
created_at: {type: 'dateTime', nullable: false},
|
|
337
|
-
|
|
338
|
-
updated_at: {type: 'dateTime', nullable: true},
|
|
339
|
-
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
320
|
+
updated_at: {type: 'dateTime', nullable: true}
|
|
340
321
|
},
|
|
341
322
|
brute: {
|
|
342
323
|
key: {type: 'string', maxlength: 191, primary: true},
|
|
@@ -367,9 +348,7 @@ module.exports = {
|
|
|
367
348
|
icon_image: {type: 'string', maxlength: 2000, nullable: true},
|
|
368
349
|
description: {type: 'string', maxlength: 2000, nullable: true},
|
|
369
350
|
created_at: {type: 'dateTime', nullable: false},
|
|
370
|
-
|
|
371
|
-
updated_at: {type: 'dateTime', nullable: true},
|
|
372
|
-
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
351
|
+
updated_at: {type: 'dateTime', nullable: true}
|
|
373
352
|
},
|
|
374
353
|
webhooks: {
|
|
375
354
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
@@ -387,9 +366,7 @@ module.exports = {
|
|
|
387
366
|
last_triggered_status: {type: 'string', maxlength: 50, nullable: true},
|
|
388
367
|
last_triggered_error: {type: 'string', maxlength: 50, nullable: true},
|
|
389
368
|
created_at: {type: 'dateTime', nullable: false},
|
|
390
|
-
|
|
391
|
-
updated_at: {type: 'dateTime', nullable: true},
|
|
392
|
-
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
369
|
+
updated_at: {type: 'dateTime', nullable: true}
|
|
393
370
|
},
|
|
394
371
|
api_keys: {
|
|
395
372
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
@@ -413,9 +390,7 @@ module.exports = {
|
|
|
413
390
|
last_seen_at: {type: 'dateTime', nullable: true},
|
|
414
391
|
last_seen_version: {type: 'string', maxlength: 50, nullable: true},
|
|
415
392
|
created_at: {type: 'dateTime', nullable: false},
|
|
416
|
-
|
|
417
|
-
updated_at: {type: 'dateTime', nullable: true},
|
|
418
|
-
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
393
|
+
updated_at: {type: 'dateTime', nullable: true}
|
|
419
394
|
},
|
|
420
395
|
mobiledoc_revisions: {
|
|
421
396
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
@@ -435,13 +410,13 @@ module.exports = {
|
|
|
435
410
|
post_status: {type: 'string', maxlength: 50, nullable: true, validations: {isIn: [['draft', 'published', 'scheduled', 'sent']]}},
|
|
436
411
|
reason: {type: 'string', maxlength: 50, nullable: true},
|
|
437
412
|
feature_image: {type: 'string', maxlength: 2000, nullable: true},
|
|
438
|
-
feature_image_alt: {type: 'string', maxlength:
|
|
413
|
+
feature_image_alt: {type: 'string', maxlength: 2000, nullable: true, validations: {isLength: {max: 191}}},
|
|
439
414
|
feature_image_caption: {type: 'text', maxlength: 65535, nullable: true},
|
|
440
415
|
custom_excerpt: {type: 'string', maxlength: 2000, nullable: true, validations: {isLength: {max: 300}}}
|
|
441
416
|
},
|
|
442
417
|
members: {
|
|
443
418
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
444
|
-
uuid: {type: 'string', maxlength: 36, nullable:
|
|
419
|
+
uuid: {type: 'string', maxlength: 36, nullable: false, unique: true, validations: {isUUID: true}},
|
|
445
420
|
transient_id: {type: 'string', maxlength: 191, nullable: false, unique: true},
|
|
446
421
|
email: {type: 'string', maxlength: 191, nullable: false, unique: true, validations: {isEmail: true}},
|
|
447
422
|
status: {
|
|
@@ -461,9 +436,7 @@ module.exports = {
|
|
|
461
436
|
last_seen_at: {type: 'dateTime', nullable: true},
|
|
462
437
|
last_commented_at: {type: 'dateTime', nullable: true},
|
|
463
438
|
created_at: {type: 'dateTime', nullable: false},
|
|
464
|
-
created_by: {type: 'string', maxlength: 24, nullable: false},
|
|
465
439
|
updated_at: {type: 'dateTime', nullable: true},
|
|
466
|
-
updated_by: {type: 'string', maxlength: 24, nullable: true},
|
|
467
440
|
'@@INDEXES@@': [
|
|
468
441
|
['email_disabled']
|
|
469
442
|
]
|
|
@@ -646,9 +619,7 @@ module.exports = {
|
|
|
646
619
|
name: {type: 'string', maxlength: 191, nullable: false, unique: true},
|
|
647
620
|
slug: {type: 'string', maxlength: 191, nullable: false, unique: true},
|
|
648
621
|
created_at: {type: 'dateTime', nullable: false},
|
|
649
|
-
|
|
650
|
-
updated_at: {type: 'dateTime', nullable: true},
|
|
651
|
-
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
622
|
+
updated_at: {type: 'dateTime', nullable: true}
|
|
652
623
|
},
|
|
653
624
|
members_labels: {
|
|
654
625
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
@@ -663,9 +634,7 @@ module.exports = {
|
|
|
663
634
|
name: {type: 'string', maxlength: 191, nullable: true},
|
|
664
635
|
email: {type: 'string', maxlength: 191, nullable: true},
|
|
665
636
|
created_at: {type: 'dateTime', nullable: false},
|
|
666
|
-
|
|
667
|
-
updated_at: {type: 'dateTime', nullable: true},
|
|
668
|
-
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
637
|
+
updated_at: {type: 'dateTime', nullable: true}
|
|
669
638
|
},
|
|
670
639
|
subscriptions: {
|
|
671
640
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
@@ -717,9 +686,7 @@ module.exports = {
|
|
|
717
686
|
start_date: {type: 'dateTime', nullable: false},
|
|
718
687
|
default_payment_card_last4: {type: 'string', maxlength: 4, nullable: true},
|
|
719
688
|
created_at: {type: 'dateTime', nullable: false},
|
|
720
|
-
created_by: {type: 'string', maxlength: 24, nullable: false},
|
|
721
689
|
updated_at: {type: 'dateTime', nullable: true},
|
|
722
|
-
updated_by: {type: 'string', maxlength: 24, nullable: true},
|
|
723
690
|
mrr: {type: 'integer', unsigned: true, nullable: false, defaultTo: 0},
|
|
724
691
|
offer_id: {type: 'string', maxlength: 24, nullable: true, unique: false, references: 'offers.id'},
|
|
725
692
|
trial_start_at: {type: 'dateTime', nullable: true},
|
|
@@ -869,9 +836,7 @@ module.exports = {
|
|
|
869
836
|
submitted_at: {type: 'dateTime', nullable: false},
|
|
870
837
|
newsletter_id: {type: 'string', maxlength: 24, nullable: true, references: 'newsletters.id'},
|
|
871
838
|
created_at: {type: 'dateTime', nullable: false},
|
|
872
|
-
|
|
873
|
-
updated_at: {type: 'dateTime', nullable: true},
|
|
874
|
-
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
839
|
+
updated_at: {type: 'dateTime', nullable: true}
|
|
875
840
|
},
|
|
876
841
|
email_batches: {
|
|
877
842
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
@@ -935,8 +900,7 @@ module.exports = {
|
|
|
935
900
|
created_at: {type: 'dateTime', nullable: false},
|
|
936
901
|
updated_at: {type: 'dateTime', nullable: true},
|
|
937
902
|
first_used_at: {type: 'dateTime', nullable: true},
|
|
938
|
-
used_count: {type: 'integer', nullable: false, unsigned: true, defaultTo: 0}
|
|
939
|
-
created_by: {type: 'string', maxlength: 24, nullable: false}
|
|
903
|
+
used_count: {type: 'integer', nullable: false, unsigned: true, defaultTo: 0}
|
|
940
904
|
},
|
|
941
905
|
snippets: {
|
|
942
906
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
@@ -944,9 +908,7 @@ module.exports = {
|
|
|
944
908
|
mobiledoc: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: false},
|
|
945
909
|
lexical: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true},
|
|
946
910
|
created_at: {type: 'dateTime', nullable: false},
|
|
947
|
-
|
|
948
|
-
updated_at: {type: 'dateTime', nullable: true},
|
|
949
|
-
updated_by: {type: 'string', maxlength: 24, nullable: true}
|
|
911
|
+
updated_at: {type: 'dateTime', nullable: true}
|
|
950
912
|
},
|
|
951
913
|
custom_theme_settings: {
|
|
952
914
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
@@ -1087,13 +1049,6 @@ module.exports = {
|
|
|
1087
1049
|
created_at: {type: 'dateTime', nullable: false},
|
|
1088
1050
|
email_sent_at: {type: 'dateTime', nullable: true}
|
|
1089
1051
|
},
|
|
1090
|
-
temp_mail_events: {
|
|
1091
|
-
id: {type: 'string', maxlength: 100, nullable: false, primary: true},
|
|
1092
|
-
type: {type: 'string', maxlength: 50, nullable: false},
|
|
1093
|
-
message_id: {type: 'string', maxlength: 150, nullable: false},
|
|
1094
|
-
recipient: {type: 'string', maxlength: 191, nullable: false},
|
|
1095
|
-
occurred_at: {type: 'dateTime', nullable: false}
|
|
1096
|
-
},
|
|
1097
1052
|
collections: {
|
|
1098
1053
|
id: {type: 'string', maxlength: 24, nullable: false, primary: true},
|
|
1099
1054
|
title: {type: 'string', maxlength: 191, nullable: false},
|
|
@@ -88,6 +88,15 @@ class DataGenerator {
|
|
|
88
88
|
async clearData(transaction) {
|
|
89
89
|
const tables = this.tableList.map(t => t.name).reverse();
|
|
90
90
|
|
|
91
|
+
const ownerUser = await transaction('roles_users')
|
|
92
|
+
.join('roles', 'roles.id', 'roles_users.role_id')
|
|
93
|
+
.where('roles.name', 'Owner')
|
|
94
|
+
.first();
|
|
95
|
+
|
|
96
|
+
if (!ownerUser) {
|
|
97
|
+
this.logger.warn('Owner user not found, selective user clearing will not be possible');
|
|
98
|
+
}
|
|
99
|
+
|
|
91
100
|
// TODO: Remove this once we import posts_meta
|
|
92
101
|
tables.unshift('posts_meta');
|
|
93
102
|
|
|
@@ -96,10 +105,10 @@ class DataGenerator {
|
|
|
96
105
|
this.logger.debug(`Clearing table ${table}`);
|
|
97
106
|
|
|
98
107
|
if (table === 'roles_users') {
|
|
99
|
-
await transaction(table).del().whereNot('user_id',
|
|
108
|
+
await transaction(table).del().whereNot('user_id', ownerUser?.user_id || null);
|
|
100
109
|
} else if (table === 'users') {
|
|
101
110
|
// Avoid deleting the admin user
|
|
102
|
-
await transaction(table).del().whereNot('id',
|
|
111
|
+
await transaction(table).del().whereNot('id', ownerUser?.user_id || null);
|
|
103
112
|
} else {
|
|
104
113
|
await transaction(table).truncate();
|
|
105
114
|
}
|
|
@@ -89,9 +89,7 @@ class EmailsImporter extends TableImporter {
|
|
|
89
89
|
submitted_at: dateToDatabaseString(timestamp),
|
|
90
90
|
newsletter_id: newsletter.id,
|
|
91
91
|
created_at: dateToDatabaseString(timestamp),
|
|
92
|
-
|
|
93
|
-
updated_at: dateToDatabaseString(timestamp),
|
|
94
|
-
updated_by: 'unused'
|
|
92
|
+
updated_at: dateToDatabaseString(timestamp)
|
|
95
93
|
};
|
|
96
94
|
}
|
|
97
95
|
}
|
|
@@ -31,9 +31,7 @@ class LabelsImporter extends TableImporter {
|
|
|
31
31
|
name: name,
|
|
32
32
|
slug: `${slugify(name)}`,
|
|
33
33
|
created_at: dateToDatabaseString(blogStartDate),
|
|
34
|
-
|
|
35
|
-
updated_at: dateToDatabaseString(blogStartDate),
|
|
36
|
-
updated_by: '1'
|
|
34
|
+
updated_at: dateToDatabaseString(blogStartDate)
|
|
37
35
|
};
|
|
38
36
|
}
|
|
39
37
|
}
|
|
@@ -102,7 +102,6 @@ class MembersImporter extends TableImporter {
|
|
|
102
102
|
// 40% of users logged in within a week, 60% sometime since registering
|
|
103
103
|
last_seen_at: luck(40) ? dateToDatabaseString(faker.date.recent(7)) : dateToDatabaseString(faker.date.between(timestamp, new Date())),
|
|
104
104
|
created_at: dateToDatabaseString(timestamp),
|
|
105
|
-
created_by: id,
|
|
106
105
|
updated_at: dateToDatabaseString(timestamp)
|
|
107
106
|
};
|
|
108
107
|
}
|
|
@@ -237,7 +237,6 @@ class MembersStripeCustomersSubscriptionsImporter extends TableImporter {
|
|
|
237
237
|
stripe_price_id: stripePrice.stripe_price_id,
|
|
238
238
|
start_date: dateToDatabaseString(startDate),
|
|
239
239
|
created_at: dateToDatabaseString(startDate),
|
|
240
|
-
created_by: 'unused',
|
|
241
240
|
mrr,
|
|
242
241
|
plan_id: stripeProduct.stripe_product_id,
|
|
243
242
|
plan_nickname: `${ghostProduct.name} - ${stripePrice.nickname}`,
|
|
@@ -53,7 +53,6 @@ class PostsImporter extends TableImporter {
|
|
|
53
53
|
return {
|
|
54
54
|
id: this.fastFakeObjectId(),
|
|
55
55
|
created_at: dateToDatabaseString(timestamp),
|
|
56
|
-
created_by: '1',
|
|
57
56
|
updated_at: dateToDatabaseString(timestamp),
|
|
58
57
|
published_at: status === 'published' ? dateToDatabaseString(timestamp) : status === 'scheduled' ? dateToDatabaseString(faker.date.soon(5, timestamp)) : null,
|
|
59
58
|
uuid: faker.datatype.uuid(),
|
|
@@ -14,7 +14,12 @@ class RolesUsersImporter extends TableImporter {
|
|
|
14
14
|
* Ignore overriden quantity for 1:1 relationship
|
|
15
15
|
*/
|
|
16
16
|
async import() {
|
|
17
|
-
const
|
|
17
|
+
const ownerUser = await this.transaction('roles_users')
|
|
18
|
+
.join('roles', 'roles.id', 'roles_users.role_id')
|
|
19
|
+
.where('roles.name', 'Owner')
|
|
20
|
+
.first();
|
|
21
|
+
|
|
22
|
+
const users = await this.transaction.select('id').from('users').whereNot('id', ownerUser?.user_id || null);
|
|
18
23
|
this.roles = await this.transaction.select('id', 'name').from('roles');
|
|
19
24
|
|
|
20
25
|
await this.importForEach(users, 1);
|
|
@@ -32,8 +32,7 @@ class TagsImporter extends TableImporter {
|
|
|
32
32
|
name: name,
|
|
33
33
|
slug: slugify(name),
|
|
34
34
|
description: faker.lorem.sentence(),
|
|
35
|
-
created_at: dateToDatabaseString(faker.date.between(threeYearsAgo, twoYearsAgo))
|
|
36
|
-
created_by: this.users[faker.datatype.number(this.users.length - 1)].id
|
|
35
|
+
created_at: dateToDatabaseString(faker.date.between(threeYearsAgo, twoYearsAgo))
|
|
37
36
|
};
|
|
38
37
|
}
|
|
39
38
|
}
|
|
@@ -22,8 +22,7 @@ class UsersImporter extends TableImporter {
|
|
|
22
22
|
password: await security.password.hash(faker.color.human()),
|
|
23
23
|
email: faker.internet.email(name),
|
|
24
24
|
profile_image: faker.internet.avatar(),
|
|
25
|
-
created_at: dateToDatabaseString(faker.date.between(new Date(2016, 0), new Date()))
|
|
26
|
-
created_by: 'unused'
|
|
25
|
+
created_at: dateToDatabaseString(faker.date.between(new Date(2016, 0), new Date()))
|
|
27
26
|
};
|
|
28
27
|
}
|
|
29
28
|
}
|
|
@@ -303,10 +303,6 @@ Click Tracking → redirects → members_click_events
|
|
|
303
303
|
2. MySQL tracks member signup with attribution
|
|
304
304
|
3. MySQL tracks paid conversion with attribution
|
|
305
305
|
|
|
306
|
-
## API Endpoints
|
|
307
|
-
|
|
308
|
-
All endpoints require authentication (`mw.authAdminApi`) and are gated behind `labs.isSet('trafficAnalytics')`.
|
|
309
|
-
|
|
310
306
|
### Core Stats Endpoints
|
|
311
307
|
|
|
312
308
|
```javascript
|
|
@@ -311,10 +311,6 @@ Click Tracking → redirects → members_click_events
|
|
|
311
311
|
3. MySQL tracks paid conversion with attribution
|
|
312
312
|
4. Combined view shows complete funnel
|
|
313
313
|
|
|
314
|
-
## API Endpoints
|
|
315
|
-
|
|
316
|
-
All endpoints require authentication (`mw.authAdminApi`) and are gated behind `labs.isSet('trafficAnalytics')`.
|
|
317
|
-
|
|
318
314
|
### Core Stats Endpoints
|
|
319
315
|
|
|
320
316
|
```javascript
|
|
@@ -54,7 +54,14 @@ ghostBookshelf.plugin(require('./plugins/bulk-operations'));
|
|
|
54
54
|
|
|
55
55
|
ghostBookshelf.plugin(require('./plugins/filtered-collection'));
|
|
56
56
|
|
|
57
|
-
ghostBookshelf.plugin(require('./plugins/user-type')
|
|
57
|
+
ghostBookshelf.plugin(require('./plugins/user-type'), {
|
|
58
|
+
resolveIntegrationUserId: function resolveIntegrationUserId(options) {
|
|
59
|
+
return ghostBookshelf.model('User').getOwnerId(options);
|
|
60
|
+
},
|
|
61
|
+
resolveInternalUserId: function resolveInternalUserId(options) {
|
|
62
|
+
return ghostBookshelf.model('User').getOwnerId(options);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
58
65
|
|
|
59
66
|
ghostBookshelf.plugin(require('./plugins/data-manipulation'));
|
|
60
67
|
|