Skip to content
Closed
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/server/api/endpoints/authentication.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ const invitations = require('../../services/invitations');
const dbBackup = require('../../data/db/backup');
const apiMail = require('./index').mail;
const apiSettings = require('./index').settings;
const UsersService = require('../../services/Users');
const UsersService = require('../../services/users');
const userService = new UsersService({dbBackup, models, auth, apiMail, apiSettings});
const {deleteAllSessions} = require('../../services/auth/session');

Expand Down
2 changes: 1 addition & 1 deletion ghost/core/core/server/api/endpoints/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ const dbBackup = require('../../data/db/backup');
const auth = require('../../services/auth');
const apiMail = require('./index').mail;
const apiSettings = require('./index').settings;
const UsersService = require('../../services/Users');
const UsersService = require('../../services/users');
const userService = new UsersService({dbBackup, models, auth, apiMail, apiSettings});
const ALLOWED_INCLUDES = ['count.posts', 'permissions', 'roles', 'roles.permissions'];
const UNSAFE_ATTRS = ['status', 'roles'];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const _ = require('lodash');
const {ValidationError} = require('@tryghost/errors');
const validator = require('@tryghost/validator');
const tpl = require('@tryghost/tpl');
const AnnouncementBarSettings = require('../../../../../services/announcement-bar-service/AnnouncementBarSettings');
const AnnouncementBarSettings = require('../../../../../services/announcement-bar-service/announcement-bar-settings');

const messages = {
invalidEmailReceived: 'Please send a valid email',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import ObjectID from 'bson-objectid';
import {Knex} from 'knex';
import {IdentityTokenService} from '../identity-tokens/IdentityTokenService';
import {IdentityTokenService} from '../identity-tokens/identity-token-service';
import fetch from 'node-fetch';

type ExpectedWebhook = {
Expand Down
2 changes: 1 addition & 1 deletion ghost/core/core/server/services/adapter-manager/index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const AdapterManager = require('./AdapterManager');
const AdapterManager = require('./adapter-manager');
const getAdapterServiceConfig = require('./config');
const resolveAdapterOptions = require('./options-resolver');
const config = require('../../../shared/config');
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const AnnouncementVisibilityValues = require('./AnnouncementVisibilityValues');
const AnnouncementVisibilityValues = require('./announcement-visibility-values');

class AnnouncementBarSettings {
#getAnnouncementSettings;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const settingsCache = require('../../../shared/settings-cache');
const AnnouncementBarSettings = require('./AnnouncementBarSettings');
const AnnouncementBarSettings = require('./announcement-bar-settings');

const announcementBarService = new AnnouncementBarSettings({
getAnnouncementSettings: () => ({
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const Feedback = require('./Feedback');
const Feedback = require('./feedback');
const errors = require('@tryghost/errors');
const tpl = require('@tryghost/tpl');

Expand Down Expand Up @@ -74,8 +74,8 @@ class AudienceFeedbackController {
}

const feedback = new Feedback({
memberId: member.id,
postId: post.id,
memberId: member.id,
postId: post.id,
score
});
await this.#repository.add(feedback);
Expand Down
8 changes: 4 additions & 4 deletions ghost/core/core/server/services/audience-feedback/index.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
const urlUtils = require('../../../shared/url-utils');
const urlService = require('../../services/url');

const AudienceFeedbackService = require('./AudienceFeedbackService');
const AudienceFeedbackController = require('./AudienceFeedbackController');
const Feedback = require('./Feedback');
const FeedbackRepository = require('./FeedbackRepository');
const AudienceFeedbackService = require('./audience-feedback-service');
const AudienceFeedbackController = require('./audience-feedback-controller');
const Feedback = require('./feedback');
const FeedbackRepository = require('./feedback-repository');

class AudienceFeedbackServiceWrapper {
async init() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ const settingsCache = require('../../../../shared/settings-cache');
const models = require('../../../models');
const urlUtils = require('../../../../shared/url-utils');

const SessionStore = require('./SessionStore');
const SessionStore = require('./session-store');
const sessionStore = new SessionStore(models.Session);

let unoExpressSessionMiddleware;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ const messages = {

module.exports = class CommentsController {
/**
* @param {import('./CommentsService')} service
* @param {import('./CommentsStatsService')} stats
* @param {import('./comments-service')} service
* @param {import('./comments-stats-service')} stats
*/
constructor(service, stats) {
this.service = service;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const moment = require('moment');
const htmlToPlaintext = require('@tryghost/html-to-plaintext');
const emailService = require('../email-service');
const CommentsServiceEmailRenderer = require('./CommentsServiceEmailRenderer');
const CommentsServiceEmailRenderer = require('./comments-service-email-renderer');
const {t} = require('../i18n');

class CommentsServiceEmails {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class CommentsService {
/** @private */
this.contentGating = contentGating;

const Emails = require('./CommentsServiceEmails');
const Emails = require('./comments-service-emails');
/** @private */
this.emails = new Emails({
config,
Expand Down
6 changes: 3 additions & 3 deletions ghost/core/core/server/services/comments/index.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
class CommentsServiceWrapper {
init() {
const CommentsService = require('./CommentsService');
const CommentsController = require('./CommentsController');
const CommentsStats = require('./CommentsStatsService');
const CommentsService = require('./comments-service');
const CommentsController = require('./comments-controller');
const CommentsStats = require('./comments-stats-service');

const config = require('../../../shared/config');
const logging = require('@tryghost/logging');
Expand Down
4 changes: 2 additions & 2 deletions ghost/core/core/server/services/custom-redirects/index.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
const config = require('../../../shared/config');
const urlUtils = require('../../../shared/url-utils');

const DynamicRedirectManager = require('../lib/DynamicRedirectManager');
const CustomRedirectsAPI = require('./CustomRedirectsAPI');
const DynamicRedirectManager = require('../lib/dynamic-redirect-manager');
const CustomRedirectsAPI = require('./custom-redirects-api');
const validation = require('./validation');
const {getBackupRedirectsFilePath} = require('./utils');

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {DonationPaymentEvent} from './DonationPaymentEvent';
import {DonationPaymentEvent} from './donation-payment-event';
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚨 Bug: Broken require: DonationBookshelfRepository renamed but ref not updated

The file DonationBookshelfRepository.ts was renamed to donation-bookshelf-repository.ts in this PR, but donation-service-wrapper.js (line 11) still contains require('./DonationBookshelfRepository'). Since the file no longer exists at the PascalCase path, this will cause a MODULE_NOT_FOUND error when the donation service initializes.

The fix is to update the require in donation-service-wrapper.js to use the new kebab-case filename:

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

Was this helpful? React with 👍 / 👎

  • Apply suggested fix


type DonationRepository = {
save(event: DonationPaymentEvent): Promise<void>;
Expand Down
2 changes: 1 addition & 1 deletion ghost/core/core/server/services/donations/index.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
const DonationServiceWrapper = require('./DonationServiceWrapper');
const DonationServiceWrapper = require('./donation-service-wrapper');

module.exports = new DonationServiceWrapper();
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const MailgunClient = require('../lib/MailgunClient');
const MailgunClient = require('../lib/mailgun-client');

const DEFAULT_EVENT_FILTER = 'delivered OR opened OR failed OR unsubscribed OR complained';
const PAGE_LIMIT = 300;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ class EmailAnalyticsServiceWrapper {
return;
}

const EmailAnalyticsService = require('./EmailAnalyticsService');
const EmailEventStorage = require('../email-service/EmailEventStorage');
const EmailEventProcessor = require('../email-service/EmailEventProcessor');
const MailgunProvider = require('./EmailAnalyticsProviderMailgun');
const EmailAnalyticsService = require('./email-analytics-service');
const EmailEventStorage = require('../email-service/email-event-storage');
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚨 Bug: Broken requires: email-event-storage/processor files not renamed

In email-analytics-service-wrapper.js, the require paths were updated to kebab-case (../email-service/email-event-storage and ../email-service/email-event-processor), but the actual files in the email-service/ directory were not renamed — they are still EmailEventStorage.js and EmailEventProcessor.js. This will cause a runtime MODULE_NOT_FOUND error when the email analytics service initializes, breaking email analytics functionality entirely.

On case-insensitive filesystems (macOS) this might not surface during local development, but it will fail on case-sensitive filesystems (Linux, CI, production).

Was this helpful? React with 👍 / 👎

Suggested change
const EmailEventStorage = require('../email-service/email-event-storage');
const EmailEventStorage = require('../email-service/EmailEventStorage');
const EmailEventProcessor = require('../email-service/EmailEventProcessor');
  • Apply suggested fix

const EmailEventProcessor = require('../email-service/email-event-processor');
const MailgunProvider = require('./email-analytics-provider-mailgun');
const {EmailRecipientFailure, EmailSpamComplaintEvent, Email} = require('../../models');
const StartEmailAnalyticsJobEvent = require('./events/StartEmailAnalyticsJobEvent');
const StartEmailAnalyticsJobEvent = require('./events/start-email-analytics-job-event');
const domainEvents = require('@tryghost/domain-events');
const settings = require('../../../shared/settings-cache');
const labs = require('../../../shared/labs');
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const EventProcessingResult = require('./EventProcessingResult');
const EventProcessingResult = require('./event-processing-result');
const logging = require('@tryghost/logging');
const errors = require('@tryghost/errors');

Expand Down
2 changes: 1 addition & 1 deletion ghost/core/core/server/services/email-analytics/index.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
const EmailAnalyticsServiceWrapper = require('./EmailAnalyticsServiceWrapper');
const EmailAnalyticsServiceWrapper = require('./email-analytics-service-wrapper');

module.exports = new EmailAnalyticsServiceWrapper();
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const {parentPort} = require('worker_threads');
const StartEmailAnalyticsJobEvent = require('../../events/StartEmailAnalyticsJobEvent');
const StartEmailAnalyticsJobEvent = require('../../events/start-email-analytics-job-event');

// recurring job to fetch analytics since the most recently seen event timestamp

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class EmailServiceWrapper {
const {DomainWarmingService} = require('./DomainWarmingService');

const {Post, Newsletter, Email, EmailBatch, EmailRecipient, Member} = require('../../models');
const MailgunClient = require('../lib/MailgunClient');
const MailgunClient = require('../lib/mailgun-client');
const configService = require('../../../shared/config');
const settingsCache = require('../../../shared/settings-cache');
const settingsHelpers = require('../settings-helpers');
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const {AbstractEmailSuppressionList, EmailSuppressionData} = require('./EmailSuppressionList');
const {AbstractEmailSuppressionList, EmailSuppressionData} = require('./email-suppression-list');

module.exports = class InMemoryEmailSuppressionList extends AbstractEmailSuppressionList {
store = ['spam@member.test', 'fail@member.test'];
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const {AbstractEmailSuppressionList, EmailSuppressionData, EmailSuppressedEvent} = require('./EmailSuppressionList');
const {AbstractEmailSuppressionList, EmailSuppressionData, EmailSuppressedEvent} = require('./email-suppression-list');
const SpamComplaintEvent = require('../email-service/events/SpamComplaintEvent');
const EmailBouncedEvent = require('../email-service/events/EmailBouncedEvent');
const DomainEvents = require('@tryghost/domain-events');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ const models = require('../../models');
const configService = require('../../../shared/config');
const settingsCache = require('../../../shared/settings-cache');
const labs = require('../../../shared/labs');
const MailgunClient = require('../lib/MailgunClient');
const MailgunEmailSuppressionList = require('./MailgunEmailSuppressionList');
const MailgunClient = require('../lib/mailgun-client');
const MailgunEmailSuppressionList = require('./mailgun-email-suppression-list');

const mailgunClient = new MailgunClient({
config: configService,
Expand Down
2 changes: 1 addition & 1 deletion ghost/core/core/server/services/explore-ping/index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const ExplorePingService = require('./ExplorePingService');
const ExplorePingService = require('./explore-ping-service');
const config = require('../../../shared/config');
const labs = require('../../../shared/labs');
const logging = require('@tryghost/logging');
Expand Down
2 changes: 1 addition & 1 deletion ghost/core/core/server/services/explore/index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const ExploreService = require('./ExploreService');
const ExploreService = require('./explore-service');

const MembersService = require('../members');
const PostsService = require('../posts/posts-service-instance')();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const models = require('../../models');
const FrontendDataService = require('./FrontendDataService');
const FrontendDataService = require('./front-end-data-service');

module.exports.init = () => {
return new FrontendDataService({IntegrationModel: models.Integration});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const {IdentityTokenService} = require('./IdentityTokenService');
const {IdentityTokenService} = require('./identity-token-service');

module.exports = class IdentityTokenServiceWrapper {
/** @type IdentityTokenService */
Expand Down
2 changes: 1 addition & 1 deletion ghost/core/core/server/services/identity-tokens/index.js
Original file line number Diff line number Diff line change
@@ -1 +1 @@
module.exports = require('./IdentityTokenServiceWrapper');
module.exports = require('./identity-token-service-wrapper');
2 changes: 1 addition & 1 deletion ghost/core/core/server/services/invites/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const settingsCache = require('../../../shared/settings-cache');
const settingsHelpers = require('../settings-helpers');
const mailService = require('../../services/mail');
const urlUtils = require('../../../shared/url-utils');
const Invites = require('./Invites');
const Invites = require('./invites');

module.exports = new Invites({
settingsCache,
Expand Down
4 changes: 2 additions & 2 deletions ghost/core/core/server/services/mail/index.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
const path = require('path');
const urlUtils = require('../../../shared/url-utils');
const settingsCache = require('../../../shared/settings-cache');
const EmailContentGenerator = require('../lib/EmailContentGenerator');
const EmailContentGenerator = require('../lib/email-content-generator');

const emailContentGenerator = new EmailContentGenerator({
getSiteUrl: () => urlUtils.urlFor('home', true),
getSiteTitle: () => settingsCache.get('title'),
templatesDir: path.resolve(__dirname, '..', 'mail', 'templates')
});

exports.GhostMailer = require('./GhostMailer');
exports.GhostMailer = require('./ghost-mailer');
exports.utils = {
generateContent: emailContentGenerator.getContent.bind(emailContentGenerator)
};
2 changes: 1 addition & 1 deletion ghost/core/core/server/services/media-inliner/service.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module.exports = {
async init() {
const debug = require('@tryghost/debug')('mediaInliner');
const MediaInliner = require('./ExternalMediaInliner');
const MediaInliner = require('./external-media-inliner');
const models = require('../../models');
const jobsService = require('../jobs');

Expand Down
12 changes: 6 additions & 6 deletions ghost/core/core/server/services/member-attribution/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,26 +40,26 @@ graph TD

### Components

#### 1. **MemberAttributionService** (`MemberAttributionService.js`)
#### 1. **MemberAttributionService** (`member-attribution-service.js`)
Main service interface that coordinates all attribution logic.

#### 2. **AttributionBuilder** (`AttributionBuilder.js`)
#### 2. **AttributionBuilder** (`attribution-builder.js`)
Converts URL history into attribution resources using the "Last Post Algorithm™️".

**Key Classes:**
- `Attribution`: Represents attribution data with methods to fetch and enrich resources
- `AttributionBuilder`: Factory for creating `Attribution` instances

#### 3. **UrlHistory** (`UrlHistory.js`)
#### 3. **UrlHistory** (`url-history.js`)
Validated container for URL history arrays from the frontend.

#### 4. **UrlTranslator** (`UrlTranslator.js`)
#### 4. **UrlTranslator** (`url-translator.js`)
Translates between URLs and Ghost resources.

#### 5. **ReferrerTranslator** (`ReferrerTranslator.js`)
#### 5. **ReferrerTranslator** (`referrer-translator.js`)
Parses referrer information into source and medium classifications.

#### 6. **OutboundLinkTagger** (`OutboundLinkTagger.js`)
#### 6. **OutboundLinkTagger** (`outbound-link-tagger.js`)
Adds `?ref=` parameters to external links in newsletters.

#### 7. **Frontend Script** (`member-attribution.js`)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
*/

class Attribution {
/** @type {import('./UrlTranslator')} */
/** @type {import('./url-translator')} */
#urlTranslator;

/**
Expand Down Expand Up @@ -133,9 +133,9 @@ class Attribution {
* Convert a UrlHistory to an attribution object
*/
class AttributionBuilder {
/** @type {import('./UrlTranslator')} */
/** @type {import('./url-translator')} */
urlTranslator;
/** @type {import('./ReferrerTranslator')} */
/** @type {import('./referrer-translator')} */
referrerTranslator;

/**
Expand Down Expand Up @@ -166,7 +166,7 @@ class AttributionBuilder {

/**
* Last Post Algorithm™️
* @param {import('./UrlHistory').UrlHistoryArray} history
* @param {import('./url-history').UrlHistoryArray} history
* @returns {Promise<Attribution>}
*/
async getAttribution(history) {
Expand Down
10 changes: 5 additions & 5 deletions ghost/core/core/server/services/member-attribution/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ class MemberAttributionServiceWrapper {
}

// Wire up all the dependencies
const MemberAttributionService = require('./MemberAttributionService');
const UrlTranslator = require('./UrlTranslator');
const ReferrerTranslator = require('./ReferrerTranslator');
const AttributionBuilder = require('./AttributionBuilder');
const OutboundLinkTagger = require('./OutboundLinkTagger');
const MemberAttributionService = require('./member-attribution-service');
const UrlTranslator = require('./url-translator');
const ReferrerTranslator = require('./referrer-translator');
const AttributionBuilder = require('./attribution-builder');
const OutboundLinkTagger = require('./outbound-link-tagger');
const models = require('../../models');

const urlTranslator = new UrlTranslator({
Expand Down
Loading