Skip to content

Commit

Permalink
Fix metadata handling on value save
Browse files Browse the repository at this point in the history
  • Loading branch information
TdyP committed Aug 25, 2023
1 parent 1decb39 commit ddd3793
Show file tree
Hide file tree
Showing 5 changed files with 174 additions and 113 deletions.
36 changes: 34 additions & 2 deletions apps/core/src/domain/record/recordDomain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import {IUtils} from 'utils/utils';
import * as Config from '_types/config';
import {IListWithCursor} from '_types/list';
import {IPreview} from '_types/preview';
import {IValue, IValuesOptions} from '_types/value';
import {IStandardValue, IValue, IValuesOptions} from '_types/value';
import PermissionError from '../../errors/PermissionError';
import ValidationError from '../../errors/ValidationError';
import {getPreviewUrl} from '../../utils/preview/preview';
Expand Down Expand Up @@ -1072,8 +1072,40 @@ export default function({

const forceArray = options?.forceArray ?? false;

//TODO: fix "[object]" on input after edit
let formattedValues = await Promise.all(
values.map(v => valueDomain.formatValue({attribute: attrProps, value: v, record, library, ctx}))
values.map(async v => {
const formattedValue = await valueDomain.formatValue({
attribute: attrProps,
value: v,
record,
library,
ctx
});

if (attrProps.metadata_fields && formattedValue.metadata) {
for (const metadataField of attrProps.metadata_fields) {
if (!formattedValue.metadata[metadataField]) {
continue;
}

const metadataAttributeProps = await attributeDomain.getAttributeProperties({
id: metadataField,
ctx
});

formattedValue.metadata[metadataField] = await valueDomain.runActionsList({
listName: ActionsListEvents.GET_VALUE,
attribute: metadataAttributeProps,
library,
value: formattedValue.metadata[metadataField] as IStandardValue,
ctx
});
}
}

return formattedValue;
})
);

// sort of flatMap cause _formatRecordValue can return multiple values for 1 input val (think heritage)
Expand Down
224 changes: 122 additions & 102 deletions apps/core/src/domain/value/valueDomain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ interface IDeps {
'core.domain.tree'?: ITreeDomain;
}

const valueDomain = function ({
const valueDomain = function({
config = null,
'core.domain.actionsList': actionsListDomain = null,
'core.domain.attribute': attributeDomain = null,
Expand Down Expand Up @@ -187,6 +187,57 @@ const valueDomain = function ({
}
};

const _formatValue = async ({attribute, value, record, library, ctx}) => {
let processedValue = {...value}; // Don't mutate given value

const isLinkAttribute =
attribute.type === AttributeTypes.SIMPLE_LINK || attribute.type === AttributeTypes.ADVANCED_LINK;

if (isLinkAttribute && attribute.linked_library) {
const linkValue = processedValue.value
? {...processedValue.value, library: processedValue.value.library ?? attribute.linked_library}
: null;
processedValue = {...value, value: linkValue};
}

processedValue.attribute = attribute.id;

// Format metadata values as well
if ((attribute.metadata_fields ?? []).length) {
const metadataValuesFormatted = await attribute.metadata_fields.reduce(
async (allValuesProm, metadataField) => {
const allValues = await allValuesProm;
try {
const metadataAttributeProps = await attributeDomain.getAttributeProperties({
id: metadataField,
ctx
});

allValues[metadataField] =
typeof value.metadata?.[metadataField] !== 'undefined'
? await _formatValue({
attribute: metadataAttributeProps,
value: {value: value.metadata?.[metadataField]},
record,
library,
ctx
})
: null;
} catch (err) {
logger.error(err);
allValues[metadataField] = null;
}

return allValues;
},
Promise.resolve({})
);
processedValue.metadata = metadataValuesFormatted;
}

return processedValue;
};

const _executeDeleteValue = async ({library, recordId, attribute, value, ctx}: IDeleteValueParams) => {
// Check permission
const canUpdateRecord = await recordPermissionDomain.getRecordPermission({
Expand Down Expand Up @@ -303,6 +354,71 @@ const valueDomain = function ({
return res;
};

const _executeSaveValue = async (
library: string,
record: IRecord,
attribute: IAttribute,
value: IValue,
ctx: IQueryInfos
) => {
const savedVal = await saveOneValue(
library,
record.id,
attribute,
value,
{
valueRepo,
recordRepo,
treeRepo,
getDefaultElementHelper,
actionsListDomain,
attributeDomain,
versionProfileDomain
},
ctx
);

// Apply actions list on value

let processedValue = await _runActionsList({
listName: ActionsListEvents.GET_VALUE,
value: savedVal,
attribute,
record,
library,
ctx
});

processedValue = await _formatValue({
attribute,
value: processedValue,
record,
library,
ctx
});

// Runs actionsList on metadata values as well
if (attribute.metadata_fields?.length && processedValue.metadata) {
for (const metadataField of attribute.metadata_fields) {
const metadataAttributeProps = await attributeDomain.getAttributeProperties({
id: metadataField,
ctx
});

processedValue.metadata[metadataField] = await _runActionsList({
listName: ActionsListEvents.GET_VALUE,
value: processedValue.metadata[metadataField] as IStandardValue,
attribute: metadataAttributeProps,
record,
library,
ctx
});
}
}

return savedVal;
};

return {
async getValues({library, recordId, attribute, options, ctx}): Promise<IValue[]> {
await validate.validateLibrary(library, ctx);
Expand Down Expand Up @@ -472,22 +588,7 @@ const valueDomain = function ({
ctx
});

const savedVal = await saveOneValue(
library,
recordId,
attributeProps,
valueToSave,
{
valueRepo,
recordRepo,
treeRepo,
getDefaultElementHelper,
actionsListDomain,
attributeDomain,
versionProfileDomain
},
ctx
);
const savedVal = await _executeSaveValue(library, record, attributeProps, valueToSave, ctx);

await eventsManager.sendDatabaseEvent(
{
Expand Down Expand Up @@ -515,7 +616,7 @@ const valueDomain = function ({
});

// Apply formating
processedValue = await this.formatValue({
processedValue = await _formatValue({
attribute: attributeProps,
value: processedValue,
record,
Expand Down Expand Up @@ -629,22 +730,7 @@ const valueDomain = function ({
value: valToSave,
ctx
})
: await saveOneValue(
library,
recordId,
attributeProps,
valToSave,
{
valueRepo,
recordRepo,
treeRepo,
getDefaultElementHelper,
actionsListDomain,
attributeDomain,
versionProfileDomain
},
ctx
);
: await _executeSaveValue(library, record, attributeProps, valToSave, ctx);

// TODO: get old value ?
await eventsManager.sendDatabaseEvent(
Expand All @@ -660,24 +746,7 @@ const valueDomain = function ({
ctx
);

let processedValue = await _runActionsList({
listName: ActionsListEvents.GET_VALUE,
value: savedVal,
attribute: attributeProps,
record: {id: recordId},
library,
ctx
});

processedValue = await this.formatValue({
attribute: attributeProps,
value: processedValue,
record,
library,
ctx
});

prevRes.values.push(processedValue);
prevRes.values.push(savedVal);
} catch (e) {
if (
!e.type ||
Expand Down Expand Up @@ -717,56 +786,7 @@ const valueDomain = function ({

return _executeDeleteValue({library, recordId, attribute, value, ctx});
},
async formatValue({attribute, value, record, library, ctx}) {
let processedValue = {...value}; // Don't mutate given value

const isLinkAttribute =
attribute.type === AttributeTypes.SIMPLE_LINK || attribute.type === AttributeTypes.ADVANCED_LINK;

if (isLinkAttribute && attribute.linked_library) {
const linkValue = processedValue.value
? {...processedValue.value, library: processedValue.value.library ?? attribute.linked_library}
: null;
processedValue = {...value, value: linkValue};
}

processedValue.attribute = attribute.id;

// Format metadata values as well
if ((attribute.metadata_fields ?? []).length) {
const metadataValuesFormatted = await attribute.metadata_fields.reduce(
async (allValuesProm, metadataField) => {
const allValues = await allValuesProm;
try {
const metadataAttributeProps = await attributeDomain.getAttributeProperties({
id: metadataField,
ctx
});

allValues[metadataField] =
typeof value.metadata?.[metadataField] !== 'undefined'
? await this.formatValue({
attribute: metadataAttributeProps,
value: {value: value.metadata?.[metadataField]},
record,
library,
ctx
})
: null;
} catch (err) {
logger.error(err);
allValues[metadataField] = null;
}

return allValues;
},
Promise.resolve({})
);
processedValue.metadata = metadataValuesFormatted;
}

return processedValue;
},
formatValue: _formatValue,
runActionsList: _runActionsList
};
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ function StandardField({

let resultValue;
if (state.metadataEdit) {
const value =
const metadataValue =
(submitResValue.metadata ?? []).find(({name}) => name === element.attribute.id)?.value ?? null;
resultValue = {
id_value: null,
Expand All @@ -124,8 +124,8 @@ function StandardField({
created_by: null,
modified_by: null,
version: null,
raw_value: value,
value,
raw_value: metadataValue.raw_value ?? metadataValue.value,
value: metadataValue.value,
metadata: null,
attribute
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,14 @@ function EditRecordModal({
attribute: value.attribute,
metadata: value.metadata
? Object.keys(value.metadata).reduce((metadata, metadataAttributeId) => {
metadata.push({name: metadataAttributeId, value: value.metadata[metadataAttributeId]});
metadata.push({
name: metadataAttributeId,
value: {
id_value: null,
value: value.metadata[metadataAttributeId],
raw_value: value.metadata[metadataAttributeId]
}
});
return metadata;
}, [])
: null
Expand Down
Loading

0 comments on commit ddd3793

Please sign in to comment.