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 Sep 5, 2024
1 parent 96e5ee2 commit 7079a25
Showing 1 changed file with 46 additions and 33 deletions.
79 changes: 46 additions & 33 deletions internal/v1/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -235,58 +235,51 @@ 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)
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
var composeRequest ComposeRequest
if err := json.Unmarshal(composeEntry.Request, &composeRequest); err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to unmarshal compose request").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))
if composeRequest.Customizations != nil && composeRequest.Customizations.Users != nil {
for _, u := range *composeRequest.Customizations.Users {
u.RedactPassword()
}
return httpError
}

var composeRequest ComposeRequest
err = json.Unmarshal(composeEntry.Request, &composeRequest)
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)
}
if composeRequest.Customizations != nil && composeRequest.Customizations.Users != nil {
for _, u := range *composeRequest.Customizations.Users {
u.RedactPassword()
}
defer closeBody(ctx, resp.Body)

switch resp.StatusCode {
case http.StatusOK:
return h.handleSuccessfulResponse(ctx, resp, composeRequest)
case http.StatusNotFound:
return h.handleNotFoundResponse(resp)
default:
return h.handleErrorResponse(ctx, resp)
}
}

func (h *Handlers) handleSuccessfulResponse(ctx echo.Context, resp *http.Response, composeRequest ComposeRequest) error {
var cloudStat composer.ComposeStatus
err = json.NewDecoder(resp.Body).Decode(&cloudStat)
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 +291,26 @@ 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 parseComposerUploadStatus(us *composer.UploadStatus) (*UploadStatus, error) {
if us == nil {
return nil, nil
Expand Down

0 comments on commit 7079a25

Please sign in to comment.