From 95f09ab88144360b26ee9500d7d23372ba8fb908 Mon Sep 17 00:00:00 2001 From: Tom Wiesing Date: Thu, 4 Apr 2024 15:30:48 +0200 Subject: [PATCH] Add rebuild triplestore button to frontend --- internal/dis/component/server/admin/admin.go | 26 ++++---- .../admin/html/instance_triplestore.html | 10 ++++ .../dis/component/server/admin/instance.go | 1 + .../server/admin/instance_triplestore.go | 59 +++++++++++++++++++ .../socket/actions/rebuild_triplestore.go | 34 +++++++++++ internal/dis/distillery.go | 1 + 6 files changed, 121 insertions(+), 10 deletions(-) create mode 100644 internal/dis/component/server/admin/html/instance_triplestore.html create mode 100644 internal/dis/component/server/admin/instance_triplestore.go create mode 100644 internal/dis/component/server/admin/socket/actions/rebuild_triplestore.go diff --git a/internal/dis/component/server/admin/admin.go b/internal/dis/component/server/admin/admin.go index 7d4e2f0..803bc67 100644 --- a/internal/dis/component/server/admin/admin.go +++ b/internal/dis/component/server/admin/admin.go @@ -71,16 +71,17 @@ var ( menuProvision = component.MenuItem{Title: "Provision", Path: "/admin/instances/provision/"} - menuInstances = component.MenuItem{Title: "Instances", Path: "/admin/instances/"} - menuInstance = component.DummyMenuItem() - menuRebuild = component.DummyMenuItem() - menuGrants = component.DummyMenuItem() - menuPurge = component.DummyMenuItem() - menuSnapshots = component.DummyMenuItem() - menuSSH = component.DummyMenuItem() - menuStats = component.DummyMenuItem() - menuData = component.DummyMenuItem() - menuDrupal = component.DummyMenuItem() + menuInstances = component.MenuItem{Title: "Instances", Path: "/admin/instances/"} + menuInstance = component.DummyMenuItem() + menuRebuild = component.DummyMenuItem() + menuGrants = component.DummyMenuItem() + menuPurge = component.DummyMenuItem() + menuSnapshots = component.DummyMenuItem() + menuSSH = component.DummyMenuItem() + menuStats = component.DummyMenuItem() + menuData = component.DummyMenuItem() + menuTriplestore = component.DummyMenuItem() + menuDrupal = component.DummyMenuItem() ) func (admin *Admin) HandleRoute(ctx context.Context, route string) (handler http.Handler, err error) { @@ -161,6 +162,11 @@ func (admin *Admin) HandleRoute(ctx context.Context, route string) (handler http router.Handler(http.MethodGet, route+"instance/:slug/stats", stats) } + { + triplestore := admin.instanceTS(ctx) + router.Handler(http.MethodGet, route+"instance/:slug/triplestore", triplestore) + } + { data := admin.instanceData(ctx) router.Handler(http.MethodGet, route+"instance/:slug/data", data) diff --git a/internal/dis/component/server/admin/html/instance_triplestore.html b/internal/dis/component/server/admin/html/instance_triplestore.html new file mode 100644 index 0000000..03ef6af --- /dev/null +++ b/internal/dis/component/server/admin/html/instance_triplestore.html @@ -0,0 +1,10 @@ + +
+

Triplestore

+
+ +
+ +
diff --git a/internal/dis/component/server/admin/instance.go b/internal/dis/component/server/admin/instance.go index 70d7b89..fd0fca3 100644 --- a/internal/dis/component/server/admin/instance.go +++ b/internal/dis/component/server/admin/instance.go @@ -79,6 +79,7 @@ func (admin *Admin) instanceTabs(slug string, active string) templating.FlagFunc {Title: "Overview", Path: template.URL("/admin/instance/" + slug), Active: active == "overview"}, {Title: "Rebuild", Path: template.URL("/admin/instance/" + slug + "/rebuild"), Active: active == "rebuild"}, {Title: "Users & Grants", Path: template.URL("/admin/instance/" + slug + "/users"), Active: active == "users"}, + {Title: "Triplestore", Path: template.URL("/admin/instance/" + slug + "/triplestore"), Active: active == "triplestore"}, {Title: "Drupal", Path: template.URL("/admin/instance/" + slug + "/drupal"), Active: active == "drupal"}, {Title: "WissKI Data", Path: template.URL("/admin/instance/" + slug + "/data"), Active: active == "data"}, {Title: "WissKI Stats", Path: template.URL("/admin/instance/" + slug + "/stats"), Active: active == "stats"}, diff --git a/internal/dis/component/server/admin/instance_triplestore.go b/internal/dis/component/server/admin/instance_triplestore.go new file mode 100644 index 0000000..96ed74c --- /dev/null +++ b/internal/dis/component/server/admin/instance_triplestore.go @@ -0,0 +1,59 @@ +package admin + +import ( + "context" + _ "embed" + "html/template" + "net/http" + + "github.com/FAU-CDI/wisski-distillery/internal/dis/component" + "github.com/FAU-CDI/wisski-distillery/internal/dis/component/server/assets" + "github.com/FAU-CDI/wisski-distillery/internal/dis/component/server/templating" + "github.com/FAU-CDI/wisski-distillery/internal/wisski" + "github.com/tkw1536/pkglib/httpx" + + "github.com/julienschmidt/httprouter" +) + +//go:embed "html/instance_triplestore.html" +var instanceTriplestoreHTML []byte +var instanceTriplestoreTemplate = templating.Parse[instanceTriplestoreContext]( + "instance_triplestore.html", instanceTriplestoreHTML, nil, + + templating.Assets(assets.AssetsAdmin), +) + +type instanceTriplestoreContext struct { + templating.RuntimeFlags + + Instance *wisski.WissKI +} + +func (admin *Admin) instanceTS(ctx context.Context) http.Handler { + tpl := instanceTriplestoreTemplate.Prepare( + admin.dependencies.Templating, + templating.Crumbs( + menuAdmin, + menuInstances, + menuInstance, + menuTriplestore, + ), + ) + + return tpl.HTMLHandlerWithFlags(admin.dependencies.Handling, func(r *http.Request) (ctx instanceTriplestoreContext, funcs []templating.FlagFunc, err error) { + slug := httprouter.ParamsFromContext(r.Context()).ByName("slug") + + // setup the context with just the instance + ctx.Instance, err = admin.dependencies.Instances.WissKI(r.Context(), slug) + if err != nil { + return ctx, nil, httpx.ErrNotFound + } + + return ctx, []templating.FlagFunc{ + templating.ReplaceCrumb(menuInstance, component.MenuItem{Title: "Instance", Path: template.URL("/admin/instance/" + ctx.Instance.Slug)}), + templating.ReplaceCrumb(menuTriplestore, component.MenuItem{Title: "Triplestore", Path: template.URL("/admin/instance/" + ctx.Instance.Slug + "/triplestore")}), + templating.Title(ctx.Instance.Slug + " - Triplestore"), + admin.instanceTabs(slug, "triplestore"), + }, nil + }) +} diff --git a/internal/dis/component/server/admin/socket/actions/rebuild_triplestore.go b/internal/dis/component/server/admin/socket/actions/rebuild_triplestore.go new file mode 100644 index 0000000..6e055c7 --- /dev/null +++ b/internal/dis/component/server/admin/socket/actions/rebuild_triplestore.go @@ -0,0 +1,34 @@ +package actions + +import ( + "context" + "io" + + "github.com/FAU-CDI/wisski-distillery/internal/dis/component" + "github.com/FAU-CDI/wisski-distillery/internal/dis/component/auth/scopes" + "github.com/FAU-CDI/wisski-distillery/internal/wisski" +) + +type RebuildTriplestore struct { + component.Base + dependencies struct { + } +} + +var ( + _ WebsocketInstanceAction = (*Snapshot)(nil) +) + +func (wsa *RebuildTriplestore) Action() InstanceAction { + return InstanceAction{ + Action: Action{ + Name: "rebuild_triplestore", + Scope: scopes.ScopeUserAdmin, + NumParams: 0, + }, + } +} + +func (wsa *RebuildTriplestore) Act(ctx context.Context, instance *wisski.WissKI, in io.Reader, out io.Writer, params ...string) error { + return instance.TRB().RebuildTriplestore(ctx, out, false) +} diff --git a/internal/dis/distillery.go b/internal/dis/distillery.go index 8498ba5..8b3c11c 100644 --- a/internal/dis/distillery.go +++ b/internal/dis/distillery.go @@ -232,6 +232,7 @@ func (dis *Distillery) allComponents(context *lifetime.Registry[component.Compon lifetime.Place[*actions.Start](context) lifetime.Place[*actions.Stop](context) lifetime.Place[*actions.Purge](context) + lifetime.Place[*actions.RebuildTriplestore](context) // Cron lifetime.Place[*cron.Cron](context)