Skip to content

Instantly share code, notes, and snippets.

@bradjones1
Last active January 12, 2022 22:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bradjones1/18ff9ebdb85455f781a2a212577653ce to your computer and use it in GitHub Desktop.
Save bradjones1/18ff9ebdb85455f781a2a212577653ce to your computer and use it in GitHub Desktop.
Drupal JSON API URL Builder for orbit.js
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