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 authored and schuellerf committed Aug 29, 2024
1 parent 17d4224 commit 1f37e93
Showing 1 changed file with 58 additions and 32 deletions.
90 changes: 58 additions & 32 deletions internal/v1/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -233,60 +233,46 @@ func (h *Handlers) GetPackages(ctx echo.Context, params GetPackagesParams) error
}

func (h *Handlers) GetComposeStatus(ctx echo.Context, composeId uuid.UUID) error {
composeEntry, err := h.getComposeByIdAndOrgId(ctx, composeId)
_, err := h.getComposeByIdAndOrgId(ctx, composeId)
if err != nil {
return err
return echo.NewHTTPError(http.StatusNotFound, "Compose entry not found").SetInternal(err)
}

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)

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
switch resp.StatusCode {
case http.StatusOK:
return h.handleSuccessfulResponse(ctx, resp, composeId)
case http.StatusNotFound:
return h.handleNotFoundResponse(resp)
default:
return h.handleErrorResponse(ctx, resp)
}
}

var composeRequest ComposeRequest
err = json.Unmarshal(composeEntry.Request, &composeRequest)
func (h *Handlers) handleSuccessfulResponse(ctx echo.Context, resp *http.Response, composeId uuid.UUID) error {
composeRequest, err := h.parseAndRedactComposeRequest(ctx, composeId)
if err != nil {
return err
}
if composeRequest.Customizations != nil && composeRequest.Customizations.Users != nil {
for _, u := range *composeRequest.Customizations.Users {
u.RedactPassword()
}
}

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

us, err := parseComposerUploadStatus(cloudStat.ImageStatus.UploadStatus)
uploadStatus, err := parseComposerUploadStatus(cloudStat.ImageStatus.UploadStatus)
if err != nil {
return err
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 @@ -298,6 +284,46 @@ 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)
}
// Composes can get deleted in composer, usually when the image is expired
return echo.NewHTTPError(http.StatusNotFound, string(body))
}

func (h *Handlers) handleErrorResponse(ctx echo.Context, resp *http.Response) error {
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
}

func (h *Handlers) parseAndRedactComposeRequest(ctx echo.Context, composeId uuid.UUID) (ComposeRequest, error) {
composeEntry, err := h.getComposeByIdAndOrgId(ctx, composeId)
if err != nil {
return ComposeRequest{}, err
}

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

if composeRequest.Customizations != nil && composeRequest.Customizations.Users != nil {
for _, u := range *composeRequest.Customizations.Users {
u.RedactPassword()
}
}

return composeRequest, nil
}

func parseComposerUploadStatus(us *composer.UploadStatus) (*UploadStatus, error) {
if us == nil {
return nil, nil
Expand Down

0 comments on commit 1f37e93

Please sign in to comment.