...
1 package overlook
2
3 import (
4 "embed"
5 "html/template"
6 "log"
7 "net/http"
8 "os"
9 "sort"
10
11 "edge-infra.dev/pkg/f8n/devinfra/reports"
12
13
14 "edge-infra.dev/pkg/f8n/devinfra/database/psql"
15
16 "github.com/gin-gonic/gin"
17 )
18
19
20 var templates embed.FS
21
22 type Table struct {
23 Issues []reports.Issues
24 }
25
26 func init() {
27 gin.SetMode(gin.ReleaseMode)
28 }
29
30 func Start() {
31 r := gin.Default()
32 logger := log.New(os.Stdout, "overlook", log.Ldate|log.Ltime|log.Lshortfile)
33
34 t, err := template.ParseFS(templates, "*.tmpl")
35 if err != nil {
36 logger.Fatalf("failed to load templates dir. err: %v", err.Error())
37 }
38 r.SetHTMLTemplate(t)
39
40 r.GET("/", func(c *gin.Context) {
41 psql, err := psql.New()
42 if err != nil {
43 log.Panic(err)
44 }
45
46 table := &Table{}
47
48 err = table.GetIssues(psql)
49 if err != nil {
50 logger.Fatal(err)
51 }
52
53 c.HTML(http.StatusOK, "index.tmpl", gin.H{
54 "title": "overlook",
55 "table": table,
56 })
57 })
58
59 r.GET("/api/health", func(c *gin.Context) {
60 c.JSON(200, gin.H{
61 "status": "ok",
62 })
63 })
64
65 logger.Println("starting server on port 8080")
66
67 if err := r.Run(":8080"); err != nil {
68 logger.Printf("error starting on port 8080: %v", err)
69 os.Exit(1)
70 }
71 }
72
73
74 func (table *Table) GetIssues(psql *psql.Client) error {
75 rows, err := psql.Query("select * from issues")
76 if err != nil {
77 return err
78 }
79 defer rows.Close()
80
81 for rows.Next() {
82 issue := reports.Issues{}
83 err := rows.Scan(
84 &issue.Number,
85 &issue.Title,
86 &issue.Size,
87 &issue.Team,
88 &issue.Kind,
89 &issue.Area,
90 &issue.MilestoneNumber,
91 )
92 if err != nil {
93 log.Fatal(err)
94 }
95 table.Issues = append(table.Issues, issue)
96 }
97 if err := rows.Err(); err != nil {
98 return err
99 }
100
101 sort.Slice(table.Issues, func(i, j int) bool {
102 return table.Issues[i].Number < table.Issues[j].Number
103 })
104
105 return nil
106 }
107
View as plain text