go/svc/invoice: add statusz
diff --git a/go/svc/invoice/statusz.go b/go/svc/invoice/statusz.go
new file mode 100644
index 0000000..dbc59f1
--- /dev/null
+++ b/go/svc/invoice/statusz.go
@@ -0,0 +1,93 @@
+package main
+
+import (
+ "context"
+ "fmt"
+ "net/http"
+
+ "code.hackerspace.pl/hscloud/go/mirko"
+ "code.hackerspace.pl/hscloud/go/statusz"
+ "github.com/golang/glog"
+)
+
+const invoicesFragment = `
+ <style type="text/css">
+ .table td,th {
+ background-color: #eee;
+ padding: 0.2em 0.4em 0.2em 0.4em;
+ }
+ .table th {
+ background-color: #c0c0c0;
+ }
+ .table {
+ background-color: #fff;
+ border-spacing: 0.2em;
+ margin-left: auto;
+ margin-right: auto;
+ }
+ </style>
+ <div>
+ {{ .Msg }}
+ <table class="table">
+ <tr>
+ <th>Internal ID</th>
+ <th>Number</th>
+ <th>Customer</th>
+ <th>Amount (net)</th>
+ <th>Actions</th>
+ </tr>
+ {{ range .Invoices }}
+ {{ if .Sealed }}
+ <tr>
+ {{ else }}
+ <tr style="opacity: 0.5">
+ {{ end }}
+ <td>{{ .ID }}</td>
+ <td>{{ .Number }}</td>
+ <td>{{ index .Proto.CustomerBilling 0 }}</td>
+ <td>{{ .TotalNetPretty }}</td>
+ <td>
+ <a href="/debug/view?id={{ .ID }}">View</a>
+ </td>
+ </tr>
+ {{ end }}
+ </table>
+ </div>
+`
+
+type templateInvoice struct {
+ invoice
+ TotalNetPretty string
+}
+
+func (s *service) setupStatusz(m *mirko.Mirko) {
+ statusz.AddStatusPart("Invoices", invoicesFragment, func(ctx context.Context) interface{} {
+ var res struct {
+ Invoices []templateInvoice
+ Msg string
+ }
+ invoices, err := s.m.getInvoices(ctx)
+ res.Invoices = make([]templateInvoice, len(invoices))
+ for i, inv := range invoices {
+ res.Invoices[i] = templateInvoice{
+ invoice: inv,
+ TotalNetPretty: fmt.Sprintf("%.2f %s", float64(inv.TotalNet)/100, inv.Proto.Unit),
+ }
+ }
+
+ if err != nil {
+ glog.Errorf("Could not get invoices for statusz: %v", err)
+ res.Msg = fmt.Sprintf("Could not get invoices: %v", err)
+ }
+ return res
+ })
+
+ m.HTTPMux().HandleFunc("/debug/view", func(w http.ResponseWriter, r *http.Request) {
+ rendered, err := s.invoicePDF(r.Context(), r.URL.Query().Get("id"))
+ if err != nil {
+ fmt.Fprintf(w, "error: %v", err)
+ }
+ w.Header().Set("Content-type", "application/pdf")
+ w.Write(rendered)
+ })
+}