Trim ActivityPub SharedInbox collection (Notes) along with assoc message area
This commit is contained in:
parent
5314fb4ad9
commit
10e2abffc6
|
@ -15,7 +15,7 @@ const { getJson } = require('../http_util');
|
||||||
|
|
||||||
// deps
|
// deps
|
||||||
const { isString } = require('lodash');
|
const { isString } = require('lodash');
|
||||||
const Log = require('../logger');
|
const Log = require('../logger').log;
|
||||||
const async = require('async');
|
const async = require('async');
|
||||||
|
|
||||||
module.exports = class Collection extends ActivityPubObject {
|
module.exports = class Collection extends ActivityPubObject {
|
||||||
|
@ -672,6 +672,64 @@ module.exports = class Collection extends ActivityPubObject {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static removeByMaxCount(collectionName, maxCount, cb) {
|
||||||
|
apDb.run(
|
||||||
|
`DELETE FROM collection
|
||||||
|
WHERE _rowid_ IN (
|
||||||
|
SELECT _rowid_
|
||||||
|
FROM collection
|
||||||
|
WHERE name = ?
|
||||||
|
ORDER BY _rowid_ DESC
|
||||||
|
LIMIT -1 OFFSET ${maxCount}
|
||||||
|
);`,
|
||||||
|
[maxCount],
|
||||||
|
function res(err) {
|
||||||
|
// non-arrow function for 'this'
|
||||||
|
Collection._removeByLogHelper(
|
||||||
|
collectionName,
|
||||||
|
'MaxCount',
|
||||||
|
err,
|
||||||
|
maxCount,
|
||||||
|
this.changes
|
||||||
|
);
|
||||||
|
return cb(err);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static removeByMaxAgeDays(collectionName, maxAgeDays, cb) {
|
||||||
|
apDb.run(
|
||||||
|
`DELETE FROM collection
|
||||||
|
WHERE name = ? AND timestamp < DATE('now', '-${maxAgeDays} days');`,
|
||||||
|
[maxAgeDays],
|
||||||
|
function res(err) {
|
||||||
|
// non-arrow function for 'this'
|
||||||
|
Collection._removeByLogHelper(
|
||||||
|
collectionName,
|
||||||
|
'MaxAgeDays',
|
||||||
|
err,
|
||||||
|
maxAgeDays,
|
||||||
|
this.changes
|
||||||
|
);
|
||||||
|
return cb(err);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static _removeByLogHelper(collectionName, type, err, value, deletedCount) {
|
||||||
|
if (err) {
|
||||||
|
Log.error(
|
||||||
|
{ collectionName, error: err.message, type, value },
|
||||||
|
'Error trimming collection'
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
Log.debug(
|
||||||
|
{ collectionName, type, value, deletedCount },
|
||||||
|
'Collection trimmed successfully'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static _rowToObjectInfo(row) {
|
static _rowToObjectInfo(row) {
|
||||||
return {
|
return {
|
||||||
name: row.name,
|
name: row.name,
|
||||||
|
|
|
@ -923,6 +923,8 @@ module.exports = () => {
|
||||||
alwaysExportExternal: true,
|
alwaysExportExternal: true,
|
||||||
subjectOptional: true,
|
subjectOptional: true,
|
||||||
addressFlavor: 'activitypub',
|
addressFlavor: 'activitypub',
|
||||||
|
maxAgeDays: 365 * 2,
|
||||||
|
maxMessages: 100000,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -16,6 +16,8 @@ const {
|
||||||
WellKnownConfTags,
|
WellKnownConfTags,
|
||||||
WellKnownAreaTags,
|
WellKnownAreaTags,
|
||||||
} = require('./message_const');
|
} = require('./message_const');
|
||||||
|
const Collection = require('./activitypub/collection');
|
||||||
|
const { Collections } = require('./activitypub/const');
|
||||||
|
|
||||||
// deps
|
// deps
|
||||||
const async = require('async');
|
const async = require('async');
|
||||||
|
@ -824,18 +826,69 @@ function trimMessageAreasScheduledEvent(args, cb) {
|
||||||
return callback(null, areaInfos);
|
return callback(null, areaInfos);
|
||||||
},
|
},
|
||||||
function trimGeneralAreas(areaInfos, callback) {
|
function trimGeneralAreas(areaInfos, callback) {
|
||||||
|
const cbWrap = (e, t, c) => {
|
||||||
|
if (e) {
|
||||||
|
Log.warn({ error: e.message, type: t }, `Failed trimming (${t})`);
|
||||||
|
}
|
||||||
|
return c(null);
|
||||||
|
};
|
||||||
|
|
||||||
|
const ApSharedAreaTag = Message.WellKnownAreaTags.ActivityPubShared;
|
||||||
|
|
||||||
|
// Clean up messages, and any associated ActivityPub 'SharedInbox'
|
||||||
|
// Notes (ie: the source of said messages)
|
||||||
async.each(
|
async.each(
|
||||||
areaInfos,
|
areaInfos,
|
||||||
(areaInfo, next) => {
|
(areaInfo, nextArea) => {
|
||||||
trimMessageAreaByMaxMessages(areaInfo, err => {
|
async.series(
|
||||||
if (err) {
|
[
|
||||||
return next(err);
|
next => {
|
||||||
|
trimMessageAreaByMaxMessages(areaInfo, err => {
|
||||||
|
return cbWrap(err, 'Messages:MaxCount', next);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
next => {
|
||||||
|
if (areaInfo.areaTag !== ApSharedAreaTag) {
|
||||||
|
return next(null);
|
||||||
|
}
|
||||||
|
Collection.removeByMaxCount(
|
||||||
|
Collections.SharedInbox,
|
||||||
|
areaInfo.maxMessages,
|
||||||
|
err => {
|
||||||
|
return cbWrap(
|
||||||
|
err,
|
||||||
|
'ActivityPubShared:MaxCount',
|
||||||
|
next
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
},
|
||||||
|
next => {
|
||||||
|
trimMessageAreaByMaxAgeDays(areaInfo, err => {
|
||||||
|
return cbWrap(err, 'Messages:MaxAgeDays', next);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
next => {
|
||||||
|
if (areaInfo.areaTag !== ApSharedAreaTag) {
|
||||||
|
return next(null);
|
||||||
|
}
|
||||||
|
Collection.removeByMaxAgeDays(
|
||||||
|
Collections.SharedInbox,
|
||||||
|
areaInfo.maxAgeDays,
|
||||||
|
err => {
|
||||||
|
return cbWrap(
|
||||||
|
err,
|
||||||
|
'ActivityPubShared:MaxAgeDays',
|
||||||
|
next
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
},
|
||||||
|
],
|
||||||
|
err => {
|
||||||
|
return nextArea(err);
|
||||||
}
|
}
|
||||||
|
);
|
||||||
trimMessageAreaByMaxAgeDays(areaInfo, err => {
|
|
||||||
return next(err);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
callback
|
callback
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in New Issue