package overlook import ( "embed" "html/template" "log" "net/http" "os" "sort" "edge-infra.dev/pkg/f8n/devinfra/reports" // needed for the postgres driver "edge-infra.dev/pkg/f8n/devinfra/database/psql" "github.com/gin-gonic/gin" ) //go:embed *.tmpl var templates embed.FS type Table struct { Issues []reports.Issues } func init() { gin.SetMode(gin.ReleaseMode) } func Start() { r := gin.Default() logger := log.New(os.Stdout, "overlook", log.Ldate|log.Ltime|log.Lshortfile) t, err := template.ParseFS(templates, "*.tmpl") if err != nil { logger.Fatalf("failed to load templates dir. err: %v", err.Error()) } r.SetHTMLTemplate(t) r.GET("/", func(c *gin.Context) { psql, err := psql.New() if err != nil { log.Panic(err) } table := &Table{} err = table.GetIssues(psql) if err != nil { logger.Fatal(err) } c.HTML(http.StatusOK, "index.tmpl", gin.H{ "title": "overlook", "table": table, }) }) r.GET("/api/health", func(c *gin.Context) { c.JSON(200, gin.H{ "status": "ok", }) }) logger.Println("starting server on port 8080") if err := r.Run(":8080"); err != nil { logger.Printf("error starting on port 8080: %v", err) os.Exit(1) } } // get the issues and return a list func (table *Table) GetIssues(psql *psql.Client) error { rows, err := psql.Query("select * from issues") if err != nil { return err } defer rows.Close() for rows.Next() { issue := reports.Issues{} err := rows.Scan( &issue.Number, &issue.Title, &issue.Size, &issue.Team, &issue.Kind, &issue.Area, &issue.MilestoneNumber, ) if err != nil { log.Fatal(err) } table.Issues = append(table.Issues, issue) } if err := rows.Err(); err != nil { return err } sort.Slice(table.Issues, func(i, j int) bool { return table.Issues[i].Number < table.Issues[j].Number }) return nil }