nestjsx / crud

NestJs CRUD for RESTful APIs
https://github.com/nestjsx/crud/wiki
MIT License
4.04k stars 533 forks source link

Filter `$eq` does not work with `date` column #786

Open navigator-dev opened 2 years ago

navigator-dev commented 2 years ago

Bug Report

Current behavior

I have a MySQL entity with a dueDate column of type date and if I use a request with filter dueDate||$eq||2022-04-22 I do not get any results even though there are values in the database. I looked at the TypeORM logs and I saw that the request was akin to SELECT * FROM Task WHERE dueDate = '2022-04-22T00:00:00.000Z'.

The string 2022-04-22 is getting turned into 2022-04-22T00:00:00.000Z which means that the $eq operator will never work.

Expected behavior

I would like to be able to use the MySQL date column and be able to use $lt, $lte, $eq, $gte, $gt to filter out results based on the date.

Possible Solution

I dove into the code and found that commenting out the following block results in the expected behavior.

https://github.com/nestjsx/crud/blob/43cf6658bc245101ea79eb70360ec3b78894f2cb/packages/crud-request/src/request-query.parser.ts#L205-L207

Is there a way to control this behavior with an option on the crud controller or with an override? I had tried overwriting the value in the filter in an override

@Override()
@Get()
async getMany(@ParsedRequest() parsedReq: CrudRequest) {
    const dueDateFilters = parsedReq?.parsed?.filter?.filter((x) => x.field === "dueDate" && x.value instanceof Date);
    if (dueDateFilters && dueDateFilters.length) {
        for (const filter of dueDateFilters) {
            filter.value = moment(filter.value).format("YYYY-MM-DD");
        }
    }
    return this.base.getManyBase(parsedReq);
}

but even this did not work.

Environment


Package version: ^5.0.0-alpha.3


For Tooling issues:
- Node version: v16.13.2
- Platform:  Mac
- Database MySQL 5.7

Others:

Repository with minimal reproduction