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