ruleset io.picolabs.plan.bazaar {
meta {
name "bazaar apps"
use module io.picolabs.wrangler alias wrangler
use module io.picolabs.plan.apps alias app
shares bazaar, krl_code
}
global {
styles = <<
>>
bazaar = function(_headers){
base = <<#{meta:host}/sky/cloud/#{meta:eci}/#{meta:rid}/krl_code.txt>>
edit = app:event_url(meta:rid,"app_needs_edit","edit")
repo = repo_pico()
repo_attrs = repo => ""
| << style="pointer-events:none;cursor:default">>
repo_title = repo => ""
| << title="not available">>
li_apps = function(){
ent:apps
.values()
.map(function(spec){
rid = spec{"rid"}
<<
#{rid} |
#{spec.get("name")} |
#{spec.get("rsname")} |
#{spec.get("event_domain")} |
show KRL |
edit/host KRL |
del |
>>
})
}
app:html_page("manage bazaar apps",styles,
<<
Manage bazaar apps
Apps
Ruleset ID |
App Name |
App meta name |
event domain |
boilerplate |
Edit |
Delete |
#{li_apps().join("")}
New app
>>
,_headers)
}
krl_code = function(rid){
rsname = ent:apps{[rid,"rsname"]}
home = ent:apps{[rid,"name"]}
<Manage #{rsname}
\>\>, _headers)
}
}
}
>>
}
repo_rid = "com.vcpnews.repo"
repo_name = function(){
netid = wrangler:name()
netid+"/bazaar"
}
repo_pico = function(){
the_name = repo_name()
wrangler:children()
.filter(function(c){
c{"name"} == the_name
})
.head()
}
repo_krl = function(rid){
repo = repo_pico()
repo.isnull() => "no repo" |
wrangler:picoQuery(
repo{"eci"},
repo_rid,
"krl",
{"rid":rid}
)
}
}
rule acceptNewApp {
select when io_picolabs_plan_bazaar new_app
rid re#^([a-zA-Z][a-zA-Z0-9._-]+)$#
home re#^([a-zA-Z][a-zA-Z0-9_]+)$#
rsname re#([a-zA-Z][a-zA-Z0-9_ ]*)#
setting(rid,home,rsname)
pre {
spec = {
"rid": rid,
"name": home,
"rsname": rsname || home,
"event_domain": rid.replace(re#[.-]#g,"_")
}
}
fired {
ent:apps{rid} := spec
}
}
rule deleteApp {
select when io_picolabs_plan_bazaar app_not_wanted
rid re#^(.+)$# setting(rid)
fired {
clear ent:apps{rid}
}
}
rule redirectBack {
select when io_picolabs_plan_bazaar new_app
or io_picolabs_plan_bazaar app_not_wanted
pre {
referrer = event:attr("_headers").get("referer") // sic
}
if referrer then send_directive("_redirect",{"url":referrer})
}
rule sendSourceCode {
select when io_picolabs_plan_bazaar app_needs_edit
rid re#(.+)#
setting(rid)
pre {
has = repo_krl() >< rid
repo = repo_pico()
}
if repo && not has then
event:send({
"eci": repo{"eci"},
"domain": "introspect_repo", "type": "new_source",
"attrs": {"rid": rid, "src": krl_code(rid)}
})
}
rule openNewEditor {
select when io_picolabs_plan_bazaar app_needs_edit
rid re#(.+)#
setting(rid)
pre {
rs_rid = "io.picolabs.plan.ruleset"
rs_eci = wrangler:channels(["app","introspections"]).head(){"id"}
url = <<#{meta:host}/c/#{rs_eci}/query/#{rs_rid}/codeEditor.html?rid=#{rid}>>
}
send_directive("_redirect",{"url":url})
}
}