From 3bfb6fe2b713efd618654eb0558b8fa8112ee8ab Mon Sep 17 00:00:00 2001
From: Matthew Dillon <mrdillon@alaska.edu>
Date: Tue, 13 Oct 2015 09:13:35 -0700
Subject: [PATCH] Refactor DbGetUserByID

Fixes #15
---
 api/users.go         |  8 +++-----
 handlers/handlers.go |  2 +-
 models/users.go      | 11 +++++++----
 3 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/api/users.go b/api/users.go
index 93ba51d..199cc38 100644
--- a/api/users.go
+++ b/api/users.go
@@ -60,14 +60,12 @@ func (u UserService) List(val *url.Values, claims *types.Claims) (types.Entity,
 
 // Get retrieves a single user.
 func (u UserService) Get(id int64, dummy string, claims *types.Claims) (types.Entity, *types.AppError) {
-	user, err := models.DbGetUserByID(id)
+	user, err := models.GetUser(id, dummy, claims)
 	user.Password = ""
 	if err != nil {
 		return nil, newJSONError(err, http.StatusInternalServerError)
 	}
 
-	user.CanEdit = claims.Role == "A" || id == claims.Sub
-
 	payload := payloads.User{
 		User: user,
 		Meta: &models.UserMeta{
@@ -81,7 +79,7 @@ func (u UserService) Get(id int64, dummy string, claims *types.Claims) (types.En
 func (u UserService) Update(id int64, e *types.Entity, dummy string, claims *types.Claims) *types.AppError {
 	user := (*e).(*payloads.User).User
 
-	originalUser, err := models.DbGetUserByID(id)
+	originalUser, err := models.GetUser(id, dummy, claims)
 	if err != nil {
 		return newJSONError(err, http.StatusInternalServerError)
 	}
@@ -263,7 +261,7 @@ func HandleUserLockout(w http.ResponseWriter, r *http.Request) *types.AppError {
 func HandleUserPasswordChange(w http.ResponseWriter, r *http.Request) *types.AppError {
 	claims := helpers.GetClaims(r)
 
-	if err := models.UpdateUserPassword(claims.Sub, r.FormValue("password")); err != nil {
+	if err := models.UpdateUserPassword(&claims, r.FormValue("password")); err != nil {
 		return newJSONError(err, http.StatusInternalServerError)
 	}
 
diff --git a/handlers/handlers.go b/handlers/handlers.go
index 2c57caa..50b1733 100644
--- a/handlers/handlers.go
+++ b/handlers/handlers.go
@@ -299,7 +299,7 @@ func (fn errorHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 func tokenRefresh(j *jwt.Middleware) errorHandler {
 	t := func(w http.ResponseWriter, r *http.Request) *types.AppError {
 		claims := helpers.GetClaims(r)
-		user, err := models.DbGetUserByID(claims.Sub)
+		user, err := models.GetUser(claims.Sub, "", &claims)
 		if err != nil {
 			return newJSONError(err, http.StatusInternalServerError)
 		}
diff --git a/models/users.go b/models/users.go
index b9f8fc2..9b04f96 100644
--- a/models/users.go
+++ b/models/users.go
@@ -112,8 +112,8 @@ func DbAuthenticate(email string, password string) error {
 	return nil
 }
 
-// DbGetUserByID returns a specific user record by ID.
-func DbGetUserByID(id int64) (*User, error) {
+// GetUser returns a specific user record by ID.
+func GetUser(id int64, dummy string, claims *types.Claims) (*User, error) {
 	var user User
 	q := `SELECT *
 		FROM users
@@ -126,6 +126,9 @@ func DbGetUserByID(id int64) (*User, error) {
 		}
 		return nil, err
 	}
+
+	user.CanEdit = claims.Role == "A" || id == claims.Sub
+
 	return &user, nil
 }
 
@@ -167,8 +170,8 @@ func ListUsers(opt helpers.ListOptions, claims *types.Claims) (*Users, error) {
 	return &users, nil
 }
 
-func UpdateUserPassword(id int64, password string) error {
-	user, err := DbGetUserByID(id)
+func UpdateUserPassword(claims *types.Claims, password string) error {
+	user, err := GetUser(claims.Sub, "", claims)
 	if err != nil {
 		return err
 	}