ghost 4.48.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (660) hide show
  1. package/Gruntfile.js +24 -24
  2. package/README.md +3 -2
  3. package/content/themes/casper/assets/built/global.css +1 -1
  4. package/content/themes/casper/assets/built/global.css.map +1 -1
  5. package/content/themes/casper/assets/built/screen.css +1 -1
  6. package/content/themes/casper/assets/built/screen.css.map +1 -1
  7. package/content/themes/casper/assets/css/global.css +2 -2
  8. package/content/themes/casper/assets/css/screen.css +412 -664
  9. package/content/themes/casper/author.hbs +48 -35
  10. package/content/themes/casper/default.hbs +5 -23
  11. package/content/themes/casper/error-404.hbs +1 -1
  12. package/content/themes/casper/index.hbs +29 -22
  13. package/content/themes/casper/package.json +25 -37
  14. package/content/themes/casper/page.hbs +12 -12
  15. package/content/themes/casper/partials/icons/facebook.hbs +1 -1
  16. package/content/themes/casper/partials/icons/twitter.hbs +1 -1
  17. package/content/themes/casper/partials/post-card.hbs +26 -40
  18. package/content/themes/casper/post.hbs +54 -50
  19. package/content/themes/casper/tag.hbs +42 -47
  20. package/core/boot.js +18 -15
  21. package/core/bridge.js +24 -25
  22. package/core/built/assets/ghost-dark-08acba9994ea4f9478dfdca2a97b36f1.css +1 -0
  23. package/core/built/assets/{ghost.min-10ba0de3ecb93d63d62bb43ac11c740f.js → ghost.min-75bec566fbea362ed98811fe6d5b6e24.js} +1115 -1185
  24. package/core/built/assets/ghost.min-855c93486d789aa09dbe97f272672bf9.css +1 -0
  25. package/core/built/assets/icons/analytics.svg +14 -0
  26. package/core/built/assets/icons/calendar.svg +4 -1
  27. package/core/built/assets/icons/email-at.svg +1 -1
  28. package/core/built/assets/icons/email-name.svg +1 -1
  29. package/core/built/assets/icons/info.svg +1 -1
  30. package/core/built/assets/icons/twitter-logo.svg +3 -0
  31. package/core/built/assets/{vendor.min-97fd438f4772c5ec6bb30ad779b8530e.js → vendor.min-14ad7269e0529dd20f61d2989e69fa1e.js} +95 -90
  32. package/core/cli/README.md +88 -0
  33. package/core/cli/command.js +129 -0
  34. package/core/cli/repl.js +32 -0
  35. package/core/cli/timetravel.js +87 -0
  36. package/core/frontend/apps/amp/lib/helpers/amp_content.js +10 -12
  37. package/core/frontend/apps/amp/lib/router.js +2 -3
  38. package/core/frontend/helpers/body_class.js +2 -2
  39. package/core/frontend/helpers/excerpt.js +0 -2
  40. package/core/frontend/helpers/get.js +23 -24
  41. package/core/frontend/helpers/ghost_head.js +102 -103
  42. package/core/frontend/helpers/navigation.js +0 -2
  43. package/core/frontend/helpers/prev_post.js +20 -26
  44. package/core/frontend/helpers/price.js +2 -2
  45. package/core/frontend/meta/author-url.js +2 -2
  46. package/core/frontend/meta/description.js +3 -3
  47. package/core/frontend/meta/excerpt.js +1 -2
  48. package/core/frontend/meta/generate-excerpt.js +2 -11
  49. package/core/frontend/meta/paginated-url.js +1 -1
  50. package/core/frontend/meta/rss-url.js +0 -1
  51. package/core/frontend/meta/url.js +4 -4
  52. package/core/frontend/services/data/entry-lookup.js +1 -1
  53. package/core/frontend/services/data/fetch-data.js +1 -1
  54. package/core/frontend/services/helpers/handlebars.js +11 -12
  55. package/core/frontend/services/proxy.js +11 -1
  56. package/core/frontend/services/rendering/format-response.js +9 -2
  57. package/core/frontend/services/rendering/index.js +0 -4
  58. package/core/frontend/services/rendering/render-entry.js +1 -1
  59. package/core/frontend/services/rendering/templates.js +15 -5
  60. package/core/frontend/services/routing/CollectionRouter.js +2 -2
  61. package/core/frontend/services/routing/EmailRouter.js +2 -2
  62. package/core/frontend/services/routing/ParentRouter.js +1 -1
  63. package/core/frontend/services/routing/PreviewRouter.js +3 -3
  64. package/core/frontend/services/routing/{config/v4.js → config.js} +3 -5
  65. package/core/frontend/services/routing/controllers/channel.js +0 -10
  66. package/core/frontend/services/routing/controllers/collection.js +0 -9
  67. package/core/frontend/services/routing/controllers/email-post.js +2 -7
  68. package/core/frontend/services/routing/controllers/entry.js +1 -3
  69. package/core/frontend/services/routing/controllers/index.js +2 -2
  70. package/core/frontend/services/routing/controllers/{preview.js → previews.js} +3 -8
  71. package/core/frontend/services/routing/controllers/static.js +1 -6
  72. package/core/frontend/services/routing/router-manager.js +38 -20
  73. package/core/frontend/services/rss/generate-feed.js +7 -9
  74. package/core/frontend/services/theme-engine/active.js +0 -8
  75. package/core/frontend/services/theme-engine/config/defaults.json +1 -3
  76. package/core/frontend/services/theme-engine/middleware/index.js +0 -1
  77. package/core/frontend/services/theme-engine/middleware/update-global-template-options.js +0 -69
  78. package/core/frontend/services/theme-engine/middleware/update-local-template-options.js +3 -6
  79. package/core/frontend/web/middleware/static-theme.js +14 -6
  80. package/core/frontend/web/routes.js +9 -9
  81. package/core/frontend/web/site.js +15 -18
  82. package/core/server/adapters/scheduling/post-scheduling/index.js +1 -1
  83. package/core/server/api/README.md +2 -6
  84. package/core/server/api/canary/authentication.js +4 -3
  85. package/core/server/api/canary/{email-preview.js → email-previews.js} +9 -8
  86. package/core/server/api/canary/index.js +14 -18
  87. package/core/server/api/canary/members.js +1 -13
  88. package/core/server/api/{v3/actions.js → canary/newsletters-public.js} +6 -6
  89. package/core/server/api/canary/newsletters.js +1 -13
  90. package/core/server/api/canary/notifications.js +17 -22
  91. package/core/server/api/canary/offers-public.js +28 -0
  92. package/core/server/api/canary/pages.js +1 -1
  93. package/core/server/api/canary/posts.js +4 -8
  94. package/core/server/api/canary/{preview.js → previews.js} +1 -1
  95. package/core/server/api/canary/schedules.js +1 -1
  96. package/core/server/api/canary/session.js +1 -1
  97. package/core/server/api/canary/settings-public.js +3 -1
  98. package/core/server/api/canary/settings.js +28 -16
  99. package/core/server/api/canary/utils/index.js +2 -4
  100. package/core/server/api/canary/utils/serializers/input/index.js +0 -4
  101. package/core/server/api/canary/utils/serializers/input/members.js +46 -17
  102. package/core/server/api/canary/utils/serializers/input/pages.js +0 -17
  103. package/core/server/api/canary/utils/serializers/input/posts.js +1 -28
  104. package/core/server/api/canary/utils/serializers/input/settings.js +61 -142
  105. package/core/server/api/canary/utils/serializers/input/tiers.js +39 -4
  106. package/core/server/api/canary/utils/serializers/output/authentication.js +2 -6
  107. package/core/server/api/canary/utils/serializers/output/index.js +2 -10
  108. package/core/server/api/canary/utils/serializers/output/mappers/index.js +1 -0
  109. package/core/server/api/canary/utils/serializers/output/mappers/newsletters.js +24 -0
  110. package/core/server/api/canary/utils/serializers/output/mappers/pages.js +1 -1
  111. package/core/server/api/canary/utils/serializers/output/mappers/posts.js +9 -7
  112. package/core/server/api/canary/utils/serializers/output/mappers/settings.js +5 -31
  113. package/core/server/api/canary/utils/serializers/output/members.js +18 -3
  114. package/core/server/api/canary/utils/serializers/output/offers.js +9 -1
  115. package/core/server/api/canary/utils/serializers/output/{preview.js → previews.js} +2 -2
  116. package/core/server/api/canary/utils/serializers/output/settings.js +6 -14
  117. package/core/server/api/canary/utils/serializers/output/site.js +0 -1
  118. package/core/server/api/canary/utils/serializers/output/tiers.js +21 -62
  119. package/core/server/api/canary/utils/serializers/output/utils/clean.js +5 -10
  120. package/core/server/api/canary/utils/serializers/output/utils/extra-attrs.js +0 -126
  121. package/core/server/api/canary/utils/serializers/output/utils/post-gating.js +1 -1
  122. package/core/server/api/canary/utils/serializers/output/utils/url.js +0 -5
  123. package/core/server/api/canary/utils/validators/input/index.js +2 -2
  124. package/core/server/api/canary/utils/validators/input/{passwordreset.js → password_reset.js} +2 -2
  125. package/core/server/api/canary/utils/validators/input/settings.js +2 -23
  126. package/core/server/api/canary/utils/validators/utils/json-schema.js +1 -2
  127. package/core/server/api/index.js +1 -7
  128. package/core/server/api/shared/serializers/input/utils/settings-key-group-mapper.js +2 -2
  129. package/core/server/api/shared/serializers/input/utils/settings-key-type-mapper.js +2 -4
  130. package/core/server/data/db/connection.js +0 -13
  131. package/core/server/data/exporter/table-lists.js +0 -3
  132. package/core/server/data/importer/importers/data/base.js +16 -7
  133. package/core/server/data/importer/importers/data/data-importer.js +38 -1
  134. package/core/server/data/importer/importers/data/newsletters.js +45 -0
  135. package/core/server/data/importer/importers/data/posts.js +40 -12
  136. package/core/server/data/importer/importers/data/products.js +68 -0
  137. package/core/server/data/importer/importers/data/settings.js +10 -10
  138. package/core/server/data/importer/importers/data/stripe-prices.js +59 -0
  139. package/core/server/data/importer/importers/data/stripe-products.js +61 -0
  140. package/core/server/data/migrations/utils/constants.js +3 -0
  141. package/core/server/data/migrations/utils/index.js +10 -0
  142. package/core/server/data/migrations/utils/migrations.js +156 -0
  143. package/core/server/data/migrations/utils/permissions.js +291 -0
  144. package/core/server/data/migrations/utils/schema.js +158 -0
  145. package/core/server/data/migrations/utils/settings.js +59 -0
  146. package/core/server/data/migrations/utils/tables.js +94 -0
  147. package/core/server/data/migrations/versions/1.25/01-final-v1.js +2 -0
  148. package/core/server/data/migrations/versions/1.25/02-noop.js +6 -0
  149. package/core/server/data/migrations/versions/2.37/01-final-v2.js +2 -0
  150. package/core/server/data/migrations/versions/3.41/01-final-v3.js +2 -0
  151. package/core/server/data/migrations/versions/4.0/22-solve-orphaned-webhooks.js +3 -9
  152. package/core/server/data/migrations/versions/4.0/23-regenerate-posts-html.js +2 -11
  153. package/core/server/data/migrations/versions/4.11/02-add-email-verification-required-setting.js +1 -1
  154. package/core/server/data/migrations/versions/4.12/02-fix-member-statuses.js +1 -1
  155. package/core/server/data/migrations/versions/4.14/02-fix-free-members-status-events.js +1 -1
  156. package/core/server/data/migrations/versions/4.22/01-add-is-launch-complete-setting.js +1 -1
  157. package/core/server/data/migrations/versions/4.22/02-update-launch-complete-setting-from-user-data.js +1 -1
  158. package/core/server/data/migrations/versions/4.35/2022-02-02-10-38-add-default-content-visibility-tiers-setting.js +1 -1
  159. package/core/server/data/migrations/versions/4.45/2022-04-21-02-55-add-notifications-key-entry-to-settings-table.js +1 -1
  160. package/core/server/data/migrations/versions/4.6/01-remove-comped-status.js +1 -1
  161. package/core/server/data/migrations/versions/4.7/03-add-labs-setting.js +1 -1
  162. package/core/server/data/migrations/versions/4.9/05-fix-missed-mobiledoc-url-transforms.js +1 -1
  163. package/core/server/data/migrations/versions/4.9/06-add-comped-status.js +1 -1
  164. package/core/server/data/migrations/versions/4.9/07-update-comped-members-status-events.js +1 -1
  165. package/core/server/data/migrations/versions/5.0/2022-03-14-12-33-delete-duplicate-offer-redemptions.js +36 -0
  166. package/core/server/data/migrations/versions/5.0/2022-03-28-15-25-backfill-mrr-adjustments-for-offers.js +108 -0
  167. package/core/server/data/migrations/versions/5.0/2022-04-25-10-32-backfill-mrr-for-discounted-subscriptions.js +44 -0
  168. package/core/server/data/migrations/versions/5.0/2022-04-26-15-44-backfill-mrr-events-for-canceled-subscriptions.js +73 -0
  169. package/core/server/data/migrations/versions/5.0/2022-04-27-11-26-backfill-mrr-for-canceled-subscriptions.js +31 -0
  170. package/core/server/data/migrations/versions/5.0/2022-04-28-03-26-remove-author-id-column-from-posts-table.js +7 -0
  171. package/core/server/data/migrations/versions/5.0/2022-05-03-09-39-drop-nullable-subscribe-event-newsletter-id.js +4 -0
  172. package/core/server/data/migrations/versions/5.0/2022-05-04-15-24-map-existing-emails-to-default-newsletter.js +44 -0
  173. package/core/server/data/migrations/versions/5.0/2022-05-05-13-13-migrate-legacy-recipient-filters.js +30 -0
  174. package/core/server/data/migrations/versions/5.0/2022-05-05-13-29-add-newsletters-admin-integration-permission-roles.js +20 -0
  175. package/core/server/data/migrations/versions/5.0/2022-05-05-15-17-drop-oauth-table.js +3 -0
  176. package/core/server/data/migrations/versions/5.0/2022-05-06-08-16-cleanup-client-subscriber-permissions.js +68 -0
  177. package/core/server/data/migrations/versions/5.0/2022-05-06-13-22-add-frontend-integration.js +68 -0
  178. package/core/server/data/migrations/versions/5.0/2022-05-09-10-00-drop-members-subscribed-column.js +18 -0
  179. package/core/server/data/migrations/versions/5.0/2022-05-09-14-17-cleanup-invalid-users-status.js +17 -0
  180. package/core/server/data/migrations/versions/5.0/2022-05-10-08-33-drop-members-analytics-table.js +3 -0
  181. package/core/server/data/migrations/versions/5.0/2022-05-10-14-57-cleanup-invalid-posts-status.js +17 -0
  182. package/core/server/data/migrations/versions/5.0/2022-05-11-12-08-drop-webhooks-status-column.js +18 -0
  183. package/core/server/data/migrations/versions/5.0/2022-05-11-13-12-rename-settings.js +51 -0
  184. package/core/server/data/migrations/versions/5.0/2022-05-11-16-36-remove-unused-settings.js +54 -0
  185. package/core/server/data/migrations/versions/5.0/2022-05-12-10-29-add-newsletter-permissions-for-editors-and-authors.js +20 -0
  186. package/core/server/data/migrations/versions/5.0/2022-05-12-13-51-add-label-permissions-for-authors.js +12 -0
  187. package/core/server/data/migrations/versions/5.0/2022-05-13-11-38-drop-none-email-recipient-filter.js +28 -0
  188. package/core/server/data/migrations/versions/5.0/2022-05-21-00-00-regenerate-posts-html.js +70 -0
  189. package/core/server/data/schema/commands.js +35 -3
  190. package/core/server/data/schema/default-settings/default-settings.json +2 -159
  191. package/core/server/data/schema/fixtures/fixture-manager.js +11 -2
  192. package/core/server/data/schema/fixtures/fixtures.json +16 -7
  193. package/core/server/data/schema/schema.js +26 -38
  194. package/core/server/data/schema/validator.js +2 -0
  195. package/core/server/ghost-server.js +34 -64
  196. package/core/server/lib/image/gravatar.js +25 -9
  197. package/core/server/models/api-key.js +3 -26
  198. package/core/server/models/base/plugins/bulk-operations.js +14 -6
  199. package/core/server/models/integration.js +17 -0
  200. package/core/server/models/member.js +8 -4
  201. package/core/server/models/newsletter.js +27 -0
  202. package/core/server/models/post.js +30 -32
  203. package/core/server/models/relations/authors.js +74 -100
  204. package/core/server/models/settings.js +6 -2
  205. package/core/server/models/webhook.js +2 -1
  206. package/core/server/run-update-check.js +1 -1
  207. package/core/server/services/api-version-compatibility/index.js +24 -18
  208. package/core/server/services/api-version-compatibility/legacy-api-path-match.js +23 -0
  209. package/core/server/services/api-version-compatibility/mw-version-rewrites.js +36 -0
  210. package/core/server/services/auth/api-key/admin.js +8 -7
  211. package/core/server/services/auth/passwordreset.js +3 -3
  212. package/core/server/services/auth/session/express-session.js +1 -1
  213. package/core/server/services/auth/session/index.js +1 -1
  214. package/core/server/services/auth/setup.js +8 -8
  215. package/core/server/services/bulk-email/bulk-email-processor.js +5 -1
  216. package/core/server/services/frontend-data-service/frontend-data-service.js +27 -0
  217. package/core/server/services/frontend-data-service/index.js +6 -0
  218. package/core/server/services/mail/index.js +14 -1
  219. package/core/server/services/mega/email-preview.js +14 -15
  220. package/core/server/services/mega/mega.js +37 -52
  221. package/core/server/services/mega/post-email-serializer.js +18 -28
  222. package/core/server/services/members/api.js +0 -3
  223. package/core/server/services/members/config.js +0 -49
  224. package/core/server/services/members/exporter/query.js +7 -7
  225. package/core/server/services/members/middleware.js +3 -135
  226. package/core/server/services/members/service.js +0 -27
  227. package/core/server/services/members/settings.js +3 -9
  228. package/core/server/services/newsletters/service.js +78 -10
  229. package/core/server/services/posts/post-scheduling-service.js +5 -17
  230. package/core/server/services/posts/posts-service.js +15 -62
  231. package/core/server/services/public-config/site.js +0 -6
  232. package/core/server/services/route-settings/index.js +0 -3
  233. package/core/server/services/route-settings/settings-loader.js +10 -34
  234. package/core/server/services/route-settings/validate.js +1 -7
  235. package/core/server/services/settings/index.js +1 -77
  236. package/core/server/services/settings/settings-service.js +184 -0
  237. package/core/server/services/themes/validate.js +1 -1
  238. package/core/server/services/url/Resources.js +1 -3
  239. package/core/server/services/url/UrlGenerator.js +1 -1
  240. package/core/server/services/url/UrlService.js +6 -20
  241. package/core/server/services/url/{configs/v2.js → config.js} +0 -0
  242. package/core/server/services/users.js +2 -2
  243. package/core/server/services/webhooks/listen.js +5 -2
  244. package/core/server/services/webhooks/serialize.js +6 -7
  245. package/core/server/services/webhooks/trigger.js +62 -47
  246. package/core/server/update-check.js +1 -1
  247. package/core/server/web/admin/app.js +1 -1
  248. package/core/server/web/admin/views/default-prod.html +4 -4
  249. package/core/server/web/admin/views/default.html +4 -4
  250. package/core/server/web/api/app.js +3 -15
  251. package/core/server/web/api/canary/admin/app.js +1 -1
  252. package/core/server/web/api/canary/admin/middleware.js +3 -1
  253. package/core/server/web/api/canary/admin/routes.js +7 -23
  254. package/core/server/web/api/canary/content/app.js +2 -3
  255. package/core/server/web/api/canary/content/routes.js +5 -4
  256. package/core/server/web/members/app.js +5 -4
  257. package/core/server/web/parent/backend.js +0 -1
  258. package/core/server/web/parent/frontend.js +5 -6
  259. package/core/server/web/parent/middleware/ghost-locals.js +0 -3
  260. package/core/shared/config/defaults.json +5 -2
  261. package/core/shared/config/overrides.json +1 -27
  262. package/core/shared/html-to-plaintext.js +74 -10
  263. package/core/shared/labs.js +4 -8
  264. package/core/shared/settings-cache/cache.js +38 -4
  265. package/core/shared/settings-cache/public.js +13 -7
  266. package/core/shared/url-utils.js +0 -2
  267. package/ghost.js +6 -0
  268. package/package.json +66 -64
  269. package/yarn.lock +751 -1295
  270. package/core/built/assets/ghost-dark-c94ae212747200ca4bafc37cfb0714d8.css +0 -1
  271. package/core/built/assets/ghost.min-4084931bc22e794fe3722139050a80b3.css +0 -1
  272. package/core/frontend/helpers/author.js +0 -41
  273. package/core/frontend/helpers/products.js +0 -65
  274. package/core/frontend/services/rendering/secure.js +0 -19
  275. package/core/frontend/services/routing/config/canary.js +0 -61
  276. package/core/frontend/services/routing/config/v2.js +0 -54
  277. package/core/frontend/services/routing/config/v3.js +0 -54
  278. package/core/frontend/services/theme-engine/engines/create.js +0 -45
  279. package/core/frontend/services/theme-engine/engines/index.js +0 -5
  280. package/core/frontend/services/theme-engine/middleware/update-local-template-data.js +0 -9
  281. package/core/server/api/canary/products-public.js +0 -34
  282. package/core/server/api/canary/products.js +0 -116
  283. package/core/server/api/canary/utils/serializers/input/products.js +0 -28
  284. package/core/server/api/canary/utils/serializers/output/email-previews.js +0 -7
  285. package/core/server/api/canary/utils/serializers/output/products.js +0 -213
  286. package/core/server/api/v2/actions.js +0 -38
  287. package/core/server/api/v2/authentication.js +0 -191
  288. package/core/server/api/v2/authors-public.js +0 -69
  289. package/core/server/api/v2/config.js +0 -12
  290. package/core/server/api/v2/db.js +0 -120
  291. package/core/server/api/v2/images.js +0 -20
  292. package/core/server/api/v2/index.js +0 -147
  293. package/core/server/api/v2/integrations.js +0 -144
  294. package/core/server/api/v2/invites.js +0 -126
  295. package/core/server/api/v2/mail.js +0 -66
  296. package/core/server/api/v2/notifications.js +0 -96
  297. package/core/server/api/v2/oembed.js +0 -186
  298. package/core/server/api/v2/pages-public.js +0 -78
  299. package/core/server/api/v2/pages.js +0 -197
  300. package/core/server/api/v2/posts-public.js +0 -78
  301. package/core/server/api/v2/posts.js +0 -192
  302. package/core/server/api/v2/preview.js +0 -46
  303. package/core/server/api/v2/redirects.js +0 -28
  304. package/core/server/api/v2/roles.js +0 -19
  305. package/core/server/api/v2/schedules.js +0 -77
  306. package/core/server/api/v2/session.js +0 -70
  307. package/core/server/api/v2/settings-public.js +0 -17
  308. package/core/server/api/v2/settings.js +0 -195
  309. package/core/server/api/v2/site.js +0 -14
  310. package/core/server/api/v2/slack.js +0 -12
  311. package/core/server/api/v2/slugs.js +0 -51
  312. package/core/server/api/v2/tags-public.js +0 -71
  313. package/core/server/api/v2/tags.js +0 -159
  314. package/core/server/api/v2/themes.js +0 -133
  315. package/core/server/api/v2/users.js +0 -179
  316. package/core/server/api/v2/utils/index.js +0 -34
  317. package/core/server/api/v2/utils/permissions.js +0 -112
  318. package/core/server/api/v2/utils/serializers/index.js +0 -9
  319. package/core/server/api/v2/utils/serializers/input/db.js +0 -20
  320. package/core/server/api/v2/utils/serializers/input/index.js +0 -33
  321. package/core/server/api/v2/utils/serializers/input/integrations.js +0 -33
  322. package/core/server/api/v2/utils/serializers/input/pages.js +0 -203
  323. package/core/server/api/v2/utils/serializers/input/posts.js +0 -218
  324. package/core/server/api/v2/utils/serializers/input/settings.js +0 -152
  325. package/core/server/api/v2/utils/serializers/input/tags.js +0 -35
  326. package/core/server/api/v2/utils/serializers/input/users.js +0 -26
  327. package/core/server/api/v2/utils/serializers/input/utils/url.js +0 -71
  328. package/core/server/api/v2/utils/serializers/input/webhooks.js +0 -12
  329. package/core/server/api/v2/utils/serializers/output/actions.js +0 -13
  330. package/core/server/api/v2/utils/serializers/output/all.js +0 -25
  331. package/core/server/api/v2/utils/serializers/output/authentication.js +0 -68
  332. package/core/server/api/v2/utils/serializers/output/authors.js +0 -21
  333. package/core/server/api/v2/utils/serializers/output/config.js +0 -21
  334. package/core/server/api/v2/utils/serializers/output/db.js +0 -40
  335. package/core/server/api/v2/utils/serializers/output/images.js +0 -19
  336. package/core/server/api/v2/utils/serializers/output/index.js +0 -107
  337. package/core/server/api/v2/utils/serializers/output/integrations.js +0 -35
  338. package/core/server/api/v2/utils/serializers/output/invites.js +0 -24
  339. package/core/server/api/v2/utils/serializers/output/mail.js +0 -19
  340. package/core/server/api/v2/utils/serializers/output/notifications.js +0 -29
  341. package/core/server/api/v2/utils/serializers/output/oembed.js +0 -8
  342. package/core/server/api/v2/utils/serializers/output/pages.js +0 -26
  343. package/core/server/api/v2/utils/serializers/output/posts.js +0 -26
  344. package/core/server/api/v2/utils/serializers/output/preview.js +0 -9
  345. package/core/server/api/v2/utils/serializers/output/redirects.js +0 -5
  346. package/core/server/api/v2/utils/serializers/output/roles.js +0 -29
  347. package/core/server/api/v2/utils/serializers/output/schedules.js +0 -5
  348. package/core/server/api/v2/utils/serializers/output/settings.js +0 -61
  349. package/core/server/api/v2/utils/serializers/output/site.js +0 -16
  350. package/core/server/api/v2/utils/serializers/output/slugs.js +0 -11
  351. package/core/server/api/v2/utils/serializers/output/tags.js +0 -25
  352. package/core/server/api/v2/utils/serializers/output/themes.js +0 -25
  353. package/core/server/api/v2/utils/serializers/output/users.js +0 -45
  354. package/core/server/api/v2/utils/serializers/output/utils/clean.js +0 -174
  355. package/core/server/api/v2/utils/serializers/output/utils/date.js +0 -21
  356. package/core/server/api/v2/utils/serializers/output/utils/extra-attrs.js +0 -161
  357. package/core/server/api/v2/utils/serializers/output/utils/mapper.js +0 -136
  358. package/core/server/api/v2/utils/serializers/output/utils/post-gating.js +0 -29
  359. package/core/server/api/v2/utils/serializers/output/utils/settings-type-group-mapper.js +0 -24
  360. package/core/server/api/v2/utils/serializers/output/utils/url.js +0 -67
  361. package/core/server/api/v2/utils/serializers/output/webhooks.js +0 -15
  362. package/core/server/api/v2/utils/validators/index.js +0 -9
  363. package/core/server/api/v2/utils/validators/input/images.js +0 -85
  364. package/core/server/api/v2/utils/validators/input/index.js +0 -45
  365. package/core/server/api/v2/utils/validators/input/invitations.js +0 -49
  366. package/core/server/api/v2/utils/validators/input/invites.js +0 -21
  367. package/core/server/api/v2/utils/validators/input/oembed.js +0 -17
  368. package/core/server/api/v2/utils/validators/input/pages.js +0 -46
  369. package/core/server/api/v2/utils/validators/input/passwordreset.js +0 -36
  370. package/core/server/api/v2/utils/validators/input/posts.js +0 -46
  371. package/core/server/api/v2/utils/validators/input/settings.js +0 -79
  372. package/core/server/api/v2/utils/validators/input/setup.js +0 -17
  373. package/core/server/api/v2/utils/validators/input/tags.js +0 -6
  374. package/core/server/api/v2/utils/validators/input/users.js +0 -21
  375. package/core/server/api/v2/utils/validators/output/index.js +0 -1
  376. package/core/server/api/v2/utils/validators/utils/json-schema.js +0 -17
  377. package/core/server/api/v2/webhooks.js +0 -163
  378. package/core/server/api/v3/authentication.js +0 -192
  379. package/core/server/api/v3/authors-public.js +0 -69
  380. package/core/server/api/v3/config.js +0 -12
  381. package/core/server/api/v3/db.js +0 -131
  382. package/core/server/api/v3/email-preview.js +0 -74
  383. package/core/server/api/v3/email.js +0 -65
  384. package/core/server/api/v3/identities.js +0 -36
  385. package/core/server/api/v3/images.js +0 -20
  386. package/core/server/api/v3/index.js +0 -179
  387. package/core/server/api/v3/integrations.js +0 -150
  388. package/core/server/api/v3/invites.js +0 -125
  389. package/core/server/api/v3/labels.js +0 -162
  390. package/core/server/api/v3/mail.js +0 -66
  391. package/core/server/api/v3/memberSigninUrls.js +0 -33
  392. package/core/server/api/v3/members.js +0 -412
  393. package/core/server/api/v3/membersStripeConnect.js +0 -29
  394. package/core/server/api/v3/notifications.js +0 -96
  395. package/core/server/api/v3/oembed.js +0 -23
  396. package/core/server/api/v3/pages-public.js +0 -77
  397. package/core/server/api/v3/pages.js +0 -199
  398. package/core/server/api/v3/posts-public.js +0 -76
  399. package/core/server/api/v3/posts.js +0 -200
  400. package/core/server/api/v3/preview.js +0 -44
  401. package/core/server/api/v3/redirects.js +0 -47
  402. package/core/server/api/v3/roles.js +0 -19
  403. package/core/server/api/v3/schedules.js +0 -77
  404. package/core/server/api/v3/session.js +0 -70
  405. package/core/server/api/v3/settings-public.js +0 -17
  406. package/core/server/api/v3/settings.js +0 -224
  407. package/core/server/api/v3/site.js +0 -14
  408. package/core/server/api/v3/slack.js +0 -12
  409. package/core/server/api/v3/slugs.js +0 -48
  410. package/core/server/api/v3/snippets.js +0 -115
  411. package/core/server/api/v3/tags-public.js +0 -71
  412. package/core/server/api/v3/tags.js +0 -159
  413. package/core/server/api/v3/themes.js +0 -131
  414. package/core/server/api/v3/users.js +0 -242
  415. package/core/server/api/v3/utils/index.js +0 -34
  416. package/core/server/api/v3/utils/permissions.js +0 -116
  417. package/core/server/api/v3/utils/serializers/index.js +0 -9
  418. package/core/server/api/v3/utils/serializers/input/authors.js +0 -31
  419. package/core/server/api/v3/utils/serializers/input/db.js +0 -20
  420. package/core/server/api/v3/utils/serializers/input/index.js +0 -41
  421. package/core/server/api/v3/utils/serializers/input/integrations.js +0 -33
  422. package/core/server/api/v3/utils/serializers/input/members.js +0 -62
  423. package/core/server/api/v3/utils/serializers/input/pages.js +0 -208
  424. package/core/server/api/v3/utils/serializers/input/posts.js +0 -242
  425. package/core/server/api/v3/utils/serializers/input/settings.js +0 -168
  426. package/core/server/api/v3/utils/serializers/input/tags.js +0 -42
  427. package/core/server/api/v3/utils/serializers/input/users.js +0 -26
  428. package/core/server/api/v3/utils/serializers/input/utils/slug-filter-order.js +0 -18
  429. package/core/server/api/v3/utils/serializers/input/utils/url.js +0 -71
  430. package/core/server/api/v3/utils/serializers/input/webhooks.js +0 -12
  431. package/core/server/api/v3/utils/serializers/output/actions.js +0 -13
  432. package/core/server/api/v3/utils/serializers/output/all.js +0 -25
  433. package/core/server/api/v3/utils/serializers/output/authentication.js +0 -69
  434. package/core/server/api/v3/utils/serializers/output/authors.js +0 -21
  435. package/core/server/api/v3/utils/serializers/output/config.js +0 -25
  436. package/core/server/api/v3/utils/serializers/output/db.js +0 -40
  437. package/core/server/api/v3/utils/serializers/output/email-preview.js +0 -7
  438. package/core/server/api/v3/utils/serializers/output/emails.js +0 -13
  439. package/core/server/api/v3/utils/serializers/output/identities.js +0 -7
  440. package/core/server/api/v3/utils/serializers/output/images.js +0 -19
  441. package/core/server/api/v3/utils/serializers/output/index.js +0 -135
  442. package/core/server/api/v3/utils/serializers/output/integrations.js +0 -35
  443. package/core/server/api/v3/utils/serializers/output/invites.js +0 -24
  444. package/core/server/api/v3/utils/serializers/output/labels.js +0 -25
  445. package/core/server/api/v3/utils/serializers/output/mail.js +0 -19
  446. package/core/server/api/v3/utils/serializers/output/member-signin_urls.js +0 -7
  447. package/core/server/api/v3/utils/serializers/output/members.js +0 -228
  448. package/core/server/api/v3/utils/serializers/output/notifications.js +0 -29
  449. package/core/server/api/v3/utils/serializers/output/oembed.js +0 -8
  450. package/core/server/api/v3/utils/serializers/output/pages.js +0 -26
  451. package/core/server/api/v3/utils/serializers/output/posts.js +0 -26
  452. package/core/server/api/v3/utils/serializers/output/preview.js +0 -10
  453. package/core/server/api/v3/utils/serializers/output/redirects.js +0 -5
  454. package/core/server/api/v3/utils/serializers/output/roles.js +0 -29
  455. package/core/server/api/v3/utils/serializers/output/schedules.js +0 -5
  456. package/core/server/api/v3/utils/serializers/output/settings.js +0 -65
  457. package/core/server/api/v3/utils/serializers/output/site.js +0 -19
  458. package/core/server/api/v3/utils/serializers/output/slugs.js +0 -11
  459. package/core/server/api/v3/utils/serializers/output/snippets.js +0 -97
  460. package/core/server/api/v3/utils/serializers/output/tags.js +0 -25
  461. package/core/server/api/v3/utils/serializers/output/themes.js +0 -25
  462. package/core/server/api/v3/utils/serializers/output/users.js +0 -74
  463. package/core/server/api/v3/utils/serializers/output/utils/clean.js +0 -166
  464. package/core/server/api/v3/utils/serializers/output/utils/date.js +0 -21
  465. package/core/server/api/v3/utils/serializers/output/utils/extra-attrs.js +0 -174
  466. package/core/server/api/v3/utils/serializers/output/utils/mapper.js +0 -197
  467. package/core/server/api/v3/utils/serializers/output/utils/post-gating.js +0 -39
  468. package/core/server/api/v3/utils/serializers/output/utils/settings-type-group-mapper.js +0 -24
  469. package/core/server/api/v3/utils/serializers/output/utils/url.js +0 -67
  470. package/core/server/api/v3/utils/serializers/output/webhooks.js +0 -15
  471. package/core/server/api/v3/utils/validators/index.js +0 -9
  472. package/core/server/api/v3/utils/validators/input/images.js +0 -85
  473. package/core/server/api/v3/utils/validators/input/index.js +0 -61
  474. package/core/server/api/v3/utils/validators/input/invitations.js +0 -49
  475. package/core/server/api/v3/utils/validators/input/invites.js +0 -21
  476. package/core/server/api/v3/utils/validators/input/labels.js +0 -6
  477. package/core/server/api/v3/utils/validators/input/members.js +0 -6
  478. package/core/server/api/v3/utils/validators/input/oembed.js +0 -17
  479. package/core/server/api/v3/utils/validators/input/pages.js +0 -46
  480. package/core/server/api/v3/utils/validators/input/passwordreset.js +0 -36
  481. package/core/server/api/v3/utils/validators/input/posts.js +0 -46
  482. package/core/server/api/v3/utils/validators/input/settings.js +0 -89
  483. package/core/server/api/v3/utils/validators/input/setup.js +0 -17
  484. package/core/server/api/v3/utils/validators/input/snippets.js +0 -6
  485. package/core/server/api/v3/utils/validators/input/tags.js +0 -6
  486. package/core/server/api/v3/utils/validators/input/users.js +0 -22
  487. package/core/server/api/v3/utils/validators/input/webhooks.js +0 -27
  488. package/core/server/api/v3/utils/validators/output/index.js +0 -1
  489. package/core/server/api/v3/utils/validators/utils/json-schema.js +0 -17
  490. package/core/server/api/v3/webhooks.js +0 -130
  491. package/core/server/data/migrations/utils.js +0 -571
  492. package/core/server/data/migrations/versions/1.13/1-custom-template-post.js +0 -7
  493. package/core/server/data/migrations/versions/1.13/2-theme-permissions.js +0 -58
  494. package/core/server/data/migrations/versions/1.18/1-add-webhooks-table.js +0 -2
  495. package/core/server/data/migrations/versions/1.19/1-webhook-permissions.js +0 -31
  496. package/core/server/data/migrations/versions/1.20/1-remove-settings-keys.js +0 -65
  497. package/core/server/data/migrations/versions/1.21/1-add-contributor-role.js +0 -58
  498. package/core/server/data/migrations/versions/1.22/1-multiple-authors-DDL.js +0 -2
  499. package/core/server/data/migrations/versions/1.22/1-multiple-authors-DML.js +0 -63
  500. package/core/server/data/migrations/versions/1.25/1-update-koenig-beta-html.js +0 -70
  501. package/core/server/data/migrations/versions/1.25/2-demo-post.js +0 -55
  502. package/core/server/data/migrations/versions/1.3/1-post-excerpt.js +0 -7
  503. package/core/server/data/migrations/versions/1.4/1-codeinjection-post.js +0 -14
  504. package/core/server/data/migrations/versions/1.5/1-og-twitter-post.js +0 -34
  505. package/core/server/data/migrations/versions/1.7/1-add-backup-client.js +0 -10
  506. package/core/server/data/migrations/versions/1.9/1-add-permissions-redirect.js +0 -23
  507. package/core/server/data/migrations/versions/2.0/1-rename-amp-column.js +0 -44
  508. package/core/server/data/migrations/versions/2.0/2-update-posts.js +0 -7
  509. package/core/server/data/migrations/versions/2.0/3-remove-koenig-labs.js +0 -42
  510. package/core/server/data/migrations/versions/2.0/4-permalink-setting.js +0 -85
  511. package/core/server/data/migrations/versions/2.0/5-remove-demo-post.js +0 -85
  512. package/core/server/data/migrations/versions/2.0/6-replace-fixture-posts.js +0 -10
  513. package/core/server/data/migrations/versions/2.13/1-remove-empty-strings.js +0 -5
  514. package/core/server/data/migrations/versions/2.14/1-add-actions-table.js +0 -2
  515. package/core/server/data/migrations/versions/2.14/2-add-actions-permissions.js +0 -12
  516. package/core/server/data/migrations/versions/2.15/1-add-type-column-to-integrations.js +0 -8
  517. package/core/server/data/migrations/versions/2.15/2-insert-zapier-integration.js +0 -69
  518. package/core/server/data/migrations/versions/2.16/1-add-members-perrmissions.js +0 -1
  519. package/core/server/data/migrations/versions/2.17/1-normalize-settings.js +0 -74
  520. package/core/server/data/migrations/versions/2.17/2-posts-add-canonical-url.js +0 -7
  521. package/core/server/data/migrations/versions/2.18/1-restore-settings-from-backup.js +0 -134
  522. package/core/server/data/migrations/versions/2.2/1-add-sessions-table.js +0 -2
  523. package/core/server/data/migrations/versions/2.2/2-add-integrations-and-api-key-tables.js +0 -6
  524. package/core/server/data/migrations/versions/2.2/3-insert-admin-integration-role.js +0 -83
  525. package/core/server/data/migrations/versions/2.2/4-insert-integration-and-api-key-permissions.js +0 -77
  526. package/core/server/data/migrations/versions/2.2/5-add-mobiledoc-revisions-table.js +0 -2
  527. package/core/server/data/migrations/versions/2.21/1-update-editor-permissions.js +0 -28
  528. package/core/server/data/migrations/versions/2.22/1-add-member-permissions-to-roles.js +0 -47
  529. package/core/server/data/migrations/versions/2.27/1-insert-ghost-db-backup-role.js +0 -83
  530. package/core/server/data/migrations/versions/2.27/2-insert-db-backup-integration.js +0 -69
  531. package/core/server/data/migrations/versions/2.27/3-add-subdirectory-to-relative-canonical-urls.js +0 -100
  532. package/core/server/data/migrations/versions/2.28/1-add-db-backup-content-permission.js +0 -9
  533. package/core/server/data/migrations/versions/2.28/2-add-db-backup-content-permission-to-roles.js +0 -15
  534. package/core/server/data/migrations/versions/2.28/3-insert-ghost-scheduler-role.js +0 -84
  535. package/core/server/data/migrations/versions/2.28/4-insert-scheduler-integration.js +0 -69
  536. package/core/server/data/migrations/versions/2.28/5-add-scheduler-permission-to-roles.js +0 -23
  537. package/core/server/data/migrations/versions/2.28/6-add-type-column.js +0 -6
  538. package/core/server/data/migrations/versions/2.28/7-populate-type-column.js +0 -6
  539. package/core/server/data/migrations/versions/2.28/8-remove-page-column.js +0 -6
  540. package/core/server/data/migrations/versions/2.29/1-add-post-page-column.js +0 -20
  541. package/core/server/data/migrations/versions/2.29/2-populate-post-page-column.js +0 -98
  542. package/core/server/data/migrations/versions/2.29/3-remove-page-type-column.js +0 -15
  543. package/core/server/data/migrations/versions/2.3/1-add-webhook-columns.js +0 -45
  544. package/core/server/data/migrations/versions/2.3/2-add-webhook-edit-permission.js +0 -9
  545. package/core/server/data/migrations/versions/2.31/1-remove-name-and-password-from-members-table.js +0 -15
  546. package/core/server/data/migrations/versions/2.32/01-add-members-stripe-customers-table.js +0 -4
  547. package/core/server/data/migrations/versions/2.32/02-add-name-to-members-table.js +0 -7
  548. package/core/server/data/migrations/versions/2.33/01-correct-members-stripe-customers-table.js +0 -37
  549. package/core/server/data/migrations/versions/2.34/01-add-stripe-customers-subscriptions-table.js +0 -2
  550. package/core/server/data/migrations/versions/2.34/02-add-email-to-members-stripe-customers-table.js +0 -7
  551. package/core/server/data/migrations/versions/2.34/03-add-name-to-members-stripe-customers-table.js +0 -7
  552. package/core/server/data/migrations/versions/2.35/01-add-note-to-members-table.js +0 -7
  553. package/core/server/data/migrations/versions/2.37/01-add-self-signup-and-from address-to-members-settings.js +0 -67
  554. package/core/server/data/migrations/versions/2.6/1-add-webhook-permission-roles.js +0 -31
  555. package/core/server/data/migrations/versions/2.8/1-add-members-table.js +0 -2
  556. package/core/server/data/migrations/versions/3.0/01-remove-user-ghost-auth-columns.js +0 -14
  557. package/core/server/data/migrations/versions/3.0/02-drop-token-auth-tables.js +0 -31
  558. package/core/server/data/migrations/versions/3.0/03-drop-client-auth-tables.js +0 -35
  559. package/core/server/data/migrations/versions/3.0/04-add-posts-meta-table.js +0 -2
  560. package/core/server/data/migrations/versions/3.0/05-populate-posts-meta-table.js +0 -83
  561. package/core/server/data/migrations/versions/3.0/06-remove-posts-meta-columns.js +0 -44
  562. package/core/server/data/migrations/versions/3.0/07-add-posts-type-column.js +0 -8
  563. package/core/server/data/migrations/versions/3.0/08-populate-posts-type-column.js +0 -94
  564. package/core/server/data/migrations/versions/3.0/09-remove-posts-page-column.js +0 -7
  565. package/core/server/data/migrations/versions/3.0/10-remove-empty-strings.js +0 -81
  566. package/core/server/data/migrations/versions/3.0/11-update-posts-html.js +0 -7
  567. package/core/server/data/migrations/versions/3.0/12-populate-members-table-from-subscribers.js +0 -54
  568. package/core/server/data/migrations/versions/3.0/13-drop-subscribers-table.js +0 -34
  569. package/core/server/data/migrations/versions/3.0/14-remove-subscribers-flag.js +0 -24
  570. package/core/server/data/migrations/versions/3.1/01-add-send-email-when-published-to-posts.js +0 -7
  571. package/core/server/data/migrations/versions/3.1/02-add-email-subject-to-posts-meta.js +0 -7
  572. package/core/server/data/migrations/versions/3.1/03-add-email-preview-permissions.js +0 -18
  573. package/core/server/data/migrations/versions/3.1/04-add-subscribed-flag-to-members.js +0 -7
  574. package/core/server/data/migrations/versions/3.1/05-add-emails-table.js +0 -2
  575. package/core/server/data/migrations/versions/3.1/06-add-email-permissions.js +0 -15
  576. package/core/server/data/migrations/versions/3.1/07-add-uuid-field-to-members.js +0 -8
  577. package/core/server/data/migrations/versions/3.1/08-add-uuid-values-to-members.js +0 -23
  578. package/core/server/data/migrations/versions/3.1/09-add-further-email-permissions.js +0 -25
  579. package/core/server/data/migrations/versions/3.1/10-add-email-error-data-column.js +0 -8
  580. package/core/server/data/migrations/versions/3.11/01-remove-broken-complimentary-plan-from-members-settings.js +0 -68
  581. package/core/server/data/migrations/versions/3.12/01-add-identity-permission.js +0 -7
  582. package/core/server/data/migrations/versions/3.12/02-remove-legacy-is-paid-flag-from-settings.js +0 -93
  583. package/core/server/data/migrations/versions/3.18/01-add-email-preview-permissions-to-roles.js +0 -39
  584. package/core/server/data/migrations/versions/3.18/02-add-members_stripe_connect-auth-permissions.js +0 -7
  585. package/core/server/data/migrations/versions/3.19/01-update-member-from-email-address.js +0 -91
  586. package/core/server/data/migrations/versions/3.2/01-add-cancel-at-period-end-to-subscriptions.js +0 -7
  587. package/core/server/data/migrations/versions/3.22/01-removed-legacy-values-from-settings-table.js +0 -65
  588. package/core/server/data/migrations/versions/3.22/02-settings-key-renames.js +0 -90
  589. package/core/server/data/migrations/versions/3.22/03-add-group-and-flags-to-settings.js +0 -15
  590. package/core/server/data/migrations/versions/3.22/04-populate-settings-groups-and-flags.js +0 -194
  591. package/core/server/data/migrations/versions/3.22/05-migrate-members-subscription-settings.js +0 -182
  592. package/core/server/data/migrations/versions/3.22/06-migrate-stripe-connect-settings.js +0 -132
  593. package/core/server/data/migrations/versions/3.22/07-update-type-for-settings.js +0 -137
  594. package/core/server/data/migrations/versions/3.23/01-migrate-bulk-email-settings.js +0 -65
  595. package/core/server/data/migrations/versions/3.23/02-remove-bulk-email-settings.js +0 -48
  596. package/core/server/data/migrations/versions/3.23/03-update-portal-button-setting.js +0 -24
  597. package/core/server/data/migrations/versions/3.23/04-add-meta-columns-to-tags-table.js +0 -54
  598. package/core/server/data/migrations/versions/3.24/01-populate-group-for-new-portal-settings.js +0 -38
  599. package/core/server/data/migrations/versions/3.25/01-add-members-stripe-webhook-settings.js +0 -22
  600. package/core/server/data/migrations/versions/3.26/01-add-amp-gtag-id-setting.js +0 -20
  601. package/core/server/data/migrations/versions/3.29/01-remove-duplicate-subscriptions.js +0 -53
  602. package/core/server/data/migrations/versions/3.29/02-remove-duplicate-customers.js +0 -53
  603. package/core/server/data/migrations/versions/3.29/03-remove-orphaned-customers.js +0 -35
  604. package/core/server/data/migrations/versions/3.29/04-remove-orphaned-subscriptions.js +0 -35
  605. package/core/server/data/migrations/versions/3.29/05-add-member-constraints.js +0 -177
  606. package/core/server/data/migrations/versions/3.30/01-add-member-signin-url-permission-roles.js +0 -8
  607. package/core/server/data/migrations/versions/3.32/01-add-member-support-address-setting.js +0 -27
  608. package/core/server/data/migrations/versions/3.32/02-add-member-reply-address-setting.js +0 -20
  609. package/core/server/data/migrations/versions/3.32/03-add-routes-hash-setting.js +0 -20
  610. package/core/server/data/migrations/versions/3.33/01-add-email-recipients-tables.js +0 -8
  611. package/core/server/data/migrations/versions/3.34/01-add-tokens-table.js +0 -2
  612. package/core/server/data/migrations/versions/3.35/01-add-address-columns-to-emails-table.js +0 -14
  613. package/core/server/data/migrations/versions/3.36/01-add-snippets-table.js +0 -2
  614. package/core/server/data/migrations/versions/3.36/02-add-snippets-permissions.js +0 -56
  615. package/core/server/data/migrations/versions/3.37/01-update-portal-button-setting.js +0 -30
  616. package/core/server/data/migrations/versions/3.38/01-add-email-recipient-filter-column.js +0 -8
  617. package/core/server/data/migrations/versions/3.38/02-populate-email-recipient-filter-column.js +0 -34
  618. package/core/server/data/migrations/versions/3.38/03-add-recipient-filter-column.js +0 -8
  619. package/core/server/data/migrations/versions/3.38/04-populate-recipient-filter-column.js +0 -49
  620. package/core/server/data/migrations/versions/3.38/05-add-emails-track-opens-column.js +0 -7
  621. package/core/server/data/migrations/versions/3.38/06-add-newsletter-settings.js +0 -16
  622. package/core/server/data/migrations/versions/3.38/07-migrate-newsletter-settings-from-config.js +0 -48
  623. package/core/server/data/migrations/versions/3.38/08-repopulate-send-email-when-published-down-migration.js +0 -25
  624. package/core/server/data/migrations/versions/3.38/09-remove-send-email-when-published-column.js +0 -7
  625. package/core/server/data/migrations/versions/3.39/01-add-members-signup-redirect-settings.js +0 -16
  626. package/core/server/data/migrations/versions/3.39/02-add-user-id-to-api-keys-table.js +0 -7
  627. package/core/server/data/migrations/versions/3.39/03-add-email-track-opens-setting.js +0 -16
  628. package/core/server/data/migrations/versions/3.39/04-add-cancellation-reason-column.js +0 -7
  629. package/core/server/data/migrations/versions/3.39/05-remove-unused-columns-on-emails.js +0 -14
  630. package/core/server/data/migrations/versions/3.39/06-add-email-recipient-index.js +0 -58
  631. package/core/server/data/migrations/versions/3.39/07-add-email-recipients-event-timestamps.js +0 -19
  632. package/core/server/data/migrations/versions/3.39/08-add-email-stats-columns.js +0 -22
  633. package/core/server/data/migrations/versions/3.40/01-add-members-email-open-rate-column.js +0 -8
  634. package/core/server/data/migrations/versions/3.40/02-add members-email-aggregation-columns.js +0 -16
  635. package/core/server/data/migrations/versions/3.40/03-populate-members-email-counts.js +0 -15
  636. package/core/server/data/migrations/versions/3.41/01-add-firstpromoter-settings.js +0 -16
  637. package/core/server/data/migrations/versions/3.6/1-add-labels-table.js +0 -2
  638. package/core/server/data/migrations/versions/3.6/2-add-members-labels-table.js +0 -2
  639. package/core/server/data/migrations/versions/3.6/3-add-labels-permissions.js +0 -47
  640. package/core/server/data/migrations/versions/3.7/01-fix-incorrect-member-labels-foreign-keys.js +0 -46
  641. package/core/server/data/migrations/versions/3.8/01-add-geolocation-to-members.js +0 -7
  642. package/core/server/data/migrations/versions/3.9/01-add-member-sigin-url-permissions.js +0 -7
  643. package/core/server/services/mail/utils.js +0 -34
  644. package/core/server/services/url/configs/canary.js +0 -143
  645. package/core/server/services/url/configs/v3.js +0 -141
  646. package/core/server/services/url/configs/v4.js +0 -143
  647. package/core/server/web/api/v2/admin/app.js +0 -43
  648. package/core/server/web/api/v2/admin/middleware.js +0 -85
  649. package/core/server/web/api/v2/admin/routes.js +0 -200
  650. package/core/server/web/api/v2/content/app.js +0 -38
  651. package/core/server/web/api/v2/content/middleware.js +0 -23
  652. package/core/server/web/api/v2/content/routes.js +0 -37
  653. package/core/server/web/api/v3/admin/app.js +0 -43
  654. package/core/server/web/api/v3/admin/middleware.js +0 -89
  655. package/core/server/web/api/v3/admin/routes.js +0 -267
  656. package/core/server/web/api/v3/content/app.js +0 -38
  657. package/core/server/web/api/v3/content/middleware.js +0 -23
  658. package/core/server/web/api/v3/content/routes.js +0 -37
  659. package/core/server/web/oauth/app.js +0 -153
  660. package/core/server/web/oauth/index.js +0 -1
@@ -51,7 +51,7 @@ module.exports = {
51
51
  feature_image: {type: 'string', maxlength: 2000, nullable: true},
52
52
  featured: {type: 'bool', nullable: false, defaultTo: false},
53
53
  type: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'post', validations: {isIn: [['post', 'page']]}},
54
- status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'draft'},
54
+ status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'draft', validations: {isIn: [['published', 'draft', 'scheduled', 'sent']]}},
55
55
  // NOTE: unused at the moment and reserved for future features
56
56
  locale: {type: 'string', maxlength: 6, nullable: true},
57
57
  visibility: {
@@ -63,14 +63,8 @@ module.exports = {
63
63
  email_recipient_filter: {
64
64
  type: 'text',
65
65
  maxlength: 1000000000,
66
- nullable: false,
67
- defaultTo: 'none'
66
+ nullable: false
68
67
  },
69
- /**
70
- * @deprecated: single authors was superceded by multiple authors in Ghost 1.22.0
71
- * If we keep it, then only, because you can easier query post.author_id than posts_authors[*].sort_order.
72
- */
73
- author_id: {type: 'string', maxlength: 24, nullable: false},
74
68
  created_at: {type: 'dateTime', nullable: false},
75
69
  /**
76
70
  * @deprecated: https://github.com/TryGhost/Ghost/issues/10286
@@ -109,6 +103,7 @@ module.exports = {
109
103
  feature_image_caption: {type: 'text', maxlength: 65535, nullable: true},
110
104
  email_only: {type: 'bool', nullable: false, defaultTo: false}
111
105
  },
106
+ // NOTE: this is the staff table
112
107
  users: {
113
108
  id: {type: 'string', maxlength: 24, nullable: false, primary: true},
114
109
  name: {type: 'string', maxlength: 191, nullable: false},
@@ -123,10 +118,23 @@ module.exports = {
123
118
  facebook: {type: 'string', maxlength: 2000, nullable: true},
124
119
  twitter: {type: 'string', maxlength: 2000, nullable: true},
125
120
  accessibility: {type: 'text', maxlength: 65535, nullable: true},
126
- // TODO: would be good to add validation here to control for all possible status values.
127
- // The ones that come up by reviewing the user model are:
128
- // 'active', 'inactive', 'locked', 'warn-1', 'warn-2', 'warn-3', 'warn-4'
129
- status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'active'},
121
+ status: {
122
+ type: 'string',
123
+ maxlength: 50,
124
+ nullable: false,
125
+ defaultTo: 'active',
126
+ validations: {
127
+ isIn: [[
128
+ 'active',
129
+ 'inactive',
130
+ 'locked',
131
+ 'warn-1',
132
+ 'warn-2',
133
+ 'warn-3',
134
+ 'warn-4'
135
+ ]]
136
+ }
137
+ },
130
138
  // NOTE: unused at the moment and reserved for future features
131
139
  locale: {type: 'string', maxlength: 6, nullable: true},
132
140
  visibility: {
@@ -145,16 +153,6 @@ module.exports = {
145
153
  updated_at: {type: 'dateTime', nullable: true},
146
154
  updated_by: {type: 'string', maxlength: 24, nullable: true}
147
155
  },
148
- oauth: {
149
- id: {type: 'string', maxlength: 24, nullable: false, primary: true},
150
- provider: {type: 'string', maxlength: 50, nullable: false},
151
- provider_id: {type: 'string', maxlength: 191, nullable: false},
152
- access_token: {type: 'text', maxlength: 65535, nullable: true},
153
- refresh_token: {type: 'text', maxlength: 2000, nullable: true},
154
- created_at: {type: 'dateTime', nullable: false},
155
- updated_at: {type: 'dateTime', nullable: true},
156
- user_id: {type: 'string', maxlength: 24, nullable: false, references: 'users.id'}
157
- },
158
156
  posts_authors: {
159
157
  id: {type: 'string', maxlength: 24, nullable: false, primary: true},
160
158
  post_id: {type: 'string', maxlength: 24, nullable: false, references: 'posts.id'},
@@ -337,13 +335,12 @@ module.exports = {
337
335
  target_url: {type: 'string', maxlength: 2000, nullable: false},
338
336
  name: {type: 'string', maxlength: 191, nullable: true},
339
337
  secret: {type: 'string', maxlength: 191, nullable: true},
340
- // NOTE: the defaultTo does not make sense to set on DB layer as it leads to unnecessary maintenance every major release
341
- // it might make sense to introduce "isIn" validation checking if it's a valid version e.g: 'v3', 'v4', 'canary'
338
+ // @NOTE: the defaultTo does not make sense to set on DB layer as it leads to unnecessary maintenance every major release
339
+ // would be ideal if we can remove the default and instead have "isIn" validation checking if it's a valid version e.g: 'v3', 'v4', 'canary'
342
340
  api_version: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'v2'},
343
341
  // NOTE: integration_id column needs "nullable: true" -> "nullable: false" migration (recreate table with nullable: false)
344
342
  // CASE: Ghost instances initialized pre 4.0 will have this column set to nullable: true in db schema
345
343
  integration_id: {type: 'string', maxlength: 24, nullable: false, references: 'integrations.id', cascadeDelete: true},
346
- status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'available'},
347
344
  last_triggered_at: {type: 'dateTime', nullable: true},
348
345
  last_triggered_status: {type: 'string', maxlength: 50, nullable: true},
349
346
  last_triggered_error: {type: 'string', maxlength: 50, nullable: true},
@@ -397,7 +394,6 @@ module.exports = {
397
394
  name: {type: 'string', maxlength: 191, nullable: true},
398
395
  note: {type: 'string', maxlength: 2000, nullable: true},
399
396
  geolocation: {type: 'string', maxlength: 2000, nullable: true},
400
- subscribed: {type: 'bool', nullable: true, defaultTo: true},
401
397
  email_count: {type: 'integer', unsigned: true, nullable: false, defaultTo: 0},
402
398
  email_opened_count: {type: 'integer', unsigned: true, nullable: false, defaultTo: 0},
403
399
  email_open_rate: {type: 'integer', unsigned: true, nullable: true, index: true},
@@ -407,10 +403,12 @@ module.exports = {
407
403
  updated_at: {type: 'dateTime', nullable: true},
408
404
  updated_by: {type: 'string', maxlength: 24, nullable: true}
409
405
  },
406
+ // NOTE: this is the tiers table
410
407
  products: {
411
408
  id: {type: 'string', maxlength: 24, nullable: false, primary: true},
412
409
  name: {type: 'string', maxlength: 191, nullable: false},
413
410
  slug: {type: 'string', maxlength: 191, nullable: false, unique: true},
411
+ // @deprecated: use a status enum with isIn validation, not aan ctive boolean
414
412
  active: {type: 'boolean', nullable: false, defaultTo: true},
415
413
  welcome_page_url: {type: 'string', maxlength: 2000, nullable: true},
416
414
  visibility: {
@@ -429,6 +427,7 @@ module.exports = {
429
427
  },
430
428
  offers: {
431
429
  id: {type: 'string', maxlength: 24, nullable: false, primary: true},
430
+ // @deprecated: use a status enum with isIn validation, not aan ctive boolean
432
431
  active: {type: 'boolean', nullable: false, defaultTo: true},
433
432
  name: {type: 'string', maxlength: 191, nullable: false, unique: true},
434
433
  code: {type: 'string', maxlength: 191, nullable: false, unique: true},
@@ -651,8 +650,7 @@ module.exports = {
651
650
  recipient_filter: {
652
651
  type: 'text',
653
652
  maxlength: 1000000000,
654
- nullable: false,
655
- defaultTo: 'status:-free'
653
+ nullable: false
656
654
  },
657
655
  error: {type: 'string', maxlength: 2000, nullable: true},
658
656
  error_data: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true},
@@ -720,16 +718,6 @@ module.exports = {
720
718
  updated_at: {type: 'dateTime', nullable: true},
721
719
  updated_by: {type: 'string', maxlength: 24, nullable: true}
722
720
  },
723
- temp_member_analytic_events: {
724
- id: {type: 'string', maxlength: 24, nullable: false, primary: true},
725
- event_name: {type: 'string', maxlength: 50, nullable: false},
726
- created_at: {type: 'dateTime', nullable: false},
727
- member_id: {type: 'string', maxlength: 24, nullable: false},
728
- member_status: {type: 'string', maxlength: 50, nullable: false},
729
- entry_id: {type: 'string', maxlength: 24, nullable: true},
730
- source_url: {type: 'string', maxlength: 2000, nullable: true},
731
- metadata: {type: 'string', maxlength: 191, nullable: true}
732
- },
733
721
  custom_theme_settings: {
734
722
  id: {type: 'string', maxlength: 24, nullable: false, primary: true},
735
723
  theme: {type: 'string', maxlength: 191, nullable: false},
@@ -45,6 +45,8 @@ function validateSchema(tableName, model, options) {
45
45
  // check nullable
46
46
  if (Object.prototype.hasOwnProperty.call(schema[tableName][columnKey], 'nullable') &&
47
47
  schema[tableName][columnKey].nullable !== true &&
48
+ Object.prototype.hasOwnProperty.call(schema[tableName][columnKey], 'type') &&
49
+ schema[tableName][columnKey].type !== 'text' &&
48
50
  !Object.prototype.hasOwnProperty.call(schema[tableName][columnKey], 'defaultTo')
49
51
  ) {
50
52
  if (validator.isEmpty(strVal)) {
@@ -1,12 +1,6 @@
1
1
  // # Ghost Server
2
2
  // Handles the creation of an HTTP Server for Ghost
3
3
  const debug = require('@tryghost/debug')('server');
4
-
5
- const Promise = require('bluebird');
6
- const fs = require('fs-extra');
7
- const path = require('path');
8
- const _ = require('lodash');
9
- const config = require('../shared/config');
10
4
  const errors = require('@tryghost/errors');
11
5
  const tpl = require('@tryghost/tpl');
12
6
  const logging = require('@tryghost/logging');
@@ -42,14 +36,25 @@ const messages = {
42
36
  * ## GhostServer
43
37
  */
44
38
  class GhostServer {
45
- constructor({url}) {
39
+ /**
40
+ *
41
+ * @param {Object} options
42
+ * @param {String} options.url
43
+ * @param {String} options.env development|production|testing
44
+ * @param {Object} options.serverConfig
45
+ * @param {String} options.serverConfig.host
46
+ * @param {Number} options.serverConfig.port
47
+ * @param {Number} options.serverConfig.shutdownTimeout
48
+ * @param {Boolean} options.serverConfig.testmode
49
+ */
50
+ constructor({url, env, serverConfig}) {
46
51
  this.url = url;
52
+ this.env = env;
53
+ this.serverConfig = serverConfig;
54
+
47
55
  this.rootApp = null;
48
56
  this.httpServer = null;
49
57
 
50
- // Expose config module for use externally.
51
- this.config = config;
52
-
53
58
  // Tasks that should be run before the server exits
54
59
  this.cleanupTasks = [];
55
60
  }
@@ -66,42 +71,16 @@ class GhostServer {
66
71
  */
67
72
  start(rootApp) {
68
73
  debug('Starting...');
69
- const self = this;
70
- self.rootApp = rootApp;
71
- let socketConfig;
74
+ this.rootApp = rootApp;
72
75
 
73
- const socketValues = {
74
- path: path.join(config.get('paths').contentPath, config.get('env') + '.socket'),
75
- permissions: '660'
76
- };
76
+ const {host, port, testmode, shutdownTimeout} = this.serverConfig;
77
+ const self = this;
77
78
 
78
79
  return new Promise(function (resolve, reject) {
79
- if (_.has(config.get('server'), 'socket')) {
80
- socketConfig = config.get('server').socket;
81
-
82
- if (_.isString(socketConfig)) {
83
- socketValues.path = socketConfig;
84
- } else if (_.isObject(socketConfig)) {
85
- socketValues.path = socketConfig.path || socketValues.path;
86
- socketValues.permissions = socketConfig.permissions || socketValues.permissions;
87
- }
88
-
89
- // Make sure the socket is gone before trying to create another
90
- try {
91
- fs.unlinkSync(socketValues.path);
92
- } catch (e) {
93
- // We can ignore this.
94
- }
95
-
96
- self.httpServer = rootApp.listen(socketValues.path);
97
- fs.chmod(socketValues.path, socketValues.permissions);
98
- config.set('server:socket', socketValues);
99
- } else {
100
- self.httpServer = rootApp.listen(
101
- config.get('server').port,
102
- config.get('server').host
103
- );
104
- }
80
+ self.httpServer = rootApp.listen(
81
+ port,
82
+ host
83
+ );
105
84
 
106
85
  self.httpServer.on('error', function (error) {
107
86
  let ghostError;
@@ -109,7 +88,7 @@ class GhostServer {
109
88
  if (error.code === 'EADDRINUSE') {
110
89
  ghostError = new errors.InternalServerError({
111
90
  message: tpl(messages.addressInUse.error),
112
- context: tpl(messages.addressInUse.context, {port: config.get('server').port}),
91
+ context: tpl(messages.addressInUse.context, {port}),
113
92
  help: tpl(messages.addressInUse.help)
114
93
  });
115
94
  } else {
@@ -132,7 +111,7 @@ class GhostServer {
132
111
  self._logStartMessages();
133
112
 
134
113
  // Debug logs output in testmode only
135
- if (config.get('server:testmode')) {
114
+ if (testmode) {
136
115
  self._startTestMode();
137
116
  }
138
117
 
@@ -143,7 +122,7 @@ class GhostServer {
143
122
  });
144
123
  });
145
124
 
146
- stoppable(self.httpServer, config.get('server:shutdownTimeout'));
125
+ stoppable(self.httpServer, shutdownTimeout);
147
126
 
148
127
  // ensure that Ghost exits correctly on Ctrl+C and SIGTERM
149
128
  process
@@ -177,7 +156,7 @@ class GhostServer {
177
156
  * Stops the server & handles cleanup, but does not exit the process
178
157
  * Used in tests for quick start/stop actions
179
158
  * Called by shutdown to handle server stop and cleanup before exiting
180
- * @returns {Promise} Resolves once Ghost has stopped
159
+ * @returns {Promise<any>} Resolves once Ghost has stopped
181
160
  */
182
161
  async stop() {
183
162
  try {
@@ -221,22 +200,13 @@ class GhostServer {
221
200
  * If server.shutdownTimeout is reached, requests are terminated in-flight
222
201
  */
223
202
  async _stopServer() {
224
- return new Promise((resolve, reject) => {
225
- this.httpServer
226
- .stop((error, status) => {
227
- if (error) {
228
- return reject(error);
229
- }
230
-
231
- return resolve(status);
232
- });
233
- });
203
+ const util = require('util');
204
+ return util.promisify(this.httpServer.stop)();
234
205
  }
235
206
 
236
207
  async _cleanup() {
237
208
  // Wait for all cleanup tasks to finish
238
- await Promise
239
- .all(this.cleanupTasks.map(task => task()));
209
+ return Promise.all(this.cleanupTasks.map(task => task()));
240
210
  }
241
211
 
242
212
  /**
@@ -281,14 +251,14 @@ class GhostServer {
281
251
  * Log Start Messages
282
252
  */
283
253
  _logStartMessages() {
284
- logging.info(tpl(messages.ghostIsRunningIn, {env: config.get('env')}));
254
+ logging.info(tpl(messages.ghostIsRunningIn, {env: this.env}));
285
255
 
286
- if (config.get('env') === 'production') {
256
+ if (this.env === 'production') {
287
257
  logging.info(tpl(messages.yourBlogIsAvailableOn, {url: this.url}));
288
258
  } else {
289
259
  logging.info(tpl(messages.listeningOn, {
290
- host: config.get('server').socket || config.get('server').host,
291
- port: config.get('server').port
260
+ host: this.serverConfig.host,
261
+ port: this.serverConfig.port
292
262
  }));
293
263
  logging.info(tpl(messages.urlConfiguredAs, {url: this.url}));
294
264
  }
@@ -303,7 +273,7 @@ class GhostServer {
303
273
  logging.warn(tpl(messages.ghostHasShutdown));
304
274
 
305
275
  // Extra clear message for production mode
306
- if (config.get('env') === 'production') {
276
+ if (this.env === 'production') {
307
277
  logging.warn(tpl(messages.yourBlogIsNowOffline));
308
278
  }
309
279
 
@@ -1,5 +1,6 @@
1
1
  const Promise = require('bluebird');
2
2
  const crypto = require('crypto');
3
+ const tpl = require('@tryghost/tpl');
3
4
 
4
5
  class Gravatar {
5
6
  constructor({config, request}) {
@@ -7,21 +8,36 @@ class Gravatar {
7
8
  this.request = request;
8
9
  }
9
10
 
11
+ url(email, options) {
12
+ if (options.default) {
13
+ // tpl errors on token `{default}` so we use `{_default}` instead
14
+ // but still allow the option to be passed as `default`
15
+ options._default = options.default;
16
+ }
17
+ const defaultOptions = {
18
+ size: 250,
19
+ _default: 'blank',
20
+ rating: 'g'
21
+ };
22
+ const emailHash = crypto.createHash('md5').update(email.toLowerCase().trim()).digest('hex');
23
+ const gravatarUrl = this.config.get('gravatar').url;
24
+ return tpl(gravatarUrl, Object.assign(defaultOptions, options, {hash: emailHash}));
25
+ }
26
+
10
27
  lookup(userData, timeout) {
11
- let gravatarUrl = '//www.gravatar.com/avatar/' +
12
- crypto.createHash('md5').update(userData.email.toLowerCase().trim()).digest('hex') +
13
- '?s=250';
14
-
15
28
  if (this.config.isPrivacyDisabled('useGravatar')) {
16
29
  return Promise.resolve();
17
30
  }
18
-
19
- return Promise.resolve(this.request('https:' + gravatarUrl + '&d=404&r=x', {timeout: timeout || 2 * 1000}))
31
+
32
+ // test existence using a default 404, but return a different default
33
+ // so we still have a fallback if the image gets removed from Gravatar
34
+ const testUrl = this.url(userData.email, {default: 404, rating: 'x'});
35
+ const imageUrl = this.url(userData.email, {default: 'mp', rating: 'x'});
36
+
37
+ return Promise.resolve(this.request(testUrl, {timeout: timeout || 2 * 1000}))
20
38
  .then(function () {
21
- gravatarUrl += '&d=mm&r=x';
22
-
23
39
  return {
24
- image: gravatarUrl
40
+ image: imageUrl
25
41
  };
26
42
  })
27
43
  .catch({statusCode: 404}, function () {
@@ -1,36 +1,13 @@
1
1
  const omit = require('lodash/omit');
2
- const crypto = require('crypto');
2
+ const security = require('@tryghost/security');
3
3
  const ghostBookshelf = require('./base');
4
4
  const {Role} = require('./role');
5
5
 
6
- /*
7
- * Uses birthday problem estimation to calculate chance of collision
8
- * d = 16^26 // 26 char hex string
9
- * n = 10,000,000 // 10 million
10
- *
11
- * (-n x (n-1)) / 2d
12
- * 1 - e^
13
- *
14
- *
15
- * 17
16
- * ~= 4 x 10^
17
- *
18
- * ref: https://medium.freecodecamp.org/how-long-should-i-make-my-api-key-833ebf2dc26f
19
- * ref: https://en.wikipedia.org/wiki/Birthday_problem#Approximations
20
- *
21
- * 26 char hex string = 13 bytes
22
- * 64 char hex string JWT secret = 32 bytes
23
- */
24
- const createSecret = (type) => {
25
- const bytes = type === 'content' ? 13 : 32;
26
- return crypto.randomBytes(bytes).toString('hex');
27
- };
28
-
29
6
  const ApiKey = ghostBookshelf.Model.extend({
30
7
  tableName: 'api_keys',
31
8
 
32
9
  defaults() {
33
- const secret = createSecret(this.get('type'));
10
+ const secret = security.secret.create(this.get('type'));
34
11
 
35
12
  return {
36
13
  secret
@@ -97,7 +74,7 @@ const ApiKey = ghostBookshelf.Model.extend({
97
74
  }
98
75
  }, {
99
76
  refreshSecret(data, options) {
100
- const secret = createSecret(data.type);
77
+ const secret = security.secret.create(data.type);
101
78
  return this.edit(Object.assign({}, data, {secret}), options);
102
79
  }
103
80
  });
@@ -52,9 +52,9 @@ async function editMultiple(knex, table, chunk, options) {
52
52
  await knex(table).whereIn('id', chunk).update(options.data);
53
53
  }
54
54
 
55
- async function delSingle(knex, table, id) {
55
+ async function delSingle(knex, table, id, options) {
56
56
  try {
57
- await knex(table).where('id', id).del();
57
+ await knex(table).where(options.column ?? 'id', id).del();
58
58
  } catch (err) {
59
59
  const importError = new errors.DataImportError({
60
60
  message: `Failed to remove entry from ${table}`,
@@ -66,8 +66,8 @@ async function delSingle(knex, table, id) {
66
66
  }
67
67
  }
68
68
 
69
- async function delMultiple(knex, table, chunk) {
70
- await knex(table).whereIn('id', chunk).del();
69
+ async function delMultiple(knex, table, chunk, options) {
70
+ await knex(table).whereIn(options.column ?? 'id', chunk).del();
71
71
  }
72
72
 
73
73
  const insert = createBulkOperation(insertSingle, insertMultiple);
@@ -91,10 +91,18 @@ module.exports = function (Bookshelf) {
91
91
  return edit(Bookshelf.knex, tableName, data, options);
92
92
  },
93
93
 
94
- bulkDestroy: function bulkDestroy(data, tableName) {
94
+ /**
95
+ *
96
+ * @param {string[]} data List of ids to delete
97
+ * @param {*} tableName
98
+ * @param {Object} [options]
99
+ * @param {string} [options.column] Delete the rows where this column equals the ids in `data` (defaults to 'id')
100
+ * @returns
101
+ */
102
+ bulkDestroy: function bulkDestroy(data, tableName, options = {}) {
95
103
  tableName = tableName || this.prototype.tableName;
96
104
 
97
- return del(Bookshelf.knex, tableName, data);
105
+ return del(Bookshelf.knex, tableName, data, options);
98
106
  }
99
107
  });
100
108
  };
@@ -1,3 +1,4 @@
1
+ const _ = require('lodash');
1
2
  const limitService = require('../services/limits');
2
3
  const ghostBookshelf = require('./base');
3
4
  const {NoPermissionError} = require('@tryghost/errors');
@@ -64,6 +65,14 @@ const Integration = ghostBookshelf.Model.extend({
64
65
  return options;
65
66
  },
66
67
 
68
+ defaultRelations: function defaultRelations(methodName, options) {
69
+ if (['edit', 'add', 'destroy'].indexOf(methodName) !== -1) {
70
+ options.withRelated = _.union(['api_keys'], options.withRelated || []);
71
+ }
72
+
73
+ return options;
74
+ },
75
+
67
76
  async permissible(integrationModel, action, context, attrs, loadedPerms, hasUserPermission, hasApiKeyPermission) {
68
77
  const isAdd = (action === 'add');
69
78
 
@@ -76,6 +85,14 @@ const Integration = ghostBookshelf.Model.extend({
76
85
  if (!hasUserPermission || !hasApiKeyPermission) {
77
86
  throw new NoPermissionError();
78
87
  }
88
+ },
89
+
90
+ async getInternalFrontendKey(options) {
91
+ options = options || {};
92
+
93
+ options.withRelated = ['api_keys'];
94
+
95
+ return this.findOne({slug: 'ghost-internal-frontend'}, options);
79
96
  }
80
97
  });
81
98
 
@@ -2,7 +2,7 @@ const ghostBookshelf = require('./base');
2
2
  const uuid = require('uuid');
3
3
  const _ = require('lodash');
4
4
  const config = require('../../shared/config');
5
- const crypto = require('crypto');
5
+ const {gravatar} = require('../lib/image');
6
6
 
7
7
  const Member = ghostBookshelf.Model.extend({
8
8
  tableName: 'members',
@@ -10,7 +10,6 @@ const Member = ghostBookshelf.Model.extend({
10
10
  defaults() {
11
11
  return {
12
12
  status: 'free',
13
- subscribed: true,
14
13
  uuid: uuid.v4(),
15
14
  email_count: 0,
16
15
  email_opened_count: 0
@@ -30,6 +29,12 @@ const Member = ghostBookshelf.Model.extend({
30
29
  }, {
31
30
  key: 'products',
32
31
  replacement: 'products.slug'
32
+ }, {
33
+ key: 'tier',
34
+ replacement: 'products.slug'
35
+ }, {
36
+ key: 'tiers',
37
+ replacement: 'products.slug'
33
38
  }, {
34
39
  key: 'newsletters',
35
40
  replacement: 'newsletters.slug'
@@ -311,8 +316,7 @@ const Member = ghostBookshelf.Model.extend({
311
316
  // Will not use gravatar if privacy.useGravatar is false in config
312
317
  attrs.avatar_image = null;
313
318
  if (attrs.email && !config.isPrivacyDisabled('useGravatar')) {
314
- const emailHash = crypto.createHash('md5').update(attrs.email.toLowerCase().trim()).digest('hex');
315
- attrs.avatar_image = `https://gravatar.com/avatar/${emailHash}?s=250&d=blank`;
319
+ attrs.avatar_image = gravatar.url(attrs.email, {size: 250, default: 'blank'});
316
320
  }
317
321
 
318
322
  return attrs;
@@ -38,6 +38,11 @@ const Newsletter = ghostBookshelf.Model.extend({
38
38
  return this.hasMany('Post');
39
39
  },
40
40
 
41
+ // Force active newsletters for content API
42
+ enforcedFilters: function enforcedFilters(options) {
43
+ return (options.context && options.context.public) ? 'status:active' : null;
44
+ },
45
+
41
46
  async onSaving(model, _attr, options) {
42
47
  ghostBookshelf.Model.prototype.onSaving.apply(this, arguments);
43
48
 
@@ -99,6 +104,28 @@ const Newsletter = ghostBookshelf.Model.extend({
99
104
  return attrs;
100
105
  }
101
106
  }, {
107
+ /**
108
+ * Returns an array of keys permitted in a method's `options` hash, depending on the current method.
109
+ * @param {String} methodName The name of the method to check valid options for.
110
+ * @return {Array} Keys allowed in the `options` hash of the model's method.
111
+ */
112
+ permittedOptions: function permittedOptions(methodName) {
113
+ let options = ghostBookshelf.Model.permittedOptions.call(this, methodName);
114
+
115
+ // allowlists for the `options` hash argument on methods, by method name.
116
+ // these are the only options that can be passed to Bookshelf / Knex.
117
+ const validOptions = {
118
+ findOne: ['filter'],
119
+ findAll: ['filter']
120
+ };
121
+
122
+ if (validOptions[methodName]) {
123
+ options = options.concat(validOptions[methodName]);
124
+ }
125
+
126
+ return options;
127
+ },
128
+
102
129
  orderDefaultRaw: function () {
103
130
  return 'sort_order ASC, created_at ASC, id ASC';
104
131
  },