我正在尝试使用GS实施通知系统
基本上,相关模型为:
Organizations
(组织);User
,是org的成员。用户可以在org中拥有管理权限;Entity
管理员用户可以创建,普通用户可以购买,实体也属于组织。在GS中,有以下供稿:
notification:$userId-$orgId
----重复使用默认供稿,某些组织中用户的个人通知供稿Org:$orgId
----为所有组织成员共享提要AdminEntity:$entityId
----有关管理员用户的用户对实体的操作的通知UserEntity:$entityId
----有关普通用户对实体的管理/系统操作的通知让我简要解释一下提要之间的基本关系:
1)Admin
创建Entity
:
将活动推送Org:$orgId
至此事件。活动将有user:$userId
作为Actor
和entity:$entityId
作为Object
。
订阅他notification:$userId-$orgId
的AdminEntity:$entityId
2)User
加入Organization
:
将活动推送Org:$orgId
到此事件
订阅他notification:$userId-$orgId
的Org:$orgId
。
3)User
购买Entity
:
将活动推送AdminEntity:$entityId
至此事件。
订阅他notification:$userId-$orgId
的UserEntity:$entityId
等等。
所描述模型的问题在于,在第一种情况下User
,作为的创建者,Entity
还将通过与其他成员一起Org:$orgId
创建的通知来接收通知。第二种情况也是一样。Entity
Organization
这是通知系统的有害行为。
理想情况下,我们不应该User
在“共享的”供稿中通知他自己的活动,例如Org:$orgId
。问题是-如何实现这一目标?也许GS提要应该以不同的方式进行组织,或者可以通过Aggregation Format
语法来完成?
编辑:如我所见,可能的解决方案可以是:
摆脱像所有共享的饲料Org
,AdminEntity
,UserEntity
,
直接notification:$userId-org$id
通过add_to_many
电话推送活动,以提供有关用户在组织中的角色,与实体的关系等信息。
我不确定这是否是GS的惯用解决方案。
我认为您的结构可能比您最初设计的要简单,并且更接近您在文章底部提到的内容。我还建议您通读http://blog.getstream.io/best-practices-for-instagram-style-feeds/,这听起来与您想要在此处进行的操作类似。
为了简化我们的Feed类型的细分:
任何Feed类型都可以使用Flat Feed,但我们通常建议仅Flat Feed和汇总Feed跟随其他Flat Feed。通知供稿通常独立存在,下面将对其进行介绍。
让我们做以下假设:
12
56
为“ Acme Inc”74
63
让我们创建一个扁平的供稿,称为org
将在其中进行实体活动的地方,聚合的供稿,org_aggregated
供汇总的数据,通知的供稿,称为notifications
用户的供稿的timeline
。如果您的用户可以看到另一个用户(而不是组织)创作的所有内容的供稿,那么我建议您使用另一个固定供稿usercontent
。
对于Silverthorne将此活动发布到GetStream而言,活动参与者是"user:12"
,动词可能是"post"
,对象是 "entity:63"
对此进行伪编码,因为我不知道您使用的是哪个SDK,因此将类似于:
# acme inc gets created as an organization, and so its aggregated feed
# should follow the org's flat feed
acme_org_feed = getstreamClient->feed('org', '56')
acme_org_agg_feed = getstreamClient->feed('org_aggregated', '56')
acme_org_agg_feed->follow(acme_org_feed)
Run Code Online (Sandbox Code Playgroud)
此时,添加到Acme org
固定供稿中的每个实体也将被汇总。您可以设置如何在GetStream仪表板上汇总这些内容。
现在,让Ian关注Acme:
# ian is a member of Acme Inc, so follow their entity feed
ian_feed = getstreamClient->feed('timeline', '74')
ian_feed->follow(acme_org_feed)
Run Code Online (Sandbox Code Playgroud)
如果Ian是新注册,则可以将活动发送给Acme的通知供稿,如下所示:
acme_notif_feed = getstreamClient->feed('org_notification', '56')
acme_notif_feed->addActivity({
'actor': 'user:74',
'verb': 'registration',
'object': 'user:74'
})
Run Code Online (Sandbox Code Playgroud)
以后检索此通知feed时,它将所有动词分组在一起,然后分解通知活动,因此,如果您选择,您的UI可以报告不同的动向。
现在让我们将Silverthorne将该实体添加到GetStream:#Silverthorne将活动添加到Acme Inc的实体供稿#我们将“ cc”该活动“ cc”到聚合供稿acme_org_feed-> addActivity({'actor':'user:12','动词”:“发布”,“对象”:“实体:63”,“收件人”:['usercontent:12'],...您要跟踪的其他任何元数据})
保存此内容后,GetStream将执行以下操作:
org
Acme(org:56
)的固定供稿中user:74
遵循org:56
usercontent:12
“ To”字段中的副本保存到Silverthorne的feed();这是完全可选的org_aggregated:56
)的汇总Feed中,因为该汇总Feed遵循固定FeedIan登录后,您的应用程序现在将显示几个可能的供稿和选项,这完全取决于您的应用程序:
timeline:74
提要,该提要将具有实体#63的副本ian_feed->followed()
Ian关注的每个供稿的列表org_aggregated:56
和Ian可以查看one new entity added in the past day
是否是您汇总内容的方式)这里的关键是,伊恩不会有遵循饲料中才能看到的内容,您的应用程序可以拉任何饲料显示屏的任何用户。
如果Ian要“共享”或“喜欢” Silverthorne发布的实体,则可以在“ org_notification:56” Feed中添加新活动,并以“ user:74”作为Actor,而“ entity:63”是对象,动词是您想要的任何字符串(最多20个字符)。如果您希望您的应用查看其他用户如何与组织的帖子进行交互,则可以获取org_notification:56
所有用户都可以看到“ Ian Likedentity 63”,或者您的UI需要显示它。
希望这有助于澄清问题,并为您提供更多详细信息。如果您需要进一步的帮助或想法,请通过电子邮件与我们的支持团队联系。
最后一点,我认为我不会做的$userId-$orgId
……我们的某些SDK(例如Rails和Django)会自动尝试“丰富”数据库中的这些值,因此您需要其他逻辑来尝试以便稍后拆分这些值。我们建议将UUID用作无冲突的标识符,但这完全由您控制。如果一个用户确实可以属于多个组织,则可以让该用户“关注”组织的供稿。
归档时间: |
|
查看次数: |
863 次 |
最近记录: |