This is an automated email from the ASF dual-hosted git repository.

ocket8888 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git


The following commit(s) were added to refs/heads/master by this push:
     new 76db3a8  Fix API capabilities rewrite bugs (#4321)
76db3a8 is described below

commit 76db3a830d0605466c4aeaab39884fced854b415
Author: Michael Hoppal <[email protected]>
AuthorDate: Fri Jan 24 06:46:44 2020 -0700

    Fix API capabilities rewrite bugs (#4321)
    
    Include:
    - Empty list instead of null when filtering to non existing
    capabilities
    - Return 400 instead of 500 when passing in an invalid http method
---
 traffic_ops/traffic_ops_golang/api/api.go                  | 14 ++++++++++++++
 .../traffic_ops_golang/apicapability/api_capabilities.go   | 14 ++++++--------
 2 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/traffic_ops/traffic_ops_golang/api/api.go 
b/traffic_ops/traffic_ops_golang/api/api.go
index 182e019..7112045 100644
--- a/traffic_ops/traffic_ops_golang/api/api.go
+++ b/traffic_ops/traffic_ops_golang/api/api.go
@@ -690,6 +690,16 @@ func parseUniqueConstraint(err *pq.Error) (error, error, 
int) {
        return fmt.Errorf("%v %s '%s' already exists.", err.Table, match[1], 
match[2]), nil, http.StatusBadRequest
 }
 
+// parses pq errors for database enum constraint violations
+func parseEnumConstraint(err *pq.Error) (error, error, int) {
+       pattern := regexp.MustCompile(`invalid input value for enum (.+): 
\"(.+)\"`)
+       match := pattern.FindStringSubmatch(err.Message)
+       if match == nil {
+               return nil, nil, http.StatusOK
+       }
+       return fmt.Errorf("invalid enum value %s for field %s.", match[2], 
match[1]), nil, http.StatusBadRequest
+}
+
 // parses pq errors for ON DELETE RESTRICT fk constraint violations
 //
 // Note: This method would also catch an ON UPDATE RESTRICT fk constraint,
@@ -752,6 +762,10 @@ func ParseDBError(ierr error) (error, error, int) {
                return usrErr, sysErr, errCode
        }
 
+       if usrErr, sysErr, errCode := parseEnumConstraint(err); errCode != 
http.StatusOK {
+               return usrErr, sysErr, errCode
+       }
+
        return nil, err, http.StatusInternalServerError
 }
 
diff --git a/traffic_ops/traffic_ops_golang/apicapability/api_capabilities.go 
b/traffic_ops/traffic_ops_golang/apicapability/api_capabilities.go
index f96edbc..949198a 100644
--- a/traffic_ops/traffic_ops_golang/apicapability/api_capabilities.go
+++ b/traffic_ops/traffic_ops_golang/apicapability/api_capabilities.go
@@ -42,7 +42,7 @@ func GetAPICapabilitiesHandler(w http.ResponseWriter, r 
*http.Request) {
        defer inf.Close()
 
        results, errCode, usrErr, sysErr := getAPICapabilities(inf.Tx, 
inf.Params)
-       if userErr != nil || sysErr != nil {
+       if usrErr != nil || sysErr != nil {
                api.HandleErr(w, r, inf.Tx.Tx, errCode, usrErr, sysErr)
                return
        }
@@ -68,7 +68,7 @@ func getAPICapabilities(tx *sqlx.Tx, params 
map[string]string) ([]tc.APICapabili
        if len(errs) > 0 {
                err = util.JoinErrs(errs)
                return nil, http.StatusInternalServerError, nil, fmt.Errorf(
-                       "query exception: could not build api_capbility query 
with params: %v, error: %v",
+                       "query exception: could not build api_capability query 
with params: %v, error: %v",
                        params,
                        err,
                )
@@ -76,16 +76,14 @@ func getAPICapabilities(tx *sqlx.Tx, params 
map[string]string) ([]tc.APICapabili
 
        query := selectQuery + where + orderBy + pagination
        rows, err := tx.NamedQuery(query, queryValues)
+
        if err != nil {
-               return nil, http.StatusInternalServerError, nil, fmt.Errorf(
-                       "db exception: could not execute api_capbility query 
with params: %v, error: %v",
-                       params,
-                       err,
-               )
+               usrErr, sysErr, errCode := api.ParseDBError(err)
+               return nil, errCode, usrErr, sysErr
        }
        defer rows.Close()
 
-       var apiCaps []tc.APICapability
+       apiCaps := []tc.APICapability{}
        for rows.Next() {
                var ac tc.APICapability
                err = rows.Scan(

Reply via email to