/- *group /+ store=group-store, resource :: |_ =bowl:gall +$ card card:agent:gall :: ++ resource-for-update |= =vase ^- (list resource) =/ =update:store !<(update:store vase) ?: ?=(%initial -.update) ~ ~[resource.update] :: ++ scry-for |* [=mold =path] =. path (snoc path %noun) .^ mold %gx (scot %p our.bowl) %group-store (scot %da now.bowl) path == ++ scry-tag |= [rid=resource =tag] ^- (unit (set ship)) =/ group (scry-group rid) ?~ group ~ `(~(gut by tags.u.group) tag ~) :: ++ scry-group |= rid=resource %+ scry-for ,(unit group) `path`groups+(en-path:resource rid) :: ++ scry-groups .^ ,(set resource) %gy (scot %p our.bowl) %group-store (scot %da now.bowl) /groups/noun == :: ++ members |= rid=resource =; =group members.group (fall (scry-group rid) *group) :: ++ is-member |= [=ship group=resource] ^- ? =- (~(has in -) ship) (members group) :: ++ is-admin |= [=ship group=resource] ^- ? =/ tags tags:(fall (scry-group group) *^group) =/ admins=(set ^ship) (~(gut by tags) %admin ~) (~(has in admins) ship) :: +role-for-ship: get role for user :: :: Returns ~ if no such group exists or user is not :: a member of the group. Returns [~ ~] if the user :: is a member with no additional role. ++ role-for-ship |= [rid=resource =ship] ^- (unit (unit role-tag)) =/ grp=(unit group) (scry-group rid) ?~ grp ~ =* group u.grp =* policy policy.group =* tags tags.group =/ admins=(set ^ship) (~(gut by tags) %admin ~) ?: (~(has in admins) ship) ``%admin =/ mods (~(gut by tags) %moderator ~) ?: (~(has in mods) ship) ``%moderator =/ janitors (~(gut by tags) %janitor ~) ?: (~(has in janitors) ship) ``%janitor ?: (~(has in members.group) ship) [~ ~] ~ :: ++ can-join |= [rid=resource =ship] %+ scry-for ,? ^- path :- %groups (weld (en-path:resource rid) /join/(scot %p ship)) :: ++ get-tagged-ships |= [rid=resource =tag] ^- (set ship) =/ grp=(unit group) (scry-group rid) ?~ grp ~ (~(get ju tags.u.grp) tag) :: ++ is-managed |= rid=resource =/ group=(unit group) (scry-group rid) ?~ group %.n !hidden.u.group :: --