jagan-parthiban commented on code in PR #7408: URL: https://github.com/apache/trafficcontrol/pull/7408#discussion_r1163691134
########## traffic_ops/traffic_ops_golang/servicecategory/servicecategories.go: ########## @@ -187,3 +191,317 @@ WHERE name=$2 RETURNING last_updated` func deleteQuery() string { return `DELETE FROM service_category WHERE name=:name` } + +// Get [Version : V5] function Process the *http.Request and writes the response. It uses GetServiceCategory function. +func Get(w http.ResponseWriter, r *http.Request) { + inf, userErr, sysErr, errCode := api.NewInfo(r, nil, nil) + if userErr != nil || sysErr != nil { + api.HandleErr(w, r, inf.Tx.Tx, errCode, userErr, sysErr) + return + } + defer inf.Close() + + code := http.StatusOK + useIMS := false + config, e := api.GetConfig(r.Context()) + if e == nil && config != nil { + useIMS = config.UseIMS + } else { + log.Warnf("Couldn't get config %v", e) + } + + var maxTime *time.Time + var err error + var scList []tc.ServiceCategoryV5 + + tx := inf.Tx + + scList, err, code, maxTime = GetServiceCategory(tx, inf.Params, useIMS, r.Header) + if code == http.StatusNotModified { + w.WriteHeader(code) + api.WriteResp(w, r, []tc.ServiceCategoryV5{}) + return + } + + if code == http.StatusBadRequest { + api.HandleErr(w, r, inf.Tx.Tx, http.StatusBadRequest, errors.New(err.Error()), nil) + return + } + + if err != nil { + api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, nil, errors.New("Service category errors: "+err.Error())) + return + } + + if maxTime != nil && api.SetLastModifiedHeader(r, useIMS) { + api.AddLastModifiedHdr(w, *maxTime) + } + + api.WriteResp(w, r, scList) +} + +// GetServiceCategory [Version : V5] receives transactions from Get function and returns service_categories list. +func GetServiceCategory(tx *sqlx.Tx, params map[string]string, useIMS bool, header http.Header) ([]tc.ServiceCategoryV5, error, int, *time.Time) { + var runSecond bool + var maxTime time.Time + scList := []tc.ServiceCategoryV5{} + + selectQuery := `SELECT name, last_updated FROM service_category as sc` + + // Query Parameters to Database Query column mappings + queryParamsToQueryCols := map[string]dbhelpers.WhereColumnInfo{ + "name": {Column: "sc.name", Checker: nil}, + } + if _, ok := params["orderby"]; !ok { + params["orderby"] = "name" + } + where, orderBy, pagination, queryValues, errs := dbhelpers.BuildWhereAndOrderByAndPagination(params, queryParamsToQueryCols) + if len(errs) > 0 { + return nil, util.JoinErrs(errs), http.StatusBadRequest, nil + } + + if useIMS { + runSecond, maxTime = TryIfModifiedSinceQuery(header, tx, where, queryValues) + if !runSecond { + log.Debugln("IMS HIT") + return scList, nil, http.StatusNotModified, &maxTime + } + log.Debugln("IMS MISS") + } else { + log.Debugln("Non IMS request") + } + query := selectQuery + where + orderBy + pagination + rows, err := tx.NamedQuery(query, queryValues) + if err != nil { + return nil, errors.New("service category read: error getting service category(ies): " + err.Error()), http.StatusInternalServerError, nil Review Comment: Additional Error message is wrapped to identify the actual reason for http.StatusInternalServerError. Because there are cases where it might be caused by Error reading from db or Error generating a named query and like that. Because that exact message is passed to the parent function and the message is used to handle api.HandleErr. ########## traffic_ops/traffic_ops_golang/servicecategory/servicecategories.go: ########## @@ -187,3 +191,317 @@ WHERE name=$2 RETURNING last_updated` func deleteQuery() string { return `DELETE FROM service_category WHERE name=:name` } + +// Get [Version : V5] function Process the *http.Request and writes the response. It uses GetServiceCategory function. +func Get(w http.ResponseWriter, r *http.Request) { + inf, userErr, sysErr, errCode := api.NewInfo(r, nil, nil) + if userErr != nil || sysErr != nil { + api.HandleErr(w, r, inf.Tx.Tx, errCode, userErr, sysErr) + return + } + defer inf.Close() + + code := http.StatusOK + useIMS := false + config, e := api.GetConfig(r.Context()) + if e == nil && config != nil { + useIMS = config.UseIMS + } else { + log.Warnf("Couldn't get config %v", e) + } + + var maxTime *time.Time + var err error + var scList []tc.ServiceCategoryV5 + + tx := inf.Tx + + scList, err, code, maxTime = GetServiceCategory(tx, inf.Params, useIMS, r.Header) + if code == http.StatusNotModified { + w.WriteHeader(code) + api.WriteResp(w, r, []tc.ServiceCategoryV5{}) + return + } + + if code == http.StatusBadRequest { + api.HandleErr(w, r, inf.Tx.Tx, http.StatusBadRequest, errors.New(err.Error()), nil) + return + } + + if err != nil { + api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, nil, errors.New("Service category errors: "+err.Error())) + return + } + + if maxTime != nil && api.SetLastModifiedHeader(r, useIMS) { + api.AddLastModifiedHdr(w, *maxTime) + } + + api.WriteResp(w, r, scList) +} + +// GetServiceCategory [Version : V5] receives transactions from Get function and returns service_categories list. +func GetServiceCategory(tx *sqlx.Tx, params map[string]string, useIMS bool, header http.Header) ([]tc.ServiceCategoryV5, error, int, *time.Time) { + var runSecond bool + var maxTime time.Time + scList := []tc.ServiceCategoryV5{} + + selectQuery := `SELECT name, last_updated FROM service_category as sc` + + // Query Parameters to Database Query column mappings + queryParamsToQueryCols := map[string]dbhelpers.WhereColumnInfo{ + "name": {Column: "sc.name", Checker: nil}, + } + if _, ok := params["orderby"]; !ok { + params["orderby"] = "name" + } + where, orderBy, pagination, queryValues, errs := dbhelpers.BuildWhereAndOrderByAndPagination(params, queryParamsToQueryCols) + if len(errs) > 0 { + return nil, util.JoinErrs(errs), http.StatusBadRequest, nil + } + + if useIMS { + runSecond, maxTime = TryIfModifiedSinceQuery(header, tx, where, queryValues) + if !runSecond { + log.Debugln("IMS HIT") + return scList, nil, http.StatusNotModified, &maxTime + } + log.Debugln("IMS MISS") + } else { + log.Debugln("Non IMS request") + } + query := selectQuery + where + orderBy + pagination + rows, err := tx.NamedQuery(query, queryValues) + if err != nil { + return nil, errors.New("service category read: error getting service category(ies): " + err.Error()), http.StatusInternalServerError, nil Review Comment: Changed it to just err ########## traffic_ops/traffic_ops_golang/servicecategory/servicecategories.go: ########## @@ -187,3 +191,317 @@ WHERE name=$2 RETURNING last_updated` func deleteQuery() string { return `DELETE FROM service_category WHERE name=:name` } + +// Get [Version : V5] function Process the *http.Request and writes the response. It uses GetServiceCategory function. +func Get(w http.ResponseWriter, r *http.Request) { + inf, userErr, sysErr, errCode := api.NewInfo(r, nil, nil) + if userErr != nil || sysErr != nil { + api.HandleErr(w, r, inf.Tx.Tx, errCode, userErr, sysErr) + return + } + defer inf.Close() + + code := http.StatusOK + useIMS := false + config, e := api.GetConfig(r.Context()) + if e == nil && config != nil { + useIMS = config.UseIMS + } else { + log.Warnf("Couldn't get config %v", e) + } + + var maxTime *time.Time + var err error + var scList []tc.ServiceCategoryV5 + + tx := inf.Tx + + scList, err, code, maxTime = GetServiceCategory(tx, inf.Params, useIMS, r.Header) + if code == http.StatusNotModified { + w.WriteHeader(code) + api.WriteResp(w, r, []tc.ServiceCategoryV5{}) + return + } + + if code == http.StatusBadRequest { + api.HandleErr(w, r, inf.Tx.Tx, http.StatusBadRequest, errors.New(err.Error()), nil) + return + } + + if err != nil { + api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, nil, errors.New("Service category errors: "+err.Error())) + return + } + + if maxTime != nil && api.SetLastModifiedHeader(r, useIMS) { + api.AddLastModifiedHdr(w, *maxTime) + } + + api.WriteResp(w, r, scList) +} + +// GetServiceCategory [Version : V5] receives transactions from Get function and returns service_categories list. +func GetServiceCategory(tx *sqlx.Tx, params map[string]string, useIMS bool, header http.Header) ([]tc.ServiceCategoryV5, error, int, *time.Time) { + var runSecond bool + var maxTime time.Time + scList := []tc.ServiceCategoryV5{} + + selectQuery := `SELECT name, last_updated FROM service_category as sc` + + // Query Parameters to Database Query column mappings + queryParamsToQueryCols := map[string]dbhelpers.WhereColumnInfo{ + "name": {Column: "sc.name", Checker: nil}, + } + if _, ok := params["orderby"]; !ok { + params["orderby"] = "name" + } + where, orderBy, pagination, queryValues, errs := dbhelpers.BuildWhereAndOrderByAndPagination(params, queryParamsToQueryCols) + if len(errs) > 0 { + return nil, util.JoinErrs(errs), http.StatusBadRequest, nil + } + + if useIMS { + runSecond, maxTime = TryIfModifiedSinceQuery(header, tx, where, queryValues) + if !runSecond { + log.Debugln("IMS HIT") + return scList, nil, http.StatusNotModified, &maxTime + } + log.Debugln("IMS MISS") + } else { + log.Debugln("Non IMS request") + } + query := selectQuery + where + orderBy + pagination + rows, err := tx.NamedQuery(query, queryValues) + if err != nil { + return nil, errors.New("service category read: error getting service category(ies): " + err.Error()), http.StatusInternalServerError, nil + } + defer rows.Close() + + for rows.Next() { + sc := tc.ServiceCategoryV5{} + if err = rows.Scan(&sc.Name, &sc.LastUpdated); err != nil { + return nil, errors.New("error getting service category(ies): " + err.Error()), http.StatusInternalServerError, nil Review Comment: Additional Error message is wrapped to identify the actual reason for http.StatusInternalServerError. Because there are cases where it might be caused by Error reading from db or Error generating a named query and like that. Because that exact message is passed to the parent function and the message is used to handle api.HandleErr. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: issues-unsubscr...@trafficcontrol.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org