From a4e651c85e69029ba909f3d476eda9726ee4966e Mon Sep 17 00:00:00 2001
From: Kim Oliver Drechsel <kim@drechsel.xyz>
Date: Wed, 31 Jul 2024 11:56:10 +0200
Subject: [PATCH] fix: adjust http response (#31)

---
 cmd/docker-compose-webhook/main.go | 16 ++--------
 internal/utils/utils.go            | 48 ++++++++++++++++++++++--------
 2 files changed, 38 insertions(+), 26 deletions(-)

diff --git a/cmd/docker-compose-webhook/main.go b/cmd/docker-compose-webhook/main.go
index 02ab943..5e0435b 100644
--- a/cmd/docker-compose-webhook/main.go
+++ b/cmd/docker-compose-webhook/main.go
@@ -130,7 +130,6 @@ func main() {
 					utils.JSONError(w,
 						errMsg,
 						err.Error(),
-						event.Repository.FullName,
 						jobID,
 						http.StatusInternalServerError)
 
@@ -156,7 +155,6 @@ func main() {
 				utils.JSONError(w,
 					errMsg,
 					err.Error(),
-					event.Repository.FullName,
 					jobID,
 					http.StatusInternalServerError)
 
@@ -171,7 +169,6 @@ func main() {
 				utils.JSONError(w,
 					errMsg,
 					err.Error(),
-					event.Repository.FullName,
 					jobID,
 					http.StatusInternalServerError)
 
@@ -193,7 +190,6 @@ func main() {
 					utils.JSONError(w,
 						errMsg,
 						err.Error(),
-						event.Repository.FullName,
 						jobID,
 						http.StatusInternalServerError)
 				}
@@ -209,7 +205,6 @@ func main() {
 				utils.JSONError(w,
 					errMsg,
 					err.Error(),
-					event.Repository.FullName,
 					jobID,
 					http.StatusInternalServerError)
 
@@ -229,7 +224,6 @@ func main() {
 				utils.JSONError(w,
 					errMsg,
 					err.Error(),
-					event.Repository.FullName,
 					jobID,
 					http.StatusInternalServerError)
 
@@ -258,7 +252,6 @@ func main() {
 					utils.JSONError(w,
 						errMsg,
 						err.Error(),
-						event.Repository.FullName,
 						jobID,
 						http.StatusInternalServerError)
 
@@ -277,7 +270,6 @@ func main() {
 				utils.JSONError(w,
 					errMsg,
 					err.Error(),
-					event.Repository.FullName,
 					jobID,
 					http.StatusInternalServerError)
 
@@ -295,17 +287,15 @@ func main() {
 				utils.JSONError(w,
 					errMsg,
 					err.Error(),
-					event.Repository.FullName,
 					jobID,
 					http.StatusInternalServerError)
 
 				return
 			}
 
-			jobLog.Info("project deployment successful")
-
-			// Respond with a 204 No Content status
-			w.WriteHeader(http.StatusNoContent)
+			msg := "project deployment successful"
+			jobLog.Info(msg)
+			utils.JSONResponse(w, msg, jobID, http.StatusCreated)
 
 		case gitlab.PushEventPayload:
 			// TODO: Implement GitLab webhook handling
diff --git a/internal/utils/utils.go b/internal/utils/utils.go
index 68672f5..0445d87 100644
--- a/internal/utils/utils.go
+++ b/internal/utils/utils.go
@@ -6,33 +6,55 @@ import (
 	"net/http"
 )
 
+type jsonResponse struct {
+	Code    int    `json:"code"`
+	JobID   string `json:"job_id,omitempty"`
+	Details string `json:"details,omitempty"`
+}
+
+// jsonError inherits from jsonResponse and adds an error message
 type jsonError struct {
-	Code       int    `json:"code"`
-	Error      string `json:"error"`
-	Details    string `json:"details,omitempty"`
-	Repository string `json:"repository,omitempty"`
-	JobID      string `json:"job_id,omitempty"`
+	jsonResponse
+	Error string `json:"error"`
 }
 
 // JSONError writes an error response to the client in JSON format
-func JSONError(w http.ResponseWriter, err interface{}, details, repo, jobId string, code int) {
+func JSONError(w http.ResponseWriter, err interface{}, details, jobId string, code int) {
 	if _, ok := err.(error); ok {
 		err = fmt.Sprintf("%v", err)
 	}
 
-	err = jsonError{
-		Error:      err.(string),
-		Code:       code,
-		Details:    details,
-		Repository: repo,
-		JobID:      jobId,
+	resp := jsonError{
+		Error: err.(string),
+		jsonResponse: jsonResponse{
+			Code:    code,
+			JobID:   jobId,
+			Details: details,
+		},
+	}
+
+	w.Header().Set("Content-Type", "application/json; charset=utf-8")
+	w.Header().Set("X-Content-Type-Options", "nosniff")
+	w.WriteHeader(code)
+
+	err = json.NewEncoder(w).Encode(resp)
+	if err != nil {
+		return
+	}
+}
+
+func JSONResponse(w http.ResponseWriter, details, jobId string, code int) {
+	resp := jsonResponse{
+		Code:    code,
+		JobID:   jobId,
+		Details: details,
 	}
 
 	w.Header().Set("Content-Type", "application/json; charset=utf-8")
 	w.Header().Set("X-Content-Type-Options", "nosniff")
 	w.WriteHeader(code)
 
-	err = json.NewEncoder(w).Encode(err)
+	err := json.NewEncoder(w).Encode(resp)
 	if err != nil {
 		return
 	}