There is an open issue in ember-cli-mirage that tries to bring filter
support for JSONAPI Serializer
. Unfortunately my tests needed this functionality now. More specifically they needed a fulltext filtering support.
Here is a solution I came up with.
First make sure that factories for all endpoints produce something that we can filter on. I simply created attribute fulltext
that returns a string of things that I want to filter on:
// mirage/factories/item.js import faker from "faker"; export default Factory.extend({ fulltext() { return `${this.name}`; }, name() { return faker.commerce.productName(); }, });
// mirage/factories/customer.js import { Factory } from "ember-cli-mirage"; import faker from "faker"; export default Factory.extend({ fulltext() { return `${this.firstName} ${this.lastName}`; }, firstName() { return faker.name.firstName(); }, lastName() { return faker.name.lastName(); }, });
Then teach mirage to filter on attribute filter
when querying for collections:
// mirage/config.js import Response from "ember-cli-mirage/response"; export default function() { this.namespace = "api/v1/"; this.get("/customers", fulltextFilter); this.get("/items", fulltextFilter); } function fulltextFilter(schema, request) { // example: request.url = '/api/v1/items?filter%5Bfulltext%5D=Automobil' // So we make it so that `subject = 'items'`. This way we can use this function for any endpoint let subject = request.url.split(/[/?]/)[3]; // If mirage got request for fulltext filter let fulltextParam = request.queryParams["filter[fulltext]"] if (fulltextParam) { // I'm making the search case in-sensitive let fulltextParamCI = fulltextParam.toLowerCase(); // Filter out from all the records return schema[subject].all().filter(function(record) { // Leave only those which `fulltext` attribute contain our string return record.attrs.fulltext.toLowerCase().indexOf(fulltextParamCI) !== -1; }); } // If no filter is applied, return all records for given `subject` return schema[subject].all(); }
Notes
- This is very primitive fulltext search, you might need to make it more fancy for your use-case.
- On the backend I'm using
jsonapi-resources@0.9.10
and I'm not exactly sure why it requires the query param as literal string offilter[fulltext]
and not nested array. Your API might be different.
Top comments (0)