bogdan_uman
@bogdan_uman
шлЫмазл неукЪ-поцЪ

Проверка доступа к записи?

Здравствуйте. Подскажите пожалуйста. Как правильно решать такой кейс:
1) есть табличка с пользователями, но пользователи могут принадлежать другим пользователям

CREATE TABLE public."Users" (
	id serial NOT NULL,
	"parentId" int4 NULL,
	email varchar(100) NOT NULL DEFAULT ''::character varying,
       CONSTRAINT "Users_email_key" UNIQUE (email),
	CONSTRAINT "Users_pkey" PRIMARY KEY (id),
	CONSTRAINT "Users_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "Users"(id) ON DELETE CASCADE,
);


2) Есть таблица "Cartridges" которая имеет связь с таблицей пользователей по полю "userId".
Редактировать, просматривать запись может только или непосредственно сам пользователь или его родитель

CREATE TABLE public."Cartridges" (
	id serial NOT NULL,
	code varchar(9) NOT NULL DEFAULT ''::character varying,
	printed int4 NOT NULL DEFAULT 0,
	"userId" int4 NULL,
	CONSTRAINT "Cartridges_pkey" PRIMARY KEY (id),
	CONSTRAINT "Cartridges_userId_fkey" FOREIGN KEY ("userId") REFERENCES "Users"(id) ON DELETE CASCADE
);


Делаю через добавление CTE к каждому запросу, который рекурсивно создает табличку с пользователем и его родителем, а далее уже соединением проверяем есть ли он там.

WITH RECURSIVE "UsersTree" AS (
  SELECT
      id,
      email,
      "parentId"
    FROM "Users"
        WHERE id = 4

      UNION ALL

      SELECT
          "Users".id,
      "Users".email,
      "Users"."parentId"
    FROM "Users"
    INNER JOIN "UsersTree" ON "Users"."parentId" = "UsersTree".id
)
update "Cartridges" set printed = 5 
  from "UsersTree" where "Cartridges".id = 2 and "UsersTree".id = "Cartridges"."userId"
  returning *


Но как-то громоздкая выходит конструкция, которую нужно добавлять к каждому запросу. Как в таких случаях деают. Спасибо
  • Вопрос задан
  • 41 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы