Вы можете разбить строки (компоненты метода и пути), а затем сравнить детали, вот пример:
const urls = ["PATCH /users/{userId}",
"PATCH /users/types/{userIdId}",
"PATCH /products/brands/{brandId}/image",
"PATCH /product-types/{productId}"
];
const myUrl = "PATCH /users/5dce7b7e47224c477734e35d";
function parse(str) {
return str.split(/\s?\//);
}
function isPlaceholder(str) {
return /\{[^}]+\}/.test(str);
}
function hasPermission() {
const myUrlParsed = parse(myUrl);
// check if any of the "urls" elements matches "myUrl"
return urls.some(url => {
const parsedUrl = parse(url);
if (myUrlParsed.length === parsedUrl.length) {
// check if all the "myUrlParsed" elements match all "parsedUrl" elements at the coresponding index or if the "parsedUrl" element is a placeholder
return myUrlParsed.every((v, i) => v === parsedUrl[i] || isPlaceholder(parsedUrl[i]));
}
return false;
});
}
console.log("has permission:", hasPermission());
Для этого нужно разбить каждый URL-адрес до массива, который выглядит следующим образом:
["PATCH", "users", "{userId}"]
, а затем проверить каждый из этих видов массивов повторяет массив, сгенерированный из строки myUrl
.
Проверка проверяет, равен ли каждый элемент массива по соответствующему индексу или заполнитель (начинается с {
и оканчивается на }
).
Другим способом сделать это будет преобразование URL в регулярные выражения, вот пример:
let urls = ["PATCH /users/{userId}",
"PATCH /users/types/{userIdId}",
"PATCH /products/brands/{brandId}/image",
"PATCH /product-types/{productId}"
];
const myUrl = "PATCH /users/5dce7b7e47224c477734e35d";
function escapeRegex(s) {
return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
};
urls = urls.map(url => {
const regExpStr = url.split(/\{[^\}]+\}/)
.map(escapeRegex)
.join('[^\/]+');
return new RegExp(regExpStr);
});
function hasPermission() {
return urls.some(url => url.test(myUrl));
}
console.log("Has permission:", hasPermission());