@@ -2,6 +2,7 @@ package server
22
33import (
44 "context"
5+ "fmt"
56 "log"
67 "net/http"
78
@@ -24,9 +25,29 @@ func CreatePipelineReport(c *gin.Context) {
2425 return
2526 }
2627
28+ // Init scms table if needed
29+ for i := range p .Targets {
30+ branch := p .Targets [i ].Scm .Branch .Target
31+ url := p .Targets [i ].Scm .URL
32+
33+ got , err := dbGetScm ("" , url , branch )
34+ if err != nil {
35+ logrus .Errorf ("get scm data: %s" , err )
36+ continue
37+ }
38+
39+ if len (got ) == 0 && url != "" && branch != "" {
40+ _ , err := dbInsertSCM (url , branch )
41+ if err != nil {
42+ logrus .Errorf ("insert scm data: %s" , err )
43+ continue
44+ }
45+ }
46+ }
47+
2748 newReportID , err := dbInsertReport (p )
2849 if err != nil {
29- logrus .Errorf ("query failed : %s" , err )
50+ logrus .Errorf ("insert reports : %s" , err )
3051 c .JSON (http .StatusInternalServerError , gin.H {"message" : err })
3152 return
3253 }
@@ -63,7 +84,58 @@ func FindAllPipelineReports(c *gin.Context) {
6384 UpdatedAt string
6485 }
6586
66- query := "SELECT * FROM pipelineReports ORDER BY updated_at DESC FETCH FIRST 1000 ROWS ONLY"
87+ queryParams := c .Request .URL .Query ()
88+
89+ scmid := queryParams .Get ("scmid" )
90+ query := ""
91+
92+ switch scmid {
93+ case "" :
94+ query = `
95+ SELECT id, data, created_at, updated_at
96+ FROM pipelineReports
97+ ORDER BY updated_at DESC FETCH FIRST 1000 ROWS ONLY`
98+
99+ case "none" , "null" , "nil" :
100+ query = `
101+ SELECT DISTINCT ON (s.data ->> 'Name') s.id, s.data, s.created_at, s.updated_at
102+ FROM (
103+ SELECT *
104+ FROM pipelinereports
105+ WHERE NOT jsonb_path_exists(data::jsonb, '$.Targets[*].* ? (@.Scm.URL != "" && @.Scm.Branch.Target != "")')
106+ ORDER BY updated_at DESC
107+ ) s
108+ ORDER BY s.data ->> 'Name', s.updated_at DESC FETCH FIRST 1000 ROWS ONLY;`
109+
110+ default :
111+ scm , err := dbGetScm (scmid , "" , "" )
112+ if err != nil {
113+ logrus .Errorf ("get scm data: %s" , err )
114+ return
115+ }
116+
117+ switch len (scm ) {
118+ case 0 :
119+ logrus .Errorf ("scm data not found" )
120+
121+ case 1 :
122+ query = `
123+ SELECT DISTINCT ON (s.data ->> 'Name') s.id, s.data, s.created_at, s.updated_at
124+ FROM (
125+ SELECT *
126+ FROM pipelinereports
127+ WHERE jsonb_path_exists(data::jsonb, '$.Targets[*].* ? (@.Scm.URL == "%s" && @.Scm.Branch.Target == "%s")')
128+ ORDER BY updated_at DESC
129+ ) s
130+ ORDER BY s.data ->> 'Name', s.updated_at DESC FETCH FIRST 1000 ROWS ONLY;
131+ `
132+
133+ query = fmt .Sprintf (query , scm [0 ].URL , scm [0 ].Branch )
134+
135+ default :
136+ logrus .Errorf ("multiple scms found" )
137+ }
138+ }
67139
68140 rows , err := database .DB .Query (context .Background (), query )
69141 if err != nil {
@@ -77,7 +149,7 @@ func FindAllPipelineReports(c *gin.Context) {
77149 dataset := []data {}
78150
79151 for rows .Next () {
80- p := PipelineRow {}
152+ p := PipelineReportRow {}
81153
82154 err = rows .Scan (& p .ID , & p .Pipeline , & p .Created_at , & p .Updated_at )
83155 if err != nil {
0 commit comments