aboutsummaryrefslogtreecommitdiffhomepage
path: root/storage
diff options
context:
space:
mode:
authorGravatar Frédéric Guillot <fred@miniflux.net>2017-12-29 13:53:02 -0800
committerGravatar Frédéric Guillot <fred@miniflux.net>2017-12-29 13:53:02 -0800
commit0f053b07a55c6dad2ec4b6da75995ccfa26bcb4e (patch)
tree408e2246675c7cc437a328879d23b4097d79980e /storage
parent7c19febd7362a2e78146fb7c40baa54901703190 (diff)
Improve user API responses
Diffstat (limited to 'storage')
-rw-r--r--storage/user.go93
1 files changed, 37 insertions, 56 deletions
diff --git a/storage/user.go b/storage/user.go
index 427b391..912ee04 100644
--- a/storage/user.go
+++ b/storage/user.go
@@ -177,78 +177,40 @@ func (s *Storage) UpdateUser(user *model.User) error {
func (s *Storage) UserByID(userID int64) (*model.User, error) {
defer helper.ExecutionTime(time.Now(), fmt.Sprintf("[Storage:UserByID] userID=%d", userID))
query := `SELECT
- id, username, is_admin, theme, language, timezone, entry_direction, extra
+ id, username, is_admin, theme, language, timezone, entry_direction, last_login_at, extra
FROM users
WHERE id = $1`
- var user model.User
- var extra hstore.Hstore
- row := s.db.QueryRow(query, userID)
- err := row.Scan(
- &user.ID,
- &user.Username,
- &user.IsAdmin,
- &user.Theme,
- &user.Language,
- &user.Timezone,
- &user.EntryDirection,
- &extra,
- )
- if err == sql.ErrNoRows {
- return nil, nil
- } else if err != nil {
- return nil, fmt.Errorf("unable to fetch user: %v", err)
- }
-
- user.Extra = make(map[string]string)
- for key, value := range extra.Map {
- if value.Valid {
- user.Extra[key] = value.String
- }
- }
-
- return &user, nil
+ return s.fetchUser(query, userID)
}
// UserByUsername finds a user by the username.
func (s *Storage) UserByUsername(username string) (*model.User, error) {
defer helper.ExecutionTime(time.Now(), fmt.Sprintf("[Storage:UserByUsername] username=%s", username))
query := `SELECT
- id, username, is_admin, theme, language, timezone, entry_direction
+ id, username, is_admin, theme, language, timezone, entry_direction, last_login_at, extra
FROM users
WHERE username=LOWER($1)`
- var user model.User
- row := s.db.QueryRow(query, username)
- err := row.Scan(
- &user.ID,
- &user.Username,
- &user.IsAdmin,
- &user.Theme,
- &user.Language,
- &user.Timezone,
- &user.EntryDirection,
- )
- if err == sql.ErrNoRows {
- return nil, nil
- } else if err != nil {
- return nil, fmt.Errorf("unable to fetch user: %v", err)
- }
-
- return &user, nil
+ return s.fetchUser(query, username)
}
// UserByExtraField finds a user by an extra field value.
func (s *Storage) UserByExtraField(field, value string) (*model.User, error) {
defer helper.ExecutionTime(time.Now(), fmt.Sprintf("[Storage:UserByExtraField] field=%s", field))
query := `SELECT
- id, username, is_admin, theme, language, timezone, entry_direction
+ id, username, is_admin, theme, language, timezone, entry_direction, last_login_at, extra
FROM users
WHERE extra->$1=$2`
- var user model.User
- row := s.db.QueryRow(query, field, value)
- err := row.Scan(
+ return s.fetchUser(query, field, value)
+}
+
+func (s *Storage) fetchUser(query string, args ...interface{}) (*model.User, error) {
+ var extra hstore.Hstore
+
+ user := model.NewUser()
+ err := s.db.QueryRow(query, args...).Scan(
&user.ID,
&user.Username,
&user.IsAdmin,
@@ -256,14 +218,23 @@ func (s *Storage) UserByExtraField(field, value string) (*model.User, error) {
&user.Language,
&user.Timezone,
&user.EntryDirection,
+ &user.LastLoginAt,
+ &extra,
)
+
if err == sql.ErrNoRows {
return nil, nil
} else if err != nil {
return nil, fmt.Errorf("unable to fetch user: %v", err)
}
- return &user, nil
+ for key, value := range extra.Map {
+ if value.Valid {
+ user.Extra[key] = value.String
+ }
+ }
+
+ return user, nil
}
// RemoveUser deletes a user.
@@ -290,8 +261,9 @@ func (s *Storage) RemoveUser(userID int64) error {
// Users returns all users.
func (s *Storage) Users() (model.Users, error) {
defer helper.ExecutionTime(time.Now(), "[Storage:Users]")
- query := `SELECT
- id, username, is_admin, theme, language, timezone, last_login_at
+ query := `
+ SELECT
+ id, username, is_admin, theme, language, timezone, entry_direction, last_login_at, extra
FROM users
ORDER BY username ASC`
@@ -303,7 +275,8 @@ func (s *Storage) Users() (model.Users, error) {
var users model.Users
for rows.Next() {
- var user model.User
+ var extra hstore.Hstore
+ user := model.NewUser()
err := rows.Scan(
&user.ID,
&user.Username,
@@ -311,14 +284,22 @@ func (s *Storage) Users() (model.Users, error) {
&user.Theme,
&user.Language,
&user.Timezone,
+ &user.EntryDirection,
&user.LastLoginAt,
+ &extra,
)
if err != nil {
return nil, fmt.Errorf("unable to fetch users row: %v", err)
}
- users = append(users, &user)
+ for key, value := range extra.Map {
+ if value.Valid {
+ user.Extra[key] = value.String
+ }
+ }
+
+ users = append(users, user)
}
return users, nil