Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ghost/core/core/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const sentry = require('./shared/sentry');
const express = require('./shared/express');
const config = require('./shared/config');
const logging = require('@tryghost/logging');
const urlService = require('./server/services/url');
const urlService = require('./server/services/url').service;
const fs = require('fs');
const path = require('path');
/** @import {Application as ExpressApplication, Request, RequestHandler} from 'express' */
Expand Down
102 changes: 70 additions & 32 deletions ghost/core/core/boot.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,13 @@ function notifyServerReady(error) {
* @param {object} options.config
*/
async function initDatabase({config}) {
// Migrations create fixtures through models which can use configured adapters.
// Initialize this dependency explicitly before the migration runner starts.
debug('Begin: adapters');
const adapterManager = require('./server/services/adapter-manager');
adapterManager.init();
debug('End: adapters');

const DatabaseStateManager = require('./server/data/db/database-state-manager');
const dbStateManager = new DatabaseStateManager({knexMigratorFilePath: config.get('paths:appRoot')});
await dbStateManager.makeReady();
Expand All @@ -92,12 +99,20 @@ async function initDatabase({config}) {
async function initCore({ghostServer, config}) {
debug('Begin: initCore');

// Validate configured adapters up-front so misconfiguration fails at boot
// rather than on first lazy use (e.g. first image upload or scheduled job)
debug('Begin: adapters');
const adapterManager = require('./server/services/adapter-manager').default;
adapterManager.init();
debug('End: adapters');
debug('Begin: URL Service');
const urlService = require('./server/services/url');
urlService.init();
debug('End: URL Service');

debug('Begin: Internal Keys');
const internalKeys = require('./server/services/internal-keys');
internalKeys.init();
debug('End: Internal Keys');

debug('Begin: OEmbed Service');
const oembed = require('./server/services/oembed');
oembed.init();
debug('End: OEmbed Service');

// URL Utils is a bit slow, put it here so the timing is visible separate from models
debug('Begin: Load urlUtils');
Expand All @@ -110,11 +125,16 @@ async function initCore({ghostServer, config}) {
await limits.init();
debug('End: limits');

debug('Begin: Settings Helpers');
const settingsHelpers = require('./server/services/settings-helpers');
settingsHelpers.init();
debug('End: Settings Helpers');

// Settings are a core concept we use settings to store key-value pairs used in critical pathways as well as public data like the site title
debug('Begin: settings');
const settings = require('./server/services/settings/settings-service');
const settings = require('./server/services/settings');
await settings.init();
await settings.syncEmailSettings(config.get('hostSettings:emailVerification:verified'));
await settings.service.syncEmailSettings(config.get('hostSettings:emailVerification:verified'));
debug('End: settings');

debug('Begin: i18n');
Expand All @@ -134,10 +154,24 @@ async function initCore({ghostServer, config}) {
memberCustomFieldsService.init();
debug('End: Member Custom Fields Service');

// Endpoint definitions read these cache handles while Express is assembled,
// before the main service-init phase runs.
debug('Begin: API Cache Services');
const postsPublic = require('./server/services/posts-public');
const tagsPublic = require('./server/services/tags-public');
const stats = require('./server/services/stats');
await Promise.all([postsPublic.init(), tagsPublic.init(), stats.init()]);
debug('End: API Cache Services');

const jobServiceRoot = require('./server/services/jobs');
const mentionsJobServiceRoot = require('./server/services/mentions-jobs');
jobServiceRoot.init();
mentionsJobServiceRoot.init();

if (ghostServer) {
// Job Service allows parts of Ghost to run in the background
debug('Begin: Job Service');
const jobService = require('./server/services/jobs');
const jobService = jobServiceRoot.service;

if (config.get('server:testmode')) {
jobService.initTestMode();
Expand All @@ -150,7 +184,7 @@ async function initCore({ghostServer, config}) {

// Mentions Job Service allows mentions to be processed in the background
debug('Begin: Mentions Job Service');
const mentionsJobService = require('./server/services/mentions-jobs');
const mentionsJobService = mentionsJobServiceRoot.service;

if (config.get('server:testmode')) {
mentionsJobService.initTestMode();
Expand Down Expand Up @@ -244,7 +278,7 @@ async function initExpressApps({frontend, backend, config}) {

if (frontend) {
// SITE + MEMBERS
const urlService = require('./server/services/url');
const urlService = require('./server/services/url').service;
const frontendApp = require('./server/web/parent/frontend')({urlService});
parentApp.use(vhost(config.getFrontendMountPath(), frontendApp));
}
Expand Down Expand Up @@ -281,7 +315,7 @@ async function initDynamicRouting({frontend}) {
debug('Begin: Dynamic Routing');
const routing = require('./frontend/services/routing');
const routeSettingsModule = require('./server/services/route-settings');
const urlService = require('./server/services/url');
const urlService = require('./server/services/url').service;
const bridge = require('./bridge');
bridge.init();

Expand Down Expand Up @@ -331,7 +365,7 @@ async function initServices({ghostServer, config, prometheusClient}) {
const indexnow = require('./server/services/indexnow-ping');
const slack = require('./server/services/slack-ping');
const webhooks = require('./server/services/webhooks');
const postScheduling = require('./server/services/post-scheduling').default;
const postScheduling = require('./server/services/post-scheduling');
const comments = require('./server/services/comments');
const staffService = require('./server/services/staff');
const memberAttribution = require('./server/services/member-attribution');
Expand All @@ -342,48 +376,51 @@ async function initServices({ghostServer, config, prometheusClient}) {
const emailService = require('./server/services/email-service');
const emailAnalytics = require('./server/services/email-analytics');
const mentionsService = require('./server/services/mentions');
const tagsPublic = require('./server/services/tags-public');
const postsPublic = require('./server/services/posts-public');
const postsService = require('./server/services/posts');
const slackNotifications = require('./server/services/slack-notifications');
const mediaInliner = require('./server/services/media-inliner');
const announcementBarService = require('./server/services/announcement-bar-service');
const giftService = require('./server/services/gifts');
const machinePaymentsService = require('./server/services/machine-payments');
const recommendationsService = require('./server/services/recommendations');
const notifications = require('./server/services/notifications');
const memberWelcomeEmailService = require('./server/services/member-welcome-emails');
const invites = require('./server/services/invites');
const emailAddressService = require('./server/services/email-address');
const statsService = require('./server/services/stats');
const tinybird = require('./server/services/tinybird');
const explorePingService = require('./server/services/explore-ping');
const domainEvents = require('@tryghost/domain-events');
const automations = require('./server/services/automations');
const automationsApi = require('./server/services/automations/automations-api');
const adapterManager = require('./server/services/adapter-manager').default;
const {service: adapterManager} = require('./server/services/adapter-manager');
const {withErrorCapture} = require('./server/adapters/scheduling/error-capture');

const metrics = require('@tryghost/metrics');
const db = require('./server/data/db');
const models = require('./server/models');
const urlUtils = require('./shared/url-utils').default;
const settingsCache = require('./shared/settings-cache');
const internalKeys = require('./server/services/internal-keys').default;
const {service: internalKeys} = require('./server/services/internal-keys');

// Initialize things that other services depend on first.
emailAddressService.init();
const newsletters = require('./server/services/newsletters');
newsletters.init();
const apiUrl = urlUtils.urlFor('api', {type: 'admin'}, true);
const schedulerAdapter = withErrorCapture(adapterManager.getAdapter('scheduling'));
schedulerAdapter.run();
postScheduling.init();
await stripe.init();
memberAttribution.init();
await members.init();
await mentionsService.init();
staffService.init();
memberWelcomeEmailService.init();
invites.init();

await Promise.all([
identityTokens.init(),
memberAttribution.init(),
mentionsService.init(),
staffService.init(),
members.init(),
tiers.init(),
tagsPublic.init(),
postsPublic.init(),
membersEvents.init(),
permissions.init(),
indexnow.init(),
Expand All @@ -395,23 +432,23 @@ async function initServices({ghostServer, config, prometheusClient}) {
config,
db,
domainEvents,
emailSuppressionList,
membersRepository: members.api.members,
emailSuppressionList: emailSuppressionList.service,
membersRepository: members.service.api.members,
models,
metrics,
prometheusClient,
settingsCache
}),
webhooks.listen(),
webhooks.init(),
comments.init(),
linkTracking.init(),
emailSuppressionList.init(),
slackNotifications.init(),
mediaInliner.init(),
announcementBarService.init(),
recommendationsService.init(),
notifications.init(),
tinybird.init(),
statsService.init(),
giftService.init({
apiUrl,
schedulerAdapter,
Expand All @@ -431,7 +468,7 @@ async function initServices({ghostServer, config, prometheusClient}) {
await explorePingService.init();

if (schedulerAdapter.rescheduleOnBoot) {
await postScheduling.rescheduleAll();
await postScheduling.service.rescheduleAll();
}

debug('End: Services');
Expand All @@ -452,7 +489,7 @@ async function initBackgroundServices({config}) {

// Load all inactive themes
const themeService = require('./server/services/themes');
themeService.loadInactiveThemes();
themeService.service.loadInactiveThemes();

// we don't want to kick off background services that will interfere with tests
if (process.env.NODE_ENV.startsWith('test')) {
Expand All @@ -463,7 +500,7 @@ async function initBackgroundServices({config}) {
// Runs before activitypub.init so an activitypub failure can't disable recovery.
try {
const emailService = require('./server/services/email-service');
await emailService.service.resumeInterruptedSends();
await emailService.service.service.resumeInterruptedSends();
} catch (err) {
const logging = require('@tryghost/logging');
logging.error(err);
Expand Down Expand Up @@ -491,7 +528,8 @@ async function initBackgroundServices({config}) {
remoteFlags.init(config);

const milestonesService = require('./server/services/milestones');
milestonesService.initAndRun();
await milestonesService.init();
milestonesService.service.scheduleRun();

debug('End: initBackgroundServices');
}
Expand Down
8 changes: 4 additions & 4 deletions ghost/core/core/frontend/services/proxy.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
// This file contains everything that the helpers and frontend apps require from the core of Ghost
const settingsCache = require('../../shared/settings-cache');
const config = require('../../shared/config');
const settingsHelpers = require('../../server/services/settings-helpers');
const settingsHelpers = require('../../server/services/settings-helpers').service;
const storageUtils = require('../../server/adapters/storage/utils');
const internalKeys = require('../../server/services/internal-keys').default;
const internalKeys = require('../../server/services/internal-keys').service;
const serverEventBus = require('../../server/lib/common/events');
const errors = require('@tryghost/errors');
const logging = require('@tryghost/logging');
Expand Down Expand Up @@ -88,7 +88,7 @@ module.exports = {
// Member actions needed by the frontend's unsubscribe route. Lazy so that
// loading the proxy does not pull the members service in ahead of boot.
get members() {
return require('../../server/services/members');
return require('../../server/services/members').service;
},

// TODO: Expose less of the API to make this safe
Expand All @@ -110,6 +110,6 @@ module.exports = {
// Labs utils for enabling/disabling helpers
labs: require('../../shared/labs'),
// URGH... Yuk (unhelpful comment :D)
urlService: require('../../server/services/url'),
urlService: require('../../server/services/url').service,
urlUtils: require('../../shared/url-utils').default
};
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const _ = require('lodash');
const path = require('path');
const {NoContentError} = require('@tryghost/errors');
const imageTransform = require('@tryghost/image-transform');
const adapterManager = require('../../../server/services/adapter-manager').default;
const adapterManager = require('../../../server/services/adapter-manager').service;
const activeTheme = require('../../services/theme-engine/active');
const config = require('../../../shared/config');
const {imageSize} = require('../../../server/lib/image');
Expand Down
2 changes: 1 addition & 1 deletion ghost/core/core/frontend/web/routers/link-redirects.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const linkRedirects = require('../../../server/services/link-redirection');
const linkRedirects = require('../../../server/services/link-redirection').service;

module.exports = function handleRedirects(siteApp) {
siteApp.get(linkRedirects.service.relativeRedirectPrefix() + '*', linkRedirects.service.handleRequest);
Expand Down
10 changes: 5 additions & 5 deletions ghost/core/core/frontend/web/site.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,16 @@ const {MemberPageViewEvent} = require('../../shared/events');

// App requires
const config = require('../../shared/config');
const adapterManager = require('../../server/services/adapter-manager').default;
const adapterManager = require('../../server/services/adapter-manager').service;
const urlUtils = require('../../shared/url-utils').default;
const sitemapHandler = require('../services/sitemap/handler');
const serveFavicon = require('./routers/serve-favicon');
const servePublicFiles = require('./routers/serve-public-file');
const themeEngine = require('../services/theme-engine');
const themeMiddleware = themeEngine.middleware;
const membersService = require('../../server/services/members');
const offersService = require('../../server/services/offers');
const customRedirects = require('../../server/services/custom-redirects');
const membersService = require('../../server/services/members').service;
const offersService = require('../../server/services/offers').service;
const customRedirects = require('../../server/services/custom-redirects').service;
const linkRedirectsHandler = require('./routers/link-redirects');
const siteRoutes = require('./routes');
const shared = require('../../server/web/shared');
Expand Down Expand Up @@ -74,7 +74,7 @@ module.exports = function setupSiteApp(routerConfig) {
const {createLlmsService} = require('../services/llms/service');
const {createLlmsHandler} = require('../services/llms/handler');
const {createLlmsDiscovery} = require('./middleware/llms-discovery');
const machinePaymentsService = require('../../server/services/machine-payments');
const machinePaymentsService = require('../../server/services/machine-payments').service;

const llmsService = createLlmsService({
settingsCache,
Expand Down
2 changes: 1 addition & 1 deletion ghost/core/core/server/adapters/cache/index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const adapterManager = require('../../services/adapter-manager').default;
const adapterManager = require('../../services/adapter-manager').service;

/**
* @param {'settings'|'theme'|'urls'} [feature] - name for the "feature" to enable through adapter, e.g.: settings cache
Expand Down
2 changes: 1 addition & 1 deletion ghost/core/core/server/api/endpoints/authentication.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const apiMail = require('./index').mail;
const apiSettings = require('./index').settings;
const UsersService = require('../../services/users');
const userService = new UsersService({dbBackup, models, auth, apiMail, apiSettings});
const adapterManager = require('../../services/adapter-manager').default;
const adapterManager = require('../../services/adapter-manager').service;
const schedulerAdapter = adapterManager.getAdapter('scheduling');

async function destroyRequestSession(req) {
Expand Down
2 changes: 1 addition & 1 deletion ghost/core/core/server/api/endpoints/automated-emails.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const _ = require('lodash');
const tpl = require('@tryghost/tpl');
const errors = require('@tryghost/errors');
const models = require('../../models');
const memberWelcomeEmailService = require('../../services/member-welcome-emails/service');
const memberWelcomeEmailService = require('../../services/member-welcome-emails').service;
const emailAddressService = require('../../services/email-address');
const {DEFAULT_EMAIL_DESIGN_SETTING_SLUG} = require('../../services/member-welcome-emails/constants');
const {validateEmailSenderFields} = require('./utils/validate-email-sender-fields');
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const memberWelcomeEmailService = require('../../services/member-welcome-emails/service');
const memberWelcomeEmailService = require('../../services/member-welcome-emails').service;

/** @type {import('@tryghost/api-framework').Controller} */
const controller = {
Expand Down
2 changes: 1 addition & 1 deletion ghost/core/core/server/api/endpoints/comment-dislikes.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Endpoint for the admin API to return dislikers for a comment

const commentsService = require('../../services/comments');
const commentsService = require('../../services/comments').service;

/** @type {import('@tryghost/api-framework').Controller} */
const controller = {
Expand Down
2 changes: 1 addition & 1 deletion ghost/core/core/server/api/endpoints/comment-likes.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Endpoint for the admin API to return likers for a comment

const commentsService = require('../../services/comments');
const commentsService = require('../../services/comments').service;

/** @type {import('@tryghost/api-framework').Controller} */
const controller = {
Expand Down
2 changes: 1 addition & 1 deletion ghost/core/core/server/api/endpoints/comment-replies.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// This is a new endpoint for the admin API to return replies to a comment with pagination

const commentsService = require('../../services/comments');
const commentsService = require('../../services/comments').service;
const ALLOWED_INCLUDES = ['member', 'replies', 'replies.member', 'replies.count.likes', 'replies.count.dislikes', 'replies.liked', 'replies.disliked', 'count.replies', 'count.direct_replies', 'count.likes', 'count.dislikes', 'liked', 'disliked', 'post', 'parent', 'in_reply_to'];

/** @type {import('@tryghost/api-framework').Controller} */
Expand Down
2 changes: 1 addition & 1 deletion ghost/core/core/server/api/endpoints/comment-reports.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Endpoint for the admin API to return reporters for a comment

const commentsService = require('../../services/comments');
const commentsService = require('../../services/comments').service;

/** @type {import('@tryghost/api-framework').Controller} */
const controller = {
Expand Down
Loading
Loading