I have an array with roles which looks like this :
["ROLE_ADMIN", "ROLE_USER_ADMIN_MARKETING"]
What I need :
I need to check if in this array, a string
match EXACTLY. If yes, return true
, if no return false
.
Warning:
As you can see below, there are roles
that start with same text, so it is important to check the exact same string.
Why my console.log
returns true
here ? Maybe I shouldn't use switch
case ?
export const ROLE_ADMIN = "ROLE_ADMIN";
export const ROLE_USER_ADMIN = "ROLE_USER_ADMIN";
export const ROLE_MARKETING = "ROLE_USER_ADMIN_MARKETING";
export const ROLE_TECHNICAL = "ROLE_USER_ADMIN_TECHNICAL";
const roles: string[] = JSON.parse(localStorage.getItem("roles"));
class UserRole {
static regexAdmin = new RegExp(`\\b${ROLE_ADMIN}\\b`);
static regexUserAdmin = new RegExp(`\\b${ROLE_USER_ADMIN}\\b`);
static regexMarketing = new RegExp(`\\b${ROLE_MARKETING}\\b`);
static regexTechnical = new RegExp(`\\b${ROLE_TECHNICAL}\\b`);
public static hasAuthorization(role: string): boolean {
for (const role of roles) {
switch (true) {
case UserRole.regexAdmin.test(role):
return true;
case UserRole.regexUserAdmin.test(role):
return true;
case UserRole.regexMarketing.test(role):
return true;
case UserRole.regexTechnical.test(role):
return true;
default:
return false;
}
}
}
}
export const hasAdmin = UserRole.hasAuthorization(ROLE_USER_ADMIN);
console.log(hasAdmin); // THIS RETURNS TRUE
CodePudding user response:
The problems in your code:
for (const role of roles) {
shadows the parameter role: string
. You're completely ignoring the argument and only comparing roles
from local storage with the hard coded regexes. Your loop always returns in the first iteration.
My solution:
A regex isn't necessary. It's a simple
["ROLE_ADMIN", "ROLE_USER_ADMIN_MARKETING"].includes(ROLE_USER_ADMIN)
Example:
let ROLE_USER_ADMIN = "ROLE_ADMIN";
console.log(["ROLE_ADMIN", "ROLE_USER_ADMIN_MARKETING"].includes(ROLE_USER_ADMIN));
ROLE_USER_ADMIN = "ROLE_ADMIN2";
console.log(["ROLE_ADMIN", "ROLE_USER_ADMIN_MARKETING"].includes(ROLE_USER_ADMIN));
ROLE_USER_ADMIN = "ROLE_ADMI";
console.log(["ROLE_ADMIN", "ROLE_USER_ADMIN_MARKETING"].includes(ROLE_USER_ADMIN));
The full code could be
export const ROLE_ADMIN = "ROLE_ADMIN";
export const ROLE_USER_ADMIN = "ROLE_USER_ADMIN";
export const ROLE_MARKETING = "ROLE_USER_ADMIN_MARKETING";
export const ROLE_TECHNICAL = "ROLE_USER_ADMIN_TECHNICAL";
const roles: string[] = JSON.parse(localStorage.getItem("roles"));
class UserRole {
public static hasAuthorization(role: string): boolean {
return roles.includes(role);
}
}
export const hasAdmin = UserRole.hasAuthorization(ROLE_USER_ADMIN);
console.log(hasAdmin); // THIS RETURNS TRUE
Example:
const ROLE_ADMIN = "ROLE_ADMIN";
const ROLE_USER_ADMIN = "ROLE_USER_ADMIN";
const ROLE_MARKETING = "ROLE_USER_ADMIN_MARKETING";
const ROLE_TECHNICAL = "ROLE_USER_ADMIN_TECHNICAL";
const roles = ["ROLE_ADMIN", "ROLE_USER_ADMIN_MARKETING"];
class UserRole {
static hasAuthorization(role) {
return roles.includes(role);
}
}
const hasAdmin = UserRole.hasAuthorization(ROLE_USER_ADMIN);
const hasMarketing = UserRole.hasAuthorization(ROLE_MARKETING);
console.log(hasAdmin); // THIS RETURNS FALSE
console.log(hasMarketing); // THIS RETURNS TRUE