Przeglądaj źródła

add MailServer as a message handler

Yuki Takei 5 lat temu
rodzic
commit
d829a53095

+ 3 - 0
src/server/crowi/index.js

@@ -340,6 +340,9 @@ Crowi.prototype.setupSearcher = async function() {
 Crowi.prototype.setupMailer = async function() {
   const MailService = require('@server/service/mail');
   this.mailService = new MailService(this);
+
+  // add as a message handler
+  this.configPubsub.addMessageHandler(this.mailService);
 };
 
 Crowi.prototype.setupSlack = async function() {

+ 8 - 2
src/server/routes/apiv3/app-settings.js

@@ -366,8 +366,11 @@ module.exports = (crowi) => {
     try {
       const { configManager, mailService } = crowi;
 
-      await configManager.updateConfigsInTheSameNamespace('crowi', requestMailSettingParams);
+      // update config without publishing ConfigPubsubMessage
+      await configManager.updateConfigsInTheSameNamespace('crowi', requestMailSettingParams, true);
+
       await mailService.initialize();
+      mailService.publishUpdatedMessage();
 
       const mailSettingParams = {
         fromAddress: configManager.getConfig('crowi', 'mail:from'),
@@ -420,8 +423,11 @@ module.exports = (crowi) => {
     try {
       const { configManager, mailService } = crowi;
 
-      await configManager.updateConfigsInTheSameNamespace('crowi', requestAwsSettingParams);
+      // update config without publishing ConfigPubsubMessage
+      await configManager.updateConfigsInTheSameNamespace('crowi', requestAwsSettingParams, true);
+
       await mailService.initialize();
+      mailService.publishUpdatedMessage();
 
       const awsSettingParams = {
         region: crowi.configManager.getConfig('crowi', 'aws:region'),

+ 48 - 1
src/server/service/mail.js

@@ -3,11 +3,19 @@ const logger = require('@alias/logger')('growi:service:mail');
 const nodemailer = require('nodemailer');
 const swig = require('swig-templates');
 
-class MailService {
+
+const ConfigPubsubMessage = require('../models/vo/config-pubsub-message');
+const ConfigPubsubMessageHandlable = require('./config-pubsub/handlable');
+
+
+class MailService extends ConfigPubsubMessageHandlable {
 
   constructor(crowi) {
+    super();
+
     this.appService = crowi.appService;
     this.configManager = crowi.configManager;
+    this.configPubsub = crowi.configPubsub;
 
     this.mailConfig = {};
     this.mailer = {};
@@ -15,6 +23,45 @@ class MailService {
     this.initialize();
   }
 
+  /**
+   * @inheritdoc
+   */
+  shouldHandleConfigPubsubMessage(configPubsubMessage) {
+    const { eventName, updatedAt } = configPubsubMessage;
+    if (eventName !== 'mailServiceUpdated' || updatedAt == null) {
+      return false;
+    }
+
+    return this.lastLoadedAt == null || this.lastLoadedAt < new Date(configPubsubMessage.updatedAt);
+  }
+
+  /**
+   * @inheritdoc
+   */
+  async handleConfigPubsubMessage(configPubsubMessage) {
+    const { configManager } = this;
+
+    logger.info('Initialize mail settings by pubsub notification');
+    await configManager.loadConfigs();
+    this.initialize();
+  }
+
+  async publishUpdatedMessage() {
+    const { configPubsub } = this;
+
+    if (configPubsub != null) {
+      const configPubsubMessage = new ConfigPubsubMessage('mailServiceUpdated', { updatedAt: new Date() });
+
+      try {
+        await configPubsub.publish(configPubsubMessage);
+      }
+      catch (e) {
+        logger.error('Failed to publish update message with configPubsub: ', e.message);
+      }
+    }
+  }
+
+
   initialize() {
     const { appService, configManager } = this;