Ghost/ghost/stripe/lib/StripeService.js

107 lines
3.5 KiB
JavaScript

const WebhookManager = require('./WebhookManager');
const StripeAPI = require('./StripeAPI');
const StripeMigrations = require('./StripeMigrations');
const WebhookController = require('./WebhookController');
const DomainEvents = require('@tryghost/domain-events');
const {StripeLiveEnabledEvent, StripeLiveDisabledEvent} = require('./events');
module.exports = class StripeService {
constructor({
labs,
membersService,
donationService,
staffService,
StripeWebhook,
models
}) {
const api = new StripeAPI({labs});
const webhookManager = new WebhookManager({
StripeWebhook,
api
});
const migrations = new StripeMigrations({
models,
api
});
const webhookController = new WebhookController({
webhookManager,
api,
get memberRepository(){
return membersService.api.members;
},
get productRepository() {
return membersService.api.productRepository;
},
get eventRepository() {
return membersService.api.events;
},
get donationRepository() {
return donationService.repository;
},
get staffServiceEmails() {
return staffService.api.emails;
},
sendSignupEmail(email){
return membersService.api.sendEmailWithMagicLink({
email,
requestedType: 'signup-paid',
options: {
forceEmailType: true
},
tokenData: {}
});
}
});
this.models = models;
this.api = api;
this.webhookManager = webhookManager;
this.migrations = migrations;
this.webhookController = webhookController;
}
async connect() {
DomainEvents.dispatch(StripeLiveEnabledEvent.create({message: 'Stripe Live Mode Enabled'}));
}
async disconnect() {
await this.models.Product.forge().query().update({
monthly_price_id: null,
yearly_price_id: null
});
await this.models.StripePrice.forge().query().del();
await this.models.StripeProduct.forge().query().del();
await this.models.MemberStripeCustomer.forge().query().del();
await this.models.Offer.forge().query().update({
stripe_coupon_id: null
});
await this.webhookManager.stop();
this.api.configure(null);
DomainEvents.dispatch(StripeLiveDisabledEvent.create({message: 'Stripe Live Mode Disabled'}));
}
async configure(config) {
this.api.configure({
secretKey: config.secretKey,
publicKey: config.publicKey,
enablePromoCodes: config.enablePromoCodes,
get enableAutomaticTax() {
return config.enableAutomaticTax;
},
checkoutSessionSuccessUrl: config.checkoutSessionSuccessUrl,
checkoutSessionCancelUrl: config.checkoutSessionCancelUrl,
checkoutSetupSessionSuccessUrl: config.checkoutSetupSessionSuccessUrl,
checkoutSetupSessionCancelUrl: config.checkoutSetupSessionCancelUrl,
testEnv: config.testEnv
});
await this.webhookManager.configure({
webhookSecret: config.webhookSecret,
webhookHandlerUrl: config.webhookHandlerUrl
});
await this.webhookManager.start();
}
};