github.com/kyleu/dbaudit@v0.0.2-0.20240321155047-ff2f2c940496/app/controller/clib/sandbox.go (about)

     1  // Package clib - Content managed by Project Forge, see [projectforge.md] for details.
     2  package clib
     3  
     4  import (
     5  	"net/http"
     6  
     7  	"github.com/kyleu/dbaudit/app"
     8  	"github.com/kyleu/dbaudit/app/controller"
     9  	"github.com/kyleu/dbaudit/app/controller/cutil"
    10  	"github.com/kyleu/dbaudit/app/lib/sandbox"
    11  	"github.com/kyleu/dbaudit/app/lib/telemetry"
    12  	"github.com/kyleu/dbaudit/views/vsandbox"
    13  )
    14  
    15  func SandboxList(w http.ResponseWriter, r *http.Request) {
    16  	controller.Act("sandbox.list", w, r, func(as *app.State, ps *cutil.PageState) (string, error) {
    17  		ps.SetTitleAndData("Sandboxes", sandbox.AllSandboxes)
    18  		return controller.Render(w, r, as, &vsandbox.List{}, ps, "sandbox")
    19  	})
    20  }
    21  
    22  func SandboxRun(w http.ResponseWriter, r *http.Request) {
    23  	controller.Act("sandbox.run", w, r, func(as *app.State, ps *cutil.PageState) (string, error) {
    24  		key, err := cutil.RCRequiredString(r, "key", false)
    25  		if err != nil {
    26  			return "", err
    27  		}
    28  
    29  		sb := sandbox.AllSandboxes.Get(key)
    30  		if sb == nil {
    31  			return controller.ERsp("no sandbox with key [%s]", key)
    32  		}
    33  
    34  		ctx, span, logger := telemetry.StartSpan(ps.Context, "sandbox."+key, ps.Logger)
    35  		defer span.Complete()
    36  
    37  		ret, err := sb.Run(ctx, as, logger.With("sandbox", key))
    38  		if err != nil {
    39  			return "", err
    40  		}
    41  		ps.SetTitleAndData(sb.Title, ret)
    42  		if sb.Key == "testbed" {
    43  			return controller.Render(w, r, as, &vsandbox.Testbed{}, ps, "sandbox", sb.Key)
    44  		}
    45  		return controller.Render(w, r, as, &vsandbox.Run{Key: key, Title: sb.Title, Icon: sb.Icon, Result: ret}, ps, "sandbox", sb.Key)
    46  	})
    47  }