7

I have a problem I can't find an answer to in Loopback's docs.

Say I have a model Company and a modelEmployee. There is an 1Xn relation between the Company and its Employees. When /api/Employees is called, server returns all the employees.

I only want to return the list of employees who are in the same company with the user requesting the list.

For this, I created a remote hook

     Employee.beforeRemote('find', function(context, modelInstance, next) {
        var reject = function() {
            process.nextTick(function() {
                next(null, false);
            });
        };

        // do not allow anonymous users
        var userId = context.req.accessToken.userId;
        if (!userId) {
            return reject();
        }

        //I get the details of the user who sent the request 
        //to learn which company does he belong to
        Employee.findById(userId, function(err, user) {
            if(!context.req.query.filter) context.req.query.filter={};
            context.req.query.filter.where = {brandId:user.companyId};
            console.log(context.req.query);
            next();
        });

    });

I thought this should work every time, but appearantly it only works when find already has some query filters like include - although the console.log prints a correct context.req.query object.

What am I missing? Any help would be greatly appreciated!

Marc
  • 3,683
  • 8
  • 34
  • 48
Mihaly KR
  • 2,363
  • 2
  • 19
  • 20
  • Are you saying that the `beforeRemote()` hook function is not being called when there is no filter passed to `find()`, or that your code specifically is not working when no filter is provided? – Jordan Kasper Mar 31 '15 at 17:30
  • The problem was that context.req.query.filter is ignored when it wasn't set from the client request. Alex's suggestion worked though, thank you all for your help. – Mihaly KR Apr 01 '15 at 07:04

1 Answers1

11

context.args.filter seems to work for this purpose. As a side note, instead of replacing where, you might want to merge it with something provided by client. For implementation idea you can refer to: https://github.com/strongloop/loopback-datasource-juggler/blob/master/lib/utils.js#L56-L122

Alex V
  • 1,155
  • 8
  • 10
  • I want to do this exact same thing, however I'm getting a "TypeError: Cannot assign to read only property ....". Did you ever see this while working on this issue? – Jonathan Jun 02 '16 at 13:11