71 lines
2.1 KiB
Go
71 lines
2.1 KiB
Go
package pages
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"net/http"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// SeedSurfaces writes core surface manifests to the registry table.
|
|
// Called once at startup. Does NOT overwrite the enabled flag — admin
|
|
// toggles survive restarts.
|
|
func (e *Engine) SeedSurfaces() {
|
|
ctx := context.Background()
|
|
for _, s := range e.surfaces {
|
|
manifest := map[string]any{
|
|
"route": s.Route,
|
|
"alt_routes": s.AltRoutes,
|
|
"template": s.Template,
|
|
"components": s.Components,
|
|
"data_requires": s.DataRequires,
|
|
"auth": s.Auth,
|
|
"layout": s.Layout,
|
|
}
|
|
if err := e.stores.Surfaces.Seed(ctx, s.ID, s.Title, s.Source, manifest); err != nil {
|
|
log.Printf("[pages] Failed to seed surface %q: %v", s.ID, err)
|
|
}
|
|
}
|
|
log.Printf("[pages] Seeded %d core surfaces into registry", len(e.surfaces))
|
|
}
|
|
|
|
// IsSurfaceEnabled checks if a surface is enabled in the registry.
|
|
// Chat and Admin are always enabled (system-critical).
|
|
// Returns true if the surface is not found (fail-open for backward compat).
|
|
func (e *Engine) IsSurfaceEnabled(surfaceID string) bool {
|
|
// Chat and Admin cannot be disabled — they're system-critical
|
|
if surfaceID == "chat" || surfaceID == "admin" {
|
|
return true
|
|
}
|
|
ctx := context.Background()
|
|
sr, err := e.stores.Surfaces.Get(ctx, surfaceID)
|
|
if err != nil || sr == nil {
|
|
return true // Not in registry = assume enabled (backward compat)
|
|
}
|
|
return sr.Enabled
|
|
}
|
|
|
|
// EnabledSurfaceIDs returns a list of enabled surface IDs for nav rendering.
|
|
func (e *Engine) EnabledSurfaceIDs() []string {
|
|
ctx := context.Background()
|
|
ids, err := e.stores.Surfaces.ListEnabled(ctx)
|
|
if err != nil {
|
|
log.Printf("[pages] Failed to load enabled surfaces: %v", err)
|
|
// Fallback: return all core surface IDs
|
|
var all []string
|
|
for _, s := range e.surfaces {
|
|
all = append(all, s.ID)
|
|
}
|
|
return all
|
|
}
|
|
return ids
|
|
}
|
|
|
|
// disabledRedirect returns a handler that redirects to the chat surface.
|
|
func (e *Engine) disabledRedirect() gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
c.Redirect(http.StatusTemporaryRedirect, e.cfg.BasePath+"/")
|
|
}
|
|
}
|