Create a scope more than one level away based on a Smart field
Please be sure of your agent type and version and pick the right documentation accordingly.
This is the documentation of the forest-express-sequelize
and forest-express-mongoose
Node.js agents that will soon reach end-of-support.
forest-express-sequelize
v9 and forest-express-mongoose
v9 are replaced by @forestadmin/agent
v1.
Please check your agent type and version and read on or switch to the right documentation.
Create a scope more than one level away based on a Smart field
Context: As a user I want to create a scope on a table that does not have the tag column in the table.
As a user I want to create a scope on related tables more than one level away
Example:
The objective is to implement scopes on all tables, filtering oncompanies
to make sure that companies can only see their own data. In this example, companies
has many departments
, departments
has many users
. The company id is not in users
table but in the departments
table. We want to scope users
according to a company value.
Step 1: Create a smart field and the filter for the users
table
users
tableconst { collection } = require('forest-express-sequelize');
const { users, departments, companies } = require('../models');
const models = require('../models');
const { Op } = models.objectMapping;
collection('users', {
actions: [],
fields: [
{
field: 'company name',
isFilterable: true,
type: 'String',
get: async (user) => {
//We are looking for the company name of the user (user belongs to a department that belongs to a company)
const company = await companies.findOne({
attributes: ['name'],
include: {
required: true,
model: departments,
where: { id: user.departmentId },
},
});
return company.name;
},
filter: async ({ condition: { value, operator } }) => {
switch (operator) {
case 'equal':
//We are looking for all the users ids that have a company name equal to the condition value
const queryToFindUsers = await users.findAll({
attributes: ['id'],
include: [
{
required: true,
model: departments,
include: [
{
required: true,
model: companies,
where: { name: { [Op.eq]: value } },
},
],
},
],
});
//We map this array of objects to retrieve the user ids
const userIds = queryToFindUsers.map((user) => user.id);
return { id: { [Op.in]: userIds } };
default:
return null;
}
},
},
],
segments: [],
});
Step 2: Configure the scope in the UI
In project settings:

In the table users

Last updated
Was this helpful?