Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CreatedAt search with date range in listHandler #296

Open
alsabbahy opened this issue May 12, 2022 · 3 comments
Open

CreatedAt search with date range in listHandler #296

alsabbahy opened this issue May 12, 2022 · 3 comments

Comments

@alsabbahy
Copy link

Hello, I've been trying to add the dateRange to rest-hapi querying. And I was wondering if you've had already implemented it or it exists to query with date range for field attribute like "createdAt".

@bitbay
Copy link

bitbay commented May 12, 2022

Isn't this akin to what's mentioned at mongoose tutorials on working with dates - querying?

Users.find({ createdAt: { $gte: '2009-01-02', $lte: '2022-05-12' } }).
  then(users => {
    //
});

EDIT: My bad, was missing the "in listHandler" part from the title. 🤦

@JKHeadley
Copy link
Owner

@alsabbahy @bitbay Hi! Thanks for the great questions. @bitbay is on the right track. This is not yet a feature included out-of-the-box, however there are some tricks that should get you what you need without too much effort.

We can add this query option by including a dateRange model property (with appropriate validation properties), then handling query parameters for that property in middleware.

For example:

example-model.js

...
var Schema = new mongoose.Schema(
    {
      ...
      dateRange: {
        type: Types.String,
        allowOnCreate: false,
        allowOnUpdate: false,
      }
    },
    { collection: modelName }
  );
...

Schema.statics = {
    collectionName: modelName,
    routeOptions: {
    ...
      list: {
        pre: async function (query, request, Log) {
          if (query.dateRange) {
            let dateRange
            try {
              dateRange = JSON.parse(query.dateRange)
            } catch {
              throw Boom.badRequest('Invalid JSON for \'dateRange\'');
            }
            const validate = RestHapi.joi.object({
              start: RestHapi.joi.string().required(),
              end: RestHapi.joi.string().required(),
            })
            const test = validate.validate(dateRange)
            if (test.error) {
              throw Boom.badRequest(test.error)
            }
            query.$where = `{ 
              "createdAt": {
                "$gte": "${dateRange.start}",
                "$lte": "${dateRange.end}"
              }
            }`
            delete query.dateRange
          }
          return query
        }
      }
    ...

This would allow you to query a dateRange based on createdAt for this model using a query string such as:

http://localhost:8080/example?dateRange={"start": "2020-04-11T22:26:26.564Z", "end": "2020-04-11T22:40:20.266Z"}

You could easily modify this to accept other properties to compare against other than createdAt. Note that if you would like to apply this functionality to multiple models I believe you could alternatively implement a custom policy. If you would like an example of this let me know.

Hope this helps!

@alsabbahy
Copy link
Author

@JKHeadley thanks for the quick reply.
Your example is very helpful, I'll try it and will try to make a policy for all models.
I'll let you know if I need help with policy.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants