forked from gengo/goship
/
home_handler.go
65 lines (56 loc) · 1.95 KB
/
home_handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package main
import (
"html/template"
"log"
"net/http"
"os"
"sort"
"github.com/coreos/go-etcd/etcd"
goship "github.com/gengo/goship/lib"
"github.com/gengo/goship/lib/acl"
"github.com/gengo/goship/lib/auth"
helpers "github.com/gengo/goship/lib/view-helpers"
"github.com/gengo/goship/plugins/plugin"
)
// HomeHandler is the main home screen
type HomeHandler struct {
ac acl.AccessControl
ecl *etcd.Client
assets helpers.Assets
}
func (h HomeHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
c, err := goship.ParseETCD(h.ecl)
if err != nil {
log.Printf("Failed to Parse to ETCD data %s", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
}
u, err := auth.CurrentUser(r)
if err != nil {
log.Println("Failed to get User! ")
http.Error(w, err.Error(), http.StatusUnauthorized)
}
t, err := template.New("index.html").ParseFiles("templates/index.html", "templates/base.html")
if err != nil {
log.Printf("Failed to parse template: %s", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
}
c.Projects = acl.ReadableProjects(h.ac, c.Projects, u)
sort.Sort(ByName(c.Projects))
// apply each plugin
for _, pl := range plugin.Plugins {
err := pl.Apply(c)
if err != nil {
log.Printf("Failed to apply plugin: %s", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
js, css := h.assets.Templates()
gt := os.Getenv(gitHubAPITokenEnvVar)
pt := c.Pivotal.Token
t.ExecuteTemplate(w, "base", map[string]interface{}{"Javascript": js, "Stylesheet": css, "Projects": c.Projects, "User": u, "Page": "home", "ConfirmDeployFlag": *confirmDeployFlag, "GithubToken": gt, "PivotalToken": pt})
}
// ByName is the interface for sorting projects
type ByName []goship.Project
func (slice ByName) Len() int { return len(slice) }
func (slice ByName) Less(i, j int) bool { return slice[i].Name < slice[j].Name }
func (slice ByName) Swap(i, j int) { slice[i], slice[j] = slice[j], slice[i] }