Skip to content
Snippets Groups Projects
Commit c9fd3dc4 authored by James Lopez's avatar James Lopez
Browse files

more refactoring based on feedback

parent 785cbb79
No related branches found
No related tags found
No related merge requests found
Loading
@@ -152,10 +152,10 @@ class Admin::UsersController < Admin::ApplicationController
Loading
@@ -152,10 +152,10 @@ class Admin::UsersController < Admin::ApplicationController
   
def remove_email def remove_email
email = user.emails.find(params[:email_id]) email = user.emails.find(params[:email_id])
Emails::DestroyService.new(current_user, user, email: email.email).execute success = Emails::DestroyService.new(current_user, user, email: email.email).execute
   
respond_to do |format| respond_to do |format|
if result[:status] == :success if success
format.html { redirect_back_or_admin_user(notice: "Successfully removed email.") } format.html { redirect_back_or_admin_user(notice: "Successfully removed email.") }
format.json { head :ok } format.json { head :ok }
else else
Loading
Loading
class Profiles::AvatarsController < Profiles::ApplicationController class Profiles::AvatarsController < Profiles::ApplicationController
def destroy def destroy
@user = current_user @user = current_user
@user.remove_avatar!
   
Users::UpdateService.new(@user, @user).execute Users::UpdateService.new(@user, @user).execute do |user|
user.remove_avatar!
end
   
redirect_to profile_path, status: 302 redirect_to profile_path, status: 302
end end
Loading
Loading
Loading
@@ -41,9 +41,10 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController
Loading
@@ -41,9 +41,10 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController
   
def create def create
if current_user.validate_and_consume_otp!(params[:pin_code]) if current_user.validate_and_consume_otp!(params[:pin_code])
current_user.otp_required_for_login = true Users::UpdateService.new(current_user, current_user).execute! do |user|
@codes = current_user.generate_otp_backup_codes! user.otp_required_for_login = true
Users::UpdateService.new(current_user, current_user).execute! @codes = user.generate_otp_backup_codes!
end
   
render 'create' render 'create'
else else
Loading
@@ -70,8 +71,9 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController
Loading
@@ -70,8 +71,9 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController
end end
   
def codes def codes
@codes = current_user.generate_otp_backup_codes! Users::UpdateService.new(current_user, current_user).execute! do |user|
Users::UpdateService.new(current_user, current_user).execute! @codes = user.generate_otp_backup_codes!
end
end end
   
def destroy def destroy
Loading
Loading
Loading
@@ -60,10 +60,11 @@ class SessionsController < Devise::SessionsController
Loading
@@ -60,10 +60,11 @@ class SessionsController < Devise::SessionsController
   
return unless user && user.require_password? return unless user && user.require_password?
   
token = user.generate_reset_token Users::UpdateService.new(user, user).execute do |user|
Users::UpdateService.new(user, user).execute @token = user.generate_reset_token
end
   
redirect_to edit_user_password_path(reset_password_token: token), redirect_to edit_user_password_path(reset_password_token: @token),
notice: "Please create a password for your new account." notice: "Please create a password for your new account."
end end
   
Loading
Loading
Loading
@@ -5,11 +5,5 @@ module Emails
Loading
@@ -5,11 +5,5 @@ module Emails
@user = user @user = user
@email = opts[:email] @email = opts[:email]
end end
private
def can_manage_emails?
@current_user == @user || @current_user.admin?
end
end end
end end
module Emails module Emails
class CreateService < ::Emails::BaseService class CreateService < ::Emails::BaseService
def execute(skip_authorization: false) def execute
raise Gitlab::Access::AccessDeniedError unless skip_authorization || can_manage_emails?
@user.emails.create(email: @email) @user.emails.create(email: @email)
end end
end end
Loading
Loading
module Emails module Emails
class DestroyService < ::Emails::BaseService class DestroyService < ::Emails::BaseService
def execute(skip_authorization: false) def execute
raise Gitlab::Access::AccessDeniedError unless skip_authorization || can_manage_emails?
Email.find_by_email(@email).destroy && update_secondary_emails! Email.find_by_email(@email).destroy && update_secondary_emails!
end end
   
Loading
Loading
Loading
@@ -10,7 +10,7 @@ module Users
Loading
@@ -10,7 +10,7 @@ module Users
def execute(skip_authorization: false, validate: true, &block) def execute(skip_authorization: false, validate: true, &block)
assign_attributes(skip_authorization, &block) assign_attributes(skip_authorization, &block)
   
if @user.save(validate: validate) || !@user.changed? && @user.errors.empty? if @user.save(validate: validate) || @user.errors.empty?
success success
else else
error(@user.errors.full_messages.uniq.join('. ')) error(@user.errors.full_messages.uniq.join('. '))
Loading
@@ -18,9 +18,9 @@ module Users
Loading
@@ -18,9 +18,9 @@ module Users
end end
   
def execute!(skip_authorization: false, &block) def execute!(skip_authorization: false, &block)
assign_attributes(skip_authorization, &block) result = execute(*args, &block)
   
@user.save! if @user.changed? raise SomeCustomException(result[:message]) unless result[:status] == :success
end end
   
private private
Loading
Loading
Loading
@@ -132,10 +132,11 @@ module API
Loading
@@ -132,10 +132,11 @@ module API
return { success: false, message: 'Two-factor authentication is not enabled for this user' } return { success: false, message: 'Two-factor authentication is not enabled for this user' }
end end
   
codes = user.generate_otp_backup_codes! ::Users::UpdateService.new(user, user).execute! do |user|
::Users::UpdateService.new(user, user).execute! @codes = user.generate_otp_backup_codes!
end
   
{ success: true, recovery_codes: codes } { success: true, recovery_codes: @codes }
end end
   
post "/notify_post_receive" do post "/notify_post_receive" do
Loading
Loading
Loading
@@ -16,8 +16,7 @@ module Gitlab
Loading
@@ -16,8 +16,7 @@ module Gitlab
def self.allowed?(user) def self.allowed?(user)
self.open(user) do |access| self.open(user) do |access|
if access.allowed? if access.allowed?
user.last_credential_check_at = Time.now Users::UpdateService.new(user, user, last_credential_check_a: Time.now).execute
Users::UpdateService.new(user, user).execute
   
true true
else else
Loading
Loading
Loading
@@ -364,6 +364,7 @@ describe API::Users do
Loading
@@ -364,6 +364,7 @@ describe API::Users do
   
it "updates user with new bio" do it "updates user with new bio" do
put api("/users/#{user.id}", admin), { bio: 'new test bio' } put api("/users/#{user.id}", admin), { bio: 'new test bio' }
expect(response).to have_http_status(200) expect(response).to have_http_status(200)
expect(json_response['bio']).to eq('new test bio') expect(json_response['bio']).to eq('new test bio')
expect(user.reload.bio).to eq('new test bio') expect(user.reload.bio).to eq('new test bio')
Loading
@@ -396,6 +397,7 @@ describe API::Users do
Loading
@@ -396,6 +397,7 @@ describe API::Users do
   
it 'updates user with his own email' do it 'updates user with his own email' do
put api("/users/#{user.id}", admin), email: user.email put api("/users/#{user.id}", admin), email: user.email
expect(response).to have_http_status(200) expect(response).to have_http_status(200)
expect(json_response['email']).to eq(user.email) expect(json_response['email']).to eq(user.email)
expect(user.reload.email).to eq(user.email) expect(user.reload.email).to eq(user.email)
Loading
@@ -403,12 +405,14 @@ describe API::Users do
Loading
@@ -403,12 +405,14 @@ describe API::Users do
   
it 'updates user with a new email' do it 'updates user with a new email' do
put api("/users/#{user.id}", admin), email: 'new@email.com' put api("/users/#{user.id}", admin), email: 'new@email.com'
expect(response).to have_http_status(200) expect(response).to have_http_status(200)
expect(user.reload.notification_email).to eq('new@email.com') expect(user.reload.notification_email).to eq('new@email.com')
end end
   
it 'updates user with his own username' do it 'updates user with his own username' do
put api("/users/#{user.id}", admin), username: user.username put api("/users/#{user.id}", admin), username: user.username
expect(response).to have_http_status(200) expect(response).to have_http_status(200)
expect(json_response['username']).to eq(user.username) expect(json_response['username']).to eq(user.username)
expect(user.reload.username).to eq(user.username) expect(user.reload.username).to eq(user.username)
Loading
@@ -416,12 +420,14 @@ describe API::Users do
Loading
@@ -416,12 +420,14 @@ describe API::Users do
   
it "updates user's existing identity" do it "updates user's existing identity" do
put api("/users/#{omniauth_user.id}", admin), provider: 'ldapmain', extern_uid: '654321' put api("/users/#{omniauth_user.id}", admin), provider: 'ldapmain', extern_uid: '654321'
expect(response).to have_http_status(200) expect(response).to have_http_status(200)
expect(omniauth_user.reload.identities.first.extern_uid).to eq('654321') expect(omniauth_user.reload.identities.first.extern_uid).to eq('654321')
end end
   
it 'updates user with new identity' do it 'updates user with new identity' do
put api("/users/#{user.id}", admin), provider: 'github', extern_uid: 'john' put api("/users/#{user.id}", admin), provider: 'github', extern_uid: 'john'
expect(response).to have_http_status(200) expect(response).to have_http_status(200)
expect(user.reload.identities.first.extern_uid).to eq('john') expect(user.reload.identities.first.extern_uid).to eq('john')
expect(user.reload.identities.first.provider).to eq('github') expect(user.reload.identities.first.provider).to eq('github')
Loading
@@ -429,12 +435,14 @@ describe API::Users do
Loading
@@ -429,12 +435,14 @@ describe API::Users do
   
it "updates admin status" do it "updates admin status" do
put api("/users/#{user.id}", admin), { admin: true } put api("/users/#{user.id}", admin), { admin: true }
expect(response).to have_http_status(200) expect(response).to have_http_status(200)
expect(user.reload.admin).to eq(true) expect(user.reload.admin).to eq(true)
end end
   
it "updates external status" do it "updates external status" do
put api("/users/#{user.id}", admin), { external: true } put api("/users/#{user.id}", admin), { external: true }
expect(response.status).to eq 200 expect(response.status).to eq 200
expect(json_response['external']).to eq(true) expect(json_response['external']).to eq(true)
expect(user.reload.external?).to be_truthy expect(user.reload.external?).to be_truthy
Loading
@@ -442,6 +450,7 @@ describe API::Users do
Loading
@@ -442,6 +450,7 @@ describe API::Users do
   
it "does not update admin status" do it "does not update admin status" do
put api("/users/#{admin_user.id}", admin), { can_create_group: false } put api("/users/#{admin_user.id}", admin), { can_create_group: false }
expect(response).to have_http_status(200) expect(response).to have_http_status(200)
expect(admin_user.reload.admin).to eq(true) expect(admin_user.reload.admin).to eq(true)
expect(admin_user.can_create_group).to eq(false) expect(admin_user.can_create_group).to eq(false)
Loading
@@ -449,6 +458,7 @@ describe API::Users do
Loading
@@ -449,6 +458,7 @@ describe API::Users do
   
it "does not allow invalid update" do it "does not allow invalid update" do
put api("/users/#{user.id}", admin), { email: 'invalid email' } put api("/users/#{user.id}", admin), { email: 'invalid email' }
expect(response).to have_http_status(400) expect(response).to have_http_status(400)
expect(user.reload.email).not_to eq('invalid email') expect(user.reload.email).not_to eq('invalid email')
end end
Loading
@@ -465,6 +475,7 @@ describe API::Users do
Loading
@@ -465,6 +475,7 @@ describe API::Users do
   
it "returns 404 for non-existing user" do it "returns 404 for non-existing user" do
put api("/users/999999", admin), { bio: 'update should fail' } put api("/users/999999", admin), { bio: 'update should fail' }
expect(response).to have_http_status(404) expect(response).to have_http_status(404)
expect(json_response['message']).to eq('404 User Not Found') expect(json_response['message']).to eq('404 User Not Found')
end end
Loading
@@ -515,6 +526,7 @@ describe API::Users do
Loading
@@ -515,6 +526,7 @@ describe API::Users do
   
it 'returns 409 conflict error if email address exists' do it 'returns 409 conflict error if email address exists' do
put api("/users/#{@user.id}", admin), email: 'test@example.com' put api("/users/#{@user.id}", admin), email: 'test@example.com'
expect(response).to have_http_status(409) expect(response).to have_http_status(409)
expect(@user.reload.email).to eq(@user.email) expect(@user.reload.email).to eq(@user.email)
end end
Loading
@@ -522,6 +534,7 @@ describe API::Users do
Loading
@@ -522,6 +534,7 @@ describe API::Users do
it 'returns 409 conflict error if username taken' do it 'returns 409 conflict error if username taken' do
@user_id = User.all.last.id @user_id = User.all.last.id
put api("/users/#{@user.id}", admin), username: 'test' put api("/users/#{@user.id}", admin), username: 'test'
expect(response).to have_http_status(409) expect(response).to have_http_status(409)
expect(@user.reload.username).to eq(@user.username) expect(@user.reload.username).to eq(@user.username)
end end
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment