diff --git a/pkg/arvo/app/contact-view.hoon b/pkg/arvo/app/contact-view.hoon index 8b0a0d22cf..706594b597 100644 --- a/pkg/arvo/app/contact-view.hoon +++ b/pkg/arvo/app/contact-view.hoon @@ -297,9 +297,9 @@ [%pass / %agent [our.bol %group-pull-hook] %poke %pull-hook-action !>(act)] :: ++ metadata-poke - |= act=metadata-action + |= act=* ^- card - [%pass / %agent [our.bol %metadata-store] %poke %metadata-action !>(act)] + *card :: ++ metadata-hook-poke |= act=metadata-hook-action diff --git a/pkg/arvo/app/graph-push-hook.hoon b/pkg/arvo/app/graph-push-hook.hoon index 3e5f36ac1f..420311729c 100644 --- a/pkg/arvo/app/graph-push-hook.hoon +++ b/pkg/arvo/app/graph-push-hook.hoon @@ -25,12 +25,13 @@ ^- ? =/ grp ~(. group bowl) =/ met ~(. metadata bowl) - =/ group-paths (groups-from-resource:met [%graph (en-path:res resource)]) - ?~ group-paths %.n + =/ groups + (groups-from-resource:met [%graph resource]) + ?~ groups %.n ?: requires-admin - (is-admin:grp src.bowl i.group-paths) - ?| (is-member:grp src.bowl i.group-paths) - (is-admin:grp src.bowl i.group-paths) + (is-admin:grp src.bowl i.groups) + ?| (is-member:grp src.bowl i.groups) + (is-admin:grp src.bowl i.groups) == :: ++ is-allowed-remove diff --git a/pkg/arvo/app/hark-store.hoon b/pkg/arvo/app/hark-store.hoon index 031a20284e..12148aad71 100644 --- a/pkg/arvo/app/hark-store.hoon +++ b/pkg/arvo/app/hark-store.hoon @@ -73,6 +73,8 @@ ++ on-load |= =old=vase ^- (quip card _this) + ?: =(1 1) + `this =/ old !<(versioned-state old-vase) =| cards=(list card) diff --git a/pkg/arvo/app/metadata-hook.hoon b/pkg/arvo/app/metadata-hook.hoon index 43db8695b8..05939138db 100644 --- a/pkg/arvo/app/metadata-hook.hoon +++ b/pkg/arvo/app/metadata-hook.hoon @@ -29,292 +29,4 @@ %- agent:dbug %+ verb | ^- agent:gall -=< - |_ =bowl:gall - +* this . - hc ~(. +> bowl) - def ~(. (default-agent this %|) bowl) - :: - ++ on-init - [[%pass /updates %agent [our.bowl %metadata-store] %watch /updates]~ this] - :: - ++ on-save !>(state) - ++ on-load - |= =vase - =/ old - !<(versioned-state vase) - ?: ?=(%1 -.old) - `this(state old) - :: groups OTA did not migrate metadata syncs - :: we clear our syncs, and wait for metadata-store - :: to poke us with the syncs - `this - :: - ++ on-leave on-leave:def - ++ on-peek - |= =path - ^- (unit (unit cage)) - ?+ path (on-peek:def path) - [%x %export ~] - ``noun+!>(state) - == - :: - ++ on-arvo - |= [=wire =sign-arvo] - ^- (quip card _this) - ?. ?=([%try-rejoin @ @ *] wire) - (on-arvo:def wire sign-arvo) - =/ nack-count=@ud (slav %ud i.t.wire) - =/ who=@p (slav %p i.t.t.wire) - =/ pax t.t.t.wire - ?> ?=([%behn %wake *] sign-arvo) - ~? ?=(^ error.sign-arvo) - "behn errored in backoff timers, continuing anyway" - :_ this - [(try-rejoin:hc who pax +(nack-count))]~ - :: - ++ on-fail on-fail:def - :: - ++ on-poke - |= [=mark =vase] - ^- (quip card _this) - ?+ mark (on-poke:def mark vase) - %metadata-hook-action - =^ cards state - (poke-hook-action:hc !<(metadata-hook-action vase)) - [cards this] - :: - %metadata-action - [(poke-action:hc !<(metadata-action vase)) this] - :: - %import - ?> (team:title our.bowl src.bowl) - =^ cards state - (poke-import:hc q.vase) - [cards this] - == - :: - ++ on-watch - |= =path - ^- (quip card _this) - ?+ path (on-watch:def path) - [%group *] [(watch-group:hc t.path) this] - == - :: - ++ on-agent - |= [=wire =sign:agent:gall] - ^- (quip card _this) - ?+ -.sign (on-agent:def wire sign) - %kick =^(cards state (kick:hc wire) [cards this]) - %watch-ack =^(cards state (watch-ack:hc wire p.sign) [cards this]) - %fact - ?+ p.cage.sign (on-agent:def wire sign) - %metadata-update - =^ cards state - (fact-metadata-update:hc wire !<(metadata-update q.cage.sign)) - [cards this] - == - == - -- -:: -|_ =bowl:gall -+* grp ~(. grpl bowl) -++ poke-hook-action - |= act=metadata-hook-action - ^- (quip card _state) - |^ - ?- -.act - %add-owned - ?> (team:title our.bowl src.bowl) - :- ~ - ?: (~(has by synced) path.act) state - state(synced (~(put by synced) path.act our.bowl)) - :: - %add-synced - ?> (team:title our.bowl src.bowl) - =/ =path [%group path.act] - ?: (~(has by synced) path.act) [~ state] - :_ state(synced (~(put by synced) path.act ship.act)) - [%pass path %agent [ship.act %metadata-hook] %watch path]~ - :: - %remove - =/ ship (~(get by synced) path.act) - ?~ ship [~ state] - ?: &(!=(u.ship src.bowl) ?!((team:title our.bowl src.bowl))) - [~ state] - :_ state(synced (~(del by synced) path.act)) - %- zing - :~ (unsubscribe [%group path.act] u.ship) - [%give %kick ~[[%group path.act]] ~]~ - == - == - :: - ++ unsubscribe - |= [=path =ship] - ^- (list card) - ?: =(ship our.bowl) - [%pass path %agent [our.bowl %metadata-store] %leave ~]~ - [%pass path %agent [ship %metadata-hook] %leave ~]~ - -- -:: -++ poke-action - |= act=metadata-action - ^- (list card) - |^ - ?: (team:title our.bowl src.bowl) - ?- -.act - %add (send group-path.act) - %remove (send group-path.act) - == - ?> (is-member:grp src.bowl group-path.act) - ?- -.act - %add (metadata-poke our.bowl %metadata-store) - %remove (metadata-poke our.bowl %metadata-store) - == - :: - ++ send - |= =group-path - ^- (list card) - =/ =ship - %+ slav %p - (snag 1 group-path) - =/ app ?:(=(ship our.bowl) %metadata-store %metadata-hook) - (metadata-poke ship app) - :: - ++ metadata-poke - |= [=ship app=@tas] - ^- (list card) - [%pass / %agent [ship app] %poke %metadata-action !>(act)]~ - :: - ++ is-managed - |= =path - ^- ? - ?> ?=(^ path) - !=(i.path '~') - -- -:: -++ poke-import - |= arc=* - ^- (quip card _state) - =/ sty=state-one - [%1 (remake-map ;;((tree [group-path ship]) +.arc))] - :_ sty - %+ murn ~(tap by synced.sty) - |= [=group-path =ship] - ?: =(ship our.bowl) - ~ - =/ =path [%group group-path] - `(try-rejoin ship path 0) -:: -++ try-rejoin - |= [who=@p pax=path nack-count=@ud] - ^- card - =/ =wire - [%try-rejoin (scot %ud nack-count) (scot %p who) pax] - [%pass wire %agent [who %metadata-hook] %watch pax] -:: -++ watch-group - |= =path - ^- (list card) - |^ - ?> =(our.bowl (~(got by synced) path)) - ?> (is-member:grp src.bowl path) - %+ turn ~(tap by (metadata-scry path)) - |= [[=group-path =md-resource] =metadata] - ^- card - [%give %fact ~ %metadata-update !>([%add group-path md-resource metadata])] - :: - ++ metadata-scry - |= pax=^path - ^- associations - =. pax - ;: weld - /(scot %p our.bowl)/metadata-store/(scot %da now.bowl)/group - pax - /noun - == - .^(associations %gx pax) - -- -:: -++ fact-metadata-update - |= [wir=wire fact=metadata-update] - ^- (quip card _state) - |^ - [?:((team:title our.bowl src.bowl) handle-local handle-foreign) state] - :: - ++ handle-local - ?+ -.fact ~ - %add - ?. (~(has by synced) group-path.fact) ~ - (give group-path.fact fact) - :: - %update-metadata - ?. (~(has by synced) group-path.fact) ~ - (give group-path.fact fact) - :: - %remove - ?. (~(has by synced) group-path.fact) ~ - (give group-path.fact fact) - == - :: - ++ handle-foreign - ?+ -.fact ~ - %add - ?. =(src.bowl (~(got by synced) group-path.fact)) ~ - (poke fact) - :: - %update-metadata - ?. =(src.bowl (~(got by synced) group-path.fact)) ~ - (poke [%add +.fact]) - :: - %remove - ?. =(src.bowl (~(got by synced) group-path.fact)) ~ - (poke fact) - == - :: - ++ give - |= [=path upd=metadata-update] - ^- (list card) - [%give %fact ~[[%group path]] %metadata-update !>(upd)]~ - :: - ++ poke - |= act=metadata-action - ^- (list card) - [%pass / %agent [our.bowl %metadata-store] %poke %metadata-action !>(act)]~ - -- -:: -++ kick - |= wir=wire - ^- (quip card _state) - :_ state - |- - ?+ wir !! - [%try-rejoin @ @ *] - $(wir t.t.t.wir) - :: - [%updates ~] - [%pass /updates %agent [our.bowl %metadata-store] %watch /updates]~ - :: - [%group @ *] - ?. (~(has by synced) t.wir) ~ - =/ =ship (~(got by synced) t.wir) - ?: =(ship our.bowl) - [%pass wir %agent [our.bowl %metadata-store] %watch wir]~ - [%pass wir %agent [ship %metadata-hook] %watch wir]~ - == -:: -++ watch-ack - |= [wir=wire saw=(unit tang)] - ^- (quip card _state) - ?: ?=([%try-rejoin @ *] wir) - ?~ saw - [~ state] - =/ nack-count=@ud (slav %ud i.t.wir) - =/ wakeup=@da - (add now.bowl (mul ~s1 (bex (min 19 nack-count)))) - :_ state - [%pass wir %arvo %b %wait wakeup]~ - ?> ?=(^ wir) - [~ ?~(saw state state(synced (~(del by synced) t.wir)))] -:: --- +(default-agent *agent:gall %|) diff --git a/pkg/arvo/app/metadata-store.hoon b/pkg/arvo/app/metadata-store.hoon index f9d7dbebb1..45df295a2b 100644 --- a/pkg/arvo/app/metadata-store.hoon +++ b/pkg/arvo/app/metadata-store.hoon @@ -44,11 +44,26 @@ creator=@p == :: ++$ md-resource-1 [=app-name =app-path] +:: ++$ associations-1 (map [group-path md-resource-1] metadata) +:: +$ base-state-1 - $: associations=associations - group-indices=(jug group-path md-resource) + $: associations=associations-1 + group-indices=(jug group-path md-resource-1) app-indices=(jug app-name [group-path app-path]) - resource-indices=(jug md-resource group-path) + resource-indices=(jug md-resource-1 group-path) + == +:: ++$ cached-indices + $: group-indices=(jug resource md-resource) + app-indices=(jug app-name [group=resource =resource]) + resource-indices=(jug md-resource resource) + == +:: ++$ base-state-2 + $: =associations + ~ == :: +$ state-0 [%0 base-state-0] @@ -58,6 +73,7 @@ +$ state-4 [%4 base-state-1] +$ state-5 [%5 base-state-1] +$ state-6 [%6 base-state-1] ++$ state-7 [%7 base-state-2] +$ versioned-state $% state-0 state-1 @@ -66,10 +82,16 @@ state-4 state-5 state-6 + state-7 + == +:: ++$ inflated-state + $: state-7 + cached-indices == -- :: -=| state-6 +=| inflated-state =* state - %+ verb | %- agent:dbug @@ -81,7 +103,7 @@ def ~(. (default-agent this %|) bowl) :: ++ on-init on-init:def - ++ on-save !>(state) + ++ on-save !>(-.state) ++ on-load |= =vase ^- (quip card _this) @@ -97,25 +119,6 @@ ?+ mark (on-poke:def mark vase) %metadata-action (poke-metadata-action:mc !<(metadata-action vase)) - :: - %noun - =/ val=(each [%cleanup path] tang) - (mule |.(!<([%cleanup path] vase))) - ?. ?=(%& -.val) - (on-poke:def mark vase) - =/ group=path +.p.val - =/ res=(set md-resource) (~(get ju group-indices) group) - =. group-indices (~(del by group-indices) group) - :- ~ - %+ roll ~(tap in res) - |= [r=md-resource out=_state] - =: resource-indices.out (~(del by resource-indices.out) r) - associations.out (~(del by associations.out) group r) - app-indices.out - %- ~(del ju app-indices.out) - [app-name.r group app-path.r] - == - out :: %import (poke-import:mc q.vase) @@ -161,21 +164,21 @@ ``noun+!>((metadata-for-app:mc app-name)) :: [%x %group *] - =/ =group-path t.t.path - ``noun+!>((metadata-for-group:mc group-path)) + =/ group=resource (de-path:resource t.t.path) + ``noun+!>((metadata-for-group:mc group)) :: [%x %metadata @ @ @ ~] - =/ =group-path (stab (slav %t i.t.t.path)) - =/ =md-resource [`term`i.t.t.t.path (stab (slav %t i.t.t.t.t.path))] - ``noun+!>((~(get by associations) [group-path md-resource])) + =/ group=resource (de-path:resource (stab (slav %t i.t.t.path))) + =/ =md-resource [`term`i.t.t.t.path (de-path:resource (stab (slav %t i.t.t.t.t.path)))] + ``noun+!>((~(get by associations) [group md-resource])) :: [%x %resource @ *] =/ app=term i.t.t.path - =/ app-path=^path t.t.t.path - ``noun+!>((~(get by resource-indices) app app-path)) + =/ rid=resource (de-path:resource t.t.t.path) + ``noun+!>((~(get by resource-indices) app rid)) :: [%x %export ~] - ``noun+!>(state) + ``noun+!>(-.state) == :: ++ on-leave on-leave:def @@ -192,118 +195,68 @@ =/ old !<(versioned-state vase) =| cards=(list card) |^ - ?: ?=(%6 -.old) - =/ =^associations - (migrate-app-to-graph-store %chat associations.old) + ?: ?=(%7 -.old) :- cards - %_ state - associations associations - :: - resource-indices - (rebuild-resource-indices associations) + %_ state + associations + associations.old + :: + resource-indices + (rebuild-resource-indices associations.old) :: app-indices - (rebuild-app-indices associations) + (rebuild-app-indices associations.old) :: group-indices - (rebuild-group-indices associations) + (rebuild-group-indices associations.old) == + ?: ?=(%6 -.old) + =/ old-assoc=associations-1 + (migrate-app-to-graph-store %chat associations.old) + $(old [%7 (associations-1-to-2 old-assoc) ~]) + :: ?: ?=(%5 -.old) - =/ =^associations + =/ associations=associations-1 (migrate-app-to-graph-store %publish associations.old) %_ $ -.old %6 associations.old associations - :: - resource-indices.old - (rebuild-resource-indices associations) - :: - app-indices.old - (rebuild-app-indices associations) - :: - group-indices.old - (rebuild-group-indices associations) == - - ?: ?=(%4 -.old) - %_ $ - -.old %5 - :: - resource-indices.old - (rebuild-resource-indices associations.old) - :: - app-indices.old - (rebuild-app-indices associations.old) - :: - group-indices.old - (rebuild-group-indices associations.old) - == - ?: ?=(%3 -.old) - $(old [%4 +.old]) - ?: ?=(%2 -.old) - =/ new-state=state-3 - %* . *state-3 - associations - %- malt - %+ murn ~(tap by associations.old) - |= [[=group-path =md-resource] m=metadata-0] - ^- (unit [[^group-path ^md-resource] metadata]) - ?: =(app-name.md-resource %link) ~ - `[[group-path md-resource] (old-md-to-new m)] - == - $(old new-state) - ?: ?=(%1 -.old) - %_ $ - old [%2 +.old] - :: - cards - %+ murn ~(tap in ~(key by group-indices.old)) - |= =group-path - ^- (unit card) - =/ rid (de-path-soft:resource group-path) - ?~ rid ~ - ?: =(our.bowl entity.u.rid) - `(poke-md-hook %add-owned group-path) - `(poke-md-hook %add-synced entity.u.rid group-path) - == - =/ new-state-1=state-1 - %* . *state-1 - associations (migrate-associations associations.old) - group-indices (migrate-group-indices group-indices.old) - app-indices (migrate-app-indices app-indices.old) - resource-indices (migrate-resource-indices resource-indices.old) - == - $(old new-state-1) + :: pre-breach, can safely throw away + $(old *state-7) + ++ associations-1-to-2 + |= assoc=* + *^associations :: ++ rebuild-resource-indices |= =^associations - %- ~(gas ju *(jug md-resource group-path)) + %- ~(gas ju *(jug md-resource resource)) %+ turn ~(tap in ~(key by associations)) - |= [g=group-path r=md-resource] - ^- [md-resource group-path] + |= [g=resource r=md-resource] + ^- [md-resource resource] [r g] :: ++ rebuild-group-indices |= =^associations - %- ~(gas ju *(jug group-path md-resource)) + %- ~(gas ju *(jug resource md-resource)) ~(tap in ~(key by associations)) :: ++ rebuild-app-indices |= =^associations - %- ~(gas ju *(jug app-name [group-path app-path])) + %- ~(gas ju *(jug app-name [group=resource resource])) %+ turn ~(tap in ~(key by associations)) - |= [g=group-path r=md-resource] - ^- [app-name [group-path app-path]] - [app-name.r [g app-path.r]] - + |= [g=resource r=md-resource] + ^- [app-name [resource resource]] + [app-name.r [g resource.r]] :: ++ migrate-app-to-graph-store - |= [app=@tas =^associations] - ^+ associations + |= [app=@tas associations=associations-1] + ^- associations-1 %- malt %+ turn ~(tap by associations) - |= [[=group-path =md-resource] m=metadata] - ^- [[^group-path ^md-resource] metadata] + |= [[=group-path md-resource=md-resource-1] m=metadata] + ^- [[^group-path md-resource-1] metadata] + ~! md-resource ?. =(app-name.md-resource app) [[group-path md-resource] m] =/ new-app-path=path @@ -311,155 +264,76 @@ app-path.md-resource ship+app-path.md-resource [[group-path [%graph new-app-path]] m(module app)] - :: - ++ poke-md-hook - |= act=metadata-hook-action - ^- card - =/ =cage metadata-hook-action+!>(act) - [%pass / %agent [our.bowl %metadata-hook] %poke cage] - :: - ++ new-group-path - |= =group-path - ship+(new-app-path group-path) - :: - ++ new-app-path - |= =app-path - ^- path - ?> ?=(^ app-path) - ?:(=('~' i.app-path) t.app-path app-path) - :: - ++ old-md-to-new - |= m=metadata-0 - ^- metadata - %* . *metadata - title title.m - description description.m - color color.m - date-created date-created.m - creator creator.m - module *term - == - :: - ++ migrate-md-resource - |= md-resource - ^- md-resource - ?: =(%chat app-name) [%chat (new-app-path app-path)] - ?: =(%contacts app-name) [%contacts ship+app-path] - [app-name app-path] - :: - ++ migrate-resource-indices - |= resource-indices=(jug md-resource group-path) - ^- (jug md-resource group-path) - %- malt - %+ turn ~(tap by resource-indices) - |= [=md-resource paths=(set group-path)] - :- (migrate-md-resource md-resource) - (~(run in paths) new-group-path) - :: - ++ migrate-app-indices - |= app-indices=(jug app-name [group-path app-path]) - %- malt - %+ turn ~(tap by app-indices) - |= [app=term indices=(set [=group-path =app-path])] - :- app - %- ~(run in indices) - |= [=group-path =app-path] - :- (new-group-path group-path) - ?: =(%chat app) (new-app-path app-path) - ?: =(%contacts app) ship+app-path - app-path - :: - ++ migrate-group-indices - |= group-indices=(jug group-path md-resource) - %- malt - %+ turn ~(tap by group-indices) - |= [=group-path resources=(set md-resource)] - :- (new-group-path group-path) - %- sy - %+ turn ~(tap in resources) - migrate-md-resource - :: - ++ migrate-associations - |= associations=associations-0 - %- malt - %+ turn ~(tap by associations) - |= [[g=group-path r=md-resource] m=metadata-0] - :_ m - [(new-group-path g) (migrate-md-resource r)] -- ++ poke-metadata-action |= act=metadata-action ^- (quip card _state) ?> (team:title our.bowl src.bowl) ?- -.act - %add (handle-add group-path.act resource.act metadata.act) - %remove (handle-remove group-path.act resource.act) + %add (handle-add group.act resource.act metadata.act) + %remove (handle-remove group.act resource.act) == :: ++ poke-import |= arc=* ^- (quip card _state) |^ - (on-load !>([%5 (remake-metadata ;;(tree-metadata +.arc))])) + (on-load !>([%7 (remake-metadata ;;(tree-metadata +.arc))])) :: +$ tree-metadata - $: associations=(tree [[group-path md-resource] metadata]) - group-indices=(tree [group-path (tree md-resource)]) - app-indices=(tree [app-name (tree [group-path app-path])]) - resource-indices=(tree [md-resource (tree group-path)]) + $: associations=(tree [[resource md-resource] metadata]) + ~ == :: ++ remake-metadata |= tm=tree-metadata - ^- base-state-1 + ^- base-state-2 :* (remake-map associations.tm) - (remake-jug group-indices.tm) - (remake-jug app-indices.tm) - (remake-jug resource-indices.tm) + ~ == -- :: ++ handle-add - |= [=group-path =md-resource =metadata] + |= [group=resource =md-resource =metadata] ^- (quip card _state) :- %+ send-diff app-name.md-resource ?: (~(has by resource-indices) md-resource) - [%update-metadata group-path md-resource metadata] - [%add group-path md-resource metadata] + [%update-metadata group md-resource metadata] + [%add group md-resource metadata] %= state associations - (~(put by associations) [group-path md-resource] metadata) + (~(put by associations) [group md-resource] metadata) :: group-indices - (~(put ju group-indices) group-path md-resource) + (~(put ju group-indices) group md-resource) :: app-indices %+ ~(put ju app-indices) app-name.md-resource - [group-path app-path.md-resource] + [group resource.md-resource] :: resource-indices - (~(put ju resource-indices) md-resource group-path) + (~(put ju resource-indices) md-resource group) == :: ++ handle-remove - |= [=group-path =md-resource] + |= [group=resource =md-resource] ^- (quip card _state) - :- (send-diff app-name.md-resource [%remove group-path md-resource]) + :- (send-diff app-name.md-resource [%remove group md-resource]) %= state associations - (~(del by associations) [group-path md-resource]) + (~(del by associations) [group md-resource]) :: group-indices - (~(del ju group-indices) group-path md-resource) + (~(del ju group-indices) group md-resource) :: app-indices %+ ~(del ju app-indices) app-name.md-resource - [group-path app-path.md-resource] + [group resource.md-resource] :: resource-indices - (~(del ju resource-indices) md-resource group-path) + (~(del ju resource-indices) md-resource group) == :: ++ metadata-for-app @@ -467,18 +341,18 @@ ^- ^associations %- ~(gas by *^associations) %+ turn ~(tap in (~(gut by app-indices) app-name ~)) - |= [=group-path =app-path] - :- [group-path [app-name app-path]] - (~(got by associations) [group-path [app-name app-path]]) + |= [group=resource rid=resource] + :- [group [app-name rid]] + (~(got by associations) [group [app-name rid]]) :: ++ metadata-for-group - |= =group-path + |= group=resource ^- ^associations %- ~(gas by *^associations) - %+ turn ~(tap in (~(gut by group-indices) group-path ~)) + %+ turn ~(tap in (~(gut by group-indices) group ~)) |= =md-resource - :- [group-path md-resource] - (~(got by associations) [group-path md-resource]) + :- [group md-resource] + (~(got by associations) [group md-resource]) :: ++ send-diff |= [=app-name upd=metadata-update] diff --git a/pkg/arvo/lib/group.hoon b/pkg/arvo/lib/group.hoon index cd9134c7a4..ecacecd4c4 100644 --- a/pkg/arvo/lib/group.hoon +++ b/pkg/arvo/lib/group.hoon @@ -44,15 +44,15 @@ (scry-group-path group-path) :: ++ is-member - |= [=ship =group-path] + |= [=ship group=resource] ^- ? =- (~(has in -) ship) - (members-from-path group-path) + (members group) :: ++ is-admin - |= [=ship =group-path] + |= [=ship group=resource] ^- ? - =/ tags tags:(fall (scry-group-path group-path) *group) + =/ 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 diff --git a/pkg/arvo/lib/hark/store.hoon b/pkg/arvo/lib/hark/store.hoon index c2736724f0..06df21cc59 100644 --- a/pkg/arvo/lib/hark/store.hoon +++ b/pkg/arvo/lib/hark/store.hoon @@ -245,11 +245,9 @@ |= =(list ^group-contents) ^- json :- %a - %+ murn list + %+ turn list |= =^group-contents - ?. ?=(?(%add-members %remove-members) -.group-contents) - ~ - `(update:enjs:group-store group-contents) + (update:enjs:group-store group-contents) -- :: ++ indexed-notification diff --git a/pkg/arvo/lib/metadata-json.hoon b/pkg/arvo/lib/metadata-json.hoon index 82a65c8fd0..ac74f88d82 100644 --- a/pkg/arvo/lib/metadata-json.hoon +++ b/pkg/arvo/lib/metadata-json.hoon @@ -1,4 +1,5 @@ /- *metadata-store +/+ resource |% ++ associations-to-json |= =associations @@ -6,19 +7,19 @@ ^- json %- pairs %+ turn ~(tap by associations) - |= [[=group-path =md-resource] =metadata] + |= [[group=resource =md-resource] =metadata] ^- [cord json] :- %- crip ;: weld - (trip (spat group-path)) + (trip (spat (en-path:resource group))) (weld "/" (trip app-name.md-resource)) - (trip (spat app-path.md-resource)) + (trip (spat (en-path:resource resource.md-resource))) == %- pairs - :~ [%group-path (path group-path)] + :~ [%group s+(enjs-path:resource group)] [%app-name s+app-name.md-resource] - [%app-path (path app-path.md-resource)] + [%resource s+(enjs-path:resource resource.md-resource)] [%metadata (metadata-to-json metadata)] == :: @@ -36,13 +37,13 @@ :: ++ add %- ot - :~ [%group-path pa] + :~ [%group dejs-path:resource] [%resource md-resource] [%metadata metadata] == ++ remove %- ot - :~ [%group-path pa] + :~ [%group dejs-path:resource] [%resource md-resource] == :: @@ -60,10 +61,12 @@ [%creator (su ;~(pfix sig fed:ag))] [%module so] == + :: ++ md-resource + ^- $-(json ^md-resource) %- ot :~ [%app-name so] - [%app-path pa] + [%resource dejs-path:resource] == -- :: @@ -90,27 +93,27 @@ %add :- %add %- pairs - :~ [%group-path (path group-path.upd)] + :~ [%group s+(enjs-path:resource group.upd)] [%app-name s+app-name.resource.upd] - [%app-path (path app-path.resource.upd)] + [%resource s+(enjs-path:resource resource.resource.upd)] [%metadata (metadata-to-json metadata.upd)] == :: %update-metadata :- %update-metadata %- pairs - :~ [%group-path (path group-path.upd)] + :~ [%group s+(enjs-path:resource group.upd)] [%app-name s+app-name.resource.upd] - [%app-path (path app-path.resource.upd)] + [%resource s+(enjs-path:resource resource.resource.upd)] [%metadata (metadata-to-json metadata.upd)] == :: %remove :- %remove %- pairs - :~ [%group-path (path group-path.upd)] + :~ [%group s+(enjs-path:resource group.upd)] [%app-name s+app-name.resource.upd] - [%app-path (path app-path.resource.upd)] + [%resource s+(enjs-path:resource resource.resource.upd)] == :: %associations diff --git a/pkg/arvo/lib/metadata.hoon b/pkg/arvo/lib/metadata.hoon index 13ac9ac1e0..279f4852ca 100644 --- a/pkg/arvo/lib/metadata.hoon +++ b/pkg/arvo/lib/metadata.hoon @@ -5,12 +5,12 @@ :: |_ =bowl:gall ++ app-paths-from-group - |= [=app-name =group-path] - ^- (list app-path) + |= [=app-name group=resource] + ^- (list resource) %+ murn %~ tap in - =- (~(gut by -) group-path ~) - .^ (jug ^group-path md-resource) + =- (~(gut by -) group ~) + .^ (jug resource md-resource) %gy (scot %p our.bowl) %metadata-store @@ -18,9 +18,9 @@ /group-indices == |= =md-resource - ^- (unit app-path) + ^- (unit resource) ?. =(app-name.md-resource app-name) ~ - `app-path.md-resource + `resource.md-resource :: ++ peek-metadata |= [app-name=term =group=resource:res =app=resource:res] @@ -35,23 +35,21 @@ == :: ++ group-from-app-resource - |= [app=term =app=resource:res] + |= =md-resource ^- (unit resource:res) - =/ app-path (en-path:res app-resource) - =/ group-paths (groups-from-resource app app-path) - ?~ group-paths - ~ - `(de-path:res i.group-paths) + =/ groups (groups-from-resource md-resource) + ?~ groups ~ + `i.groups :: ++ groups-from-resource |= =md-resource - ^- (list group-path) + ^- (list resource) =; resources %~ tap in %+ ~(gut by resources) md-resource - *(set group-path) - .^ (jug ^md-resource group-path) + *(set resource) + .^ (jug ^md-resource resource) %gy (scot %p our.bowl) %metadata-store diff --git a/pkg/arvo/sur/hark-store.hoon b/pkg/arvo/sur/hark-store.hoon index b80f602856..7993b1b038 100644 --- a/pkg/arvo/sur/hark-store.hoon +++ b/pkg/arvo/sur/hark-store.hoon @@ -62,9 +62,7 @@ :: +$ group-contents $~ [%add-members *resource ~] - $% $>(?(%add-members %remove-members) update:group-store) - metadata-action:metadata-store - == + $>(?(%add-members %remove-members) update:group-store) :: +$ notification [date=@da read=? =contents] diff --git a/pkg/arvo/sur/metadata-store.hoon b/pkg/arvo/sur/metadata-store.hoon index 400f21f165..840a831a24 100644 --- a/pkg/arvo/sur/metadata-store.hoon +++ b/pkg/arvo/sur/metadata-store.hoon @@ -1,9 +1,11 @@ +/- *resource |% +:: +$ group-path path +$ app-name term +$ app-path path -+$ md-resource [=app-name =app-path] -+$ associations (map [group-path md-resource] metadata) ++$ md-resource [=app-name =resource] ++$ associations (map [group=resource md-resource] metadata) :: +$ color @ux +$ metadata @@ -16,13 +18,13 @@ == :: +$ metadata-action - $% [%add =group-path resource=md-resource =metadata] - [%remove =group-path resource=md-resource] + $% [%add group=resource resource=md-resource =metadata] + [%remove group=resource resource=md-resource] == :: +$ metadata-update $% metadata-action [%associations =associations] - [%update-metadata =group-path resource=md-resource =metadata] + [%update-metadata group=resource resource=md-resource =metadata] == --