fix(revision): fix cron job to delete old revisions

This function did not use the new database datetime functions and therefore did not correctly work.

Signed-off-by: Philip Molares <philip.molares@udo.edu>
This commit is contained in:
Philip Molares
2026-01-08 00:14:53 +01:00
committed by Erik Michelson
parent 17ba34567d
commit 72149d49a5
2 changed files with 43 additions and 18 deletions
@@ -535,10 +535,12 @@ describe('RevisionsService', () => {
describe('removeOldRevisions', () => {
const now = 1758653425;
let expectedDateTime: string;
beforeEach(() => {
jest.useFakeTimers();
jest.setSystemTime(now);
noteConfig.revisionRetentionDays = 1;
expectedDateTime = dateTimeToDB(getCurrentDateTime().minus({ days: 1 }));
});
afterEach(() => {
jest.useRealTimers();
@@ -550,9 +552,16 @@ describe('RevisionsService', () => {
});
it("doesn't update if no revisions were removed", async () => {
mockDelete(tracker, TableRevision, [FieldNameRevision.createdAt], []);
mockSelect(
tracker,
[FieldNameRevision.noteId],
TableRevision,
[FieldNameRevision.createdAt],
[],
);
await service.removeOldRevisions();
expectBindings(tracker, 'delete', [[now - 24 * 60 * 60 * 1000]]);
expectBindings(tracker, 'select', [], false, true);
expectBindings(tracker, 'delete', [[expectedDateTime]]);
expectBindings(tracker, 'select', [[expectedDateTime]]);
});
it('updates notes if revisions were deleted', async () => {
// The typecast is required since jest does not see all signatures of the mocked function
@@ -572,6 +581,17 @@ describe('RevisionsService', () => {
},
],
);
mockSelect(
tracker,
[FieldNameRevision.noteId],
TableRevision,
[FieldNameRevision.createdAt],
[
{
[FieldNameRevision.noteId]: mockNoteId,
},
],
);
mockSelect(
tracker,
[
@@ -606,8 +626,12 @@ describe('RevisionsService', () => {
1,
);
await service.removeOldRevisions();
expectBindings(tracker, 'delete', [[now - 24 * 60 * 60 * 1000]]);
expectBindings(tracker, 'select', [[mockNoteId, true]]);
expectBindings(tracker, 'delete', [[expectedDateTime]]);
expectBindings(tracker, 'select', [
[expectedDateTime],
[mockNoteId, true],
]);
expectBindings(tracker, 'update', [
[
`${mockPatch}\n${mockPrimaryAlias}\n\n${mockContent1}`,
+15 -14
View File
@@ -478,36 +478,37 @@ export class RevisionsService {
* Deletes old revisions except the latest one if the clean-up is enabled
*/
async removeOldRevisions(): Promise<void> {
const currentTime = new Date().getTime();
const currentTime = getCurrentDateTime();
const revisionRetentionDays: number = this.noteConfig.revisionRetentionDays;
if (revisionRetentionDays <= 0) {
return;
}
const revisionRetentionMilliSeconds =
revisionRetentionDays * 24 * 60 * 60 * 1000;
const oldestRevisionToKeepTime = currentTime.minus({
days: revisionRetentionDays,
});
const oldestRevisionToKeepDBTime = dateTimeToDB(oldestRevisionToKeepTime);
await this.knex.transaction(async (transaction) => {
// Delete old revisions
const noteIdsWhereRevisionWereDeleted = await transaction(TableRevision)
.where(
FieldNameRevision.createdAt,
'<=',
currentTime - revisionRetentionMilliSeconds,
)
.delete(FieldNameRevision.noteId);
const noteIdsWhereRevisionsAreDeleted = await transaction(TableRevision)
.select(FieldNameRevision.noteId)
.where(FieldNameRevision.createdAt, '<=', oldestRevisionToKeepDBTime);
await transaction(TableRevision)
.where(FieldNameRevision.createdAt, '<=', oldestRevisionToKeepDBTime)
.delete();
this.logger.log(
`${noteIdsWhereRevisionWereDeleted.length} old revisions were removed from the DB`,
`${noteIdsWhereRevisionsAreDeleted.length} old revisions were removed from the DB`,
'removeOldRevisions',
);
if (noteIdsWhereRevisionWereDeleted.length === 0) {
if (noteIdsWhereRevisionsAreDeleted.length === 0) {
return;
}
const uniqueNoteIds = Array.from(
new Set(
noteIdsWhereRevisionWereDeleted.map(
noteIdsWhereRevisionsAreDeleted.map(
(entry) => entry[FieldNameRevision.noteId],
),
),