Запрос на получение разрешений у пользователя

Делаю систему разрешений для пользователя, у пользователя могут быть выданы права (определенные) или пользователь может состоять у воле у которой есть эти права,

set_id|user_id|role_id|permission_id|set_to|add_time           |start_at|end_at|active|
------|-------|-------|-------------|------|-------------------|--------|------|------|
    15|      2|       |            7|{}    |2021-03-15 13:00:43|        |      |true  |
    16|      1|      1|             |{}    |2021-03-15 13:02:29|        |      |true  |
    14|      1|       |            7|{1,2} |2021-03-15 13:00:43|        |      |true  |
    17|       |      1|            7|{99}  |2021-03-15 13:02:43|        |      |true  |

DDL

CREATE TABLE public.permission_set (
    set_id serial NOT NULL,
    user_id int4 NULL,
    role_id int4 NULL,
    permission_id int8 NULL,
    set_to _int4 NULL DEFAULT '{}'::integer[],
    add_time timestamp NULL DEFAULT timezone('utc'::text, now()),
    start_at timestamp NULL,
    end_at timestamp NULL,
    active bool NULL DEFAULT true 
);

пытаюсь получить все права и роли в которых есть эти прова и состоит пользователь:

 select *  from permission_set ps
        where ps.user_id = 1 and ps.permission_id = 7  or ps.role_id = any(select role_id from permission_set pss where pss.permission_id = 7  and pss.active is true)

С самими правами проблем нет, но если они даны роле а пользователю дана уже эта роль , тот тут уже непонятно в моем запросе для всех пользователей возвращается роль где естьб это разрешение.

Вопрос как возвращать правильныйй рещультат? (Пользователь имеет разрешение напрямую или через роль - нужно проверить такой кес)

Пояснение:

  • пользователи хранятся в таблице пользователей по колонке user_id ни связываются с таблицей permission_set приведенной выше.
  • набор прав для роли храниться в ячейке set_to ввиде массива (используется intarray extantion) если пустой массив - это аналог true типо еслть права на этот пермишен - ответ да есть , если есть запись

Ответы (0 шт):