52 lines
1.2 KiB
JavaScript
52 lines
1.2 KiB
JavaScript
|
import {
|
||
|
findRoot,
|
||
|
getFlattenedHierarchy,
|
||
|
fieldReversesReferenceToIndex,
|
||
|
isRecord
|
||
|
} from "./hierarchy"
|
||
|
import { $ } from "../common"
|
||
|
import { map, filter, reduce } from "lodash/fp"
|
||
|
|
||
|
export const canDeleteIndex = indexNode => {
|
||
|
const flatHierarchy = $(indexNode, [
|
||
|
findRoot,
|
||
|
getFlattenedHierarchy
|
||
|
])
|
||
|
|
||
|
const reverseIndexes = $(flatHierarchy,[
|
||
|
filter(isRecord),
|
||
|
reduce((obj, r) => {
|
||
|
for (let field of r.fields) {
|
||
|
if (fieldReversesReferenceToIndex(indexNode)(field)) {
|
||
|
obj.push({ ...field, record:r })
|
||
|
}
|
||
|
}
|
||
|
return obj
|
||
|
},[]),
|
||
|
map(f => `field ${f.name} on record ${f.record.name} uses this index as a reference`)
|
||
|
])
|
||
|
|
||
|
const lookupIndexes = $(flatHierarchy,[
|
||
|
filter(isRecord),
|
||
|
reduce((obj, r) => {
|
||
|
for (let field of r.fields) {
|
||
|
if (field.type === "reference"
|
||
|
&& field.typeOptions.indexNodeKey === indexNode.nodeKey()) {
|
||
|
obj.push({ ...field, record:r })
|
||
|
}
|
||
|
}
|
||
|
return obj
|
||
|
},[]),
|
||
|
map(f => `field ${f.name} on record ${f.record.name} uses this index as a lookup`)
|
||
|
])
|
||
|
|
||
|
const errors = [
|
||
|
...reverseIndexes,
|
||
|
...lookupIndexes
|
||
|
]
|
||
|
|
||
|
return {
|
||
|
canDelete: errors.length === 0,
|
||
|
errors
|
||
|
}
|
||
|
}
|