Purge playbooks data when the plugin gets disabled (#8989) (#9002)

* Purge playbooks data when the plugin gets disabled

* Address copilot comments

(cherry picked from commit b925baa21b)

Co-authored-by: Daniel Espino García <larkox@gmail.com>
This commit is contained in:
Mattermost Build 2025-07-17 13:18:06 +03:00 committed by GitHub
parent 46ca08b939
commit db38aabd14
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 77 additions and 0 deletions

View file

@ -3,6 +3,7 @@
import {SYSTEM_IDENTIFIERS} from '@constants/database';
import DatabaseManager from '@database/manager';
import {PLAYBOOK_TABLES} from '@playbooks/constants/database';
import {querySystemValue} from '@queries/servers/system';
import {setPlaybooksVersion} from './version';
@ -46,4 +47,53 @@ describe('setPlaybooksVersion', () => {
expect(error).toBeTruthy();
operator.handleSystem = originalHandleSystem;
});
it('should purge playbooks when version is empty', async () => {
const database = operator.database;
jest.spyOn(database.adapter, 'unsafeExecute').mockImplementation(() => {
return Promise.resolve();
});
const {data, error} = await setPlaybooksVersion(serverUrl, '');
expect(error).toBeUndefined();
expect(data).toBe(true);
expect(database.adapter.unsafeExecute).toHaveBeenCalledWith({
sqls: [
[`DELETE FROM ${PLAYBOOK_TABLES.PLAYBOOK_RUN}`, []],
[`DELETE FROM ${PLAYBOOK_TABLES.PLAYBOOK_CHECKLIST}`, []],
[`DELETE FROM ${PLAYBOOK_TABLES.PLAYBOOK_CHECKLIST_ITEM}`, []],
],
});
});
it('should not purge playbooks when version is not empty', async () => {
const database = operator.database;
jest.spyOn(database.adapter, 'unsafeExecute').mockImplementation(() => {
return Promise.resolve();
});
const {data, error} = await setPlaybooksVersion(serverUrl, '1.2.3');
expect(error).toBeUndefined();
expect(data).toBe(true);
expect(database.adapter.unsafeExecute).not.toHaveBeenCalled();
});
it('should handle purge playbooks errors', async () => {
const database = operator.database;
jest.spyOn(database.adapter, 'unsafeExecute').mockImplementation(() => {
return Promise.reject(new Error('fail'));
});
const {error} = await setPlaybooksVersion(serverUrl, '');
expect(error).toBeTruthy();
expect(database.adapter.unsafeExecute).toHaveBeenCalledWith({
sqls: [
[`DELETE FROM ${PLAYBOOK_TABLES.PLAYBOOK_RUN}`, []],
[`DELETE FROM ${PLAYBOOK_TABLES.PLAYBOOK_CHECKLIST}`, []],
[`DELETE FROM ${PLAYBOOK_TABLES.PLAYBOOK_CHECKLIST_ITEM}`, []],
],
});
});
});

View file

@ -3,6 +3,7 @@
import {SYSTEM_IDENTIFIERS} from '@constants/database';
import DatabaseManager from '@database/manager';
import {PLAYBOOK_TABLES} from '@playbooks/constants/database';
export const setPlaybooksVersion = async (serverUrl: string, version: string) => {
try {
@ -15,8 +16,34 @@ export const setPlaybooksVersion = async (serverUrl: string, version: string) =>
prepareRecordsOnly: false,
});
if (version === '') {
const {error} = await purgePlaybooks(serverUrl);
if (error) {
return {error};
}
}
return {data: true};
} catch (error) {
return {error};
}
};
const purgePlaybooks = async (serverUrl: string) => {
try {
const {database} = DatabaseManager.getServerDatabaseAndOperator(serverUrl);
await database.write(() => {
return database.adapter.unsafeExecute({
sqls: [
[`DELETE FROM ${PLAYBOOK_TABLES.PLAYBOOK_RUN}`, []],
[`DELETE FROM ${PLAYBOOK_TABLES.PLAYBOOK_CHECKLIST}`, []],
[`DELETE FROM ${PLAYBOOK_TABLES.PLAYBOOK_CHECKLIST_ITEM}`, []],
],
});
});
} catch (error) {
return {error};
}
return {data: true};
};