Adding a filter inside a beforeRemote remote hook
Asked Answered
M

1

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!

Murcia answered 31/3, 2015 at 16:4 Comment(2)
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?Liripipe
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.Murcia
S
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

Sphygmoid answered 31/3, 2015 at 23:40 Comment(1)
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?Semasiology

© 2022 - 2024 — McMap. All rights reserved.