UNPKG

strapi-plugin-parent-child-relationships

Version:

Strapi plugin to create and manage parent-child relationships between content types using custom fields

114 lines (94 loc) 2.87 kB
const val = (value) => value && value !== ""; const currentChildColumnsFilter = (entity, currentColumns, childColumns) => { const result = {} if (!val(currentColumns) || !val(childColumns)) return result const current_columns = currentColumns.split(' ') const child_columns = childColumns.split(' ') if (current_columns.length === child_columns.length) { result['filter'] = {} current_columns.forEach((current_column, idx) => { if (val(current_column) && val(child_columns[idx])) { result.filter[child_columns[idx]] = entity[current_column] } }) } return result } const onlyIdName = (entity, mainField) => { if (mainField) { return { id: entity.id, [mainField.name]: entity[mainField.name], }; } if (entity.name) { return { id: entity.id, name: entity.name }; } return entity; }; const entityColumnsFilter = (entity, current_column, child_column) => val(current_column) && val(child_column) ? { filter: { [child_column]: entity[current_column] } } : {}; const entityCommonTableFilter = (entity, common_relational_table) => val(common_relational_table) && entity[common_relational_table]?.id ? { filter: { [common_relational_table]: entity[common_relational_table].id, }, } : {}; const parentSelectedId = (parentData) => val(parentData?.selectedValue?.id) ? { parentSelectedId: parentData.selectedValue.id, } : {}; const splitKeyValueStr = (key_value_str = "") => { // Define a regular expression that matches either ":" or ": ". const [key, value] = key_value_str.split(/:\s?/); return [key, value]; }; const params = (entity, optionsParams = {}) => { const { db_columns, statics } = optionsParams; const paramsToReturn = {}; // TODO: write better: optimize DRY if (db_columns) { const result = {}; db_columns.forEach((key_value_str) => { const [key, value] = splitKeyValueStr(key_value_str); result[value] = { $eq: entity[key] }; }); paramsToReturn["params"] = { db_columns: result }; } if (statics) { const result = {}; statics.forEach((key_value_str) => { const [key, value] = splitKeyValueStr(key_value_str); result[value] = { $eq: key }; }); paramsToReturn["params"] = { ...paramsToReturn.params, statics: result }; } return paramsToReturn; }; const entityFilters = ({ entity, current_column, child_column, common_relational_table, parentData, mainField, optionsParams, }) => { return { ...onlyIdName(entity, mainField), ...currentChildColumnsFilter(entity, current_column, child_column), ...entityCommonTableFilter(entity, common_relational_table), ...parentSelectedId(parentData), ...params(entity, optionsParams), }; }; module.exports = { val, entityFilters, };