11package server
22
33import (
4+ "context"
5+ "fmt"
46 "net/http"
7+ "strings"
58
69 "github.com/gin-gonic/gin"
710 "github.com/sirupsen/logrus"
11+ "github.com/updatecli/udash/pkg/database"
812)
913
1014func FindSCM (c * gin.Context ) {
1115
1216 scmid := c .Request .URL .Query ().Get ("scmid" )
1317 url := c .Request .URL .Query ().Get ("url" )
1418 branch := c .Request .URL .Query ().Get ("branch" )
19+ summary := c .Request .URL .Query ().Get ("summary" )
1520
1621 rows , err := dbGetScm (scmid , url , branch )
1722 if err != nil {
@@ -23,7 +28,120 @@ func FindSCM(c *gin.Context) {
2328 return
2429 }
2530
31+ if strings .ToUpper (summary ) == "TRUE" {
32+ FindSCMSummary (c , rows )
33+ return
34+ }
35+
2636 c .JSON (http .StatusOK , gin.H {
2737 "scms" : rows ,
2838 })
2939}
40+
41+ // FindSCMSummary returns a summary of all git repositories detected.
42+ func FindSCMSummary (c * gin.Context , scmRows []DatabaseSCMRow ) {
43+
44+ type scmSummaryData struct {
45+ ID string `json:"id"`
46+ TotalResultByType map [string ]int `json:"total_result_by_type"`
47+ TotalResult int `json:"total_result"`
48+ }
49+
50+ type scmBranchData map [string ]scmSummaryData
51+
52+ type data struct {
53+ // URLS is a map of scmURLS where the key is the scm URL.
54+ Data map [string ]scmBranchData
55+ }
56+
57+ dataset := data {}
58+
59+ query := ""
60+ for _ , row := range scmRows {
61+
62+ scmID := row .ID
63+ scmURL := row .URL
64+ scmBranch := row .Branch
65+
66+ if scmBranch == "" || scmURL == "" {
67+ logrus .Debugf ("skipping scm %s, missing branch or url" , row .ID )
68+ continue
69+ }
70+
71+ query = `
72+ SELECT DISTINCT ON (s.data ->> 'Name') s.id, ( s.data ->> 'Result')
73+ FROM (
74+ SELECT *
75+ FROM pipelinereports
76+ WHERE
77+ jsonb_path_exists(data::jsonb, '$.Targets[*].* ? (@.Scm.URL == "%s" && @.Scm.Branch.Target == "%s")') AND
78+ updated_at > current_date - interval '%d day'
79+ ORDER BY updated_at DESC
80+ ) s
81+ ORDER BY s.data ->> 'Name', s.updated_at DESC;
82+ `
83+
84+ query = fmt .Sprintf (query , scmURL , scmBranch , monitoringDurationDays )
85+
86+ rows , err := database .DB .Query (context .Background (), query )
87+ if err != nil {
88+ logrus .Errorf ("query failed: %s" , err )
89+ c .JSON (http .StatusInternalServerError , gin.H {
90+ "message" : err ,
91+ })
92+ return
93+ }
94+
95+ if dataset .Data == nil {
96+ dataset .Data = make (map [string ]scmBranchData )
97+ }
98+
99+ if dataset .Data [scmURL ] == nil {
100+ dataset .Data [scmURL ] = make (map [string ]scmSummaryData )
101+ }
102+
103+ d := scmSummaryData {
104+ ID : scmID .String (),
105+ TotalResultByType : make (map [string ]int ),
106+ }
107+
108+ dataset.Data [scmURL ][scmBranch ] = d
109+
110+ for rows .Next () {
111+
112+ id := ""
113+ result := ""
114+
115+ err = rows .Scan (& id , & result )
116+ if err != nil {
117+ logrus .Errorf ("parsing result: %s" , err )
118+ c .JSON (http .StatusInternalServerError , gin.H {
119+ "message" : err ,
120+ })
121+ return
122+ }
123+
124+ resultFound := false
125+ for r := range dataset.Data [scmURL ][scmBranch ].TotalResultByType {
126+ if r == result {
127+ dataset.Data [scmURL ][scmBranch ].TotalResultByType [r ]++
128+ resultFound = true
129+ }
130+ }
131+
132+ if ! resultFound {
133+ dataset.Data [scmURL ][scmBranch ].TotalResultByType [result ] = 1
134+ }
135+ }
136+
137+ scmData := dataset.Data [scmURL ][scmBranch ]
138+ for r := range scmData .TotalResultByType {
139+ scmData .TotalResult += scmData .TotalResultByType [r ]
140+ }
141+ dataset.Data [scmURL ][scmBranch ] = scmData
142+ }
143+
144+ c .JSON (http .StatusOK , gin.H {
145+ "data" : dataset .Data ,
146+ })
147+ }
0 commit comments