diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 1828b78..f5c93a4 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -23,6 +23,8 @@ def create omniauth_uid: auth['uid'] ).first || User.create_with_omniauth(auth) + user.update!(email: auth['info']['email']) + session[:user_id] = user.id return redirect_to params[:return_to] if params[:return_to].present? end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 497ff67..ee94012 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,5 +1,7 @@ # -*- encoding : utf-8 -*- require 'kramdown' +require 'digest/md5' +require 'uri' module ApplicationHelper @@ -51,4 +53,25 @@ def markdown(md_body) md_body end end + + def gravatar_image(user, options = {}) + return nil if user.nil? || user.email.nil? + + hash = Digest::MD5.hexdigest(user.email.downcase) + query = options.select { |k, v| [:size, :default].include?(k) } + .map { |k, v| "#{k}=#{URI.encode(v.to_s)}" } + .join('&') + src = "//www.gravatar.com/avatar/#{hash}?#{query}" + + img_options = { :alt => user.nickname } + if mouseover = options[:mouseover] + img_options = mouseover + end + if size = options[:size] + img_options[:width] = size + img_options[:height] = size + end + + image_tag(src, img_options) + end end diff --git a/app/models/user.rb b/app/models/user.rb index b56b58e..11cfbe6 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -11,6 +11,7 @@ def self.create_with_omniauth(auth) create! do |user| user.omniauth_provider = auth['provider'] user.omniauth_uid = auth['uid'] + user.email = auth['info']['email'] user.nickname = nil end end diff --git a/app/views/gists/_fork_of.html.erb b/app/views/gists/_fork_of.html.erb index db2fb5c..4f33455 100644 --- a/app/views/gists/_fork_of.html.erb +++ b/app/views/gists/_fork_of.html.erb @@ -10,7 +10,9 @@ <%= time_ago_in_words(@gist.source_gist.created_at) + ' ago' %> by <% if @gist.source_gist.user.nil? %>Anonymous - <% else %><%= link_to @gist.source_gist.user.nickname, user_path(@gist.source_gist.user) %> + <% else %> + <%= link_to @gist.source_gist.user.nickname, user_path(@gist.source_gist.user) %> + <%= gravatar_image(@gist.source_gist.user, :size => 15) %> <% end %> diff --git a/app/views/gists/_forks.html.erb b/app/views/gists/_forks.html.erb index 213dac4..bbc786e 100644 --- a/app/views/gists/_forks.html.erb +++ b/app/views/gists/_forks.html.erb @@ -11,7 +11,9 @@ <%= time_ago_in_words(gist.created_at) + ' ago' %> by <% if gist.user.nil? %>Anonymous - <% else %><%= link_to gist.user.nickname, user_path(gist.user) %> + <% else %> + <%= link_to gist.user.nickname, user_path(gist.user) %> + <%= gravatar_image(gist.user, :size => 15) %> <% end %> diff --git a/app/views/gists/_history.html.erb b/app/views/gists/_history.html.erb index 4d4750b..64ca022 100644 --- a/app/views/gists/_history.html.erb +++ b/app/views/gists/_history.html.erb @@ -8,13 +8,17 @@ <%= time_ago_in_words(history.created_at) + ' ago' %> by <% if history.user.nil? %>Anonymous - <% else %><%= link_to history.user.nickname, user_path(history.user) %> + <% else %> + <%= link_to history.user.nickname, user_path(history.user) %> + <%= gravatar_image(history.user, :size => 15) %> <% end %> <% else %> <%= link_to time_ago_in_words(history.created_at) + ' ago', show_history_gist_path(@gist, history) %> by <% if history.user.nil? %>Anonymous - <% else %><%= link_to history.user.nickname, user_path(history.user) %> + <% else %> + <%= link_to history.user.nickname, user_path(history.user) %> + <%= gravatar_image(history.user, :size => 15) %> <% end %> <% end %> diff --git a/app/views/gists/_list.html.erb b/app/views/gists/_list.html.erb index 5a630e9..b758859 100644 --- a/app/views/gists/_list.html.erb +++ b/app/views/gists/_list.html.erb @@ -20,6 +20,7 @@ Anonymous <% else %> <%= link_to gist.user.nickname, user_path(gist.user) %> + <%= gravatar_image(gist.user, :size => 20) %> <% end %> diff --git a/app/views/root/index.html.erb b/app/views/root/index.html.erb index 2f04b05..4fbc595 100644 --- a/app/views/root/index.html.erb +++ b/app/views/root/index.html.erb @@ -22,7 +22,9 @@ <%= time_ago_in_words(gist.latest_history.created_at) + ' ago' %> by <% if gist.user.nil? %>Anonymous - <% else %><%= link_to gist.user.nickname, user_path(gist.user) %> + <% else %> + <%= link_to gist.user.nickname, user_path(gist.user) %> + <%= gravatar_image(gist.user, :size => 20) %> <% end %> diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index a66ecac..d3bf513 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -2,7 +2,10 @@ <%= render :partial => 'common/flash_notice' %> -

<%= @user.nickname %>

+

+ <%= gravatar_image(@user, :size => 30) %> + <%= @user.nickname %> +


@@ -12,6 +15,9 @@ + + +
<%= @user.omniauth_uid %>
<%= @user.email %>
<% if @user.id == current_user.try(:id) %> diff --git a/db/migrate/20140110041301_add_email_to_users.rb b/db/migrate/20140110041301_add_email_to_users.rb new file mode 100644 index 0000000..1370f7d --- /dev/null +++ b/db/migrate/20140110041301_add_email_to_users.rb @@ -0,0 +1,5 @@ +class AddEmailToUsers < ActiveRecord::Migration + def change + add_column :users, :email, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 2c01257..8cd1add 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,36 +11,36 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20121015023421) do +ActiveRecord::Schema.define(version: 20140110041301) do create_table "comments", force: true do |t| t.integer "gist_id", null: false t.integer "user_id", null: false t.text "body", null: false - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end create_table "favorites", force: true do |t| t.integer "user_id", null: false t.integer "gist_id", null: false - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end create_table "gist_files", force: true do |t| t.string "name", null: false t.text "body", null: false t.integer "gist_history_id", null: false - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end create_table "gist_histories", force: true do |t| t.integer "gist_id", null: false t.integer "user_id" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end create_table "gists", force: true do |t| @@ -48,16 +48,17 @@ t.boolean "is_public", null: false t.integer "user_id" t.integer "source_gist_id" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end create_table "users", force: true do |t| t.string "nickname" t.string "omniauth_provider", null: false t.string "omniauth_uid", null: false - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "email" end end diff --git a/spec/controllers/sessions_controller_spec.rb b/spec/controllers/sessions_controller_spec.rb index e99a341..51faf9b 100644 --- a/spec/controllers/sessions_controller_spec.rb +++ b/spec/controllers/sessions_controller_spec.rb @@ -25,18 +25,35 @@ def valid_session describe "GET /auth/:provider/callback" do it "accepts requests without header" do - get :create, {:provider => 'open_id'}, valid_session + get :create, {:provider => 'open_id'} expect(response.status).to eq(302) expect(response).to redirect_to root_path end - it "accepts requests" do - request.env['omniauth.auth'] = { - "provider" => 'open_id', - "uid" => "xxx" - } - get :create, {:provider => 'open_id', :return_to => '/foo'}, valid_session - expect(response.status).to eq(302) - expect(response).to redirect_to 'http://test.host/foo' + it "creates new user" do + expect { + request.env['omniauth.auth'] = { + 'provider' => 'open_id', + 'uid' => 'yyy', + 'info' => { 'email' => 'test@test.org' } + } + get :create, {:provider => 'open_id'} + }.to change { User.count }.from(0).to(1) + u = User.first + expect(u.omniauth_provider).to eq('open_id') + expect(u.omniauth_uid).to eq('yyy') + expect(u.email).to eq('test@test.org') + end + it "updates existing user" do + expect { + request.env['omniauth.auth'] = { + 'provider' => user.omniauth_provider, + 'uid' => user.omniauth_uid, + 'info' => { 'email' => 'test@test.org' } + } + get :create, {:provider => user.omniauth_provider} + }.not_to change { User.count }.from(1) + user.reload + expect(user.email).to eq('test@test.org') end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index f7611c5..f97abb4 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -8,14 +8,31 @@ expect(user).not_to be_nil end - it 'create with omniauth' do + it 'create with omniauth without email' do auth = { - "provider" => 'open_id', - "uid" => 'xxxxxx' + 'provider' => 'open_id', + 'uid' => 'xxxxxx', + 'info' => {} } created = User.create_with_omniauth(auth) expect(created.omniauth_provider).to eq('open_id') expect(created.omniauth_uid).to eq('xxxxxx') + expect(created.email).to be_nil + expect(created.nickname).to be_nil + end + + it 'create with omniauth with email' do + auth = { + 'provider' => 'open_id', + 'uid' => 'xxxxxx', + 'info' => { + 'email' => 'test@test.org' + } + } + created = User.create_with_omniauth(auth) + expect(created.omniauth_provider).to eq('open_id') + expect(created.omniauth_uid).to eq('xxxxxx') + expect(created.email).to eq('test@test.org') expect(created.nickname).to be_nil end diff --git a/spec/requests/gists_spec.rb b/spec/requests/gists_spec.rb index 2e0fd60..203e977 100644 --- a/spec/requests/gists_spec.rb +++ b/spec/requests/gists_spec.rb @@ -5,6 +5,9 @@ describe "GET /gists" do it "works" do + 3.times do + create(:gist) + end get gists_path expect(response.status).to be(200) end