Last active
March 6, 2025 23:16
-
-
Save bradjones1/18ff9ebdb85455f781a2a212577653ce to your computer and use it in GitHub Desktop.
Drupal JSON API URL Builder for orbit.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import {JSONAPIURLBuilder} from "@orbit/jsonapi"; | |
import {QueryExpressionParseError} from "@orbit/data"; | |
export default class DrupalJSONAPIURLBuilder extends JSONAPIURLBuilder { | |
buildFilterParam(filterSpecifiers) { | |
const filters = []; | |
filterSpecifiers.forEach((filterSpecifier, index) => { | |
if (filterSpecifier.kind === 'passthrough') { | |
const attributeFilter = filterSpecifier; | |
const resourceAttribute = this.serializeAttributeAsParam( | |
undefined, | |
attributeFilter.name | |
); | |
filters.push({ | |
[resourceAttribute]: attributeFilter.value, | |
}); | |
} else if (filterSpecifier.kind === 'location') { | |
const attributeFilter = filterSpecifier; | |
const resourceAttribute = this.serializeAttributeAsParam( | |
undefined, | |
attributeFilter.field | |
); | |
filters.push({ | |
location: { | |
[resourceAttribute]: { | |
lat: attributeFilter.lat, | |
lon: attributeFilter.lon, | |
radius: attributeFilter.radius, | |
} | |
} | |
}); | |
} else if (filterSpecifier.kind === 'attribute') { | |
const attributeFilter = filterSpecifier; | |
const resourceAttribute = this.serializeAttributeAsParam( | |
undefined, | |
attributeFilter.attribute | |
); | |
filters.push({ | |
['client-' + resourceAttribute + '-' + index]: { | |
path: resourceAttribute, | |
operator: attributeFilter.op, | |
value: attributeFilter.value | |
} | |
}); | |
} else if (filterSpecifier.kind === 'relatedRecord') { | |
const relatedRecordFilter = filterSpecifier; | |
if (Array.isArray(relatedRecordFilter.record)) { | |
filters.push({ | |
[relatedRecordFilter.relation]: relatedRecordFilter.record | |
.map((e) => e.id) | |
.join(',') | |
}); | |
} else { | |
filters.push({ | |
[relatedRecordFilter.relation]: relatedRecordFilter?.record?.id | |
}); | |
} | |
} else if (filterSpecifier.kind === 'relatedRecords') { | |
if (filterSpecifier.op !== 'equal') { | |
throw new Error( | |
`Operation "${filterSpecifier.op}" is not supported in JSONAPI for relatedRecords filtering` | |
); | |
} | |
const relatedRecordsFilter = filterSpecifier; | |
filters.push({ | |
[relatedRecordsFilter.relation]: relatedRecordsFilter.records | |
.map((e) => e.id) | |
.join(',') | |
}); | |
} else { | |
throw new QueryExpressionParseError( | |
`Filter operation ${filterSpecifier.op} not recognized for JSONAPISource.` | |
); | |
} | |
}); | |
return filters; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment