shrub/pkg/arvo/app/metadata-store.hoon

395 lines
10 KiB
Plaintext
Raw Normal View History

:: metadata-store [landscape]:
::
:: data store for application metadata and mappings
:: between groups and resources within applications
::
:: group-paths are expected to be an existing group path
:: resources are expected to correspond to existing app paths
::
:: note: when scrying for metadata, to make the arguments safe in paths,
:: encode group-path and app-path using (scot %t (spat group-path))
::
:: +watch paths:
:: /all associations + updates
:: /updates just updates
:: /app-name/%app-name specific app's associations + updates
::
:: +peek paths:
:: /associations all associations
:: /group-indices all group indices
:: /app-indices all app indices
:: /resource-indices all resource indices
:: /metadata/%group-path/%app-name/%app-path specific metadatum
:: /app-name/%app-name associations for app
:: /group/%group-path associations for group
::
2020-07-23 08:02:54 +03:00
/- *metadata-store, *metadata-hook
/+ *metadata-json, default-agent, verb, dbug, resource, *migrate
|%
+$ card card:agent:gall
+$ base-state-0
$: associations=associations-0
group-indices=(jug group-path md-resource)
app-indices=(jug app-name [group-path app-path])
resource-indices=(jug md-resource group-path)
==
2020-06-24 03:28:57 +03:00
::
+$ associations-0 (map [group-path md-resource] metadata-0)
2020-06-24 03:28:57 +03:00
::
+$ metadata-0
$: title=@t
description=@t
color=@ux
date-created=@da
creator=@p
2020-06-24 03:28:57 +03:00
==
::
2021-01-12 07:26:19 +03:00
+$ md-resource-1 [=app-name =app-path]
::
+$ associations-1 (map [group-path md-resource-1] metadata)
::
+$ base-state-1
2021-01-12 07:26:19 +03:00
$: associations=associations-1
group-indices=(jug group-path md-resource-1)
app-indices=(jug app-name [group-path app-path])
2021-01-12 07:26:19 +03:00
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=(map md-resource resource)
2021-01-12 07:26:19 +03:00
==
::
+$ base-state-2
$: =associations
~
2020-07-23 08:02:54 +03:00
==
::
+$ state-0 [%0 base-state-0]
+$ state-1 [%1 base-state-0]
+$ state-2 [%2 base-state-0]
+$ state-3 [%3 base-state-1]
+$ state-4 [%4 base-state-1]
+$ state-5 [%5 base-state-1]
+$ state-6 [%6 base-state-1]
2021-01-12 07:26:19 +03:00
+$ state-7 [%7 base-state-2]
2020-06-24 03:28:57 +03:00
+$ versioned-state
$% state-0
state-1
state-2
state-3
state-4
state-5
state-6
2021-01-12 07:26:19 +03:00
state-7
==
::
+$ inflated-state
$: state-7
cached-indices
2020-06-24 03:28:57 +03:00
==
--
::
2021-01-12 07:26:19 +03:00
=| inflated-state
=* state -
%+ verb |
%- agent:dbug
^- agent:gall
=<
|_ =bowl:gall
+* this .
mc ~(. +> bowl)
def ~(. (default-agent this %|) bowl)
::
++ on-init on-init:def
2021-01-12 07:26:19 +03:00
++ on-save !>(-.state)
++ on-load
2020-06-24 03:28:57 +03:00
|= =vase
^- (quip card _this)
=^ cards state
(on-load:mc vase)
[cards this]
::
++ on-poke
|= [=mark =vase]
^- (quip card _this)
?> (team:title our.bowl src.bowl)
=^ cards state
?+ mark (on-poke:def mark vase)
?(%metadata-action %metadata-update)
(poke-metadata-update:mc !<(metadata-update vase))
2020-12-01 00:06:41 +03:00
::
%import
(poke-import:mc q.vase)
::
%noun ~& +.state `state
==
[cards this]
::
++ on-watch
|= =path
^- (quip card _this)
?> (team:title our.bowl src.bowl)
|^
=/ cards=(list card)
?+ path (on-watch:def path)
[%all ~]
(give %metadata-update !>([%associations associations]))
::
[%updates ~]
~
::
[%app-name @ ~]
=/ =app-name i.t.path
=/ app-indices (metadata-for-app:mc app-name)
(give %metadata-update !>([%associations app-indices]))
==
[cards this]
::
++ give
|= =cage
^- (list card)
[%give %fact ~ cage]~
--
::
++ on-peek
|= =path
^- (unit (unit cage))
?+ path (on-peek:def path)
[%y %group-indices ~] ``noun+!>(group-indices)
[%y %app-indices ~] ``noun+!>(app-indices)
[%y %resource-indices ~] ``noun+!>(resource-indices)
[%x %associations ~] ``noun+!>(associations)
[%x %app-name @ ~]
=/ =app-name i.t.t.path
``noun+!>((metadata-for-app:mc app-name))
::
[%x %group *]
2021-01-12 07:26:19 +03:00
=/ group=resource (de-path:resource t.t.path)
``noun+!>((metadata-for-group:mc group))
::
[%x %metadata @ @ @ @ ~]
=/ =md-resource
[i.t.t.path (de-path:resource t.t.t.path)]
``noun+!>((~(get by associations) md-resource))
::
[%x %resource @ *]
=/ app=term i.t.t.path
2021-01-12 07:26:19 +03:00
=/ rid=resource (de-path:resource t.t.t.path)
``noun+!>((~(get by resource-indices) [app rid]))
2020-12-01 00:06:41 +03:00
::
[%x %export ~]
2021-01-12 07:26:19 +03:00
``noun+!>(-.state)
==
::
++ on-leave on-leave:def
++ on-agent on-agent:def
++ on-arvo on-arvo:def
++ on-fail on-fail:def
--
::
|_ =bowl:gall
::
++ on-load
|= =vase
^- (quip card _state)
=/ old !<(versioned-state vase)
=| cards=(list card)
|^
2021-01-12 07:26:19 +03:00
?: ?=(%7 -.old)
:- cards
2021-01-12 07:26:19 +03:00
%_ state
associations
associations.old
::
resource-indices
(rebuild-resource-indices associations.old)
::
group-indices
(rebuild-group-indices associations.old)
::
app-indices
2021-01-12 07:26:19 +03:00
(rebuild-app-indices associations.old)
==
2021-01-12 07:26:19 +03:00
?: ?=(%6 -.old)
=/ old-assoc=associations-1
(migrate-app-to-graph-store %chat associations.old)
$(old [%7 (associations-1-to-2 old-assoc) ~])
::
?: ?=(%5 -.old)
2021-01-12 07:26:19 +03:00
=/ associations=associations-1
(migrate-app-to-graph-store %publish associations.old)
%_ $
-.old %6
associations.old associations
==
2021-01-12 07:26:19 +03:00
:: pre-breach, can safely throw away
$(old *state-7)
++ associations-1-to-2
|= assoc=*
*^associations
::
++ rebuild-resource-indices
|= =^associations
%- ~(gas by *(map md-resource resource))
%+ turn ~(tap by associations)
|= [r=md-resource g=resource =metadata]
[r g]
::
++ rebuild-group-indices
|= =^associations
2021-01-12 07:26:19 +03:00
%- ~(gas ju *(jug resource md-resource))
%+ turn
~(tap by associations)
|= [r=md-resource g=resource =metadata]
[g r]
::
++ rebuild-app-indices
|= =^associations
2021-01-12 07:26:19 +03:00
%- ~(gas ju *(jug app-name [group=resource resource]))
%+ turn ~(tap by associations)
|= [r=md-resource g=resource =metadata]
[app-name.r g resource.r]
::
++ migrate-app-to-graph-store
2021-01-12 07:26:19 +03:00
|= [app=@tas associations=associations-1]
^- associations-1
%- malt
%+ turn ~(tap by associations)
2021-01-12 07:26:19 +03:00
|= [[=group-path md-resource=md-resource-1] m=metadata]
^- [[^group-path md-resource-1] metadata]
?. =(app-name.md-resource app)
[[group-path md-resource] m]
=/ new-app-path=path
?. ?=([@ @ ~] app-path.md-resource)
app-path.md-resource
ship+app-path.md-resource
[[group-path [%graph new-app-path]] m(module app)]
--
++ poke-metadata-update
|= upd=metadata-update
^- (quip card _state)
?> (team:title [our src]:bowl)
?+ -.upd !!
%add (handle-add +.upd)
%remove (handle-remove +.upd)
%initial-group (handle-initial-group +.upd)
==
::
2020-12-01 00:06:41 +03:00
++ poke-import
|= arc=*
^- (quip card _state)
2020-12-02 10:03:05 +03:00
|^
2021-01-12 07:26:19 +03:00
(on-load !>([%7 (remake-metadata ;;(tree-metadata +.arc))]))
2020-12-02 10:03:05 +03:00
::
+$ tree-metadata
$: associations=(tree [md-resource [resource metadata]])
2021-01-12 07:26:19 +03:00
~
2020-12-02 10:03:05 +03:00
==
::
++ remake-metadata
|= tm=tree-metadata
2021-01-12 07:26:19 +03:00
^- base-state-2
2020-12-02 10:03:05 +03:00
:* (remake-map associations.tm)
2021-01-12 07:26:19 +03:00
~
2020-12-02 10:03:05 +03:00
==
--
2020-12-01 00:06:41 +03:00
::
++ handle-add
2021-01-12 07:26:19 +03:00
|= [group=resource =md-resource =metadata]
^- (quip card _state)
:- %+ send-diff app-name.md-resource
?: (~(has by resource-indices) md-resource)
[%updated-metadata group md-resource metadata metadata]
2021-01-12 07:26:19 +03:00
[%add group md-resource metadata]
%= state
associations
(~(put by associations) md-resource [group metadata])
::
app-indices
%+ ~(put ju app-indices)
app-name.md-resource
2021-01-12 07:26:19 +03:00
[group resource.md-resource]
::
resource-indices
(~(put by resource-indices) md-resource group)
::
group-indices
(~(put ju group-indices) group md-resource)
==
::
++ handle-remove
2021-01-12 07:26:19 +03:00
|= [group=resource =md-resource]
^- (quip card _state)
2021-01-12 07:26:19 +03:00
:- (send-diff app-name.md-resource [%remove group md-resource])
%= state
associations
(~(del by associations) md-resource)
::
app-indices
%+ ~(del ju app-indices)
app-name.md-resource
2021-01-12 07:26:19 +03:00
[group resource.md-resource]
::
resource-indices
(~(del by resource-indices) md-resource)
::
group-indices
(~(del ju group-indices) group md-resource)
==
::
++ handle-initial-group
|= [group=resource =^associations]
=/ assocs=(list [=md-resource grp=resource =metadata])
~(tap by associations)
=| cards=(list card)
|-
?~ assocs
[cards state]
=, assocs
?> =(group grp.i)
=^ new-cards state
(handle-add group [md-resource metadata]:i)
$(cards (weld cards new-cards), assocs t)
::
++ metadata-for-app
|= =app-name
^+ associations
%+ roll ~(tap in (~(gut by app-indices) app-name ~))
|= [[group=resource rid=resource] out=^associations]
=/ =md-resource
[app-name rid]
=/ [resource =metadata]
(~(got by associations) md-resource)
(~(put by out) md-resource [group metadata])
::
++ metadata-for-group
2021-01-12 07:26:19 +03:00
|= group=resource
=/ resources=(set md-resource)
(~(get ju group-indices) group)
%+ roll
~(tap in resources)
|= [=md-resource out=^associations]
=/ [resource =metadata]
(~(got by associations) md-resource)
(~(put by out) md-resource [group metadata])
::
++ send-diff
|= [=app-name upd=metadata-update]
^- (list card)
|^
%- zing
:~ (update-subscribers /all upd)
(update-subscribers /updates upd)
(update-subscribers [%app-name app-name ~] upd)
==
::
++ update-subscribers
|= [pax=path upd=metadata-update]
^- (list card)
[%give %fact ~[pax] %metadata-update !>(upd)]~
--
--