Implemented basic support for GDPR
This commit is contained in:
parent
9f9cbc4c2b
commit
92ca1c0f28
21 changed files with 271 additions and 105 deletions
58
server/services/gdpr-cleanup.js
Normal file
58
server/services/gdpr-cleanup.js
Normal file
|
@ -0,0 +1,58 @@
|
|||
'use strict';
|
||||
|
||||
const config = require('config');
|
||||
const log = require('../lib/log');
|
||||
const knex = require('../lib/knex');
|
||||
const subscriptions = require('../models/subscriptions');
|
||||
const { SubscriptionStatus } = require('../../shared/lists');
|
||||
const contextHelpers = require('../lib/context-helpers');
|
||||
|
||||
const checkPeriod = 60 * 1000;
|
||||
|
||||
async function run() {
|
||||
while (true) {
|
||||
await knex.transaction(async tx => {
|
||||
const currentTs = Date.now();
|
||||
|
||||
const lsts = await tx('lists').select(['id']);
|
||||
for (const list of lsts) {
|
||||
|
||||
if (config.gdpr.deleteSubscriptionAfterUnsubscribe.enabled) {
|
||||
await tx(subscriptions.getSubscriptionTableName(list.id))
|
||||
.whereIn('status', [SubscriptionStatus.UNSUBSCRIBED, SubscriptionStatus.COMPLAINED])
|
||||
.where('unsubscribed', '<=', new Date(currentTs - config.gdpr.deleteSubscriptionAfterUnsubscribe.secondsAfterUnsubscribe * 1000))
|
||||
.del();
|
||||
}
|
||||
|
||||
if (config.gdpr.deleteDataAfterUnsubscribe.enabled) {
|
||||
const groupedFieldsMap = await subscriptions.getGroupedFieldsMapTx(tx, list.id);
|
||||
|
||||
const purgedEntity = {};
|
||||
subscriptions.purgeSensitiveData(purgedEntity, groupedFieldsMap);
|
||||
|
||||
await tx(subscriptions.getSubscriptionTableName(list.id))
|
||||
.whereNotNull('email')
|
||||
.whereIn('status', [SubscriptionStatus.UNSUBSCRIBED, SubscriptionStatus.COMPLAINED])
|
||||
.where('unsubscribed', '<=', new Date(currentTs - config.gdpr.deleteDataAfterUnsubscribe.secondsAfterUnsubscribe * 1000))
|
||||
.update(purgedEntity);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
const nextCycle = new Promise(resolve => {
|
||||
setTimeout(resolve, checkPeriod);
|
||||
});
|
||||
await nextCycle;
|
||||
}
|
||||
}
|
||||
|
||||
function start() {
|
||||
if (config.gdpr.deleteDataAfterUnsubscribe.enabled || config.gdpr.deleteDataAfterUnsubscribe.enabled) {
|
||||
log.info('GDPR', 'Starting GDPR cleanup service');
|
||||
run().catch(err => {
|
||||
log.error('GDPR', err);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
module.exports.start = start;
|
|
@ -11,8 +11,8 @@ const { SubscriptionStatus } = require('../../shared/lists');
|
|||
const links = require('../models/links');
|
||||
const contextHelpers = require('../lib/context-helpers');
|
||||
|
||||
const triggerCheckPeriod = 15 * 1000;
|
||||
const triggerFirePeriod = 60 * 1000;
|
||||
const triggerCheckPeriod = 30 * 1000;
|
||||
const triggerFirePeriod = 120 * 1000;
|
||||
|
||||
|
||||
async function run() {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue