In example, I have 4 model: User, Company, Project, Plant (in my project, it's have more: Plant, Job, Team...).
Model User: name, role, company: { id, role }, projects: [ { id, role } ], plants: [ { id, role } ]
Model Company: name, members [ ], projects [ ]
Model Project: title, members [ ], company, plants [ ]
Model Plant: title, members [ ], project, jobs [ ]
First, I make simple code to check role, (write in middleware.js
const isAdmin = (user) => {
return user.role === "admin"
}
const isCompanyMember = (user, companyId) => {
return user.company.id && user.company.id.equals(companyId)
}
To check multi permistion, I make a function and always use it in middleware.
const checkPermit = (...checks) => {
let permit = 0
for (let i = 0; i < checks.length; i++) {
if (checks[i]) permit = 1
}
return permit
}
After that, I write this function to get list user by project id (write in controller.js)
const getListUsersByProjectId = async (req, res, next) => {
const { projectId } = req.params
try {
const project = await Project.findById(projectId)
.select("members")
.populate("members", "name")
if (!project) return next("Project not found")
res.json({
result: 'ok',
message: "Find list of users successfully",
data: project
})
} catch (error) {
next(error)
}
}
To find project easily in router, i write a function:
const findProject = (projectId) => {
return Project.findById(projectId)
}
Finally, I write a router (write in router.js):
router.get('/get-list-users/:projectId',
authentication.required,
// I set signed user to req.user in function authentication.required
async (req, res, next) => {
try {
let { user } = req
let project = await findProject(req.params.projectId)
if (!project) return next("Can not find project")
let permit = checkPermit(
isAdmin(user)
isCompanyMember(user, project.company)
)
if (permit) return next()
else return next("You don't have authorization to do this action!")
} catch (error) {
next(error)
}
},
getListUsersByProjectId
)
It's my ideal and it working well but this code not fun! How to make this code cleanly? I want help from you!