[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
public getAllProcessesDecoded(filterPublicValues: (publicValues: { [key: string]: any }) => boolean): Promise<any[]> {
return new Promise<any[]>((resolve: (processesDecoded: any[]) => void, reject: (error: string) => void) => {
this.getAllProcesses().then(async (processes: any) => {
const processesDecoded: any[] = [];
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);
});
public getAllProcessesDecoded(filterData: (processId: string, data: { [key: string]: any }) => boolean): Promise<{ [processId: string]: { [key: string]: any } }> {
return this.getAllProcesses().then((processes: { [processId: string]: any }) => this.getProcessesDecodedInternal(
processes,
filterData,
));
}
// Returns details about processes that we are involved in
public getProcessesDecoded(filterPublicValues: (publicValues: { [key: string]: any }) => boolean): Promise<any[]> {
return new Promise<any[]>((resolve: (processesDecoded: any[]) => void, reject: (error: string) => void) => {
this.getProcesses().then(async (processes: any) => {
const processesDecoded: any[] = [];
public getProcessesDecoded(filterData: (processId: string, data: { [key: string]: any }) => boolean): Promise<{ [processId: string]: { [key: string]: any } }> {
return this.getProcesses().then((processes: { [processId: string]: any }) => this.getProcessesDecodedInternal(
processes,
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)) {
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;
}
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 state = process.states[stateId];
if (!state) {
continue;
}
const publicDataEncoded = state.public_data;
const publicDataEncoded = lastCommitedState.public_data;
if (!publicDataEncoded) {
continue;
}
try {
for (const key of Object.keys(publicDataEncoded)) {
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;
}
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) {
const stateId = state.state_id;
if (!stateId) {
continue;
}
try {
let processData = await this.getData(processId, lastStateId);
if (!processData) {
const stateData = await this.getData(processId, stateId);
if (!stateData || Object.keys(stateData).length === 0) {
continue;
}
const isEmpty = Object.keys(processData).length === 0;
if (isEmpty) {
for (const key of Object.keys(stateData)) {
// 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;
}
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];
processData[key] = stateData[key];
}
processDecoded.lastStateId = lastStateId;
}
} catch (error) {
console.error(error);
}
}
processesDecoded.push(processDecoded);
// filter data if needed
if (filterData && !filterData(processId, processData)) {
continue;
}
resolve(processesDecoded);
}).catch(reject);
});
processesDecoded[processId] = processData;
}
return processesDecoded;
}
public createProcess(processData: any, privateFields: string[], roles: {}): Promise<any> {