09.04.2020, 13:32
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,795
|
|
(() => {
const roleRight = [
{
"Id": 1,
"RoleId": 1,
"RightId": 1
},
{
"Id": 2,
"RoleId": 1,
"RightId": 2
},
{
"Id": 3,
"RoleId": 2,
"RightId": 2
},
{
"Id": 4,
"RoleId": 3,
"RightId": 1
},
];
const roles = [
{
"Id": 1,
"Name": "Администратор",
},
{
"Id": 2,
"Name": "Модератор",
},
{
"Id": 3,
"Name": "Пользователь",
},
];
const rights = [
{
"Id": 1,
"Name": "Контакты - Просмотр",
},
{
"Id": 2,
"Name": "Контакты - Редактирование",
}
];
const usersRoles = (() => {
const dictionaries = {
roles,
rights
};
const dictionariesIndexed = Object.keys(dictionaries).reduce((res, key) => {
res[key] = {};
dictionaries[key].forEach(item => {
res[key][item.Id] = item;
});
return res;
}, {});
const result = roleRight.reduce((res, item) => {
res[item.RoleId] = {
Id: item.RoleId,
Name: dictionariesIndexed.roles[item.RoleId].Name,
Rights: []
};
return res;
}, {});
roleRight.forEach(item => {
const roleId = item.RoleId;
const rightId = item.RightId;
result[item.RoleId].Rights.push({
Id: item.RightId,
Name: dictionariesIndexed.rights[item.RightId].Name
});
});
return Object.values(result);
})();
console.log(usersRoles);
})();
|
|
09.04.2020, 13:35
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,795
|
|
У вас данные в базе хранятся "не традиционным" способом.
Загуглите «database relationship types»
Я ошибся, это many2many со сводной таблицей roleRight.
Значения хранятся в 4-й таблице?
По-моему это несколько неудобно.
Последний раз редактировалось Nexus, 09.04.2020 в 13:38.
|
|
09.04.2020, 13:35
|
|
Профессор
|
|
Регистрация: 18.05.2011
Сообщений: 1,207
|
|
jabbascript,
const roleRight = [
{
Id: 1,
RoleId: 1,
RightId: 1
},
{
Id: 2,
RoleId: 1,
RightId: 2
},
{
Id: 3,
RoleId: 2,
RightId: 2
},
{
Id: 4,
RoleId: 3,
RightId: 1
}
];
const roles = [
{
Id: 1,
Name: "Администратор"
},
{
Id: 2,
Name: "Модератор"
},
{
Id: 3,
Name: "Пользователь"
}
];
const rights = [
{
Id: 1,
Name: "Контакты - Просмотр"
},
{
Id: 2,
Name: "Контакты - Редактирование"
}
];
console.log(
roles.map(role => {
return {
...role,
right: roleRight
.filter(item => item.RoleId === role.Id)
.map(item => rights.find(right => right.Id === item.RightId))
};
})
);
|
|
09.04.2020, 14:01
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Nexus,
если roleRight описывает совокупность прав, то все нормально. Я только никак не могу понять - для кого это получается?
|
|
09.04.2020, 14:15
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,795
|
|
Сообщение от laimas
|
если roleRight описывает совокупность прав, то все нормально.
|
Список "ролей" и их "прав" без значения "права" не имеет смысла.
А с такой структурой таблиц это будет выглядеть, как прибитый сбоку костыль.
Я это имел ввиду.
Там либо делать связь к таблице role_right, либо придется делать таблицу role_right_value с полями:
- id
- role_id
- right_id
- value
|
|
09.04.2020, 14:28
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Я не об этом, я о 4-х таблицах - если первая пользователи, вторая роли, третья права, то четвертая вполне может описывать совокупность прав. А вот тут, это что-то непонятное - чего тут получаем?
А вообще, права лучше хранить как битовый набор, это упрощает проверку доступа.
|
|
|
|