You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by oc...@apache.org on 2023/03/15 18:42:41 UTC

[trafficcontrol] branch master updated: add missing lastUpdated prop to PUT /roles (#7402)

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 e82248015f add missing lastUpdated prop to PUT /roles (#7402)
e82248015f is described below

commit e82248015f35d383e921f084563c6dfd30fdf7b8
Author: Kunal Kundu <ku...@gmail.com>
AuthorDate: Thu Mar 16 00:12:34 2023 +0530

    add missing lastUpdated prop to PUT /roles (#7402)
    
    * add missing lastUpdated prop to PUT /roles
    
    * update docs for /roles endpoints with lastUpdated
    
    * use errors.Is for comparing errors
---
 docs/source/api/v4/roles.rst                 |  9 +++++++--
 docs/source/api/v5/roles.rst                 |  9 +++++++--
 traffic_ops/traffic_ops_golang/role/roles.go | 23 ++++++++---------------
 3 files changed, 22 insertions(+), 19 deletions(-)

diff --git a/docs/source/api/v4/roles.rst b/docs/source/api/v4/roles.rst
index a0219bbd9c..137824acbe 100644
--- a/docs/source/api/v4/roles.rst
+++ b/docs/source/api/v4/roles.rst
@@ -67,6 +67,7 @@ Response Structure
 :permissions:  An array of the names of the Permissions given to this :term:`Role`
 :description:  A description of the :term:`Role`
 :name:         The name of the :term:`Role`
+:lastUpdated: The date and time at which this :term:`Role` was last updated, in :rfc:`3339` format
 
 .. code-block:: http
 	:caption: Response Example
@@ -171,6 +172,7 @@ Response Structure
 
 :description: A description of the :term:`Role`
 :name:        The name of the :term:`Role`
+:lastUpdated: The date and time at which this :term:`Role` was last updated, in :rfc:`3339` format
 
 .. code-block:: http
 	:caption: Response Example
@@ -194,7 +196,8 @@ Response Structure
 	"response": {
 		"name": "test",
 		"description": "quest",
-		"permissions": null
+		"permissions": null,
+		"lastUpdated": "2021-05-03T14:50:18.93513-06:00"
 	}}
 
 ``PUT``
@@ -249,6 +252,7 @@ Response Structure
 
 :description: A description of the :term:`Role`
 :name:        The name of the :term:`Role`
+:lastUpdated: The date and time at which this :term:`Role` was last updated, in :rfc:`3339` format
 
 .. code-block:: http
 	:caption: Response Example
@@ -275,7 +279,8 @@ Response Structure
 		"response": {
 			"name": "test",
 			"description": "quest_updated",
-			"permissions": null
+			"permissions": null,
+			"lastUpdated": "2021-05-03T14:50:18.93513-06:00"
 		}
 	}
 
diff --git a/docs/source/api/v5/roles.rst b/docs/source/api/v5/roles.rst
index 48c208ed0b..ef915b4058 100644
--- a/docs/source/api/v5/roles.rst
+++ b/docs/source/api/v5/roles.rst
@@ -67,6 +67,7 @@ Response Structure
 :permissions:  An array of the names of the Permissions given to this :term:`Role`
 :description:  A description of the :term:`Role`
 :name:         The name of the :term:`Role`
+:lastUpdated: The date and time at which this :term:`Role` was last updated, in :rfc:`3339` format
 
 .. code-block:: http
 	:caption: Response Example
@@ -171,6 +172,7 @@ Response Structure
 
 :description: A description of the :term:`Role`
 :name:        The name of the :term:`Role`
+:lastUpdated: The date and time at which this :term:`Role` was last updated, in :rfc:`3339` format
 
 .. code-block:: http
 	:caption: Response Example
@@ -194,7 +196,8 @@ Response Structure
 	"response": {
 		"name": "test",
 		"description": "quest",
-		"permissions": null
+		"permissions": null,
+		"lastUpdated": "2021-05-03T14:50:18.93513-06:00"
 	}}
 
 ``PUT``
@@ -222,6 +225,7 @@ Request Structure
 
 :description: A helpful description of the :term:`Role`'s purpose.
 :name:        The new name of the :term:`Role`
+:lastUpdated: The date and time at which this :term:`Role` was last updated, in :rfc:`3339` format
 
 .. code-block:: http
 	:caption: Request Example
@@ -275,7 +279,8 @@ Response Structure
 		"response": {
 			"name": "test",
 			"description": "quest_updated",
-			"permissions": null
+			"permissions": null,
+			"lastUpdated": "2021-05-03T14:50:18.93513-06:00"
 		}
 	}
 
diff --git a/traffic_ops/traffic_ops_golang/role/roles.go b/traffic_ops/traffic_ops_golang/role/roles.go
index e39317e7dc..e71accc4b7 100644
--- a/traffic_ops/traffic_ops_golang/role/roles.go
+++ b/traffic_ops/traffic_ops_golang/role/roles.go
@@ -20,6 +20,7 @@ package role
  */
 
 import (
+	"database/sql"
 	"encoding/json"
 	"errors"
 	"fmt"
@@ -394,24 +395,15 @@ func Update(w http.ResponseWriter, r *http.Request) {
 		api.HandleErr(w, r, tx, http.StatusPreconditionFailed, api.ResourceModifiedError, nil)
 		return
 	}
-	rows, err := tx.Query(updateRoleQuery(), roleV4.Name, roleV4.Description, currentRoleName)
+	err = tx.QueryRow(updateRoleQuery(), roleV4.Name, roleV4.Description, currentRoleName).Scan(&roleV4.LastUpdated)
 	if err != nil {
-		usrErr, sysErr, code := api.ParseDBError(err)
-		api.HandleErr(w, r, tx, code, usrErr, fmt.Errorf("updating role: %w", sysErr))
-		return
-	}
-	defer rows.Close()
-	if !rows.Next() {
-		api.HandleErr(w, r, tx, http.StatusNotFound, errors.New("no such role"), nil)
-		return
-	}
-	var lastUpdated time.Time
-	for rows.Next() {
-		if err := rows.Scan(&lastUpdated); err != nil {
-			api.HandleErr(w, r, tx, http.StatusInternalServerError, nil, fmt.Errorf("scanning lastUpdated from role update: %w", err))
+		if errors.Is(err, sql.ErrNoRows) {
+			api.HandleErr(w, r, tx, http.StatusNotFound, errors.New("no such role"), nil)
 			return
 		}
-		roleV4.LastUpdated = &lastUpdated
+		usrErr, sysErr, code := api.ParseDBError(err)
+		api.HandleErr(w, r, tx, code, usrErr, fmt.Errorf("updating role and scanning lastUpdated : %w", sysErr))
+		return
 	}
 
 	userErr, sysErr, errCode = deleteRoleCapabilityAssociations(inf.Tx, roleV4.Name)
@@ -430,6 +422,7 @@ func Update(w http.ResponseWriter, r *http.Request) {
 		Name:        roleV4.Name,
 		Permissions: roleV4.Permissions,
 		Description: roleV4.Description,
+		LastUpdated: roleV4.LastUpdated,
 	}
 	api.WriteAlertsObj(w, r, http.StatusOK, alerts, roleResponse)
 	changeLogMsg := fmt.Sprintf("ROLE: %s, ID: %d, ACTION: Updated Role", roleV4.Name, roleID)