Skip to content

Instantly share code, notes, and snippets.

@fluxynet
Last active February 19, 2020 12:36
Show Gist options
  • Select an option

  • Save fluxynet/a2f1b6382f82464d73c65ea80a3b5aa8 to your computer and use it in GitHub Desktop.

Select an option

Save fluxynet/a2f1b6382f82464d73c65ea80a3b5aa8 to your computer and use it in GitHub Desktop.
Chainable URL Query Builder
function QueryBuilder(url) {
return {
state: {
sort: {},
limit: -1,
offset: -1,
filters: {}
},
sort(field, asc = true) {
this.state.sort[field] = asc;
return this;
},
sortDesc(field) {
return this.sort(field, false);
},
limit(limit) {
this.state.limit = limit;
return this;
},
offset(offset) {
this.state.offset = offset;
return this;
},
filter(field, value) {
this.state.filters[field] = value;
return this;
},
filterBefore(field, value) {
field += ".before";
this.state.filters[field] = value;
return this;
},
filterAfter(field, value) {
field += ".after";
this.state.filters[field] = value;
return this;
},
query() {
let fragments = [];
const filters = Object.keys(this.state.filters);
for (let i = 0; i < filters.length; i++) {
let fragment = encodeURIComponent(filters[i]) + "=" + encodeURIComponent(this.state.filters[filters[i]]);
fragments.push(fragment)
}
const sorts = Object.keys(this.state.sort);
const sort = [];
for (let i = 0; i < sorts.length; i++) {
let suffix;
if (this.state.sort[sorts[i]]) {
suffix = ".asc";
} else {
suffix = ".desc";
}
sort.push(encodeURIComponent(sorts[i] + suffix));
}
if (sort.length) {
fragments.push("sort=" + sort.join(","));
}
if (this.state.offset > -1) {
fragments.push("offset=" + this.state.offset);
}
if (this.state.limit > -1) {
fragments.push("limit=" + this.state.limit);
}
let query = url;
if (fragments.length) {
query += "?" + fragments.join("&")
}
return query;
},
execute() {
return fetch(this.query());
}
}
}
let query = QueryBuilder("http://127.0.0.1/programmes");
let v = query.offset(10).limit(5).filter("name", "John").filterBefore("start_at", "2019-12-03T11:00").sort("name").sortDesc("age").query();
console.log(v);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment