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.
Files changed (281) hide show
  1. package/components/tryghost-i18n-6.0.0-alpha.2.tgz +0 -0
  2. package/core/boot.js +0 -2
  3. package/core/built/admin/assets/admin-x-activitypub/admin-x-activitypub.js +1 -1
  4. package/core/built/admin/assets/admin-x-activitypub/{index-B8te98RZ.mjs → index-BZDwG-OG.mjs} +7397 -7385
  5. package/core/built/admin/assets/admin-x-activitypub/{index-C8qwgKWF.mjs → index-DTlSQCGz.mjs} +2 -2
  6. package/core/built/admin/assets/admin-x-settings/{CodeEditorView-CAtv7MlN.mjs → CodeEditorView-CCUvrZhe.mjs} +2 -2
  7. package/core/built/admin/assets/admin-x-settings/admin-x-settings.js +3 -3
  8. package/core/built/admin/assets/admin-x-settings/{index-BVxh86CD.mjs → index-Cubs_8W6.mjs} +8088 -8532
  9. package/core/built/admin/assets/admin-x-settings/{index-DUhmXSBR.mjs → index-D0ejKdD5.mjs} +2 -2
  10. package/core/built/admin/assets/admin-x-settings/{modals-B5dtfzsB.mjs → modals-DSxs9dLy.mjs} +1676 -1614
  11. package/core/built/admin/assets/{chunk.524.1f2faf572078e5b86b09.js → chunk.524.0953dd72ae1efbabe0de.js} +7 -7
  12. package/core/built/admin/assets/{chunk.582.675905fe8f9be138fb19.js → chunk.582.3caa825c2a91efc48f1d.js} +8 -8
  13. package/core/built/admin/assets/{ghost-280b83af263b51bc4d6ce5bd8f536096.js → ghost-db0f84981913aec8a672c57aa22da07a.js} +40 -45
  14. package/core/built/admin/assets/posts/posts.js +6549 -6537
  15. package/core/built/admin/assets/stats/stats.js +8824 -8812
  16. package/core/built/admin/index.html +3 -3
  17. package/core/frontend/helpers/get.js +4 -2
  18. package/core/frontend/helpers/ghost_head.js +71 -77
  19. package/core/frontend/meta/canonical-url.js +1 -7
  20. package/core/frontend/meta/context-object.js +1 -1
  21. package/core/frontend/meta/get-meta.js +1 -4
  22. package/core/frontend/meta/og-image.js +1 -1
  23. package/core/frontend/meta/og-type.js +0 -2
  24. package/core/frontend/meta/schema.js +1 -1
  25. package/core/frontend/meta/twitter-image.js +1 -1
  26. package/core/frontend/meta/url.js +1 -12
  27. package/core/frontend/services/rendering/context.js +0 -8
  28. package/core/frontend/web/middleware/static-theme.js +20 -1
  29. package/core/server/api/endpoints/index.js +0 -4
  30. package/core/server/api/endpoints/session.js +0 -9
  31. package/core/server/api/endpoints/utils/serializers/input/settings.js +0 -2
  32. package/core/server/api/endpoints/utils/serializers/input/utils/settings-filter-type-group-mapper.js +0 -1
  33. package/core/server/api/endpoints/utils/serializers/input/utils/settings-key-group-mapper.js +0 -1
  34. package/core/server/api/endpoints/utils/serializers/input/utils/settings-key-type-mapper.js +0 -1
  35. package/core/server/api/endpoints/utils/serializers/output/all.js +1 -1
  36. package/core/server/api/endpoints/utils/serializers/output/index.js +0 -4
  37. package/core/server/api/endpoints/utils/serializers/output/mappers/snippets.js +1 -5
  38. package/core/server/api/endpoints/utils/serializers/output/members.js +0 -2
  39. package/core/server/api/endpoints/utils/validators/input/index.js +0 -4
  40. package/core/server/data/importer/importers/data/Base.js +1 -3
  41. package/core/server/data/importer/importers/data/SettingsImporter.js +1 -3
  42. package/core/server/data/migrations/utils/index.js +1 -4
  43. package/core/server/data/migrations/utils/permissions.js +14 -6
  44. package/core/server/data/migrations/utils/settings.js +39 -22
  45. package/core/server/data/migrations/versions/4.47/2022-05-03-15-30-final-v4.js +2 -0
  46. package/core/server/data/migrations/versions/4.47/2022-05-04-10-03-no-op.js +6 -0
  47. package/core/server/data/migrations/versions/5.100/2024-11-06-04-45-15-add-activitypub-integration.js +4 -2
  48. package/core/server/data/migrations/versions/5.113/2025-03-07-12-24-00-add-super-editor.js +4 -2
  49. package/core/server/data/migrations/versions/5.3/2022-07-06-07-58-add-ghost-explore-integration-role.js +4 -2
  50. package/core/server/data/migrations/versions/5.3/2022-07-06-09-17-add-ghost-explore-integration.js +4 -2
  51. package/core/server/data/migrations/versions/5.3/2022-07-06-09-26-add-ghost-explore-integration-api-key.js +4 -2
  52. package/core/server/data/migrations/versions/5.40/2023-03-21-18-42-add-self-serve-integration-role.js +4 -2
  53. package/core/server/data/migrations/versions/5.40/2023-03-21-18-52-add-self-serve-integration.js +4 -2
  54. package/core/server/data/migrations/versions/5.40/2023-03-21-19-02-add-self-serve-integration-api-key.js +4 -2
  55. package/core/server/data/migrations/versions/5.63/2023-09-13-13-03-10-add-ghost-core-content-integration.js +4 -2
  56. package/core/server/data/migrations/versions/5.63/2023-09-13-13-34-11-add-ghost-core-content-integration-key.js +4 -2
  57. package/core/server/data/migrations/versions/6.0/2025-06-20-01-41-54-remove-updated-by-column.js +46 -0
  58. package/core/server/data/migrations/versions/6.0/2025-06-20-13-41-55-remove-created-by-column.js +47 -0
  59. package/core/server/data/migrations/versions/6.0/2025-06-23-09-49-25-add-missing-member-uuids.js +22 -0
  60. package/core/server/data/migrations/versions/6.0/2025-06-23-10-03-26-members-nullable-uuid.js +5 -0
  61. package/core/server/data/migrations/versions/6.0/2025-06-24-09-19-42-use-object-id-for-hardcoded-user-id.js +95 -0
  62. package/core/server/data/migrations/versions/6.0/2025-06-25-15-03-29-remove-amp-from-settings.js +6 -0
  63. package/core/server/data/migrations/versions/6.0/2025-06-30-13-59-10-remove-mail-events-table.js +3 -0
  64. package/core/server/data/migrations/versions/6.0/2025-06-30-14-00-00-update-feature-image-alt-length.js +25 -0
  65. package/core/server/data/schema/default-settings/default-settings.json +0 -13
  66. package/core/server/data/schema/fixtures/FixtureManager.js +128 -5
  67. package/core/server/data/schema/fixtures/fixtures.json +4 -6
  68. package/core/server/data/schema/fixtures/index.js +3 -1
  69. package/core/server/data/schema/schema.js +20 -65
  70. package/core/server/data/seeders/DataGenerator.js +11 -2
  71. package/core/server/data/seeders/importers/EmailsImporter.js +1 -3
  72. package/core/server/data/seeders/importers/LabelsImporter.js +1 -3
  73. package/core/server/data/seeders/importers/MembersImporter.js +0 -1
  74. package/core/server/data/seeders/importers/MembersStripeCustomersImporter.js +1 -2
  75. package/core/server/data/seeders/importers/MembersStripeCustomersSubscriptionsImporter.js +0 -1
  76. package/core/server/data/seeders/importers/PostsImporter.js +0 -1
  77. package/core/server/data/seeders/importers/RolesUsersImporter.js +6 -1
  78. package/core/server/data/seeders/importers/TagsImporter.js +1 -2
  79. package/core/server/data/seeders/importers/UsersImporter.js +1 -2
  80. package/core/server/data/tinybird/ARCHITECTURE.md +0 -4
  81. package/core/server/data/tinybird/DOCS.md +0 -4
  82. package/core/server/models/base/bookshelf.js +8 -1
  83. package/core/server/models/base/plugins/events.js +0 -28
  84. package/core/server/models/base/plugins/user-type.js +10 -36
  85. package/core/server/models/post.js +25 -10
  86. package/core/server/models/relations/authors.js +2 -2
  87. package/core/server/models/settings.js +1 -14
  88. package/core/server/models/user.js +33 -6
  89. package/core/server/services/activitypub/ActivityPubService.js +1 -2
  90. package/core/server/services/activitypub/ActivityPubService.ts +1 -2
  91. package/core/server/services/explore-ping/ExplorePingService.js +3 -1
  92. package/core/server/services/link-redirection/README.md +1 -1
  93. package/core/server/services/mentions/MentionSendingService.js +1 -1
  94. package/core/server/services/settings/SettingsBREADService.js +5 -1
  95. package/core/server/services/settings/settings-service.js +3 -1
  96. package/core/server/services/settings-helpers/SettingsHelpers.js +0 -12
  97. package/core/server/services/update-check/UpdateCheckService.js +18 -2
  98. package/core/server/services/url/config.js +0 -2
  99. package/core/server/web/api/app.js +4 -0
  100. package/core/server/web/api/endpoints/admin/middleware.js +8 -9
  101. package/core/server/web/api/endpoints/admin/routes.js +0 -2
  102. package/core/server/web/comments/routes.js +3 -0
  103. package/core/server/web/shared/middleware/index.js +4 -0
  104. package/core/server/web/shared/middleware/max-limit-cap.js +27 -0
  105. package/core/server/web/shared/middleware/pretty-urls.js +3 -1
  106. package/core/server/web/shared/middleware/redirect-amp-urls.js +36 -0
  107. package/core/shared/config/defaults.json +2 -0
  108. package/core/shared/config/overrides.json +1 -4
  109. package/core/shared/labs.js +2 -6
  110. package/core/shared/max-limit-cap.js +61 -0
  111. package/package.json +5 -6
  112. package/tsconfig.tsbuildinfo +1 -1
  113. package/yarn.lock +18 -107
  114. package/components/tryghost-i18n-5.130.2.tgz +0 -0
  115. package/core/built/admin/assets/img/amp-d7b72aae3315fda95921fb575dfca100.svg +0 -4
  116. package/core/frontend/apps/amp/index.js +0 -30
  117. package/core/frontend/apps/amp/lib/helpers/amp_analytics.js +0 -32
  118. package/core/frontend/apps/amp/lib/helpers/amp_components.js +0 -48
  119. package/core/frontend/apps/amp/lib/helpers/amp_content.js +0 -214
  120. package/core/frontend/apps/amp/lib/helpers/amp_style.js +0 -8
  121. package/core/frontend/apps/amp/lib/router.js +0 -95
  122. package/core/frontend/apps/amp/lib/views/amp.hbs +0 -1046
  123. package/core/frontend/meta/amp-url.js +0 -14
  124. package/core/server/api/endpoints/mail-events.js +0 -17
  125. package/core/server/api/endpoints/utils/serializers/output/mail-events.js +0 -9
  126. package/core/server/api/endpoints/utils/validators/input/mail-events.js +0 -7
  127. package/core/server/data/migrations/utils/constants.js +0 -3
  128. package/core/server/data/migrations/versions/4.0/01-update-mobiledoc.js +0 -61
  129. package/core/server/data/migrations/versions/4.0/02-add-status-column-to-members.js +0 -11
  130. package/core/server/data/migrations/versions/4.0/03-populate-status-column-for-members.js +0 -81
  131. package/core/server/data/migrations/versions/4.0/04-drop-apps-related-tables.js +0 -10
  132. package/core/server/data/migrations/versions/4.0/05-add-members-subscribe-events-table.js +0 -9
  133. package/core/server/data/migrations/versions/4.0/06-populate-members-subscribe-events-table.js +0 -53
  134. package/core/server/data/migrations/versions/4.0/07-alter-unique-constraint-for-posts-slug.js +0 -7
  135. package/core/server/data/migrations/versions/4.0/08-add-members-login-events-table.js +0 -7
  136. package/core/server/data/migrations/versions/4.0/09-add-members-email-change-events-table.js +0 -9
  137. package/core/server/data/migrations/versions/4.0/10-add-members-status-events-table.js +0 -9
  138. package/core/server/data/migrations/versions/4.0/11-add-members-paid-subscription-events-table.js +0 -12
  139. package/core/server/data/migrations/versions/4.0/12-delete-apps-related-settings-keys.js +0 -16
  140. package/core/server/data/migrations/versions/4.0/13-add-members-payment-events-table.js +0 -10
  141. package/core/server/data/migrations/versions/4.0/14-remove-orphaned-stripe-records.js +0 -36
  142. package/core/server/data/migrations/versions/4.0/15-add-frontmatter-column-to-meta.js +0 -7
  143. package/core/server/data/migrations/versions/4.0/16-refactor-slack-setting.js +0 -96
  144. package/core/server/data/migrations/versions/4.0/17-populate-members-status-events-table.js +0 -41
  145. package/core/server/data/migrations/versions/4.0/18-transform-urls-absolute-to-transform-ready.js +0 -201
  146. package/core/server/data/migrations/versions/4.0/19-remove-labs-members-setting.js +0 -10
  147. package/core/server/data/migrations/versions/4.0/20-refactor-unsplash-setting.js +0 -41
  148. package/core/server/data/migrations/versions/4.0/21-sanitize-email-batches-provider-id.js +0 -8
  149. package/core/server/data/migrations/versions/4.0/22-solve-orphaned-webhooks.js +0 -87
  150. package/core/server/data/migrations/versions/4.0/23-regenerate-posts-html.js +0 -66
  151. package/core/server/data/migrations/versions/4.0/24-add-missing-email-permissions.js +0 -36
  152. package/core/server/data/migrations/versions/4.0/25-populate-members-paid-subscription-events-table.js +0 -129
  153. package/core/server/data/migrations/versions/4.0/26-add-cascade-on-delete.js +0 -76
  154. package/core/server/data/migrations/versions/4.0/27-add-primary-key-brute-migrations-lock.js +0 -9
  155. package/core/server/data/migrations/versions/4.0/28-add-webhook-intergrations-foreign-key.js +0 -16
  156. package/core/server/data/migrations/versions/4.0/29-fix-foreign-key-for-members-stripe-customers-subscriptions.js +0 -35
  157. package/core/server/data/migrations/versions/4.0/30-set-default-accent-color.js +0 -21
  158. package/core/server/data/migrations/versions/4.1/01-fix-backup-content-permission-typo.js +0 -15
  159. package/core/server/data/migrations/versions/4.1/02-add-unique-constraint-for-member-stripe-tables.js +0 -21
  160. package/core/server/data/migrations/versions/4.11/01-add-oauth-user-data.js +0 -12
  161. package/core/server/data/migrations/versions/4.11/02-add-email-verification-required-setting.js +0 -43
  162. package/core/server/data/migrations/versions/4.12/01-add-email-only-column-to-posts-meta-table.js +0 -7
  163. package/core/server/data/migrations/versions/4.12/02-fix-member-statuses.js +0 -39
  164. package/core/server/data/migrations/versions/4.13/01-add-members-stripe-connect-auth-permission-to-administrators.js +0 -6
  165. package/core/server/data/migrations/versions/4.13/02-add-members-products-events-table.js +0 -33
  166. package/core/server/data/migrations/versions/4.14/01-fix-comped-member-statuses.js +0 -73
  167. package/core/server/data/migrations/versions/4.14/02-fix-free-members-status-events.js +0 -61
  168. package/core/server/data/migrations/versions/4.15/01-add-temp-members-analytic-events-table.js +0 -12
  169. package/core/server/data/migrations/versions/4.16/01-add-custom-theme-settings-table.js +0 -9
  170. package/core/server/data/migrations/versions/4.17/01-add-custom-theme-settings-permissions.js +0 -21
  171. package/core/server/data/migrations/versions/4.17/02-add-offers-table.js +0 -19
  172. package/core/server/data/migrations/versions/4.17/03-add-offers-permissions.js +0 -35
  173. package/core/server/data/migrations/versions/4.19/01-add-active-column-to-offers.js +0 -7
  174. package/core/server/data/migrations/versions/4.19/02-add-offer-redemptions-table.js +0 -8
  175. package/core/server/data/migrations/versions/4.2/01-fix-incorrect-mrr-delta-events.js +0 -13
  176. package/core/server/data/migrations/versions/4.20/01-remove-offer-redemptions-table.js +0 -19
  177. package/core/server/data/migrations/versions/4.20/02-remove-offers-table.js +0 -30
  178. package/core/server/data/migrations/versions/4.20/03-add-offers-table.js +0 -21
  179. package/core/server/data/migrations/versions/4.20/04-add-offer-redemptions-table.js +0 -9
  180. package/core/server/data/migrations/versions/4.20/05-remove-not-null-constraint-from-portal-title.js +0 -44
  181. package/core/server/data/migrations/versions/4.22/01-add-is-launch-complete-setting.js +0 -8
  182. package/core/server/data/migrations/versions/4.22/02-update-launch-complete-setting-from-user-data.js +0 -39
  183. package/core/server/data/migrations/versions/4.23/01-truncate-offer-names.js +0 -59
  184. package/core/server/data/migrations/versions/4.3/01-add-products-table.js +0 -9
  185. package/core/server/data/migrations/versions/4.3/02-add-members-products-table.js +0 -8
  186. package/core/server/data/migrations/versions/4.3/03-add-default-product.js +0 -39
  187. package/core/server/data/migrations/versions/4.3/04-attach-members-to-product.js +0 -50
  188. package/core/server/data/migrations/versions/4.3/05-add-stripe-products-table.js +0 -9
  189. package/core/server/data/migrations/versions/4.3/06-add-stripe-prices-table.js +0 -15
  190. package/core/server/data/migrations/versions/4.3/07-add-products-permissions.js +0 -29
  191. package/core/server/data/migrations/versions/4.3/08-migrate-members-signup-setting.js +0 -109
  192. package/core/server/data/migrations/versions/4.3/09-add-price-id-column-to-subscriptions-table.js +0 -10
  193. package/core/server/data/migrations/versions/4.3/10-populate-stripe-price-id-in-subscriptions.js +0 -20
  194. package/core/server/data/migrations/versions/4.33/2022-01-14-11-50-add-type-column-to-products.js +0 -12
  195. package/core/server/data/migrations/versions/4.33/2022-01-14-11-51-add-default-free-tier.js +0 -40
  196. package/core/server/data/migrations/versions/4.33/2022-01-18-09-07-remove-duplicate-offer-redemptions.js +0 -46
  197. package/core/server/data/migrations/versions/4.33/2022-01-19-10-43-add-active-column-to-products-table.js +0 -7
  198. package/core/server/data/migrations/versions/4.34/2022-01-25-13-53-add-welcome-page-url-column-to-products.js +0 -7
  199. package/core/server/data/migrations/versions/4.35/2022-01-20-05-55-add-post-products-table.js +0 -8
  200. package/core/server/data/migrations/versions/4.35/2022-01-30-15-17-set-welcome-page-url-from-settings.js +0 -45
  201. package/core/server/data/migrations/versions/4.35/2022-02-01-11-48-update-email-recipient-filter-column-type.js +0 -19
  202. package/core/server/data/migrations/versions/4.35/2022-02-01-12-03-update-recipient-filter-column-type.js +0 -19
  203. package/core/server/data/migrations/versions/4.35/2022-02-02-10-38-add-default-content-visibility-tiers-setting.js +0 -8
  204. package/core/server/data/migrations/versions/4.35/2022-02-02-13-10-transform-specific-tiers-default-content-visibility.js +0 -147
  205. package/core/server/data/migrations/versions/4.35/2022-02-04-04-34-populate-empty-portal-products.js +0 -60
  206. package/core/server/data/migrations/versions/4.36/2022-02-07-14-34-add-last-seen-at-column-to-members.js +0 -10
  207. package/core/server/data/migrations/versions/4.37/2022-02-21-09-53-backfill-members-last-seen-at-column.js +0 -32
  208. package/core/server/data/migrations/versions/4.38/2022-03-01-08-46-add-visibility-to-tiers.js +0 -11
  209. package/core/server/data/migrations/versions/4.38/2022-03-03-16-12-add-visibility-to-tiers.js +0 -8
  210. package/core/server/data/migrations/versions/4.38/2022-03-03-16-17-drop-tiers-visible-column.js +0 -7
  211. package/core/server/data/migrations/versions/4.39/2022-03-07-10-57-update-free-products-visibility-column.js +0 -66
  212. package/core/server/data/migrations/versions/4.39/2022-03-07-10-57-update-products-visibility-column.js +0 -36
  213. package/core/server/data/migrations/versions/4.4/01-restore-free-members-signup-setting-from-backup.js +0 -99
  214. package/core/server/data/migrations/versions/4.4/02-migrate-members-signup-access.js +0 -126
  215. package/core/server/data/migrations/versions/4.40/2022-03-07-14-37-add-members-cancel-events-table.js +0 -8
  216. package/core/server/data/migrations/versions/4.40/2022-03-15-06-40-add-offers-admin-integration-permission-roles.js +0 -23
  217. package/core/server/data/migrations/versions/4.40/2022-03-15-06-40-add-tiers-admin-integration-permission-roles.js +0 -20
  218. package/core/server/data/migrations/versions/4.42/2022-03-21-17-17-add.js +0 -25
  219. package/core/server/data/migrations/versions/4.42/2022-03-30-15-44-add-newsletter-permissions.js +0 -28
  220. package/core/server/data/migrations/versions/4.43/2022-03-28-19-26-recreate-newsletter-table.js +0 -29
  221. package/core/server/data/migrations/versions/4.43/2022-03-29-14-45-add-members-newsletters-table.js +0 -7
  222. package/core/server/data/migrations/versions/4.43/2022-04-01-10-13-add-post-newsletter-relation.js +0 -108
  223. package/core/server/data/migrations/versions/4.43/2022-04-06-09-47-add-type-column-to-paid-subscription-events.js +0 -7
  224. package/core/server/data/migrations/versions/4.43/2022-04-06-14-56-add-email-newsletter-relation.js +0 -8
  225. package/core/server/data/migrations/versions/4.43/2022-04-08-10-45-add-subscription-id-to-mrr-events.js +0 -7
  226. package/core/server/data/migrations/versions/4.44/2022-04-06-15-22-populate-type-column-for-paid-subscription-events.js +0 -21
  227. package/core/server/data/migrations/versions/4.44/2022-04-08-11-54-add-cancelled-events.js +0 -51
  228. package/core/server/data/migrations/versions/4.44/2022-04-11-08-24-add-newsletter-permissions.js +0 -33
  229. package/core/server/data/migrations/versions/4.44/2022-04-11-10-54-add-mrr-to-subscriptions.js +0 -8
  230. package/core/server/data/migrations/versions/4.44/2022-04-12-07-33-fill-mrr.js +0 -29
  231. package/core/server/data/migrations/versions/4.44/2022-04-13-12-00-remove-newsletter-sender-name-not-null-constraint.js +0 -33
  232. package/core/server/data/migrations/versions/4.44/2022-04-15-07-53-add-offer-id-to-subscriptions.js +0 -9
  233. package/core/server/data/migrations/versions/4.45/2022-04-19-12-23-backfill-subscriptions-offers.js +0 -60
  234. package/core/server/data/migrations/versions/4.45/2022-04-20-11-25-add-newsletter-read-permission.js +0 -9
  235. package/core/server/data/migrations/versions/4.45/2022-04-21-02-55-add-notifications-key-entry-to-settings-table.js +0 -8
  236. package/core/server/data/migrations/versions/4.46/2022-04-13-12-00-add-created-at-newsletters.js +0 -6
  237. package/core/server/data/migrations/versions/4.46/2022-04-13-12-01-add-updated-at-newsletters.js +0 -6
  238. package/core/server/data/migrations/versions/4.46/2022-04-13-12-02-fill-created-at-newsletters.js +0 -19
  239. package/core/server/data/migrations/versions/4.46/2022-04-13-12-03-drop-nullable-created-at-newsletters.js +0 -3
  240. package/core/server/data/migrations/versions/4.46/2022-04-13-12-08-newsletters-show-header-name.js +0 -7
  241. package/core/server/data/migrations/versions/4.46/2022-04-13-12-57-add-uuid-column-to-newsletters.js +0 -8
  242. package/core/server/data/migrations/versions/4.46/2022-04-13-12-58-fill-uuid-for-newsletters.js +0 -19
  243. package/core/server/data/migrations/versions/4.46/2022-04-13-12-59-drop-nullable-uuid-newsletters.js +0 -3
  244. package/core/server/data/migrations/versions/4.46/2022-04-13-13-00-add-default-newsletter.js +0 -92
  245. package/core/server/data/migrations/versions/4.46/2022-04-20-08-39-map-subscribers-to-default-newsletter.js +0 -66
  246. package/core/server/data/migrations/versions/4.46/2022-04-22-07-43-add-newsletter-id-to-subscribe-events.js +0 -9
  247. package/core/server/data/migrations/versions/4.46/2022-04-27-07-59-set-newsletter-id-subscribe-events.js +0 -31
  248. package/core/server/data/migrations/versions/4.47/2022-05-03-15-30-update-newsletter-sending-options.js +0 -34
  249. package/core/server/data/migrations/versions/4.47/2022-05-04-10-03-transform-newsletter-header-image.js +0 -26
  250. package/core/server/data/migrations/versions/4.5/01-add-stripe-price-description-column.js +0 -7
  251. package/core/server/data/migrations/versions/4.5/02-add-product-description-column.js +0 -7
  252. package/core/server/data/migrations/versions/4.5/03-give-label-read-permissions-to-editors.js +0 -14
  253. package/core/server/data/migrations/versions/4.5/04-remove-unique-constraint-from-product-name.js +0 -13
  254. package/core/server/data/migrations/versions/4.5/05-rename-default-product-to-site-title.js +0 -38
  255. package/core/server/data/migrations/versions/4.6/01-remove-comped-status.js +0 -47
  256. package/core/server/data/migrations/versions/4.7/01-add-monthly-price-column-to-products.js +0 -7
  257. package/core/server/data/migrations/versions/4.7/02-add-yearly-price-column-to-products.js +0 -7
  258. package/core/server/data/migrations/versions/4.7/03-add-labs-setting.js +0 -42
  259. package/core/server/data/migrations/versions/4.8/01-add-feature-image-alt-column-to-posts-meta.js +0 -7
  260. package/core/server/data/migrations/versions/4.8/02-add-feature-image-caption-column-to-posts-meta.js +0 -7
  261. package/core/server/data/migrations/versions/4.8/03-add-default-product-portal-products.js +0 -69
  262. package/core/server/data/migrations/versions/4.8/04-migrate-show-newsletter-header-setting.js +0 -124
  263. package/core/server/data/migrations/versions/4.9/01-add-reset-all-passwords-permission.js +0 -11
  264. package/core/server/data/migrations/versions/4.9/02-add-benefits-table.js +0 -9
  265. package/core/server/data/migrations/versions/4.9/03-add-products-benefits-table.js +0 -8
  266. package/core/server/data/migrations/versions/4.9/04-add-member-segment-to-email-batches.js +0 -7
  267. package/core/server/data/migrations/versions/4.9/05-fix-missed-mobiledoc-url-transforms.js +0 -87
  268. package/core/server/data/migrations/versions/4.9/06-add-comped-status.js +0 -47
  269. package/core/server/data/migrations/versions/4.9/07-update-comped-members-status-events.js +0 -39
  270. package/core/server/models/mail-event.js +0 -12
  271. package/core/server/services/mail-events/BookshelfMailEventRepository.js +0 -40
  272. package/core/server/services/mail-events/InMemoryMailEventRepository.js +0 -10
  273. package/core/server/services/mail-events/InMemoryMailEventRepository.ts +0 -8
  274. package/core/server/services/mail-events/MailEvent.js +0 -20
  275. package/core/server/services/mail-events/MailEvent.ts +0 -10
  276. package/core/server/services/mail-events/MailEventRepository.js +0 -2
  277. package/core/server/services/mail-events/MailEventRepository.ts +0 -5
  278. package/core/server/services/mail-events/MailEventService.js +0 -124
  279. package/core/server/services/mail-events/MailEventService.ts +0 -169
  280. package/core/server/services/mail-events/index.js +0 -21
  281. 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
- constructor(fixtures) {
12
- this.fixtures = fixtures;
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: {internal: true},
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
- * But aren't dependent on this.fixtures
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": 1,
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
- "created_by": "1",
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
- "created_by": "1",
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
- "1": ["Owner"]
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 1000-2000
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: 191, nullable: true},
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
- created_by: {type: 'string', maxlength: 24, nullable: false},
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
- created_by: {type: 'string', maxlength: 24, nullable: false},
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
- created_by: {type: 'string', maxlength: 24, nullable: false},
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
- created_by: {type: 'string', maxlength: 24, nullable: false},
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
- created_by: {type: 'string', maxlength: 24, nullable: false},
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
- created_by: {type: 'string', maxlength: 24, nullable: false},
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
- created_by: {type: 'string', maxlength: 24, nullable: false},
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
- created_by: {type: 'string', maxlength: 24, nullable: false},
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
- created_by: {type: 'string', maxlength: 24, nullable: false},
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: 191, nullable: true},
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: true, unique: true, validations: {isUUID: true}},
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
- created_by: {type: 'string', maxlength: 24, nullable: false},
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
- created_by: {type: 'string', maxlength: 24, nullable: false},
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
- created_by: {type: 'string', maxlength: 24, nullable: false},
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
- created_by: {type: 'string', maxlength: 24, nullable: false},
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', '1');
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', '1');
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
- created_by: 'unused',
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
- created_by: '1',
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
  }
@@ -51,8 +51,7 @@ class MembersStripeCustomersImporter extends TableImporter {
51
51
  })}`,
52
52
  name: this.model.name,
53
53
  email: this.model.email,
54
- created_at: this.model.created_at,
55
- created_by: 'unused'
54
+ created_at: this.model.created_at
56
55
  };
57
56
  }
58
57
  }
@@ -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 users = await this.transaction.select('id').from('users').whereNot('id', 1);
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