Просмотр исходного кода

Create and execute a new method "createTtlIndex"

Shun Miyazawa 3 лет назад
Родитель
Сommit
ea60e4ddc8

+ 8 - 0
packages/app/src/server/crowi/index.js

@@ -150,6 +150,12 @@ Crowi.prototype.init = async function() {
   await this.autoInstall();
 };
 
+Crowi.prototype.afterInit = async function() {
+  if (this.activityService != null) {
+    await this.activityService.createTtlIndex();
+  }
+};
+
 Crowi.prototype.isPageId = function(pageId) {
   if (!pageId) {
     return false;
@@ -470,6 +476,8 @@ Crowi.prototype.start = async function() {
   // setup Global Error Handlers
   this.setupGlobalErrorHandlers();
 
+  this.afterInit();
+
   return serverListening;
 };
 

+ 22 - 0
packages/app/src/server/service/activity.ts

@@ -1,4 +1,5 @@
 import { getModelSafely } from '@growi/core';
+import mongoose from 'mongoose';
 
 import { IActivity } from '~/interfaces/activity';
 import { IPage } from '~/interfaces/page';
@@ -44,6 +45,27 @@ class ActivityService {
     });
   }
 
+  createTtlIndex = async function() {
+    if (this.crowi.configManager == null) {
+      return;
+    }
+
+    const activityExpirationSeconds = this.crowi.configManager.getConfig('crowi', 'app:activityExpirationSeconds');
+    if (activityExpirationSeconds == null) {
+      return;
+    }
+
+    const collection = mongoose.connection.collection('activities');
+
+    try {
+      // Set retention period only if activityExpirationSeconds is not null
+      await collection.createIndex({ createdAt: 1 }, { expireAfterSeconds: activityExpirationSeconds });
+    }
+    catch (err) {
+      logger.error('Failed to create TTL indexes', err);
+    }
+  };
+
 
   /**
      * @param {object} parameters