Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion app/controllers/admin/organizations_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ def create
Organization.seed_items(@organization)
UserInviteService.invite(name: user_params[:name],
email: user_params[:email],
phone_number: user_params[:phone_number],
roles: [Role::ORG_USER, Role::ORG_ADMIN],
resource: @organization)
SnapshotEvent.publish(@organization) # need one to start with
Expand Down Expand Up @@ -82,6 +83,6 @@ def reminder_schedule_params
end

def user_params
params.require(:organization).require(:user).permit(:name, :email)
params.require(:organization).require(:user).permit(:name, :email, :phone_number)
end
end
3 changes: 2 additions & 1 deletion app/controllers/admin/users_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ def create
UserInviteService.invite(
name: user_params[:name],
email: user_params[:email],
phone_number: user_params[:phone_number],
roles: [params[:resource_type].to_sym],
resource: resource
)
Expand Down Expand Up @@ -103,7 +104,7 @@ def remove_role
private

def user_params
params.require(:user).permit(:name, :email)
params.require(:user).permit(:name, :email, :phone_number)
end

def validate_role_resource_params
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/application_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,6 @@ def handle_csv_export
end

def configure_permitted_parameters
devise_parameter_sanitizer.permit(:account_update, keys: [:name])
devise_parameter_sanitizer.permit(:account_update, keys: [:name, :phone_number])
end
end
3 changes: 2 additions & 1 deletion app/controllers/partner_users_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ def create
@user = UserInviteService.invite(
email: user_params[:email],
name: user_params[:name],
phone_number: user_params[:phone_number],
roles: [Role::PARTNER],
resource: @partner
)
Expand Down Expand Up @@ -68,6 +69,6 @@ def set_partner
end

def user_params
params.require(:user).permit(:email, :name)
params.require(:user).permit(:email, :name, :phone_number)
end
end
3 changes: 2 additions & 1 deletion app/controllers/partners/users_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ def update
def create
user = UserInviteService.invite(name: user_params[:name],
email: user_params[:email],
phone_number: user_params[:phone_number],
roles: [Role::PARTNER],
resource: current_partner)

Expand All @@ -45,7 +46,7 @@ def create
private

def user_params
modified_params = params.require(:user).permit(:name, :email)
modified_params = params.require(:user).permit(:name, :email, :phone_number)
modified_params[:name] = nil if modified_params[:name].blank?
modified_params
end
Expand Down
1 change: 1 addition & 0 deletions app/models/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
# last_sign_in_ip :inet
# name :string
# organization_admin :boolean
# phone_number :string
# provider :string
# remember_created_at :datetime
# reset_password_sent_at :datetime
Expand Down
4 changes: 3 additions & 1 deletion app/services/user_invite_service.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
module UserInviteService
# @param name [String]
# @param phone_number [String]
# @param email [String]
# @param roles [Array<Symbol>]
# @param resource [ApplicationRecord]
# @param force [Boolean]
# @return [User]
def self.invite(email:, resource:, name: nil, roles: [], force: false)
def self.invite(email:, resource:, name: nil, phone_number: nil, roles: [], force: false)
# Because only one resource can be passed, currently the only case where
# multiple roles being based makes sense is ORG_USER and ORG_ADMIN.

Expand Down Expand Up @@ -40,6 +41,7 @@ def self.invite(email:, resource:, name: nil, roles: [], force: false)
User.invite!(email: email) do |user1|
name = nil if name.blank?
user1.name = name.presence || nil
user1.phone_number = phone_number.presence
add_roles(user1, resource: resource, roles: roles)
user1.skip_invitation = user1.errors[:email].any?
end
Expand Down
4 changes: 4 additions & 0 deletions app/views/admin/users/_user_form_fields.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,7 @@
<span class="input-group-text"><%= fa_icon "envelope" %></span>
<%= f.input_field :email, class: "form-control" %>
<% end %>
<%= f.input :phone_number, label: "Phone Number", wrapper: :input_group do %>
<span class="input-group-text"><%= fa_icon "phone" %></span>
<%= f.input_field :phone_number, class: "form-control" %>
<% end %>
3 changes: 3 additions & 0 deletions app/views/partner_users/_form.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@
<div class="form-group">
<%= f.input :email, label: "Email", placeholder: "Email", required: true %>
</div>
<div class="form-group">
<%= f.input :phone_number, label: "Phone Number", placeholder: "Phone Number" %>
</div>
</div>

<div class="card-footer">
Expand Down
5 changes: 4 additions & 1 deletion app/views/partner_users/_users.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<table class="table table-hover text-nowrap">
<thead>
<tr>
<th>Name & Email</th>
<th>Name, Email & Phone</th>
<th>Last Login</th>
<th>Invitation Status</th>
<th>Action</th>
Expand All @@ -20,6 +20,9 @@
<div class='d-flex flex-column'>
<span><%= user.name %></span>
<small><%= user.email %></small>
<% if user.phone_number.present? %>
<small><%= user.phone_number %></small>
<% end %>
</div>
</td>
<td>
Expand Down
4 changes: 4 additions & 0 deletions app/views/partners/users/edit.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@
<%= form.label :name, class: "col-md-3" %>
<%= form.text_field :name, class: "col-md-8 form-control" %>
</div>
<div class="form-group row">
<%= form.label :phone_number, class: "col-md-3" %>
<%= form.text_field :phone_number, class: "col-md-8 form-control" %>
</div>
<%= form.submit(class: 'btn btn-primary') %>
</div>
<% end %>
2 changes: 2 additions & 0 deletions app/views/partners/users/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,15 @@
<tr>
<th scope="col">Name</th>
<th scope="col">Email</th>
<th scope="col">Phone</th>
</tr>
</thead>
<tbody>
<% @users.each do |user| %>
<tr>
<td><%= user.display_name %></td>
<td><%= user.email %></td>
<td><%= user.phone_number %></td>
</tr>
<% end %>
</tbody>
Expand Down
7 changes: 7 additions & 0 deletions app/views/partners/users/new.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,13 @@
</div>
</div>

<div class="form-horizontal">
<div class="form-group row">
<%= form.label :phone_number, class: "control-label col-md-3" %>
<%= form.text_field :phone_number, class: "col-md-8 form-control" %>
</div>
</div>

<div class="actions">
<%= form.submit(class: 'btn btn-primary') %>
</div>
Expand Down
4 changes: 4 additions & 0 deletions app/views/users/registrations/edit.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@
<span class="input-group-text"><i class="fa fa-envelope"></i></span>
<%= f.input_field :email, class: "form-control" %>
<% end %>
<%= f.input :phone_number, label: "Phone Number:", wrapper: :input_group do %>
<span class="input-group-text"><i class="fa fa-phone"></i></span>
<%= f.input_field :phone_number, class: "form-control" %>
<% end %>
<%= f.input :current_password, label: "Current Password:", wrapper: :input_group do %>
<span class="input-group-text"><i class="fa fa-lock"></i></span>
<%= f.input_field :current_password, class: "form-control" %>
Expand Down
5 changes: 5 additions & 0 deletions db/migrate/20260920230000_add_phone_number_to_users.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class AddPhoneNumberToUsers < ActiveRecord::Migration[8.1]
def change
add_column :users, :phone_number, :string
end
end
3 changes: 2 additions & 1 deletion db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema[8.1].define(version: 2026_08_29_112930) do
ActiveRecord::Schema[8.1].define(version: 2026_09_20_230000) do
# These are extensions that must be enabled in order to support this database
enable_extension "pg_catalog.plpgsql"

Expand Down Expand Up @@ -803,6 +803,7 @@
t.boolean "organization_admin"
t.integer "organization_id"
t.bigint "partner_id"
t.string "phone_number"
t.string "provider"
t.datetime "remember_created_at", precision: nil
t.datetime "reset_password_sent_at", precision: nil
Expand Down
1 change: 1 addition & 0 deletions spec/factories/users.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
# last_sign_in_ip :inet
# name :string
# organization_admin :boolean
# phone_number :string
# provider :string
# remember_created_at :datetime
# reset_password_sent_at :datetime
Expand Down
1 change: 1 addition & 0 deletions spec/models/user_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
# last_sign_in_ip :inet
# name :string
# organization_admin :boolean
# phone_number :string
# provider :string
# remember_created_at :datetime
# reset_password_sent_at :datetime
Expand Down
3 changes: 2 additions & 1 deletion spec/requests/admin/organizations_requests_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@
end

describe "POST #create" do
let(:valid_organization_params) { attributes_for(:organization, user: { name: 'admin', email: 'admin@example.com'}).except(:logo) }
let(:valid_organization_params) { attributes_for(:organization, user: { name: 'admin', email: 'admin@example.com', phone_number: '555-123-4567' }).except(:logo) }

context "with valid params" do
it "creates an organization and redirects to #index" do
Expand All @@ -68,6 +68,7 @@
}.to change(Organization, :count).by(1)
.and change(SnapshotEvent, :count).by(1)
expect(response).to redirect_to(admin_organizations_path)
expect(User.find_by(email: 'admin@example.com').phone_number).to eq('555-123-4567')
end
end

Expand Down
6 changes: 4 additions & 2 deletions spec/requests/admin/users_requests_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,10 @@
describe "PATCH #update" do
context 'with no errors' do
it "renders index template with a successful update flash message" do
patch admin_user_path(user), params: { user: { name: 'New User 123', email: 'random@gmail.com' } }
patch admin_user_path(user), params: { user: { name: 'New User 123', email: 'random@gmail.com', phone_number: '555-123-4567' } }
expect(response).to redirect_to admin_users_path
expect(flash[:notice]).to eq("New User 123 updated!")
expect(user.reload.phone_number).to eq('555-123-4567')
end
end

Expand Down Expand Up @@ -144,13 +145,14 @@
describe "POST #create" do
it "creates an org user" do
post admin_users_path, params: {
user: { name: "New Org User", email: organization.email },
user: { name: "New Org User", email: organization.email, phone_number: "555-123-4567" },
resource_type: Role::ORG_USER,
resource_id: organization.id
}
expect(response).to redirect_to(admin_users_path)
new_user = User.find_by(name: "New Org User")
expect(new_user).not_to eq(nil)
expect(new_user.phone_number).to eq("555-123-4567")
expect(new_user.has_role?(Role::ORG_USER, organization)).to be_truthy
expect(new_user.has_role?(Role::ORG_ADMIN, organization)).to be_falsey
end
Expand Down
12 changes: 11 additions & 1 deletion spec/requests/partner_users_requests_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,14 @@
sign_in(org_admin)
end

it "shows each user's phone number" do
create(:partner_user, partner: partner, phone_number: "555-987-6543")

get partner_users_path(default_params.merge(partner_id: partner))

expect(response.body).to include("555-987-6543")
end

it "renders the index template and assigns @users" do
get partner_users_path(default_params.merge(partner_id: partner))
expect(response).to render_template(:index)
Expand All @@ -40,7 +48,8 @@
let(:valid_user_params) do
{
email: "meow@example.com",
name: "Meow Mix"
name: "Meow Mix",
phone_number: "555-123-4567"
}
end

Expand All @@ -57,6 +66,7 @@

expect(response).to redirect_to(root_path)
expect(flash[:notice]).to include("has been invited. Invitation email sent to")
expect(User.find_by(email: "meow@example.com").phone_number).to eq("555-123-4567")
end
end

Expand Down
7 changes: 5 additions & 2 deletions spec/requests/partners/user_requests_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,21 @@
patch partners_user_path(
id: partner_user.id,
user: {
name: "New name"
name: "New name",
phone_number: "555-123-4567"
}
)
expect(response).to be_redirect
expect(response.request.flash[:success]).to eq "User information was successfully updated!"
partner_user.reload
expect(partner_user.name).to eq "New name"
expect(partner_user.phone_number).to eq "555-123-4567"
end
end

describe "POST #create" do
let(:params) do
{user: {name: "New User", email: "new_partner_email@example.com"}}
{user: {name: "New User", email: "new_partner_email@example.com", phone_number: "555-123-4567"}}
end

it "creates a new user" do
Expand All @@ -39,6 +41,7 @@
aggregate_failures do
expect(response.request.flash[:success]).to eq "You have invited New User to join your organization!"
expect(response).to redirect_to(partners_users_path)
expect(User.find_by(email: "new_partner_email@example.com").phone_number).to eq "555-123-4567"
end
end

Expand Down
17 changes: 17 additions & 0 deletions spec/requests/users/registrations_requests_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
RSpec.describe "Users::Registrations", type: :request do
let(:organization) { create(:organization) }
let(:user) { create(:user, organization: organization) }

describe "PATCH #update" do
before do
sign_in(user)
end

it "updates the user's phone number" do
patch user_registration_path, params: {user: {phone_number: "555-123-4567", current_password: "password!"}}

expect(response).to redirect_to(root_path)
expect(user.reload.phone_number).to eq("555-123-4567")
end
end
end
Loading