94 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package frontend
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"io/ioutil"
 | 
						|
	"net/http"
 | 
						|
 | 
						|
	"html/template"
 | 
						|
 | 
						|
	"github.com/gin-gonic/gin"
 | 
						|
	"github.com/rakyll/statik/fs"
 | 
						|
 | 
						|
	"github.com/tweag/gerrit-queue/gerrit"
 | 
						|
	_ "github.com/tweag/gerrit-queue/statik" // register static assets
 | 
						|
	"github.com/tweag/gerrit-queue/submitqueue"
 | 
						|
)
 | 
						|
 | 
						|
// Frontend holds a gin Engine and the Sergequeue object
 | 
						|
type Frontend struct {
 | 
						|
	Router      *gin.Engine
 | 
						|
	SubmitQueue *submitqueue.SubmitQueue
 | 
						|
}
 | 
						|
 | 
						|
//loadTemplate loads a single template from statikFS and returns a template object
 | 
						|
func loadTemplate(templateName string, funcMap template.FuncMap) (*template.Template, error) {
 | 
						|
	statikFS, err := fs.New()
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	tmpl := template.New(templateName).Funcs(funcMap)
 | 
						|
	r, err := statikFS.Open("/" + templateName)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
	defer r.Close()
 | 
						|
	contents, err := ioutil.ReadAll(r)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
	return tmpl.Parse(string(contents))
 | 
						|
}
 | 
						|
 | 
						|
// MakeFrontend configures the router and returns a new Frontend struct
 | 
						|
func MakeFrontend(runner *submitqueue.Runner, submitQueue *submitqueue.SubmitQueue) *Frontend {
 | 
						|
	router := gin.Default()
 | 
						|
 | 
						|
	funcMap := template.FuncMap{
 | 
						|
		"isAutoSubmittable": func(serie *submitqueue.Serie) bool {
 | 
						|
			return submitQueue.IsAutoSubmittable(serie)
 | 
						|
		},
 | 
						|
		"changesetURL": func(changeset *gerrit.Changeset) string {
 | 
						|
			return submitQueue.GetChangesetURL(changeset)
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	tmpl := template.Must(loadTemplate("submit-queue.tmpl.html", funcMap))
 | 
						|
 | 
						|
	router.SetHTMLTemplate(tmpl)
 | 
						|
 | 
						|
	router.GET("/submit-queue.json", func(c *gin.Context) {
 | 
						|
 | 
						|
		// FIXME: do this periodically
 | 
						|
		err := submitQueue.UpdateHEAD()
 | 
						|
		if err != nil {
 | 
						|
			c.AbortWithError(http.StatusBadGateway, fmt.Errorf("unable to update HEAD"))
 | 
						|
		}
 | 
						|
		c.JSON(http.StatusOK, submitQueue)
 | 
						|
	})
 | 
						|
 | 
						|
	router.GET("/", func(c *gin.Context) {
 | 
						|
		// FIXME: do this periodically
 | 
						|
		// TODO: add hyperlinks to changesets
 | 
						|
		err := submitQueue.UpdateHEAD()
 | 
						|
		if err != nil {
 | 
						|
			c.AbortWithError(http.StatusBadGateway, fmt.Errorf("unable to update HEAD"))
 | 
						|
		}
 | 
						|
 | 
						|
		c.HTML(http.StatusOK, "submit-queue.tmpl.html", gin.H{
 | 
						|
			"series":      submitQueue.Series,
 | 
						|
			"projectName": submitQueue.ProjectName,
 | 
						|
			"branchName":  submitQueue.BranchName,
 | 
						|
			"HEAD":        submitQueue.HEAD,
 | 
						|
		})
 | 
						|
	})
 | 
						|
	return &Frontend{
 | 
						|
		Router:      router,
 | 
						|
		SubmitQueue: submitQueue,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (f *Frontend) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 | 
						|
	f.Router.ServeHTTP(w, r)
 | 
						|
}
 |