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
}