
Екатерина
19.04.2018
13:43:25
ребят, спасибо за советы и мнения, очень полезно было, на самом деле))

Anton
19.04.2018
13:49:34

Vasiliy
19.04.2018
13:50:48
вообще типа есть юзер и например подписчик(юзер который купил подписку) и надо обычному юзеру возвращать 5 новостей и 5 комментов к этой новости, а подписчику всё

Anton
19.04.2018
13:51:07
хм

Google

Vasiliy
19.04.2018
13:51:21
это не конкретный пример, но логика такая, подписчику доступно всё, а обычному - лимиты

Anton
19.04.2018
13:51:49
типо что бы эта штука сама решала кому сколько возвращать или что бы ты понимал какой пользователь у тебя?

Vasiliy
19.04.2018
13:53:18
решала

Anton
19.04.2018
13:53:36
но это же не правильно с точки зрения распределения логики

Vasiliy
19.04.2018
13:53:41
а как?

Anton
19.04.2018
13:53:51
да вот сам хз, надо подумать
но вопрос хороший
потому что мне самому сейчас надо сделать что-то такое
вообще, по хорошему, я бы вот так сделал

Vasiliy
19.04.2018
13:54:19
именно вот кейс чтобы лимитировать данные для обычного юзера
тут пока без пундита, но думаю его скоупы сюда бы зашли

Anton
19.04.2018
13:55:24
хм
ну собственно

Google

Anton
19.04.2018
13:55:38
я могу так сделать со своей штуковиной

Vasiliy
19.04.2018
13:57:04
пока чёт вроде закладывают логику на уровне сериалайзера, но что-то я уже спотыкаюсь

Anton
19.04.2018
13:59:28

Vasiliy
19.04.2018
14:00:32
бле) меня их ActionPolicy привлёк именно похожестью на пундит) но ладно

Maksim
19.04.2018
14:00:46
@davydovanton огромное спасибо что затронул на подкасте вопрос депрессий - это не звук, и у многих такие проблемы.

Anton
19.04.2018
14:01:01
вот это было бы ахуенно
тогда ты бы смог прямо в оперейшене логику крутить

Maksim
19.04.2018
14:02:12

Anton
19.04.2018
14:02:30
помогает попросить у близких помощи попросить
меня 2 раза чуть за руку не водили на первый прием
и я 1 раз сам водил

Maksim
19.04.2018
14:03:04
но то, что скинул 9-10кг, были вопросы к здоровью, и я не могу подняться иногда на работу, даже если подожгут кровать-это факт. :D

Anton
19.04.2018
14:03:51

Google

MpaK
19.04.2018
14:04:22
так то сколько людей столько и мнений, мне нравится то что Инстамарт делают, потому что то именно продукт, а не постоянный аутсорс, в такой компании приятно работать

Vasiliy
19.04.2018
14:04:41
ну допустим роль есть, но мне вот это не очень нравится
repo.all_with_limit(user)
т.е. доп метод на моделе, который в свою очередь будет доп методы на связях вызывать чтобы лимиты везде были

Maksim
19.04.2018
14:04:47
хех..

Anton
19.04.2018
14:05:15
а дальше тупо делаешь, в оперейшене детектишь роль и в результате этой роли уже резолвишь что делать

Vasiliy
19.04.2018
14:05:48
но это же для отдельного поста, верно?

Anton
19.04.2018
14:06:00
ну, ты роль для юзера показывать можешь, туда что хочешь прокидывается
можешь просто юзера кинуть и все
не правильно написал, прости, вот так
abilities['post.role'].call(user) # => :payed

Vasiliy
19.04.2018
14:06:33
abilities['post.role'].call(payed, post) - тут получается что проверяется пост оплачен или нет, верно?

Anton
19.04.2018
14:06:50
вот так надо
abilities['post.role'].call(user) # => :payed
т.е. по сути
ты через ауф должен роль получить + узнать пермишен

Vasiliy
19.04.2018
14:07:18
а, и в оперейшене уже режутся, так?

Anton
19.04.2018
14:07:21
а что доставать под роль - это уже где-то в бизнес логике
т.е. твоя цель задетектить может юзер читать и если да - какая роль, что бы достать под нее данные

Vasiliy
19.04.2018
14:07:58
чото всё равно сложно кажется как-то)

Google

Anton
19.04.2018
14:08:06
тогда твои полиси будут чистые и без зависимостей
потому что дергать что-то - токое

Vasiliy
19.04.2018
14:08:57
спасибо

Anton
19.04.2018
14:10:25
class ListOperation
include AbilitiesImport[ability_checker: 'post.read', role_detector: 'user.role']
def call(params)
user = repo.find(params[:user_id])
return Left(:permission_denied) unless ability_checker.call(user)
case role_detector.call(user)
when :regular
post_repo.list_with_limit
when :payed
post_repo.list
else
Left(:error)
end
end
end
тогда будет на изи тестироваться (мокаешь оба класса и все) + у тебя будет бизнес логика (что для каждой роли делать) чистой достаточно
и никакой магии, в том плане, что у тебя полиси вызывают базу и что-то сами решают
+ можешь накрутить роли и полиси под домен свои
ну, собственно мое мнение
и как бы я и делал
и навено надо сделать вес для ролей
лол
что бы админ "весил" больше анонима
хотя с другой стороны - а нужно ли это


Sergey
19.04.2018
14:25:45
эмм, а если в квери обжект передавать юзера, и в квери уже определять скоуп на основе пермишенов юзера не катит?

Anton
19.04.2018
14:25:58
ну, у тебя есть штука, что бы определить роль пользователя
есть штука, что бы данные достать
есть штука для того, что бы понять, разрешено что-то для юзера или нет

Google

Anton
19.04.2018
14:26:35
это разные логики
ты можешь в квери объект передать пользователя, его роль и параметры
а определить роль перед

Sergey
19.04.2018
14:29:15

Vasiliy
19.04.2018
14:29:26
так ну это вроде понятно, а если там связи резать надо

Anton
19.04.2018
14:29:57

Vasiliy
19.04.2018
14:30:07
ну т.е. лимитированные посты мы получили, но нам надо лимитировать количество комментов к примеру

Anton
19.04.2018
14:31:55

Vasiliy
19.04.2018
14:33:57
ну у тебя есть
post.limit(5)
но, тебе надо дупустим лимит на комменты к нему и лимит например на лайкнувших и репостивших, по дефолту же оно загрузит 5 постов и все связи для них или предлагаешь делать что-то типа openstruct где руками собирать нужных объехт?

Anton
19.04.2018
14:35:09
так это релейшеном собирается
делаешь релейшен один, потом в него пихаешь релейшен для коментариев и все
ну типо это логика выгребания же по сути

Vasiliy
19.04.2018
14:36:30
ну получается что логику в релейшены писать?

Anton
19.04.2018
14:36:46
ну это логика получения данных
квери объекты
агрегаторы (если про ддд говорим)
репозитории

Vasiliy
19.04.2018
14:37:31
хмммм
а как потом это гавно сериализовать с АМС например?

Anton
19.04.2018
14:39:50
а хз, лол
ну, зависит от того, что нужно