github.com/golazy/golazy@v0.0.7-0.20221012133820-968fe65a0b65/examples/webdocker/controller.go (about)

     1  package main
     2  
     3  import (
     4  	"context"
     5  	_ "embed"
     6  	"io"
     7  	"net/http"
     8  
     9  	"github.com/docker/docker/api/types"
    10  	"github.com/docker/docker/client"
    11  	. "github.com/golazy/golazy/lazyview/html"
    12  	"github.com/golazy/golazy/lazyview/layout"
    13  	"github.com/golazy/golazy/lazyview/nodes"
    14  )
    15  
    16  var (
    17  	cli *client.Client
    18  )
    19  
    20  func init() {
    21  	d, err := client.NewClientWithOpts(client.FromEnv)
    22  	if err != nil {
    23  		panic(err)
    24  	}
    25  	cli = d
    26  }
    27  
    28  type Controller struct {
    29  }
    30  
    31  //go:embed style.css
    32  var style string
    33  
    34  var PageLayout = layout.LayoutTemplate{
    35  	Lang:     "en",
    36  	Title:    "golazy",
    37  	Viewport: "width=device-width",
    38  	Head:     []interface{}{Script(Type("module"), Src("https://cdn.skypack.dev/@hotwired/turbo"))},
    39  	Styles:   []string{style},
    40  	LayoutBody: func(l *layout.LayoutTemplate, content ...interface{}) io.WriterTo {
    41  		return nodes.ContentNode{
    42  			Header(
    43  				H1("webdocker"),
    44  			),
    45  			Nav(
    46  				"Homepage",
    47  			),
    48  			Main(
    49  				content,
    50  			),
    51  		}
    52  	},
    53  }
    54  
    55  func (c *Controller) Layout(r *http.Request) *layout.LayoutTemplate {
    56  	return &PageLayout
    57  }
    58  
    59  func (c *Controller) Index(w http.ResponseWriter, r *http.Request) interface{} {
    60  	var rows []interface{}
    61  
    62  	containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
    63  	if err != nil {
    64  		return err
    65  	}
    66  
    67  	for _, container := range containers {
    68  		url := "/container/" + container.ID
    69  
    70  		rows = append(rows, Tr(
    71  			Td(container.ID[:10]),
    72  			Td(container.Image),
    73  			Td(
    74  				A(Href(url), "Inspect"),
    75  				Form(Method("delete"), Action(url), Input(Type("submit"), "Stop")),
    76  			),
    77  		))
    78  	}
    79  
    80  	return Table(
    81  		Thead(
    82  			Tr(
    83  				Td("containers"),
    84  				Td("id"),
    85  				Td("actions"),
    86  			),
    87  		),
    88  		Tbody(rows),
    89  	)
    90  }