0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-04-08 02:52:39 -05:00

Moved @tryghost/email-events to @tryghost/email-service

fix https://linear.app/ghost/issue/86a4a3e1-a5b4-44f2-a2be-8513d59e0441

- this commit moves the lib code and tests to @tryghost/email-service so we can
  colocate code in one place rather than splitting it out across
  packages, which increases the cognitive load and overhead
This commit is contained in:
Daniel Lockyer 2025-03-31 14:05:21 +02:00 committed by Daniel Lockyer
parent c450a1dad7
commit 5186f833a9
28 changed files with 52 additions and 97 deletions

View file

@ -81,7 +81,6 @@ COPY ghost/domain-events/package.json ghost/domain-events/package.json
COPY ghost/donations/package.json ghost/donations/package.json
COPY ghost/email-addresses/package.json ghost/email-addresses/package.json
COPY ghost/email-content-generator/package.json ghost/email-content-generator/package.json
COPY ghost/email-events/package.json ghost/email-events/package.json
COPY ghost/email-service/package.json ghost/email-service/package.json
COPY ghost/email-suppression-list/package.json ghost/email-suppression-list/package.json
COPY ghost/express-dynamic-redirects/package.json ghost/express-dynamic-redirects/package.json

View file

@ -44,7 +44,6 @@ services:
- node_modules_ghost_donations:/home/ghost/ghost/donations/node_modules:delegated
- node_modules_ghost_email-addresses:/home/ghost/ghost/email-addresses/node_modules:delegated
- node_modules_ghost_email-content-generator:/home/ghost/ghost/email-content-generator/node_modules:delegated
- node_modules_ghost_email-events:/home/ghost/ghost/email-events/node_modules:delegated
- node_modules_ghost_email-service:/home/ghost/ghost/email-service/node_modules:delegated
- node_modules_ghost_email-suppression-list:/home/ghost/ghost/email-suppression-list/node_modules:delegated
- node_modules_ghost_express-dynamic-redirects:/home/ghost/ghost/express-dynamic-redirects/node_modules:delegated
@ -182,7 +181,6 @@ volumes:
node_modules_ghost_donations: {}
node_modules_ghost_email-addresses: {}
node_modules_ghost_email-content-generator: {}
node_modules_ghost_email-events: {}
node_modules_ghost_email-service: {}
node_modules_ghost_email-suppression-list: {}
node_modules_ghost_express-dynamic-redirects: {}

View file

@ -1,5 +1,5 @@
const {AbstractEmailSuppressionList, EmailSuppressionData, EmailSuppressedEvent} = require('@tryghost/email-suppression-list');
const {SpamComplaintEvent, EmailBouncedEvent} = require('@tryghost/email-events');
const {SpamComplaintEvent, EmailBouncedEvent} = require('@tryghost/email-service');
const DomainEvents = require('@tryghost/domain-events');
const logging = require('@tryghost/logging');
const models = require('../../models');

View file

@ -1,7 +1,7 @@
const {MemberPageViewEvent, MemberCommentEvent, MemberLinkClickEvent} = require('@tryghost/member-events');
const moment = require('moment-timezone');
const {IncorrectUsageError} = require('@tryghost/errors');
const {EmailOpenedEvent} = require('@tryghost/email-events');
const {EmailOpenedEvent} = require('@tryghost/email-service');
const logging = require('@tryghost/logging');
const LastSeenAtCache = require('./LastSeenAtCache');

View file

@ -5,7 +5,7 @@ const LastSeenAtUpdater = require('../../../../../core/server/services/members-e
const DomainEvents = require('@tryghost/domain-events');
const {MemberPageViewEvent, MemberCommentEvent, MemberSubscribeEvent, MemberLinkClickEvent} = require('@tryghost/member-events');
const moment = require('moment');
const {EmailOpenedEvent} = require('@tryghost/email-events');
const {EmailOpenedEvent} = require('@tryghost/email-service');
const EventEmitter = require('events');
const logging = require('@tryghost/logging');

View file

@ -1,6 +0,0 @@
module.exports = {
plugins: ['ghost'],
extends: [
'plugin:ghost/node'
]
};

View file

@ -1,21 +0,0 @@
# Email Events
## Usage
## Develop
This is a monorepo package.
Follow the instructions for the top-level repo.
1. `git clone` this repo & `cd` into it as usual
2. Run `yarn` to install top-level dependencies.
## Test
- `yarn lint` run just eslint
- `yarn test` run lint and tests

View file

@ -1,8 +0,0 @@
module.exports = {
SpamComplaintEvent: require('./lib/SpamComplaintEvent'),
EmailBouncedEvent: require('./lib/EmailBouncedEvent'),
EmailDeliveredEvent: require('./lib/EmailDeliveredEvent'),
EmailOpenedEvent: require('./lib/EmailOpenedEvent'),
EmailUnsubscribedEvent: require('./lib/EmailUnsubscribedEvent'),
EmailTemporaryBouncedEvent: require('./lib/EmailTemporaryBouncedEvent')
};

View file

@ -1,27 +0,0 @@
{
"name": "@tryghost/email-events",
"version": "0.0.0",
"repository": "https://github.com/TryGhost/Ghost/tree/main/packages/email-events",
"author": "Ghost Foundation",
"private": true,
"main": "index.js",
"scripts": {
"dev": "echo \"Implement me!\"",
"test:unit": "NODE_ENV=testing c8 --all --check-coverage --reporter text --reporter cobertura -- mocha --reporter dot './test/**/*.test.js'",
"test": "yarn test:unit",
"lint:code": "eslint *.js lib/ --ext .js --cache",
"lint": "yarn lint:code && yarn lint:test",
"lint:test": "eslint -c test/.eslintrc.js test/ --ext .js --cache"
},
"files": [
"index.js",
"lib"
],
"devDependencies": {
"bson-objectid": "2.0.4",
"c8": "8.0.1",
"mocha": "10.8.2",
"sinon": "15.2.0"
},
"dependencies": {}
}

View file

@ -1,6 +0,0 @@
module.exports = {
plugins: ['ghost'],
extends: [
'plugin:ghost/test'
]
};

View file

@ -1,13 +0,0 @@
const assert = require('assert/strict');
const events = require('../');
describe('index.js', function () {
it('exports SpamComplaintEvent', function () {
assert(events.SpamComplaintEvent);
assert(events.SpamComplaintEvent === require('../lib/SpamComplaintEvent'));
});
it('exports EmailBouncedEvent', function () {
assert(events.EmailBouncedEvent);
assert(events.EmailBouncedEvent === require('../lib/EmailBouncedEvent'));
});
});

View file

@ -1,4 +1,11 @@
module.exports = {
EmailDeliveredEvent: require('./lib/events/EmailDeliveredEvent'),
EmailOpenedEvent: require('./lib/events/EmailOpenedEvent'),
EmailBouncedEvent: require('./lib/events/EmailBouncedEvent'),
EmailTemporaryBouncedEvent: require('./lib/events/EmailTemporaryBouncedEvent'),
EmailUnsubscribedEvent: require('./lib/events/EmailUnsubscribedEvent'),
SpamComplaintEvent: require('./lib/events/SpamComplaintEvent'),
EmailService: require('./lib/EmailService'),
EmailController: require('./lib/EmailController'),
EmailRenderer: require('./lib/EmailRenderer'),

View file

@ -1,6 +1,12 @@
const {EmailDeliveredEvent, EmailOpenedEvent, EmailBouncedEvent, SpamComplaintEvent, EmailUnsubscribedEvent, EmailTemporaryBouncedEvent} = require('@tryghost/email-events');
const logging = require('@tryghost/logging');
const EmailDeliveredEvent = require('./events/EmailDeliveredEvent');
const EmailOpenedEvent = require('./events/EmailOpenedEvent');
const EmailBouncedEvent = require('./events/EmailBouncedEvent');
const EmailTemporaryBouncedEvent = require('./events/EmailTemporaryBouncedEvent');
const EmailUnsubscribedEvent = require('./events/EmailUnsubscribedEvent');
const SpamComplaintEvent = require('./events/SpamComplaintEvent');
async function waitForEvent() {
return new Promise((resolve) => {
setTimeout(resolve, 70);

View file

@ -67,7 +67,7 @@ class EmailEventStorage {
/**
* @private
* @param {'temporary'|'permanent'} severity
* @param {import('@tryghost/email-events').EmailTemporaryBouncedEvent|import('@tryghost/email-events').EmailBouncedEvent} event
* @param {import('@tryghost/email-service').EmailTemporaryBouncedEvent|import('@tryghost/email-service').EmailBouncedEvent} event
* @param {{transacting?: any}} options
* @returns
*/

View file

@ -26,7 +26,6 @@
},
"dependencies": {
"@tryghost/color-utils": "0.2.2",
"@tryghost/email-events": "0.0.0",
"@tryghost/errors": "1.3.5",
"@tryghost/html-to-plaintext": "0.0.0",
"@tryghost/kg-default-cards": "10.1.1",

View file

@ -1,10 +1,17 @@
const EmailEventStorage = require('../lib/EmailEventStorage');
const {EmailDeliveredEvent, EmailOpenedEvent, EmailBouncedEvent, EmailTemporaryBouncedEvent, EmailUnsubscribedEvent, SpamComplaintEvent} = require('@tryghost/email-events');
const sinon = require('sinon');
const assert = require('assert/strict');
const logging = require('@tryghost/logging');
const {createDb, createPrometheusClient} = require('./utils');
const EmailDeliveredEvent = require('../lib/events/EmailDeliveredEvent');
const EmailOpenedEvent = require('../lib/events/EmailOpenedEvent');
const EmailBouncedEvent = require('../lib/events/EmailBouncedEvent');
const EmailTemporaryBouncedEvent = require('../lib/events/EmailTemporaryBouncedEvent');
const EmailUnsubscribedEvent = require('../lib/events/EmailUnsubscribedEvent');
const SpamComplaintEvent = require('../lib/events/SpamComplaintEvent');
describe('Email Event Storage', function () {
let logError;

View file

@ -1,6 +1,6 @@
const assert = require('assert/strict');
const ObjectID = require('bson-objectid').default;
const EmailBouncedEvent = require('../../lib/EmailBouncedEvent');
const EmailBouncedEvent = require('../../lib/events/EmailBouncedEvent');
describe('EmailBouncedEvent', function () {
it('exports a static create method to create instances', function () {

View file

@ -1,6 +1,6 @@
const assert = require('assert/strict');
const ObjectID = require('bson-objectid').default;
const EmailDeliveredEvent = require('../../lib/EmailDeliveredEvent');
const EmailDeliveredEvent = require('../../lib/events/EmailDeliveredEvent');
describe('EmailDeliveredEvent', function () {
it('exports a static create method to create instances', function () {

View file

@ -1,6 +1,6 @@
const assert = require('assert/strict');
const ObjectID = require('bson-objectid').default;
const EmailOpenedEvent = require('../../lib/EmailOpenedEvent');
const EmailOpenedEvent = require('../../lib/events/EmailOpenedEvent');
describe('EmailOpenedEvent', function () {
it('exports a static create method to create instances', function () {

View file

@ -1,6 +1,6 @@
const assert = require('assert/strict');
const ObjectID = require('bson-objectid').default;
const EmailTemporaryBouncedEvent = require('../../lib/EmailTemporaryBouncedEvent');
const EmailTemporaryBouncedEvent = require('../../lib/events/EmailTemporaryBouncedEvent');
describe('EmailTemporaryBouncedEvent', function () {
it('exports a static create method to create instances', function () {

View file

@ -1,6 +1,6 @@
const assert = require('assert/strict');
const ObjectID = require('bson-objectid').default;
const EmailUnsubscribedEvent = require('../../lib/EmailUnsubscribedEvent');
const EmailUnsubscribedEvent = require('../../lib/events/EmailUnsubscribedEvent');
describe('EmailUnsubscribedEvent', function () {
it('exports a static create method to create instances', function () {
@ -12,4 +12,14 @@ describe('EmailUnsubscribedEvent', function () {
});
assert(event instanceof EmailUnsubscribedEvent);
});
it('can create an instance without a timestamp', function () {
const event = EmailUnsubscribedEvent.create({
email: 'test@test.test',
memberId: new ObjectID().toHexString(),
emailId: new ObjectID().toHexString()
});
assert(event instanceof EmailUnsubscribedEvent);
assert(event.timestamp instanceof Date);
});
});

View file

@ -1,6 +1,6 @@
const assert = require('assert/strict');
const ObjectID = require('bson-objectid').default;
const SpamComplaintEvent = require('../../lib/SpamComplaintEvent');
const SpamComplaintEvent = require('../../lib/events/SpamComplaintEvent');
describe('SpamComplaintEvent', function () {
it('exports a static create method to create instances', function () {
@ -12,4 +12,14 @@ describe('SpamComplaintEvent', function () {
});
assert(event instanceof SpamComplaintEvent);
});
it('can create an instance without a timestamp', function () {
const event = SpamComplaintEvent.create({
email: 'test@test.test',
memberId: new ObjectID().toHexString(),
emailId: new ObjectID().toHexString()
});
assert(event instanceof SpamComplaintEvent);
assert(event.timestamp instanceof Date);
});
});