Skip to content
Draft
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
17 changes: 12 additions & 5 deletions ghost/core/core/boot.js
Original file line number Diff line number Diff line change
Expand Up @@ -322,12 +322,14 @@ async function initServices({ghostServer, config, prometheusClient}) {

debug('Begin: Services');
const identityTokens = require('./server/services/identity-tokens');
const donationService = require('./server/services/donations');
donationService.init();
const stripe = require('./server/services/stripe');
const members = require('./server/services/members');
const tiers = require('./server/services/tiers');
const permissions = require('./server/services/permissions');
const indexnow = require('./server/services/indexnow-ping').default;
const slack = require('./server/services/slack-ping').default;
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 comments = require('./server/services/comments');
Expand All @@ -342,14 +344,16 @@ async function initServices({ghostServer, config, prometheusClient}) {
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 donationService = require('./server/services/donations');
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 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');
Expand Down Expand Up @@ -404,10 +408,10 @@ async function initServices({ghostServer, config, prometheusClient}) {
emailSuppressionList.init(),
slackNotifications.init(),
mediaInliner.init(),
donationService.init(),
announcementBarService.init(),
recommendationsService.init(),
tinybird.init(),
statsService.init(),
explorePingService.init(),
giftService.init({
apiUrl,
schedulerAdapter,
Expand All @@ -423,6 +427,9 @@ async function initServices({ghostServer, config, prometheusClient}) {
})
]);

postsService.init();
await explorePingService.init();

if (schedulerAdapter.rescheduleOnBoot) {
await postScheduling.rescheduleAll();
}
Expand Down
2 changes: 1 addition & 1 deletion ghost/core/core/server/api/endpoints/announcements.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const announcementBarSettings = require('../../services/announcement-bar-service');
const announcementBarSettings = require('../../services/announcement-bar-service').service;

/** @type {import('@tryghost/api-framework').Controller} */
const controller = {
Expand Down
8 changes: 4 additions & 4 deletions ghost/core/core/server/api/endpoints/gift-links.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ const controller = {
return assertCanEditAndGift(frame);
},
query(frame: Frame) {
return service!.getPost(frame.options.id);
return service.getPost(frame.options.id);
}
},

Expand All @@ -53,7 +53,7 @@ const controller = {
return assertCanEditAndGift(frame);
},
query(frame: Frame) {
return service!.ensure(requestContextFromFrame(frame), frame.options.id);
return service.ensure(requestContextFromFrame(frame), frame.options.id);
}
},

Expand All @@ -66,7 +66,7 @@ const controller = {
return assertCanEditAndGift(frame);
},
query(frame: Frame) {
return service!.create(requestContextFromFrame(frame), frame.options.id);
return service.create(requestContextFromFrame(frame), frame.options.id);
}
},

Expand All @@ -77,7 +77,7 @@ const controller = {
return permissionsService.canThis(frame.options.context).removeAll.gift_link();
},
async query(frame: Frame) {
const count = await service!.removeAll(requestContextFromFrame(frame));
const count = await service.removeAll(requestContextFromFrame(frame));
return {count};
}
}
Expand Down
3 changes: 1 addition & 2 deletions ghost/core/core/server/api/endpoints/pages.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const models = require('../../models');
const tpl = require('@tryghost/tpl');
const errors = require('@tryghost/errors');
const getPostServiceInstance = require('../../services/posts/posts-service-instance');
const postsService = require('../../services/posts').service;
const {rejectAdminApiRestrictedFieldsTransformer} = require('./utils/api-filter-utils');
const ALLOWED_INCLUDES = ['tags', 'authors', 'authors.roles', 'tiers', 'count.signups', 'count.paid_conversions', 'post_revisions', 'post_revisions.author'];
const UNSAFE_ATTRS = ['status', 'authors', 'visibility'];
Expand All @@ -10,7 +10,6 @@ const messages = {
pageNotFound: 'Page not found.'
};

const postsService = getPostServiceInstance();

/** @type {import('@tryghost/api-framework').Controller} */
const controller = {
Expand Down
3 changes: 1 addition & 2 deletions ghost/core/core/server/api/endpoints/posts-public.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ const models = require('../../models');
const tpl = require('@tryghost/tpl');
const errors = require('@tryghost/errors');
const postsPublicService = require('../../services/posts-public');
const getPostServiceInstance = require('../../services/posts/posts-service-instance');
const postsService = getPostServiceInstance();
const postsService = require('../../services/posts').service;
const {rejectContentApiRestrictedFieldsTransformer} = require('./utils/api-filter-utils');
const {generateGiftKeyData, applyGiftAccess} = require('./utils/gift-link-access');
const {generateOptionsData, generateAuthData} = require('./utils/public-cache-keys');
Expand Down
3 changes: 1 addition & 2 deletions ghost/core/core/server/api/endpoints/posts.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const urlUtils = require('../../../shared/url-utils').default;
const models = require('../../models');
const {getCSVExportFileName} = require('./utils/csv-export-filename');
const getPostServiceInstance = require('../../services/posts/posts-service-instance');
const postsService = require('../../services/posts').service;
const {rejectAdminApiRestrictedFieldsTransformer} = require('./utils/api-filter-utils');
const allowedIncludes = [
'tags',
Expand All @@ -22,7 +22,6 @@ const allowedIncludes = [
];
const unsafeAttrs = ['status', 'authors', 'visibility'];

const postsService = getPostServiceInstance();

/**
* @param {string} event
Expand Down
3 changes: 1 addition & 2 deletions ghost/core/core/server/api/endpoints/search-index-public.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
const models = require('../../models');
const urlService = require('../../services/url');
const {requiredUrlColumns} = require('./utils/serializers/input/utils/url');
const getPostServiceInstance = require('../../services/posts/posts-service-instance');
const postsService = getPostServiceInstance();
const postsService = require('../../services/posts').service;

const urlRelationsForRouting = () => {
const withRelated = urlService.getRequiredRelations();
Expand Down
3 changes: 1 addition & 2 deletions ghost/core/core/server/api/endpoints/search-index.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
const models = require('../../models');
const urlService = require('../../services/url');
const {requiredUrlColumns} = require('./utils/serializers/input/utils/url');
const getPostServiceInstance = require('../../services/posts/posts-service-instance');
const postsService = getPostServiceInstance();
const postsService = require('../../services/posts').service;

const urlRelationsForRouting = () => {
const withRelated = urlService.getRequiredRelations();
Expand Down
5 changes: 2 additions & 3 deletions ghost/core/core/server/api/endpoints/tinybird.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const TinybirdServiceWrapper = require('../../services/tinybird');
const tinybird = require('../../services/tinybird');

/** @type {import('@tryghost/api-framework').Controller} */
const controller = {
Expand All @@ -13,8 +13,7 @@ const controller = {
method: 'browse'
},
async query() {
TinybirdServiceWrapper.init();
const tokenData = TinybirdServiceWrapper.instance?.getToken() ?? null;
const tokenData = tinybird.service.getToken();

if (tokenData?.exp) {
return {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export async function generateGiftKeyData(frame: Frame): Promise<{present: true;
return undefined;
}

const post = await giftLinksService!.getPostByToken(token);
const post = await giftLinksService.getPostByToken(token);
const postId = post ? post.id : null;
frame.giftLinkPostId = postId;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@ const utils = require('../../../index');

const postsMetaSchema = require('../../../../../../data/schema').tables.posts_meta;

const getPostServiceInstance = require('../../../../../../services/posts/posts-service-instance');
const postsService = getPostServiceInstance();
const postsService = require('../../../../../../services/posts').service;

const commentsService = require('../../../../../../services/comments');
const memberAttribution = require('../../../../../../services/member-attribution');
Expand Down
3 changes: 1 addition & 2 deletions ghost/core/core/server/lib/lexical.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,7 @@ function createLexicalHtmlRenderer(onError) {

function buildRenderOptions(userOptions) {
if (!postsService) {
const getPostServiceInstance = require('../services/posts/posts-service-instance');
postsService = getPostServiceInstance();
postsService = require('../services/posts').service;
}
if (!serializePosts) {
serializePosts = require('../api/endpoints/utils/serializers/output/posts').all;
Expand Down
33 changes: 24 additions & 9 deletions ghost/core/core/server/services/announcement-bar-service/index.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,27 @@
const settingsCache = require('../../../shared/settings-cache');
const AnnouncementBarSettings = require('./announcement-bar-settings');
const {lazySingleton} = require('../../../shared/lazy-singleton');

const announcementBarService = new AnnouncementBarSettings({
getAnnouncementSettings: () => ({
announcement: settingsCache.get('announcement_content'),
announcement_background: settingsCache.get('announcement_background'),
announcement_visibility: settingsCache.get('announcement_visibility')
})
});
let instance;

module.exports = announcementBarService;
const service = lazySingleton('AnnouncementBarSettings', () => instance);

function init() {
if (instance) {
return;
}

const settingsCache = require('../../../shared/settings-cache');

instance = new AnnouncementBarSettings({
getAnnouncementSettings: () => ({
announcement: settingsCache.get('announcement_content'),
announcement_background: settingsCache.get('announcement_background'),
announcement_visibility: settingsCache.get('announcement_visibility')
})
});
}

module.exports = {
init,
service
};

This file was deleted.

24 changes: 22 additions & 2 deletions ghost/core/core/server/services/donations/index.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,23 @@
const DonationServiceWrapper = require('./donation-service-wrapper');
const {lazySingleton} = require('../../../shared/lazy-singleton');

module.exports = new DonationServiceWrapper();
let repository;

const service = lazySingleton('DonationRepository', () => repository);

function init() {
if (repository) {
return;
}

const {DonationPaymentEvent: DonationPaymentEventModel} = require('../../models');
const {DonationBookshelfRepository} = require('./donation-bookshelf-repository');

repository = new DonationBookshelfRepository({
DonationPaymentEventModel
});
}

module.exports = {
init,
service
};
54 changes: 28 additions & 26 deletions ghost/core/core/server/services/explore-ping/index.ts
Original file line number Diff line number Diff line change
@@ -1,40 +1,42 @@
import {ExplorePingService} from './explore-ping-service';
import {lazySingleton} from '../../../shared/lazy-singleton';

const config = require('../../../shared/config');
const logging = require('@tryghost/logging');
const ghostVersion = require('@tryghost/version');
const request = require('@tryghost/request');
const settingsCache = require('../../../shared/settings-cache');
const posts = require('../posts/posts-service-instance');
const members = require('../members');
const statsService = require('../stats');
let instance: ExplorePingService | undefined;

// Export the creation function for testing
export function createService(): ExplorePingService {
return new ExplorePingService({
export const service = lazySingleton('ExplorePingService', () => instance);

export async function init(): Promise<void> {
if (instance) {
return;
}

const config = require('../../../shared/config');

const logging = require('@tryghost/logging');
const ghostVersion = require('@tryghost/version');
const request = require('@tryghost/request');
const settingsCache = require('../../../shared/settings-cache');
const posts = require('../posts').service;
const members = require('../members');
const statsService = require('../stats');

instance = new ExplorePingService({
settingsCache,
config,
logging,
ghostVersion,
request,
posts: posts(),
posts,
members,
statsService
});
}

export async function init(): Promise<void> {
// The explore ping is a background "phone home" request. It should not run
// in the test environment (cf. the update-check service, which gates on the
// same environments), where there is no explore URL configured.
if (!config.isProductionOrDevelopment()) {
return;
// The explore ping is a background "phone home" request. Construct the
// service in every environment so init() always fulfils the service
// contract, but only trigger the request in production or development.
if (config.isProductionOrDevelopment()) {
// The final intention is to have this run on a schedule. For the
// initial version, ping when the server starts without awaiting it.
instance.ping();
}

const explorePingService = createService();

// The final intention is to have this run on a schedule
// For the initial version, we'll just ping when the server starts
// Without waiting for the response
explorePingService.ping();
}
9 changes: 6 additions & 3 deletions ghost/core/core/server/services/gift-links/index.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
import {GiftLinksService} from './service';
import {recordGiftLinkAction, type RecordGiftLinkAction} from './actions';
import {lazySingleton} from '../../../shared/lazy-singleton';

export type {RequestContext} from './actions';

// Constructed by init() at boot, not at import: knex is only available once the DB has connected.
export let service: GiftLinksService | undefined;
let instance: GiftLinksService | undefined;

export const service = lazySingleton('GiftLinksService', () => instance);

export function init(): void {
if (service) {
if (instance) {
return;
}

Expand All @@ -16,5 +19,5 @@ export function init(): void {

const recordAction: RecordGiftLinkAction = ({context, verb, subject}) =>
recordGiftLinkAction({Action: models.Action, context, verb, subject});
service = new GiftLinksService({knex, recordAction});
instance = new GiftLinksService({knex, recordAction});
}
Loading
Loading