93 lines
2.3 KiB
Go
93 lines
2.3 KiB
Go
package views
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/gorilla/mux"
|
|
"gorm.io/gorm"
|
|
"io"
|
|
"net/http"
|
|
"os"
|
|
"sonarqube-badge/config"
|
|
"sonarqube-badge/security/aes"
|
|
"sonarqube-badge/store"
|
|
"strconv"
|
|
)
|
|
|
|
func postProjectBadge(w http.ResponseWriter, r *http.Request) {
|
|
vars := mux.Vars(r)
|
|
projectIdString := vars["id"]
|
|
projectId, err := strconv.Atoi(projectIdString)
|
|
if err != nil {
|
|
w.WriteHeader(http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
metric := r.FormValue("type")
|
|
|
|
db := r.Context().Value("db").(*gorm.DB)
|
|
cfg := r.Context().Value("config").(config.Config)
|
|
|
|
var project store.Project
|
|
db.First(&project, projectId)
|
|
|
|
if project.ID == 0 {
|
|
w.WriteHeader(http.StatusNotFound)
|
|
return
|
|
}
|
|
|
|
projectToken := aes.DecryptAES(cfg.Secret, project.Token)
|
|
requestProjectImage(w, cfg, project.ProjectName, projectToken, metric)
|
|
}
|
|
|
|
func getProjectBadge(w http.ResponseWriter, r *http.Request) {
|
|
vars := mux.Vars(r)
|
|
projectIdString := vars["id"]
|
|
projectId, err := strconv.Atoi(projectIdString)
|
|
if err != nil {
|
|
w.WriteHeader(http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
metric := vars["metric"]
|
|
|
|
ctx := r.Context()
|
|
db := ctx.Value("db").(*gorm.DB)
|
|
cfg := ctx.Value("config").(config.Config)
|
|
|
|
project := store.Project{}
|
|
db.First(&project, projectId)
|
|
|
|
if project.ID == 0 {
|
|
w.WriteHeader(http.StatusNotFound)
|
|
return
|
|
}
|
|
|
|
token := aes.DecryptAES(cfg.Secret, project.Token)
|
|
requestProjectImage(w, cfg, project.ProjectName, token, metric)
|
|
}
|
|
|
|
func requestProjectImage(w http.ResponseWriter, cfg config.Config, projectName string, projectToken string, metric string) {
|
|
url := fmt.Sprintf("%s/api/project_badges/measure?metric=%s&project=%s&token=%s", cfg.SqHost, metric, projectName, projectToken)
|
|
request, err := http.Get(url)
|
|
if err != nil {
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
os.Stderr.Write([]byte(err.Error()))
|
|
w.Write([]byte("internal server error"))
|
|
return
|
|
}
|
|
bytes, err := io.ReadAll(request.Body)
|
|
if err != nil {
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
os.Stderr.Write([]byte(err.Error()))
|
|
w.Write([]byte("internal server error"))
|
|
return
|
|
}
|
|
w.Header().Set("Content-Type", "image/svg+xml")
|
|
w.WriteHeader(request.StatusCode)
|
|
w.Write(bytes)
|
|
}
|
|
|
|
func BadgeRouter(r *mux.Router) {
|
|
r.HandleFunc("/project/badge/{id}/{metric}", getProjectBadge).Methods("GET")
|
|
r.HandleFunc("/project/badge/{id}", postProjectBadge).Methods("POST")
|
|
}
|