# CRUD

# Работа с записью

CRUD имеет стандартный набор URL-ов, для работы над записью. Прежде всего, необходимо зарегистрировать в системе исходную модель.

Конструктор -> CRUD -> Добавить запись

Прописываем необходимые поля модели/таблицы, и выбираем нужные разрешения. Далее указываем функцию проверки прав доступа к объекту в контексте задачи.

Пример:

CREATE OR REPLACE FUNCTION permissions_contest(action_name character, listing_id integer, user_organization_id integer, user_role character, user_id integer, user_language character, document_id character, params jsonb)
  RETURNS boolean
  LANGUAGE plpgsql
AS $function$
DECLARE
    --
    -- Проверка прав на CRUD
    -- /admin/processing/listingpage/1/change/
    --
BEGIN
    -- Доступ: Администратор и Координатор
    IF user_id > 0 AND user_role IN ('ADMIN', 'COORDINATOR') THEN
        RETURN TRUE;
    ELSE
        RETURN FALSE;
    END IF;
END;
$function$

Совет

  • Роль пользователя определяется на основе поля Роль, в объекте Пользователя в таблице authentication_user или по энд-поинту /api/v1/auth/set/role/.
  • Права доступа к CRUD неследуются из родительского листинга, если функция проверки прав доступа явно не указана.

# Валидация входящих данных

Иногда необходима пре-валидация данных, которая имеет логику, отличную от стандартной, но требуется для бизнес процессов. В этом случае, мы можем прописать функцию валидации.

Пример:

CREATE OR REPLACE FUNCTION crud_validator(action_name character, listing_id integer, user_organization_id integer, user_role character, user_id integer, user_language character, document_id character, params jsonb)
  RETURNS boolean
  LANGUAGE plpgsql
AS $function$
DECLARE
    --
    -- Кастомная валидация CRUD
    -- /admin/processing/crudpage/1/change/
    --

    in_desc TEXT;
    in_file TEXT;

BEGIN

    -- Доступ: Администратор и Координатор
    IF user_role NOT IN ('ADMIN', 'COORDINATOR') THEN
        RAISE NOTICE '%', 'Ошибка доступа!';
        RETURN FALSE;
    END IF;

    -- Входящие данные
    in_desc := jsonb_extract_path(params, 'desc');
    in_file := json_extract_path_text(params::json, 'file');

    -- Проверка наличия: Файла и Причины
    IF (in_desc IS NULL OR in_desc = '') OR (in_file IS NULL OR in_file = '') THEN  
        RAISE NOTICE '%', 'Заполните поля Файл и Описание!';
        RETURN FALSE;
    END IF;    

    -- Проверка формата файла
    IF in_file NOT SIMILAR TO '%(.doc|.docx|.xls|.xlsx|.txt|.pdf|/)' THEN  
        RAISE NOTICE '%', 'Неверный формат файла';
        RETURN FALSE;
    END IF;    

    -- Проверки пройдены
    RETURN TRUE;

END;
$function$

# Добавление записи

Метод: POST
Эндпоинт: /api/v1/processing/crud/{slug}/

Тело HTTP-запроса:

{ key: value, ... },

# Редактирование записи

Метод: PATCH или PUT
Эндпоинт: /api/v1/processing/crud/{slug}/{id}/

Тело HTTP-запроса:

{ key: value, ... },

# Удаление записи

Метод: DELETE
Эндпоинт: /api/v1/processing/crud/{slug}/{id}/

Совет

URL-ы CRUD-а доступны так же в браузере, посредству интерфейса DRF, для тестирования со стороны бекенд разработчика.

# Массовое создание записей

Метод: POST
Эндпоинт: /api/v1/processing/crud/{slug}/?multi=1

Тело HTTP-запроса:

[
  { key: value, ... },
  { key: value, ... }
]

# Массовое редактирование записей

Метод: PATCH
Эндпоинт: /api/v1/processing/crud/{slug}/?multi=1

Тело HTTP-запроса:

[
    { id: value, key: value, ...},
    { id: value, key: value, ...}
]

Совет

Возможность массового создания и редактирования, требуется в случаях, когда у родительского объекта, имеются множества инлайнов (дочерних объектов), связанных по первичному ключу (FK) в БД.

# Мультиязычность

При использовании мультиязычности, для редактирования, нужно выводить поля с постфиксом языка.

Пример:

name_en
name_ru
name_uz

# Защита формы с Google ReCaptcha:

Добавьте поле, с названием captcha в список полей CRUD для ввода. Таким образом, будет активирован механизм, для верификации пользователя. Предварительно, необходимо получить ключи для работы с ReCaptcha. Для этого перейдите в панель администратора Google, по адресу https://www.google.com/recaptcha/admin/create , заполните необходимые данные и укажите версию v3. После передайте Ключ для Сайта фронтенд разработчику, и Секретный ключ бекенд разработчику. При необходимости, можно попросить добавить captcha в форму авторизации пользователя на сайте.

# Работа с формами (фронтенд)

# Файлы

В случае, когда модель имеет хотя бы одно поле файл, необходимо изменить отправку данных с raw/json, на multipart/form-data.

# FK и M2M

При использовании FK, необходимо передавать id/code, в объекте формы. В случае с M2M, данные передаются в виде массива ключей:

array: first_item,
array: second_item,
...

Совет

По умолчанию все данные принимаются в формате json.