readysite / website / controllers / workspace.go
2.2 KB
workspace.go
package controllers

import (
	"net/http"

	"github.com/readysite/readysite/pkg/application"
	"github.com/readysite/readysite/website/internal/content"
	"github.com/readysite/readysite/website/internal/helpers"
	"github.com/readysite/readysite/website/models"
)

// Workspace returns the workspace controller.
func Workspace() (string, *WorkspaceController) {
	return "workspace", &WorkspaceController{}
}

// WorkspaceController handles the admin workspace and settings.
type WorkspaceController struct {
	application.BaseController
}

// Setup registers routes.
func (c *WorkspaceController) Setup(app *application.App) {
	c.BaseController.Setup(app)

	// Page preview (raw HTML for iframe)
	http.Handle("GET /preview/{id}", app.Method(c, "Preview", RequireAuth))
}

// Handle implements Controller interface with value receiver for request isolation.
func (c WorkspaceController) Handle(r *http.Request) application.Controller {
	c.Request = r
	return &c
}

// Preview renders a page with template functions for iframe preview.
func (c *WorkspaceController) Preview(w http.ResponseWriter, r *http.Request) {
	id := r.PathValue("id")
	page, err := models.Pages.Get(id)
	if err != nil {
		http.Error(w, "Page not found", http.StatusNotFound)
		return
	}

	w.Header().Set("Content-Type", "text/html; charset=utf-8")
	w.Write([]byte(content.RenderPage(page, r)))
}

// SaveSettings saves site settings.
func (c *WorkspaceController) SaveSettings(w http.ResponseWriter, r *http.Request) {
	helpers.SetSetting(models.SettingSiteName, r.FormValue("site_name"))
	helpers.SetSetting(models.SettingSiteDescription, r.FormValue("site_description"))
	helpers.SetSetting(models.SettingAIProvider, r.FormValue("ai_provider"))
	helpers.SetSetting(models.SettingAIModel, r.FormValue("ai_model"))

	// Save signup setting (checkbox)
	signupEnabled := "false"
	if r.FormValue("signup_enabled") == "on" || r.FormValue("signup_enabled") == "true" {
		signupEnabled = "true"
	}
	helpers.SetSetting(models.SettingSignupEnabled, signupEnabled)

	// Only update API key if provided (empty means keep existing)
	if key := r.FormValue("ai_api_key"); key != "" {
		helpers.SetSetting(models.SettingAIAPIKey, key)
	}

	w.Header().Set("HX-Trigger", `{"showToast":"Settings saved"}`)
}
← Back