jagan-parthiban commented on code in PR #7570:
URL: https://github.com/apache/trafficcontrol/pull/7570#discussion_r1234654057
##########
docs/source/api/v5/deliveryservice_request_comments.rst:
##########
@@ -97,7 +97,7 @@ Response Structure
"author": "admin",
"deliveryServiceRequestId": 2,
"id": 4,
- "lastUpdated": "2020-02-24 19:59:55+00",
+ "lastUpdated": "2020-02-24T19:59:55-06:00",
Review Comment:
Same as Above. Time stamp here must contain Nano-seconds here.
##########
docs/source/api/v5/deliveryservice_request_comments.rst:
##########
@@ -258,7 +258,7 @@ Response Structure
"author": null,
"deliveryServiceRequestId": 2,
"id": 6,
- "lastUpdated": "2020-02-24 20:05:46+00",
+ "lastUpdated": "2020-02-24T20:05:46-06:00",
Review Comment:
It is correct here. When i checked the PUT request, it is returning RFC3339
without Nanoseconds. But shouldn't the PUT request as well have Nanoseconds
same as GET and POST ?
##########
docs/source/api/v5/deliveryservice_request_comments.rst:
##########
@@ -88,7 +88,7 @@ Response Structure
"author": "admin",
"deliveryServiceRequestId": 2,
"id": 3,
- "lastUpdated": "2020-02-24 19:59:46+00",
+ "lastUpdated": "2020-02-24T19:59:46-06:00",
Review Comment:
Time stamp here must contain Nano-seconds as the V5 APIs as per this PR is
returning RFC3339 with Nano seconds.
```
{
"response": [
{
"authorId": 2,
"author": "admin",
"deliveryServiceRequestId": 5,
"id": 2,
"lastUpdated": "2023-06-20T07:24:36.775326+05:30",
"value": "Does anyone have time to review my delivery
service request?",
"xmlId": "dsempty"
}
]
}
```
##########
docs/source/api/v5/deliveryservice_request_comments.rst:
##########
@@ -173,7 +173,7 @@ Response Structure
"author": null,
"deliveryServiceRequestId": 2,
"id": 6,
- "lastUpdated": "2020-02-24 20:02:20+00",
+ "lastUpdated": "2020-02-24T20:02:20-06:00",
Review Comment:
Same as Above. Time stamp here must contain Nano-seconds here.
##########
traffic_ops/traffic_ops_golang/deliveryservice/request/comment/comments.go:
##########
@@ -186,3 +199,257 @@ WHERE id=:id RETURNING last_updated`
func deleteQuery() string {
return `DELETE FROM deliveryservice_request_comment WHERE id = :id`
}
+
+// Get is used to read the DeliveryServiceRequestCommentV5 entities from the
database.
+func Get(w http.ResponseWriter, r *http.Request) {
+ var maxTime time.Time
+ var runSecond bool
+ inf, userErr, sysErr, errCode := api.NewInfo(r, nil, nil)
+ tx := inf.Tx.Tx
+ if userErr != nil || sysErr != nil {
+ api.HandleErr(w, r, tx, errCode, userErr, sysErr)
+ return
+ }
+ defer inf.Close()
+
+ api.DefaultSort(inf, "xmlId")
+ cols := map[string]dbhelpers.WhereColumnInfo{
+ "authorId": dbhelpers.WhereColumnInfo{Column:
"dsrc.author_id"},
+ "author": dbhelpers.WhereColumnInfo{Column:
"a.username"},
+ "deliveryServiceRequestId": dbhelpers.WhereColumnInfo{Column:
"dsrc.deliveryservice_request_id"},
+ "id": dbhelpers.WhereColumnInfo{Column:
"dsrc.id", Checker: api.IsInt},
+ }
+
+ where, orderBy, pagination, queryValues, errs :=
dbhelpers.BuildWhereAndOrderByAndPagination(inf.Params, cols)
+ if len(errs) > 0 {
+ errCode = http.StatusBadRequest
+ userErr = util.JoinErrs(errs)
+ api.HandleErr(w, r, tx, errCode, userErr, nil)
+ return
+ }
+
+ if inf.Config.UseIMS {
+ runSecond, maxTime = ims.TryIfModifiedSinceQuery(inf.Tx,
r.Header, queryValues, selectMaxLastUpdatedQuery(where, orderBy, pagination))
+ if !runSecond {
+ log.Debugln("IMS HIT")
+ api.AddLastModifiedHdr(w, maxTime)
+ w.WriteHeader(http.StatusNotModified)
+ return
+ }
+ log.Debugln("IMS MISS")
+ } else {
+ log.Debugln("Non IMS request")
+ }
+
+ deliveryServiceRequestComments := []tc.DeliveryServiceRequestCommentV5{}
+ query := selectQuery() + where + orderBy + pagination
+ rows, err := inf.Tx.NamedQuery(query, queryValues)
+ if err != nil {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError, nil,
errors.New("querying cdn locks: "+err.Error()))
+ return
+ }
+ defer rows.Close()
+
+ for rows.Next() {
+ var deliveryServiceRequestComment
tc.DeliveryServiceRequestCommentV5
+ if err = rows.Scan(&deliveryServiceRequestComment.Author,
&deliveryServiceRequestComment.AuthorID,
&deliveryServiceRequestComment.DeliveryServiceRequestID,
&deliveryServiceRequestComment.XMLID, &deliveryServiceRequestComment.ID,
&deliveryServiceRequestComment.LastUpdated,
&deliveryServiceRequestComment.Value); err != nil {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError,
nil, errors.New("scanning delivery service request comments: "+err.Error()))
+ return
+ }
+ deliveryServiceRequestComments =
append(deliveryServiceRequestComments, deliveryServiceRequestComment)
+ }
+ api.WriteResp(w, r, deliveryServiceRequestComments)
+}
+
+// Validate is used to ensure that the DeliveryServiceRequestCommentV5 struct
passed in to the function is valid.
+func Validate(dsrc tc.DeliveryServiceRequestCommentV5) error {
+ errs := validation.Errors{
+ "deliveryServiceRequestId":
validation.Validate(dsrc.DeliveryServiceRequestID, validation.NotNil),
+ "value": validation.Validate(dsrc.Value,
validation.NotNil),
+ }
+ return util.JoinErrs(tovalidate.ToErrors(errs))
+}
+
+// Update is used to modify an existing DeliveryServiceRequestCommentV5 in the
database.
+func Update(w http.ResponseWriter, r *http.Request) {
+ var deliveryServiceRequestComment tc.DeliveryServiceRequestCommentV5
+
+ inf, userErr, sysErr, errCode := api.NewInfo(r, []string{"id"}, nil)
+ if userErr != nil || sysErr != nil {
+ api.HandleErr(w, r, inf.Tx.Tx, errCode, userErr, sysErr)
+ return
+ }
+ defer inf.Close()
+
+ tx := inf.Tx.Tx
+ if err :=
json.NewDecoder(r.Body).Decode(&deliveryServiceRequestComment); err != nil {
+ api.HandleErr(w, r, tx, http.StatusBadRequest, err, nil)
+ return
+ }
+
+ if err := Validate(deliveryServiceRequestComment); err != nil {
+ api.HandleErr(w, r, tx, http.StatusBadRequest, err, nil)
+ return
+ }
+
+ var current TODeliveryServiceRequestComment
+ err := inf.Tx.QueryRowx(selectQuery() + `WHERE dsrc.id=` +
inf.Params["id"]).StructScan(¤t)
+ if err != nil {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError, nil,
errors.New("scanning deliveryservice_request_comment: "+err.Error()))
+ return
+ }
+
+ userID := tc.IDNoMod(inf.User.ID)
+ if *current.AuthorID != userID {
+ api.HandleErr(w, r, tx, http.StatusBadRequest,
errors.New("comments can only be updated by the author"), nil)
+ return
+ }
+ deliveryServiceRequestComment.AuthorID = *current.AuthorID
+ idParam := inf.Params["id"]
+ id, parseErr := strconv.Atoi(idParam)
+ if parseErr != nil {
+ api.HandleErr(w, r, inf.Tx.Tx, http.StatusBadRequest,
errors.New("id must be an integer"), nil)
+ return
+ }
+ deliveryServiceRequestComment.ID = id
+ userErr, sysErr, sc := api.CheckIfUnModified(r.Header, inf.Tx, id,
"deliveryservice_request_comment")
+ if userErr != nil || sysErr != nil {
+ api.HandleErr(w, r, tx, sc, userErr, sysErr)
+ return
+ }
+
+ rows, err := inf.Tx.NamedQuery(updateQuery(),
deliveryServiceRequestComment)
+ if err != nil {
+ userErr, sysErr, sc := api.ParseDBError(err)
+ api.HandleErr(w, r, tx, sc, userErr, sysErr)
+ return
+ }
+ defer rows.Close()
+
+ if !rows.Next() {
+ api.HandleErr(w, r, tx, http.StatusNotFound, errors.New("no
deliveryservice_request_comment found with this id"), nil)
+ return
+ }
+ lastUpdated := tc.TimeNoMod{}
+ if err := rows.Scan(&lastUpdated); err != nil {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError, nil,
errors.New("scanning lastUpdated from deliveryservice_request_comment insert:
"+err.Error()))
+ return
+ }
+ deliveryServiceRequestComment.LastUpdated = time.Now()
+
+ t := lastUpdated.Time
+ updatedTime, err := util.ConvertTimeFormat(t, time.RFC3339)
+ if err != nil {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError, nil,
errors.New("converting last_updated to RFC3339 format: "+err.Error()))
+ return
+ }
+ deliveryServiceRequestComment.LastUpdated = *updatedTime
+
+ if rows.Next() {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError, nil,
errors.New("deliveryservice_request_comment update affected too many rows: >1"))
+ return
+ }
+
+ alerts := tc.CreateAlerts(tc.SuccessLevel,
"deliveryservice_request_comment was updated.")
+ api.WriteAlertsObj(w, r, http.StatusOK, alerts,
deliveryServiceRequestComment)
+ changeLogMsg := fmt.Sprintf("DELIVERYSERVICE_REQUEST_COMMENT: %d, ID:
%d, ACTION: Updated deliveryservice_request_comment",
deliveryServiceRequestComment.ID, deliveryServiceRequestComment.ID)
+ api.CreateChangeLogRawTx(api.ApiChange, changeLogMsg, inf.User, tx)
+}
+
+// Create is used to add a new DeliveryServiceRequestCommentV5 to the database.
+func Create(w http.ResponseWriter, r *http.Request) {
+ var deliveryServiceRequestComment tc.DeliveryServiceRequestCommentV5
+
+ 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()
+
+ tx := inf.Tx.Tx
+
+ if err :=
json.NewDecoder(r.Body).Decode(&deliveryServiceRequestComment); err != nil {
+ api.HandleErr(w, r, tx, http.StatusBadRequest, err, nil)
+ return
+ }
+
+ if err := Validate(deliveryServiceRequestComment); err != nil {
+ api.HandleErr(w, r, tx, http.StatusBadRequest, err, nil)
+ return
+ }
+
+ au := tc.IDNoMod(inf.User.ID)
+ deliveryServiceRequestComment.AuthorID = au
+
+ resultRows, err := inf.Tx.NamedQuery(insertQuery(),
deliveryServiceRequestComment)
+ if err != nil {
+ userErr, sysErr, errCode := api.ParseDBError(err)
+ api.HandleErr(w, r, tx, errCode, userErr, sysErr)
+ return
+ }
+ defer resultRows.Close()
+
+ rowsAffected := 0
+ for resultRows.Next() {
+ rowsAffected++
+ if err := resultRows.Scan(&deliveryServiceRequestComment.ID,
&deliveryServiceRequestComment.LastUpdated); err != nil {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError,
nil, errors.New("deliveryservice_request_comment create: scanning comment:
"+err.Error()))
+ return
+ }
+ }
+ if rowsAffected == 0 {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError, nil,
errors.New("deliveryservice_request_comment create: comment couldn't be
created"))
+ return
+ } else if rowsAffected > 1 {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError, nil,
errors.New("deliveryservice_request_comment create: comment couldn't be
created: too many ids returned from insert"))
+ return
+ }
+
+ alerts := tc.CreateAlerts(tc.SuccessLevel,
"deliveryservice_request_comment was created.")
+ api.WriteAlertsObj(w, r, http.StatusOK, alerts,
deliveryServiceRequestComment)
+ changeLogMsg := fmt.Sprintf("DELIVERYSERVICE_REQUEST_COMMENT: %d, ID:
%d, ACTION: Created deliveryservice_request_comment",
deliveryServiceRequestComment.ID, deliveryServiceRequestComment.ID)
+ api.CreateChangeLogRawTx(api.ApiChange, changeLogMsg, inf.User, tx)
+}
+
+// Delete is used to remove an existing DeliveryServiceRequestCommentV5 from
the database.
+func Delete(w http.ResponseWriter, r *http.Request) {
+ inf, userErr, sysErr, errCode := api.NewInfo(r, []string{"id"}, nil)
+ if userErr != nil || sysErr != nil {
+ api.HandleErr(w, r, inf.Tx.Tx, errCode, userErr, sysErr)
+ return
+ }
+ defer inf.Close()
+
+ tx := inf.Tx.Tx
+
+ idParam := inf.Params["id"]
+ id, parseErr := strconv.Atoi(idParam)
+ if parseErr != nil {
+ api.HandleErr(w, r, inf.Tx.Tx, http.StatusBadRequest,
errors.New("id must be an integer"), nil)
+ return
+ }
+
+ var current TODeliveryServiceRequestComment
Review Comment:
**TODeliveryServiceRequestComment** struct uses
**DeliveryServiceRequestCommentNullable** struct which has depreciated
**TimeNoMod** in **LastUpdated** field.
##########
CHANGELOG.md:
##########
@@ -37,6 +37,7 @@ The format is based on [Keep a
Changelog](http://keepachangelog.com/en/1.0.0/).
- [#7380](https://github.com/apache/trafficcontrol/pull/7380) *Traffic Portal*
Adds strikethrough (expired), red (7 days until expiration) and yellow (30 days
until expiration) visuals to delivery service cert expiration grid rows.
- [#7388](https://github.com/apache/trafficcontrol/pull/7388) *TC go Client*
Adds sslkey_expiration methodology in v4 and v5 clients
- [#7543](https://github.com/apache/trafficcontrol/pull/7543) *Traffic Portal*
New Ansible Role to use Traffic Portal v2
+- [#7570](https://github.com/apache/trafficcontrol/pull/7570) *Traffic Ops*
Fixes `deliveryservice_request_comments` v5 apis to respond with `RFC3339`
date/time Format.
Review Comment:
Shouldn't this changelog text be added to **#Fixed** Part rather than
**#Added** part in the file?
##########
lib/go-tc/deliveryservice_request_comments.go:
##########
@@ -1,5 +1,9 @@
package tc
+import (
Review Comment:
For Uniformity across all files, Import statement must be below the Licence
text.
##########
traffic_ops/traffic_ops_golang/deliveryservice/request/comment/comments.go:
##########
@@ -186,3 +199,257 @@ WHERE id=:id RETURNING last_updated`
func deleteQuery() string {
return `DELETE FROM deliveryservice_request_comment WHERE id = :id`
}
+
+// Get is used to read the DeliveryServiceRequestCommentV5 entities from the
database.
+func Get(w http.ResponseWriter, r *http.Request) {
+ var maxTime time.Time
+ var runSecond bool
+ inf, userErr, sysErr, errCode := api.NewInfo(r, nil, nil)
+ tx := inf.Tx.Tx
+ if userErr != nil || sysErr != nil {
+ api.HandleErr(w, r, tx, errCode, userErr, sysErr)
+ return
+ }
+ defer inf.Close()
+
+ api.DefaultSort(inf, "xmlId")
+ cols := map[string]dbhelpers.WhereColumnInfo{
+ "authorId": dbhelpers.WhereColumnInfo{Column:
"dsrc.author_id"},
+ "author": dbhelpers.WhereColumnInfo{Column:
"a.username"},
+ "deliveryServiceRequestId": dbhelpers.WhereColumnInfo{Column:
"dsrc.deliveryservice_request_id"},
+ "id": dbhelpers.WhereColumnInfo{Column:
"dsrc.id", Checker: api.IsInt},
+ }
+
+ where, orderBy, pagination, queryValues, errs :=
dbhelpers.BuildWhereAndOrderByAndPagination(inf.Params, cols)
+ if len(errs) > 0 {
+ errCode = http.StatusBadRequest
+ userErr = util.JoinErrs(errs)
+ api.HandleErr(w, r, tx, errCode, userErr, nil)
+ return
+ }
+
+ if inf.Config.UseIMS {
+ runSecond, maxTime = ims.TryIfModifiedSinceQuery(inf.Tx,
r.Header, queryValues, selectMaxLastUpdatedQuery(where, orderBy, pagination))
+ if !runSecond {
+ log.Debugln("IMS HIT")
+ api.AddLastModifiedHdr(w, maxTime)
+ w.WriteHeader(http.StatusNotModified)
+ return
+ }
+ log.Debugln("IMS MISS")
+ } else {
+ log.Debugln("Non IMS request")
+ }
+
+ deliveryServiceRequestComments := []tc.DeliveryServiceRequestCommentV5{}
+ query := selectQuery() + where + orderBy + pagination
+ rows, err := inf.Tx.NamedQuery(query, queryValues)
+ if err != nil {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError, nil,
errors.New("querying cdn locks: "+err.Error()))
+ return
+ }
+ defer rows.Close()
+
+ for rows.Next() {
+ var deliveryServiceRequestComment
tc.DeliveryServiceRequestCommentV5
+ if err = rows.Scan(&deliveryServiceRequestComment.Author,
&deliveryServiceRequestComment.AuthorID,
&deliveryServiceRequestComment.DeliveryServiceRequestID,
&deliveryServiceRequestComment.XMLID, &deliveryServiceRequestComment.ID,
&deliveryServiceRequestComment.LastUpdated,
&deliveryServiceRequestComment.Value); err != nil {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError,
nil, errors.New("scanning delivery service request comments: "+err.Error()))
+ return
+ }
+ deliveryServiceRequestComments =
append(deliveryServiceRequestComments, deliveryServiceRequestComment)
+ }
+ api.WriteResp(w, r, deliveryServiceRequestComments)
+}
+
+// Validate is used to ensure that the DeliveryServiceRequestCommentV5 struct
passed in to the function is valid.
+func Validate(dsrc tc.DeliveryServiceRequestCommentV5) error {
+ errs := validation.Errors{
+ "deliveryServiceRequestId":
validation.Validate(dsrc.DeliveryServiceRequestID, validation.NotNil),
+ "value": validation.Validate(dsrc.Value,
validation.NotNil),
+ }
+ return util.JoinErrs(tovalidate.ToErrors(errs))
+}
+
+// Update is used to modify an existing DeliveryServiceRequestCommentV5 in the
database.
+func Update(w http.ResponseWriter, r *http.Request) {
+ var deliveryServiceRequestComment tc.DeliveryServiceRequestCommentV5
+
+ inf, userErr, sysErr, errCode := api.NewInfo(r, []string{"id"}, nil)
+ if userErr != nil || sysErr != nil {
+ api.HandleErr(w, r, inf.Tx.Tx, errCode, userErr, sysErr)
+ return
+ }
+ defer inf.Close()
+
+ tx := inf.Tx.Tx
+ if err :=
json.NewDecoder(r.Body).Decode(&deliveryServiceRequestComment); err != nil {
+ api.HandleErr(w, r, tx, http.StatusBadRequest, err, nil)
+ return
+ }
+
+ if err := Validate(deliveryServiceRequestComment); err != nil {
+ api.HandleErr(w, r, tx, http.StatusBadRequest, err, nil)
+ return
+ }
+
+ var current TODeliveryServiceRequestComment
+ err := inf.Tx.QueryRowx(selectQuery() + `WHERE dsrc.id=` +
inf.Params["id"]).StructScan(¤t)
+ if err != nil {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError, nil,
errors.New("scanning deliveryservice_request_comment: "+err.Error()))
+ return
+ }
+
+ userID := tc.IDNoMod(inf.User.ID)
+ if *current.AuthorID != userID {
+ api.HandleErr(w, r, tx, http.StatusBadRequest,
errors.New("comments can only be updated by the author"), nil)
+ return
+ }
+ deliveryServiceRequestComment.AuthorID = *current.AuthorID
+ idParam := inf.Params["id"]
+ id, parseErr := strconv.Atoi(idParam)
+ if parseErr != nil {
+ api.HandleErr(w, r, inf.Tx.Tx, http.StatusBadRequest,
errors.New("id must be an integer"), nil)
+ return
+ }
+ deliveryServiceRequestComment.ID = id
+ userErr, sysErr, sc := api.CheckIfUnModified(r.Header, inf.Tx, id,
"deliveryservice_request_comment")
+ if userErr != nil || sysErr != nil {
+ api.HandleErr(w, r, tx, sc, userErr, sysErr)
+ return
+ }
+
+ rows, err := inf.Tx.NamedQuery(updateQuery(),
deliveryServiceRequestComment)
+ if err != nil {
+ userErr, sysErr, sc := api.ParseDBError(err)
+ api.HandleErr(w, r, tx, sc, userErr, sysErr)
+ return
+ }
+ defer rows.Close()
+
+ if !rows.Next() {
+ api.HandleErr(w, r, tx, http.StatusNotFound, errors.New("no
deliveryservice_request_comment found with this id"), nil)
+ return
+ }
+ lastUpdated := tc.TimeNoMod{}
+ if err := rows.Scan(&lastUpdated); err != nil {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError, nil,
errors.New("scanning lastUpdated from deliveryservice_request_comment insert:
"+err.Error()))
+ return
+ }
+ deliveryServiceRequestComment.LastUpdated = time.Now()
+
+ t := lastUpdated.Time
+ updatedTime, err := util.ConvertTimeFormat(t, time.RFC3339)
+ if err != nil {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError, nil,
errors.New("converting last_updated to RFC3339 format: "+err.Error()))
+ return
+ }
+ deliveryServiceRequestComment.LastUpdated = *updatedTime
+
+ if rows.Next() {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError, nil,
errors.New("deliveryservice_request_comment update affected too many rows: >1"))
+ return
+ }
+
+ alerts := tc.CreateAlerts(tc.SuccessLevel,
"deliveryservice_request_comment was updated.")
+ api.WriteAlertsObj(w, r, http.StatusOK, alerts,
deliveryServiceRequestComment)
+ changeLogMsg := fmt.Sprintf("DELIVERYSERVICE_REQUEST_COMMENT: %d, ID:
%d, ACTION: Updated deliveryservice_request_comment",
deliveryServiceRequestComment.ID, deliveryServiceRequestComment.ID)
+ api.CreateChangeLogRawTx(api.ApiChange, changeLogMsg, inf.User, tx)
+}
+
+// Create is used to add a new DeliveryServiceRequestCommentV5 to the database.
+func Create(w http.ResponseWriter, r *http.Request) {
+ var deliveryServiceRequestComment tc.DeliveryServiceRequestCommentV5
+
+ 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()
+
+ tx := inf.Tx.Tx
+
+ if err :=
json.NewDecoder(r.Body).Decode(&deliveryServiceRequestComment); err != nil {
+ api.HandleErr(w, r, tx, http.StatusBadRequest, err, nil)
+ return
+ }
+
+ if err := Validate(deliveryServiceRequestComment); err != nil {
+ api.HandleErr(w, r, tx, http.StatusBadRequest, err, nil)
+ return
+ }
+
+ au := tc.IDNoMod(inf.User.ID)
+ deliveryServiceRequestComment.AuthorID = au
+
+ resultRows, err := inf.Tx.NamedQuery(insertQuery(),
deliveryServiceRequestComment)
+ if err != nil {
+ userErr, sysErr, errCode := api.ParseDBError(err)
+ api.HandleErr(w, r, tx, errCode, userErr, sysErr)
+ return
+ }
+ defer resultRows.Close()
+
+ rowsAffected := 0
+ for resultRows.Next() {
+ rowsAffected++
+ if err := resultRows.Scan(&deliveryServiceRequestComment.ID,
&deliveryServiceRequestComment.LastUpdated); err != nil {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError,
nil, errors.New("deliveryservice_request_comment create: scanning comment:
"+err.Error()))
+ return
+ }
+ }
+ if rowsAffected == 0 {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError, nil,
errors.New("deliveryservice_request_comment create: comment couldn't be
created"))
+ return
+ } else if rowsAffected > 1 {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError, nil,
errors.New("deliveryservice_request_comment create: comment couldn't be
created: too many ids returned from insert"))
+ return
+ }
+
+ alerts := tc.CreateAlerts(tc.SuccessLevel,
"deliveryservice_request_comment was created.")
+ api.WriteAlertsObj(w, r, http.StatusOK, alerts,
deliveryServiceRequestComment)
+ changeLogMsg := fmt.Sprintf("DELIVERYSERVICE_REQUEST_COMMENT: %d, ID:
%d, ACTION: Created deliveryservice_request_comment",
deliveryServiceRequestComment.ID, deliveryServiceRequestComment.ID)
+ api.CreateChangeLogRawTx(api.ApiChange, changeLogMsg, inf.User, tx)
+}
+
+// Delete is used to remove an existing DeliveryServiceRequestCommentV5 from
the database.
+func Delete(w http.ResponseWriter, r *http.Request) {
+ inf, userErr, sysErr, errCode := api.NewInfo(r, []string{"id"}, nil)
+ if userErr != nil || sysErr != nil {
+ api.HandleErr(w, r, inf.Tx.Tx, errCode, userErr, sysErr)
+ return
+ }
+ defer inf.Close()
+
+ tx := inf.Tx.Tx
+
+ idParam := inf.Params["id"]
+ id, parseErr := strconv.Atoi(idParam)
+ if parseErr != nil {
+ api.HandleErr(w, r, inf.Tx.Tx, http.StatusBadRequest,
errors.New("id must be an integer"), nil)
Review Comment:
Should we pass the actual **parseErr** as sysErr to api.HandleErr ?
##########
traffic_ops/traffic_ops_golang/deliveryservice/request/comment/comments.go:
##########
@@ -186,3 +199,257 @@ WHERE id=:id RETURNING last_updated`
func deleteQuery() string {
return `DELETE FROM deliveryservice_request_comment WHERE id = :id`
}
+
+// Get is used to read the DeliveryServiceRequestCommentV5 entities from the
database.
+func Get(w http.ResponseWriter, r *http.Request) {
+ var maxTime time.Time
+ var runSecond bool
+ inf, userErr, sysErr, errCode := api.NewInfo(r, nil, nil)
+ tx := inf.Tx.Tx
+ if userErr != nil || sysErr != nil {
+ api.HandleErr(w, r, tx, errCode, userErr, sysErr)
+ return
+ }
+ defer inf.Close()
+
+ api.DefaultSort(inf, "xmlId")
+ cols := map[string]dbhelpers.WhereColumnInfo{
+ "authorId": dbhelpers.WhereColumnInfo{Column:
"dsrc.author_id"},
+ "author": dbhelpers.WhereColumnInfo{Column:
"a.username"},
+ "deliveryServiceRequestId": dbhelpers.WhereColumnInfo{Column:
"dsrc.deliveryservice_request_id"},
+ "id": dbhelpers.WhereColumnInfo{Column:
"dsrc.id", Checker: api.IsInt},
+ }
+
+ where, orderBy, pagination, queryValues, errs :=
dbhelpers.BuildWhereAndOrderByAndPagination(inf.Params, cols)
+ if len(errs) > 0 {
+ errCode = http.StatusBadRequest
+ userErr = util.JoinErrs(errs)
+ api.HandleErr(w, r, tx, errCode, userErr, nil)
+ return
+ }
+
+ if inf.Config.UseIMS {
+ runSecond, maxTime = ims.TryIfModifiedSinceQuery(inf.Tx,
r.Header, queryValues, selectMaxLastUpdatedQuery(where, orderBy, pagination))
+ if !runSecond {
+ log.Debugln("IMS HIT")
+ api.AddLastModifiedHdr(w, maxTime)
+ w.WriteHeader(http.StatusNotModified)
+ return
+ }
+ log.Debugln("IMS MISS")
+ } else {
+ log.Debugln("Non IMS request")
+ }
+
+ deliveryServiceRequestComments := []tc.DeliveryServiceRequestCommentV5{}
+ query := selectQuery() + where + orderBy + pagination
+ rows, err := inf.Tx.NamedQuery(query, queryValues)
+ if err != nil {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError, nil,
errors.New("querying cdn locks: "+err.Error()))
+ return
+ }
+ defer rows.Close()
+
+ for rows.Next() {
+ var deliveryServiceRequestComment
tc.DeliveryServiceRequestCommentV5
+ if err = rows.Scan(&deliveryServiceRequestComment.Author,
&deliveryServiceRequestComment.AuthorID,
&deliveryServiceRequestComment.DeliveryServiceRequestID,
&deliveryServiceRequestComment.XMLID, &deliveryServiceRequestComment.ID,
&deliveryServiceRequestComment.LastUpdated,
&deliveryServiceRequestComment.Value); err != nil {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError,
nil, errors.New("scanning delivery service request comments: "+err.Error()))
+ return
+ }
+ deliveryServiceRequestComments =
append(deliveryServiceRequestComments, deliveryServiceRequestComment)
+ }
+ api.WriteResp(w, r, deliveryServiceRequestComments)
+}
+
+// Validate is used to ensure that the DeliveryServiceRequestCommentV5 struct
passed in to the function is valid.
+func Validate(dsrc tc.DeliveryServiceRequestCommentV5) error {
+ errs := validation.Errors{
+ "deliveryServiceRequestId":
validation.Validate(dsrc.DeliveryServiceRequestID, validation.NotNil),
+ "value": validation.Validate(dsrc.Value,
validation.NotNil),
+ }
+ return util.JoinErrs(tovalidate.ToErrors(errs))
+}
+
+// Update is used to modify an existing DeliveryServiceRequestCommentV5 in the
database.
+func Update(w http.ResponseWriter, r *http.Request) {
+ var deliveryServiceRequestComment tc.DeliveryServiceRequestCommentV5
+
+ inf, userErr, sysErr, errCode := api.NewInfo(r, []string{"id"}, nil)
+ if userErr != nil || sysErr != nil {
+ api.HandleErr(w, r, inf.Tx.Tx, errCode, userErr, sysErr)
+ return
+ }
+ defer inf.Close()
+
+ tx := inf.Tx.Tx
+ if err :=
json.NewDecoder(r.Body).Decode(&deliveryServiceRequestComment); err != nil {
+ api.HandleErr(w, r, tx, http.StatusBadRequest, err, nil)
+ return
+ }
+
+ if err := Validate(deliveryServiceRequestComment); err != nil {
+ api.HandleErr(w, r, tx, http.StatusBadRequest, err, nil)
+ return
+ }
+
+ var current TODeliveryServiceRequestComment
Review Comment:
**TODeliveryServiceRequestComment** struct uses
**DeliveryServiceRequestCommentNullable** struct which has depreciated
**TimeNoMod** in **LastUpdated** field.
##########
traffic_ops/traffic_ops_golang/deliveryservice/request/comment/comments.go:
##########
@@ -186,3 +199,257 @@ WHERE id=:id RETURNING last_updated`
func deleteQuery() string {
return `DELETE FROM deliveryservice_request_comment WHERE id = :id`
}
+
+// Get is used to read the DeliveryServiceRequestCommentV5 entities from the
database.
+func Get(w http.ResponseWriter, r *http.Request) {
+ var maxTime time.Time
+ var runSecond bool
+ inf, userErr, sysErr, errCode := api.NewInfo(r, nil, nil)
+ tx := inf.Tx.Tx
+ if userErr != nil || sysErr != nil {
+ api.HandleErr(w, r, tx, errCode, userErr, sysErr)
+ return
+ }
+ defer inf.Close()
+
+ api.DefaultSort(inf, "xmlId")
+ cols := map[string]dbhelpers.WhereColumnInfo{
+ "authorId": dbhelpers.WhereColumnInfo{Column:
"dsrc.author_id"},
+ "author": dbhelpers.WhereColumnInfo{Column:
"a.username"},
+ "deliveryServiceRequestId": dbhelpers.WhereColumnInfo{Column:
"dsrc.deliveryservice_request_id"},
+ "id": dbhelpers.WhereColumnInfo{Column:
"dsrc.id", Checker: api.IsInt},
+ }
+
+ where, orderBy, pagination, queryValues, errs :=
dbhelpers.BuildWhereAndOrderByAndPagination(inf.Params, cols)
+ if len(errs) > 0 {
+ errCode = http.StatusBadRequest
+ userErr = util.JoinErrs(errs)
+ api.HandleErr(w, r, tx, errCode, userErr, nil)
+ return
+ }
+
+ if inf.Config.UseIMS {
+ runSecond, maxTime = ims.TryIfModifiedSinceQuery(inf.Tx,
r.Header, queryValues, selectMaxLastUpdatedQuery(where, orderBy, pagination))
+ if !runSecond {
+ log.Debugln("IMS HIT")
+ api.AddLastModifiedHdr(w, maxTime)
+ w.WriteHeader(http.StatusNotModified)
+ return
+ }
+ log.Debugln("IMS MISS")
+ } else {
+ log.Debugln("Non IMS request")
+ }
+
+ deliveryServiceRequestComments := []tc.DeliveryServiceRequestCommentV5{}
+ query := selectQuery() + where + orderBy + pagination
+ rows, err := inf.Tx.NamedQuery(query, queryValues)
+ if err != nil {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError, nil,
errors.New("querying cdn locks: "+err.Error()))
+ return
+ }
+ defer rows.Close()
+
+ for rows.Next() {
+ var deliveryServiceRequestComment
tc.DeliveryServiceRequestCommentV5
+ if err = rows.Scan(&deliveryServiceRequestComment.Author,
&deliveryServiceRequestComment.AuthorID,
&deliveryServiceRequestComment.DeliveryServiceRequestID,
&deliveryServiceRequestComment.XMLID, &deliveryServiceRequestComment.ID,
&deliveryServiceRequestComment.LastUpdated,
&deliveryServiceRequestComment.Value); err != nil {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError,
nil, errors.New("scanning delivery service request comments: "+err.Error()))
+ return
+ }
+ deliveryServiceRequestComments =
append(deliveryServiceRequestComments, deliveryServiceRequestComment)
+ }
+ api.WriteResp(w, r, deliveryServiceRequestComments)
+}
+
+// Validate is used to ensure that the DeliveryServiceRequestCommentV5 struct
passed in to the function is valid.
+func Validate(dsrc tc.DeliveryServiceRequestCommentV5) error {
+ errs := validation.Errors{
+ "deliveryServiceRequestId":
validation.Validate(dsrc.DeliveryServiceRequestID, validation.NotNil),
+ "value": validation.Validate(dsrc.Value,
validation.NotNil),
+ }
+ return util.JoinErrs(tovalidate.ToErrors(errs))
+}
+
+// Update is used to modify an existing DeliveryServiceRequestCommentV5 in the
database.
+func Update(w http.ResponseWriter, r *http.Request) {
+ var deliveryServiceRequestComment tc.DeliveryServiceRequestCommentV5
+
+ inf, userErr, sysErr, errCode := api.NewInfo(r, []string{"id"}, nil)
+ if userErr != nil || sysErr != nil {
+ api.HandleErr(w, r, inf.Tx.Tx, errCode, userErr, sysErr)
+ return
+ }
+ defer inf.Close()
+
+ tx := inf.Tx.Tx
+ if err :=
json.NewDecoder(r.Body).Decode(&deliveryServiceRequestComment); err != nil {
+ api.HandleErr(w, r, tx, http.StatusBadRequest, err, nil)
+ return
+ }
+
+ if err := Validate(deliveryServiceRequestComment); err != nil {
+ api.HandleErr(w, r, tx, http.StatusBadRequest, err, nil)
+ return
+ }
+
+ var current TODeliveryServiceRequestComment
+ err := inf.Tx.QueryRowx(selectQuery() + `WHERE dsrc.id=` +
inf.Params["id"]).StructScan(¤t)
+ if err != nil {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError, nil,
errors.New("scanning deliveryservice_request_comment: "+err.Error()))
+ return
+ }
+
+ userID := tc.IDNoMod(inf.User.ID)
+ if *current.AuthorID != userID {
+ api.HandleErr(w, r, tx, http.StatusBadRequest,
errors.New("comments can only be updated by the author"), nil)
+ return
+ }
+ deliveryServiceRequestComment.AuthorID = *current.AuthorID
+ idParam := inf.Params["id"]
+ id, parseErr := strconv.Atoi(idParam)
+ if parseErr != nil {
+ api.HandleErr(w, r, inf.Tx.Tx, http.StatusBadRequest,
errors.New("id must be an integer"), nil)
+ return
+ }
+ deliveryServiceRequestComment.ID = id
+ userErr, sysErr, sc := api.CheckIfUnModified(r.Header, inf.Tx, id,
"deliveryservice_request_comment")
+ if userErr != nil || sysErr != nil {
+ api.HandleErr(w, r, tx, sc, userErr, sysErr)
+ return
+ }
+
+ rows, err := inf.Tx.NamedQuery(updateQuery(),
deliveryServiceRequestComment)
+ if err != nil {
+ userErr, sysErr, sc := api.ParseDBError(err)
+ api.HandleErr(w, r, tx, sc, userErr, sysErr)
+ return
+ }
+ defer rows.Close()
+
+ if !rows.Next() {
+ api.HandleErr(w, r, tx, http.StatusNotFound, errors.New("no
deliveryservice_request_comment found with this id"), nil)
+ return
+ }
+ lastUpdated := tc.TimeNoMod{}
+ if err := rows.Scan(&lastUpdated); err != nil {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError, nil,
errors.New("scanning lastUpdated from deliveryservice_request_comment insert:
"+err.Error()))
+ return
+ }
+ deliveryServiceRequestComment.LastUpdated = time.Now()
+
+ t := lastUpdated.Time
+ updatedTime, err := util.ConvertTimeFormat(t, time.RFC3339)
Review Comment:
Why we are using depreciated TimeNoMod and then converting it. Is it
possible directly scan it in rfc3339 format. ?
--
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: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]