sonarqube-badges/router/views/badges.go
2025-03-15 01:49:52 +01:00

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")
}