A more robust logic to parse user roles on setRoles.

This commit is contained in:
Fabio Manganiello 2025-03-06 23:55:49 +01:00
parent 06566f504b
commit bb0da62ea0
Signed by: blacklight
GPG key ID: D90FBA7F76362774

View file

@ -54,22 +54,44 @@ class User {
}
public async setRoles(roles: (Role | RoleName | number | string)[]): Promise<void> {
const rolesToFetch = roles.map((role) => {
if (role instanceof Role) {
return role.id || role.name;
}
const inputRoleIds = new Set(
roles.filter((role) => {
role instanceof Role || typeof role === 'number'
}).map((role) => {
if (role instanceof Role) {
return role.id;
}
return role;
});
return role;
})
);
const inputRoleNames = new Set(
roles.filter((role) => {
typeof role === 'string'
}).map((role) => {
return role;
})
);
if (!inputRoleIds.size && !inputRoleNames.size) {
return; // No roles to set
}
const query: Record<string, any> = {}
if (inputRoleIds.size) {
query['id'] = [...inputRoleIds];
}
if (inputRoleNames.size) {
query['name'] = [...inputRoleNames];
}
const roleIds = new Set(
(
await $db.Role().findAll({
where: {
[Op.or]: {
id: rolesToFetch,
name: rolesToFetch,
},
[Op.or]: query,
},
})
).map((role) => (role as any).id)