В таблице post нужно ограничить количество постов для пользователя, например до 3.
Например, используется NodeJS и pg-promise для запросов.
let db = require("./connection");
let post= function () {
self = this;
self.create = function (obj) {
return db.query(`INSERT INTO public.post (user_id, title, message) VALUES ($(userId), $(title), $(message));`, obj);
};
};
module.exports = post;
Можно перед каждым вызовом `post.create()` отправлять запрос в БД, получать количество постов и если оно меньше 3, то отправляем новый запрос и создаем пост, если же больше - отправляем ошибку на клиент.
Но мне кажется, что такие вещи, реализуются по-хорошему на уровне СУБД (или я ошибаюсь?)
Что-то типа такого, только не соображу как передать userId из роутинга NodeJS внутрь триггера?
CREATE OR REPLACE FUNCTION check_number_of_row_per_user()
RETURNS TRIGGER AS
$body$
BEGIN
-- КАК ПЕРЕДАТЬ ПАРАМЕТР $(userId) ИЗ ЗАПРОСА?
IF (SELECT count(*) FROM public.post WHERE user_id = $(userId)) > 2
THEN
RAISE EXCEPTION 'INSERT statement exceeding maximum number of rows for table filter';
END IF;
RETURN NULL;
END;
$body$
LANGUAGE plpgsql;
CREATE TRIGGER tr_check_number_of_row_per_user
BEFORE INSERT ON public.post
FOR EACH ROW EXECUTE PROCEDURE check_number_of_row_per_user();