From 335b08c433f41aaa2d8990caa98230fc4dc66b1f Mon Sep 17 00:00:00 2001 From: Lucas Vanhalst Date: Sat, 5 Nov 2016 02:09:44 +0100 Subject: [PATCH] feat(OEmbed): Clear OEmbed cache after user-defined amount of time Should help keeping the database/backups a bit smaller. --- packages/rocketchat-i18n/i18n/en.i18n.json | 1 + .../rocketchat-lib/server/startup/settings.coffee | 1 + .../server/models/OEmbedCache.coffee | 8 ++++++++ server/startup/cron.coffee | 13 +++++++++++++ 4 files changed, 23 insertions(+) diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index 8c8cd4ef2f6..ed0665b63ca 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -153,6 +153,7 @@ "API_Analytics": "Analytics", "API_Embed": "Embed Link Previews", "API_Embed_Description": "Whether embedded link previews are enabled or not when a user posts a link to a website.", + "API_EmbedCacheExpirationDays": "Embed cache expiration days", "API_EmbedDisabledFor": "Disable Embed for Users", "API_EmbedDisabledFor_Description": "Comma-separated list of usernames to disable the embedded link previews.", "API_EmbedIgnoredHosts": "Embed Ignored Hosts", diff --git a/packages/rocketchat-lib/server/startup/settings.coffee b/packages/rocketchat-lib/server/startup/settings.coffee index 0481211e144..7e017f71b17 100644 --- a/packages/rocketchat-lib/server/startup/settings.coffee +++ b/packages/rocketchat-lib/server/startup/settings.coffee @@ -185,6 +185,7 @@ RocketChat.settings.addGroup 'Message', -> @add 'Message_AudioRecorderEnabled', true, { type: 'boolean', public: true, i18nDescription: 'Message_AudioRecorderEnabledDescription' } @add 'Message_GroupingPeriod', 300, { type: 'int', public: true, i18nDescription: 'Message_GroupingPeriodDescription' } @add 'API_Embed', true, { type: 'boolean', public: true } + @add 'API_EmbedCacheExpirationDays', 30, { type: 'int', public: false } @add 'API_EmbedDisabledFor', '', { type: 'string', public: true, i18nDescription: 'API_EmbedDisabledFor_Description' } @add 'API_EmbedIgnoredHosts', 'localhost, 127.0.0.1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16', { type: 'string', i18nDescription: 'API_EmbedIgnoredHosts_Description' } @add 'API_EmbedSafePorts', '80, 443', { type: 'string' } diff --git a/packages/rocketchat-oembed/server/models/OEmbedCache.coffee b/packages/rocketchat-oembed/server/models/OEmbedCache.coffee index 251eb3b6e6a..cdf8fbfbf27 100644 --- a/packages/rocketchat-oembed/server/models/OEmbedCache.coffee +++ b/packages/rocketchat-oembed/server/models/OEmbedCache.coffee @@ -1,6 +1,7 @@ RocketChat.models.OEmbedCache = new class extends RocketChat.models._Base constructor: -> super('oembed_cache') + @tryEnsureIndex { 'updatedAt': 1 } # FIND ONE @@ -20,3 +21,10 @@ RocketChat.models.OEmbedCache = new class extends RocketChat.models._Base record._id = @insert record return record + + # REMOVE + removeAfterDate: (date) -> + query = + updatedAt: + $lte: date + @remove query diff --git a/server/startup/cron.coffee b/server/startup/cron.coffee index dee6a59e444..f4a4391bc96 100644 --- a/server/startup/cron.coffee +++ b/server/startup/cron.coffee @@ -17,6 +17,12 @@ generateStatistics = -> logger.warn('Failed to send usage report') return +cacheCleanup = -> + date = new Date() + expirationDays = RocketChat.settings.get 'API_EmbedCacheExpirationDays' + date.setDate(date.getDate() - expirationDays) + RocketChat.models.OEmbedCache.removeAfterDate date + Meteor.startup -> Meteor.defer -> generateStatistics() @@ -28,4 +34,11 @@ Meteor.startup -> return parser.cron new Date().getMinutes() + ' * * * *' job: generateStatistics + SyncedCron.add + name: 'Cleanup OEmbed cache' + schedule: (parser) -> + now = new Date() + return parser.cron now.getMinutes() + ' ' + now.getHours() + ' * * *' + job: cacheCleanup + SyncedCron.start()