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)