[MessageBus] refactoring of getProcess* methods

This commit is contained in:
Sosthene 2025-09-11 09:05:26 +02:00
parent ad78491a90
commit e9f1d3991d

View File

@ -369,179 +369,112 @@ export default class MessageBus {
} }
// Returns all processes details, including processes we only have public data for // Returns all processes details, including processes we only have public data for
public getAllProcessesDecoded(filterPublicValues: (publicValues: { [key: string]: any }) => boolean): Promise<any[]> { public getAllProcessesDecoded(filterData: (processId: string, data: { [key: string]: any }) => boolean): Promise<{ [processId: string]: { [key: string]: any } }> {
return new Promise<any[]>((resolve: (processesDecoded: any[]) => void, reject: (error: string) => void) => { return this.getAllProcesses().then((processes: { [processId: string]: any }) => this.getProcessesDecodedInternal(
this.getAllProcesses().then(async (processes: any) => { processes,
const processesDecoded: any[] = []; filterData,
));
for (const processId of Object.keys(processes)) {
const process = processes[processId];
if (!process.states) {
continue;
}
const publicDataDecoded: { [key: string]: any } = {};
for (let stateId = 0; stateId < process.states.length - 1; stateId++) {
const state = process.states[stateId];
if (!state) {
continue;
}
const publicDataEncoded = state.public_data;
if (!publicDataEncoded) {
continue;
}
for (const key of Object.keys(publicDataEncoded)) {
publicDataDecoded[key] = await this.getPublicData(publicDataEncoded[key]);
}
}
if (!filterPublicValues(publicDataDecoded)) {
continue;
}
let processDecoded: any;
for (let stateId = 0; stateId < process.states.length - 1; stateId++) {
const lastState = process.states[stateId];
if (!lastState) {
continue;
}
const lastStateId = lastState.state_id;
if (!lastStateId) {
continue;
}
try {
let processData = await this.getData(processId, lastStateId);
if (!processData) {
continue;
}
const isEmpty = Object.keys(processData).length === 0;
if (isEmpty) {
continue;
}
for (const key of Object.keys(publicDataDecoded)) {
processData[key] = publicDataDecoded[key];
}
processData = MapUtils.toJson(processData);
if (!processDecoded) {
processDecoded = {
processId,
lastStateId,
processData,
};
} else {
for (const key of Object.keys(processData)) {
processDecoded.processData[key] = processData[key];
}
processDecoded.lastStateId = lastStateId;
}
} catch (error) {
console.error(error);
}
}
processesDecoded.push(processDecoded);
}
resolve(processesDecoded);
}).catch(reject);
});
} }
// Returns details about processes that we are involved in // Returns details about processes that we are involved in
public getProcessesDecoded(filterPublicValues: (publicValues: { [key: string]: any }) => boolean): Promise<any[]> { public getProcessesDecoded(filterData: (processId: string, data: { [key: string]: any }) => boolean): Promise<{ [processId: string]: { [key: string]: any } }> {
return new Promise<any[]>((resolve: (processesDecoded: any[]) => void, reject: (error: string) => void) => { return this.getProcesses().then((processes: { [processId: string]: any }) => this.getProcessesDecodedInternal(
this.getProcesses().then(async (processes: any) => { processes,
const processesDecoded: any[] = []; filterData,
));
}
// Returns the data of any process we have the id for
public getProcessData(processId: string): Promise<{ [key: string]: any }> {
return this.getAllProcesses().then((processes: { [processId: string]: any }) => this.getProcessesDecodedInternal(
{ [processId]: processes[processId] },
() => true, // We don't filter
));
}
/**
* Internal method that handles the common logic for both getProcessesDecoded and getAllProcessesDecoded
* @param processes - Processes to decode
* @param filterData - Filter function for all data (public + private)
* @returns Promise with decoded processes map
*/
private async getProcessesDecodedInternal(
processes: { [processId: string]: { states: any[] } },
filterData: (processId: string, data: { [key: string]: any }) => boolean
): Promise<{ [processId: string]: { [key: string]: any } }> {
const processesDecoded: { [processId: string]: { [key: string]: any } } = {};
for (const processId of Object.keys(processes)) { for (const processId of Object.keys(processes)) {
const process = processes[processId]; const process = processes[processId];
if (!process.states) { if (!process || !process.states) {
continue;
}
// We get the last commited state
const lastCommitedStateIndex = process.states.findLastIndex((state: any) => state.commited_in !== process.states[process.states.length - 1].commited_in);
const lastCommitedState = process.states[lastCommitedStateIndex];
if (!lastCommitedState) {
continue; continue;
} }
const publicDataDecoded: { [key: string]: any } = {}; const publicDataDecoded: { [key: string]: any } = {};
// We simply take the public data from the last commited state
for (let stateId = 0; stateId < process.states.length - 1; stateId++) { const publicDataEncoded = lastCommitedState.public_data;
const state = process.states[stateId];
if (!state) {
continue;
}
const publicDataEncoded = state.public_data;
if (!publicDataEncoded) { if (!publicDataEncoded) {
continue; continue;
} }
try {
for (const key of Object.keys(publicDataEncoded)) { for (const key of Object.keys(publicDataEncoded)) {
publicDataDecoded[key] = await this.getPublicData(publicDataEncoded[key]); publicDataDecoded[key] = await this.getPublicData(publicDataEncoded[key]);
} }
} catch (error) {
console.error(error);
} }
if (!filterPublicValues(publicDataDecoded)) { const processData = publicDataDecoded;
// Process all states backward to build the final decoded object
for (let stateIndex = lastCommitedStateIndex; stateIndex >= 0; stateIndex--) {
const state = process.states[stateIndex];
if (!state) {
continue; continue;
} }
let processDecoded: any; const stateId = state.state_id;
if (!stateId) {
for (let stateId = 0; stateId < process.states.length - 1; stateId++) {
const lastState = process.states[stateId];
if (!lastState) {
continue;
}
const lastStateId = lastState.state_id;
if (!lastStateId) {
continue; continue;
} }
try { try {
let processData = await this.getData(processId, lastStateId); const stateData = await this.getData(processId, stateId);
if (!processData) { if (!stateData || Object.keys(stateData).length === 0) {
continue; continue;
} }
const isEmpty = Object.keys(processData).length === 0; for (const key of Object.keys(stateData)) {
if (isEmpty) { // If we already have the key, it means the same data was update in a later state, so don't overwrite it
if (processData[key]) {
continue; continue;
}
for (const key of Object.keys(publicDataDecoded)) {
processData[key] = publicDataDecoded[key];
}
processData = MapUtils.toJson(processData);
if (!processDecoded) {
processDecoded = {
processId,
lastStateId,
processData,
};
} else { } else {
for (const key of Object.keys(processData)) { processData[key] = stateData[key];
processDecoded.processData[key] = processData[key];
} }
processDecoded.lastStateId = lastStateId;
} }
} catch (error) { } catch (error) {
console.error(error); console.error(error);
} }
} }
processesDecoded.push(processDecoded); // filter data if needed
if (filterData && !filterData(processId, processData)) {
continue;
} }
resolve(processesDecoded); processesDecoded[processId] = processData;
}).catch(reject); }
});
return processesDecoded;
} }
public createProcess(processData: any, privateFields: string[], roles: {}): Promise<any> { public createProcess(processData: any, privateFields: string[], roles: {}): Promise<any> {