[bug] fix updateProcess
This commit is contained in:
parent
c2a4b598a7
commit
929e7ee36d
@ -568,16 +568,12 @@ export async function registerAllListeners() {
|
|||||||
try {
|
try {
|
||||||
// privateFields is only used if newData contains new fields
|
// privateFields is only used if newData contains new fields
|
||||||
// roles can be empty meaning that roles from the last commited state are kept
|
// roles can be empty meaning that roles from the last commited state are kept
|
||||||
const { processId, lastStateId, newData, privateFields, roles, accessToken } = event.data;
|
const { processId, newData, privateFields, roles, accessToken } = event.data;
|
||||||
|
|
||||||
if (!accessToken || await !tokenService.validateToken(accessToken, event.origin)) {
|
if (!accessToken || await !tokenService.validateToken(accessToken, event.origin)) {
|
||||||
throw new Error('Invalid or expired session token');
|
throw new Error('Invalid or expired session token');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isValid32ByteHex(lastStateId)) {
|
|
||||||
throw new Error('Invalid last state id');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the new data is already in the process or if it's a new field
|
// Check if the new data is already in the process or if it's a new field
|
||||||
const process = await services.getProcess(processId);
|
const process = await services.getProcess(processId);
|
||||||
if (!process) {
|
if (!process) {
|
||||||
@ -587,36 +583,50 @@ export async function registerAllListeners() {
|
|||||||
if (!lastState) {
|
if (!lastState) {
|
||||||
throw new Error('Process doesn\'t have a commited state yet');
|
throw new Error('Process doesn\'t have a commited state yet');
|
||||||
}
|
}
|
||||||
if (lastState.state_id !== lastStateId) {
|
const lastStateIndex = services.getLastCommitedStateIndex(process);
|
||||||
throw new Error('Process has been updated');
|
if (lastStateIndex === null) {
|
||||||
}
|
throw new Error('Process doesn\'t have a commited state yet');
|
||||||
console.log('🚀 ~ handleUpdateProcess ~ lastState:', lastState);
|
} // Shouldn't happen
|
||||||
|
|
||||||
const privateData: Record<string, any> = {};
|
const privateData: Record<string, any> = {};
|
||||||
const publicData: Record<string, any> = {};
|
const publicData: Record<string, any> = {};
|
||||||
|
|
||||||
for (const field of Object.keys(newData)) {
|
for (const field of Object.keys(newData)) {
|
||||||
console.log('🚀 ~ handleUpdateProcess ~ newData[field]:', newData[field]);
|
console.log('🚀 ~ handleUpdateProcess ~ newData[field]:', newData[field]);
|
||||||
if (lastState.pcd_commitment[field]) {
|
// Public data are carried along each new state
|
||||||
// is it a private field ?
|
// So the first thing we can do is check if the new data is public data
|
||||||
if (lastState.public_data[field]) {
|
if (lastState.public_data[field]) {
|
||||||
// Add it to public data
|
// Add it to public data
|
||||||
publicData[field] = newData[field];
|
publicData[field] = newData[field];
|
||||||
} else {
|
continue;
|
||||||
// Add it to private data
|
|
||||||
privateData[field] = newData[field];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// is it supposed to be private ?
|
|
||||||
if (privateFields.includes(field)) {
|
|
||||||
// Add it to private data
|
|
||||||
privateData[field] = newData[field];
|
|
||||||
} else {
|
|
||||||
// Add it to public data
|
|
||||||
publicData[field] = newData[field];
|
|
||||||
}
|
|
||||||
// For new fields we should check that roles have been modified accordingly, otherwise the state would be impossible to commit
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If it's not a public data, it may be either a private data update, or a new field (public of private)
|
||||||
|
// Caller gave us a list of new private fields, if we see it here this is a new private field
|
||||||
|
if (privateFields.includes(field)) {
|
||||||
|
// Add it to private data
|
||||||
|
privateData[field] = newData[field];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now it can be an update of private data or a new public data
|
||||||
|
// We check that the field exists in previous states private data
|
||||||
|
for (let i = lastStateIndex; i >= 0; i--) {
|
||||||
|
const state = process.states[i];
|
||||||
|
if (state.pcd_commitment[field]) {
|
||||||
|
// We don't even check if it's a public field, we would have seen it in the last state
|
||||||
|
privateData[field] = newData[field];
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
// This attribute was not modified in that state, we go back to the previous state
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (privateData[field]) continue;
|
||||||
|
|
||||||
|
// We've get back all the way to the first state without seeing it, it's a new public field
|
||||||
|
publicData[field] = newData[field];
|
||||||
}
|
}
|
||||||
|
|
||||||
// We'll let the wasm check if roles are consistent
|
// We'll let the wasm check if roles are consistent
|
||||||
|
Loading…
x
Reference in New Issue
Block a user