parse-community / parse-server

Parse Server for Node.js / Express
https://parseplatform.org
Apache License 2.0
20.82k stars 4.77k forks source link

object.relation(..) throws "Invalid key '...'" when beforeFind() trigger change the query #7269

Open sadortun opened 3 years ago

sadortun commented 3 years ago

New Issue Checklist

Issue Description

Hi !

I have a beforeFind trigger that add a few restrictions on a child type, when executing parent.query().find() the server throw a Invalid key "$relatedTo"

Steps to reproduce

I have a Parent with a relation to a Child

Then:

// /cloud/index.js
  Parse.Cloud.beforeFind("Child", (req) => {
      const a = new Parse.Query("Child")
      const b = new Parse.Query("Child")

      a.equalTo('field', 'abcd')
      b.doesNotExist('field')

      return Parse.Query.and(req.query, Parse.Query.or(a, b)  )
})   

On the client

// client
const parent = new Parent()

await parent.relation('childs').query().find()

Actual Outcome

Error in mounted hook (Promise/async): "ParseError: 105 Invalid key name: $relatedTo"

Expected Outcome

An happy relation! 👪

Failing Test Case / Pull Request

It seems that reduceRelationKeys only checks for a Top level $or, and in my case, the top level operator is $and

This seems like it 'fixes' the issue :

  reduceRelationKeys(className, query, queryOptions) {
//    if (query['$or']) {
//      return Promise.all(query['$or'].map(aQuery => {
//        return this.reduceRelationKeys(className, aQuery, queryOptions);
//      }));
//    }
    for(const op of ['$or', '$and' , '$not']) {
      if (query[op]) {
        return Promise.all(query[op].map(aQuery => {
          return this.reduceRelationKeys(className, aQuery, queryOptions);
        }));
      }
    }
// ....

Environment

Server

Database

Client

Logs

davimacedo commented 3 years ago

Thanks for the PR and investigation. Would you be willed to send a PR with the fix and a regression test case?

sadortun commented 3 years ago

@davimacedo It may take a few days, but Yeah sure! If you confirm that the proposed solution above will not break everything :) I'm just smashing the keyboard until something works 🙈 😅

davimacedo commented 3 years ago

Thanks @sadortun . If all tests continue passing, it will probably not break anything. It is important to also add a new regression test case covering the problem you are trying to fix and maybe other tests to check potential problems you may think about.

sadortun commented 3 years ago

@davimacedo @dplewis off topic question :) would it be possible that you add some information about the release cycles in the readme ? It would be really nice to have at least a patch release every month

mtrezza commented 3 years ago

@sadortun Parse Server currently does not have release cycles, but it is something we are looking into, see this discussion.

sadortun commented 3 years ago

Hey @davimacedo should I iterate only over and, or, not or on all the special QueryKeys?

davimacedo commented 3 years ago

I believe only over and, or, not