diff --git a/app/assets/stylesheets/users.scss b/app/assets/stylesheets/users.scss new file mode 100644 index 00000000..1f8f00c4 --- /dev/null +++ b/app/assets/stylesheets/users.scss @@ -0,0 +1,7 @@ +.user { + .description { + p { + font-size: 14px; + } + } +} diff --git a/app/controllers/landing_controller.rb b/app/controllers/landing_controller.rb index 3d770fa2..3c5bacd5 100644 --- a/app/controllers/landing_controller.rb +++ b/app/controllers/landing_controller.rb @@ -19,7 +19,7 @@ class LandingController < ApplicationController @room_name = params[:name] @user = User.find_by(username: @room_name) @meeting_token = @room_name - @resource = params[:resource] + @resource = "rooms" @resource_url = room_url(@meeting_token) if @user.nil? redirect_to root_path diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 83820889..44266ed2 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -1,8 +1,14 @@ class SessionsController < ApplicationController def create @user = User.from_omniauth(request.env['omniauth.auth']) - session[:user_id] = @user.id - redirect_to controller: 'landing', action: 'room', name: @user.username + if @user.persisted? + session[:user_id] = @user.id + redirect_to controller: 'landing', action: 'room', name: @user.username + else + @user.save! + session[:user_id] = @user.id + redirect_to controller: 'users', action: 'edit', id: @user.id + end rescue => e logger.error "Error authenticating via omniauth: #{e}" redirect_to root_path diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb new file mode 100644 index 00000000..01a1214e --- /dev/null +++ b/app/controllers/users_controller.rb @@ -0,0 +1,31 @@ +class UsersController < ApplicationController + before_action :set_user, only: [:edit, :update] + + # GET /users/1/edit + def edit + end + + # PATCH/PUT /users/1 + # PATCH/PUT /users/1.json + def update + if @user.update(user_params) + redirect_to controller: 'landing', action: 'room', name: @user.username + else + render :edit + end + end + + private + # Use callbacks to share common setup or constraints between actions. + def set_user + @user = User.find(params[:id]) + if @user.username + raise ActionController::RoutingError.new('Not Found') + end + end + + # Never trust parameters from the scary internet, only allow the white list through. + def user_params + params.require(:user).permit(:username) + end +end diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb new file mode 100644 index 00000000..2310a240 --- /dev/null +++ b/app/helpers/users_helper.rb @@ -0,0 +1,2 @@ +module UsersHelper +end diff --git a/app/models/user.rb b/app/models/user.rb index 487fdcbc..c0d1a87b 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,10 +1,13 @@ class User < ApplicationRecord + validates :username, uniqueness: true + def self.from_omniauth(auth_hash) - user = find_or_create_by(uid: auth_hash['uid'], provider: auth_hash['provider']) - user.username = self.send("#{auth_hash['provider']}_username", auth_hash) rescue nil - user.name = auth_hash['info']['name'] - user.save! + user = find_or_initialize_by(uid: auth_hash['uid'], provider: auth_hash['provider']) + unless user.persisted? + # user.username = self.send("#{auth_hash['provider']}_username", auth_hash) rescue nil + user.name = auth_hash['info']['name'] + end user end diff --git a/app/views/users/_form.html.erb b/app/views/users/_form.html.erb new file mode 100644 index 00000000..e776c0ee --- /dev/null +++ b/app/views/users/_form.html.erb @@ -0,0 +1,15 @@ +
+
+

Enter Username below

+ + <%= form_for(user, html: {class: "form-inline"}) do |f| %> +
+ <%= f.text_field :username, placeholder: "Username", class: "form-control input" %> +
+ <%= f.submit class: "btn btn-success", value: "Save" %> + <% end %> +
+

This username will be used to identify your personal room

+
+
+
diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb new file mode 100644 index 00000000..60718c92 --- /dev/null +++ b/app/views/users/edit.html.erb @@ -0,0 +1,3 @@ +
+ <%= render 'form', user: @user %> +
diff --git a/config/routes.rb b/config/routes.rb index e051a894..793cd194 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,9 +1,11 @@ Rails.application.routes.draw do + resources :users, only: [:edit, :update] + get 'bbb/join/:resource/:id', to: 'bbb#join', as: :bbb_join get '/meetings/new', to: 'landing#new_meeting', as: :new_meeting get '/meetings(/:id)', to: 'landing#meeting', as: :meeting, :resource => "meetings" - get '/rooms/:name', to: 'landing#room', as: :room, :resource => "rooms" + get '/rooms/:name', to: 'landing#room', as: :room get '/auth/:provider/callback', to: 'sessions#create' get '/logout', to: 'sessions#destroy' diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb new file mode 100644 index 00000000..fa1218ea --- /dev/null +++ b/test/controllers/users_controller_test.rb @@ -0,0 +1,18 @@ +require 'test_helper' + +class UsersControllerTest < ActionDispatch::IntegrationTest + setup do + @user = users(:one) + end + + test "should get edit" do + get edit_user_url(@user) + assert_response :success + end + + test "should update user" do + patch user_url(@user), params: { user: { username: @user.username } } + assert_redirected_to user_url(@user) + end + +end