Skip to content

Commit

Permalink
v1/internal: refactor GetComposeStatus improve error handling and c…
Browse files Browse the repository at this point in the history
…ode structure

this commit improve error handling and code structure
* Split GetComposeStatus into smaller, more focused functions
* Enhance error handling with more specific HTTP status codes
*Add dedicated functions for handling different response scenarios
* Implement parseAndRedactComposeRequest for better separation of concerns
* Improve code readability and maintainability
  • Loading branch information
mgold1234 committed Nov 26, 2024
1 parent 02aa450 commit 36cf450
Showing 1 changed file with 47 additions and 35 deletions.
82 changes: 47 additions & 35 deletions internal/v1/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -238,56 +238,49 @@ func (h *Handlers) GetComposeStatus(ctx echo.Context, composeId uuid.UUID) error
return err
}

resp, err := h.server.cClient.ComposeStatus(composeId)
if err != nil {
return err
}
defer closeBody(ctx, resp.Body)

if resp.StatusCode == http.StatusNotFound {
body, err := io.ReadAll(resp.Body)
if err != nil {
return err
}
// Composes can get deleted in composer, usually when the image is expired
return echo.NewHTTPError(http.StatusNotFound, string(body))
} else if resp.StatusCode != http.StatusOK {
httpError := echo.NewHTTPError(http.StatusInternalServerError, "Failed querying compose status")
body, err := io.ReadAll(resp.Body)
if err != nil {
ctx.Logger().Errorf("Unable to parse composer's compose response: %v", err)
} else {
_ = httpError.SetInternal(fmt.Errorf("%s", body))
}
return httpError
}

var composeRequest ComposeRequest
err = json.Unmarshal(composeEntry.Request, &composeRequest)
if err != nil {
return err
if err := json.Unmarshal(composeEntry.Request, &composeRequest); err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to unmarshal compose request").SetInternal(err)
}

if composeRequest.Customizations != nil && composeRequest.Customizations.Users != nil {
users := *composeRequest.Customizations.Users
for i := range users {
users[i].RedactPassword()
}
}

var cloudStat composer.ComposeStatus
err = json.NewDecoder(resp.Body).Decode(&cloudStat)
resp, err := h.server.cClient.ComposeStatus(composeId)
if err != nil {
return err
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to get compose status from client").SetInternal(err)
}
defer closeBody(ctx, resp.Body)

switch resp.StatusCode {
case http.StatusOK:
return h.handleComposeStatusResponse(ctx, resp, composeRequest)
case http.StatusNotFound:
return h.handleNotFoundResponse(resp)
default:
return h.handleErrorResponse(ctx, resp, fmt.Sprintf("Failed querying compose status (code %v)", resp.StatusCode))
}
}

us, err := parseComposerUploadStatus(cloudStat.ImageStatus.UploadStatus)
func (h *Handlers) handleComposeStatusResponse(ctx echo.Context, resp *http.Response, composeRequest ComposeRequest) error {
var cloudStat composer.ComposeStatus
err := json.NewDecoder(resp.Body).Decode(&cloudStat)
if err != nil {
return err
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to decode compose status").SetInternal(err)
}
uploadStatus, err := parseComposerUploadStatus(cloudStat.ImageStatus.UploadStatus)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to parse upload status").SetInternal(err)
}

status := ComposeStatus{
ImageStatus: ImageStatus{
Status: ImageStatusStatus(cloudStat.ImageStatus.Status),
UploadStatus: us,
UploadStatus: uploadStatus,
},
Request: composeRequest,
}
Expand All @@ -299,6 +292,25 @@ func (h *Handlers) GetComposeStatus(ctx echo.Context, composeId uuid.UUID) error
return ctx.JSON(http.StatusOK, status)
}

func (h *Handlers) handleNotFoundResponse(resp *http.Response) error {
body, err := io.ReadAll(resp.Body)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to read response body").SetInternal(err)
}
return echo.NewHTTPError(http.StatusNotFound, string(body))
}

func (h *Handlers) handleErrorResponse(ctx echo.Context, resp *http.Response, errorDescription string) error {
httpError := echo.NewHTTPError(http.StatusInternalServerError, errorDescription)
body, err := io.ReadAll(resp.Body)
if err != nil {
ctx.Logger().Errorf("Unable to parse composer's compose response: %v", err)
} else {
_ = httpError.SetInternal(fmt.Errorf("%s", body))
}
return httpError
}

func parseComposerUploadStatus(us *composer.UploadStatus) (*UploadStatus, error) {
if us == nil {
return nil, nil
Expand Down Expand Up @@ -455,7 +467,7 @@ func (h *Handlers) GetComposeMetadata(ctx echo.Context, composeId uuid.UUID) err
}
return echo.NewHTTPError(http.StatusNotFound, string(body))
} else if resp.StatusCode != http.StatusOK {
httpError := echo.NewHTTPError(http.StatusInternalServerError, "Failed querying compose status")
httpError := echo.NewHTTPError(http.StatusInternalServerError, "Failed querying compose metadata")
body, err := io.ReadAll(resp.Body)
if err != nil {
ctx.Logger().Errorf("Unable to parse composer's compose response: %v", err)
Expand Down Expand Up @@ -505,7 +517,7 @@ func (h *Handlers) getComposeByIdAndOrgId(ctx echo.Context, composeId uuid.UUID)
composeEntry, err := h.server.db.GetCompose(ctx.Request().Context(), composeId, userID.OrgID())
if err != nil {
if errors.Is(err, db.ComposeEntryNotFoundError) {
return nil, echo.NewHTTPError(http.StatusNotFound, err)
return nil, echo.NewHTTPError(http.StatusNotFound, fmt.Sprintf("Compose entry %v not found %s", composeId, err))
} else {
return nil, err
}
Expand Down

0 comments on commit 36cf450

Please sign in to comment.