From e028db64475faea7dca677819de704fab974c2fd Mon Sep 17 00:00:00 2001 From: Petr Date: Sun, 12 Jul 2026 10:57:14 +0200 Subject: [PATCH] feat(users): add display name field for users --- lib/volumen/admin_routes.rb | 6 ++++++ lib/volumen/server.rb | 11 +++++++++++ lib/volumen/users.rb | 20 +++++++++++++++----- lib/volumen/web/views/form.erb | 2 +- lib/volumen/web/views/layout.erb | 4 ++-- lib/volumen/web/views/settings.erb | 13 +++++++++++++ 6 files changed, 48 insertions(+), 8 deletions(-) diff --git a/lib/volumen/admin_routes.rb b/lib/volumen/admin_routes.rb index d7925af..cec9b05 100644 --- a/lib/volumen/admin_routes.rb +++ b/lib/volumen/admin_routes.rb @@ -127,6 +127,12 @@ module Volumen change_username end + app.post "/admin/settings/name" do + require_login! + check_csrf! + change_name + end + app.post "/admin/settings/users" do require_login! require_admin! diff --git a/lib/volumen/server.rb b/lib/volumen/server.rb index fb6f01b..8f9ff8a 100644 --- a/lib/volumen/server.rb +++ b/lib/volumen/server.rb @@ -201,6 +201,10 @@ module Volumen current_user_record&.role end + def current_user_name + current_user_record&.name + end + def admin? current_role == "admin" end @@ -293,6 +297,13 @@ module Volumen end end + def change_name + name = params["name"].to_s.strip + name = nil if name.empty? + users.update_name(current_user, name) + render_settings(notice: name ? "Display name updated." : "Display name cleared.") + end + def create_user name = presence(params["username"]) password = presence(params["password"]) diff --git a/lib/volumen/users.rb b/lib/volumen/users.rb index d7045a9..3964bf2 100644 --- a/lib/volumen/users.rb +++ b/lib/volumen/users.rb @@ -15,7 +15,7 @@ module Volumen ROLES = %w[admin author].freeze DEFAULT_ROLE = "author" - User = Struct.new(:username, :password_hash, :role) + User = Struct.new(:username, :password_hash, :role, :name) def initialize(path:, bootstrap_hash: nil) @path = path @@ -33,7 +33,7 @@ module Volumen elsif @bootstrap_hash.empty? [] else - [User.new("admin", @bootstrap_hash, "admin")] + [User.new("admin", @bootstrap_hash, "admin", nil)] end end end @@ -54,11 +54,15 @@ module Volumen def add(username, password, role = DEFAULT_ROLE) return nil if username.to_s.empty? || find(username) - user = User.new(username, Password.hash(password), normalize_role(role)) + user = User.new(username, Password.hash(password), normalize_role(role), nil) persist(all + [user]) user end + def update_name(username, name) + mutate(username) { |user| user.name = name.to_s.empty? ? nil : name.to_s } + end + def update_password(username, password) mutate(username) { |user| user.password_hash = Password.hash(password) } end @@ -121,7 +125,7 @@ module Volumen def read_file data = TomlRB.load_file(@path) Array(data["users"]).map do |entry| - User.new(entry["username"], entry["password_hash"], entry["role"] || "admin") + User.new(entry["username"], entry["password_hash"], entry["role"] || "admin", entry["name"]) end end @@ -133,7 +137,13 @@ module Volumen end def user_hash(user) - { "username" => user.username, "password_hash" => user.password_hash, "role" => user.role } + hash = { + "username" => user.username, + "password_hash" => user.password_hash, + "role" => user.role + } + hash["name"] = user.name if user.name + hash end end end diff --git a/lib/volumen/web/views/form.erb b/lib/volumen/web/views/form.erb index 8183443..eb49ec9 100644 --- a/lib/volumen/web/views/form.erb +++ b/lib/volumen/web/views/form.erb @@ -62,7 +62,7 @@
- +
diff --git a/lib/volumen/web/views/layout.erb b/lib/volumen/web/views/layout.erb index 3b619f3..eb117f7 100644 --- a/lib/volumen/web/views/layout.erb +++ b/lib/volumen/web/views/layout.erb @@ -515,9 +515,9 @@