iugusdk 1.0.0.alpha.1 → 1.0.0.alpha.2
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/iugu/account_controller.rb +24 -28
- data/app/controllers/iugu/account_domains_controller.rb +35 -5
- data/app/controllers/iugu/account_roles_controller.rb +2 -5
- data/app/controllers/iugu/account_users_controller.rb +6 -12
- data/app/controllers/iugu/confirmations_controller.rb +1 -0
- data/app/controllers/iugu/invitations_controller.rb +17 -23
- data/app/controllers/iugu/omniauth_callbacks_controller.rb +3 -1
- data/app/controllers/iugu/passwords_controller.rb +1 -0
- data/app/controllers/iugu/registrations_controller.rb +11 -0
- data/app/controllers/iugu/sessions_controller.rb +1 -0
- data/app/controllers/iugu/settings_controller.rb +14 -0
- data/app/mailers/iugu_mailer.rb +2 -2
- data/app/models/account.rb +15 -0
- data/app/models/account_domain.rb +25 -2
- data/app/models/user.rb +19 -3
- data/app/models/user_invitation.rb +15 -2
- data/app/views/iugu/account_domains/index.html.haml +50 -25
- data/app/views/iugu/account_domains/instructions.html.haml +3 -0
- data/app/views/iugu/account_users/index.html.haml +4 -2
- data/app/views/iugu/invitations/new.html.haml +19 -5
- data/app/views/iugu/registrations/new.html.haml +4 -1
- data/app/views/iugu/sessions/new.html.haml +9 -8
- data/app/views/iugu/settings/account.html.haml +31 -23
- data/app/views/iugu/settings/accounts.html.haml +5 -3
- data/app/views/iugu/settings/profile.html.haml +47 -44
- data/app/views/iugu/shared/_links.haml +14 -11
- data/app/views/layouts/settings.html.haml +1 -1
- data/config/initializers/devise.rb +0 -13
- data/config/locales/iugu.en.yml +6 -0
- data/config/locales/iugu.pt-BR.yml +6 -0
- data/config/routes.rb +9 -4
- data/db/migrate/20120725170859_add_api_token_to_account.rb +9 -0
- data/db/migrate/20120803172545_add_guest_to_users.rb +9 -0
- data/lib/iugusdk/controllers/helpers.rb +1 -1
- data/lib/iugusdk/engine.rb +1 -1
- data/lib/iugusdk/iugusdk_base_controller.rb +17 -0
- data/lib/iugusdk/version.rb +1 -1
- data/lib/iugusdk.rb +30 -5
- data/spec/controller_macros.rb +1 -1
- data/spec/controllers/account_controller_spec.rb +26 -45
- data/spec/controllers/account_domains_controller_spec.rb +87 -5
- data/spec/controllers/account_roles_controller_spec.rb +0 -14
- data/spec/controllers/invitations_controller_spec.rb +21 -1
- data/spec/controllers/registration_controller_spec.rb +15 -0
- data/spec/controllers/settings_controller_spec.rb +105 -0
- data/spec/dummy/db/schema.rb +3 -1
- data/spec/dummy/log/development.log +1579 -0
- data/spec/dummy/tmp/cache/assets/C91/3F0/sprockets%2Fcd844928d19e586b4146833b720e7d29 +0 -0
- data/spec/dummy/tmp/cache/assets/CAA/190/sprockets%2Fee7298fdc707d359368983e09687c627 +0 -0
- data/spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/CE6/A00/sprockets%2F583256e44957e430e1eca9ba1739b6b6 +0 -0
- data/spec/dummy/tmp/cache/assets/CE7/4B0/sprockets%2Fd3774b9099289a36db44caec70813a19 +0 -0
- data/spec/dummy/tmp/cache/assets/CF1/A70/sprockets%2F368a631d9662bcc4891c91f739b7be37 +0 -0
- data/spec/dummy/tmp/cache/assets/CF6/A50/sprockets%2Ff434c1ed5d55916f790cf698832f76b1 +0 -0
- data/spec/dummy/tmp/cache/assets/CFB/F30/sprockets%2F84131db318a2faf415628c1075c32bdd +0 -0
- data/spec/dummy/tmp/cache/assets/D1A/F20/sprockets%2F102cc77ec78847746b1c164edcb9b639 +0 -0
- data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/D3A/D70/sprockets%2Fa3bc2dd9e66062ea36222fc6154827ee +0 -0
- data/spec/dummy/tmp/cache/assets/D46/E20/sprockets%2F1de16fe0c12f9988664ed66a835a6ab0 +0 -0
- data/spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/D64/F60/sprockets%2F4755d7f5deef0f3212cb7ae30172a33e +0 -0
- data/spec/dummy/tmp/cache/assets/D69/850/sprockets%2F5c160a5a6d1068a17af57ab38affd379 +0 -0
- data/spec/dummy/tmp/cache/assets/D77/1A0/sprockets%2Ff3864fc006a0674b4c977ff5ca5c7d2e +0 -0
- data/spec/dummy/tmp/cache/assets/D77/920/sprockets%2Faf0e746c541e6cf4540db92c87da579c +0 -0
- data/spec/dummy/tmp/cache/assets/D7A/850/sprockets%2Fd1e5bf9f64829d062ed7314af28a4e7e +0 -0
- data/spec/dummy/tmp/cache/assets/D86/3F0/sprockets%2F8f648e11dfcec044b2997b98f619cfa6 +0 -0
- data/spec/dummy/tmp/cache/assets/DA5/130/sprockets%2F7d741fa9ebe86e96fb2bd116ca91234e +0 -0
- data/spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/DF2/910/sprockets%2F02db4a9e6f91b47261fa5b0eece2ab8b +0 -0
- data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/E25/5A0/sprockets%2F795f5759cf9bc7cde9f8acf8c0ca479f +0 -0
- data/spec/dummy/tmp/cache/assets/E35/0E0/sprockets%2F9f57eaeefd4c9d5efb41c9801e3f1c1a +0 -0
- data/spec/dummy/tmp/cache/sass/e5be18dde92936a4632e65289dad5788ed73dd60/settings.sassc +0 -0
- data/spec/dummy/tmp/cache/sass/e764476e9a85279ad82622591ce49983ed21c149/default.sassc +0 -0
- data/spec/fabricators/account_domain_fabricator.rb +5 -1
- data/spec/models/account_domain_spec.rb +49 -12
- data/spec/models/account_spec.rb +32 -4
- data/spec/models/user_invitation_spec.rb +23 -1
- data/spec/models/user_spec.rb +76 -0
- data/spec/requests/account_domain_spec.rb +71 -37
- data/spec/requests/account_roles_spec.rb +1 -0
- data/spec/requests/account_spec.rb +65 -3
- data/spec/requests/account_users_spec.rb +1 -0
- data/spec/requests/omniauth_spec.rb +34 -0
- data/spec/requests/settings_spec.rb +4 -4
- data/spec/requests/user_invitation_spec.rb +32 -1
- data/spec/requests/user_spec.rb +13 -0
- metadata +126 -70
- data/lib/iugusdk/locale_filter.rb +0 -12
@@ -1,4 +1,7 @@
|
|
1
1
|
class Iugu::AccountController < Iugu::AccountSettingsController
|
2
|
+
|
3
|
+
before_filter(:only => [:destroy, :cancel_destruction, :update]) { |c| c.must_be :owner, :id }
|
4
|
+
before_filter(:only => [:generate_new_token]) { |c| c.must_be :owner, :account_id }
|
2
5
|
|
3
6
|
def index
|
4
7
|
render 'iugu/settings/accounts'
|
@@ -8,51 +11,33 @@ class Iugu::AccountController < Iugu::AccountSettingsController
|
|
8
11
|
if params[:id]
|
9
12
|
@account = current_user.accounts.find(params[:id])
|
10
13
|
else
|
11
|
-
@account = current_user_account
|
14
|
+
@account = current_user_account.account
|
12
15
|
end
|
13
16
|
@primary_domain = @account.account_domains.where(:primary => true).first if @account
|
14
17
|
render 'iugu/settings/account'
|
15
18
|
end
|
16
19
|
|
17
20
|
def destroy
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
account.destroy
|
22
|
-
notice = I18n.t("iugu.account_destruction_in") + account.destruction_job.run_at.to_s
|
23
|
-
else
|
24
|
-
notice = I18n.t("errors.messages.only_owners_can_destroy_accounts")
|
25
|
-
end
|
26
|
-
end
|
27
|
-
rescue
|
28
|
-
notice = I18n.t("iugu.notices.account_not_found")
|
29
|
-
end
|
30
|
-
redirect_to(account_settings_path, :notice => notice)
|
21
|
+
account = current_user.accounts.find(params[:id])
|
22
|
+
account.destroy
|
23
|
+
redirect_to(account_settings_path, :notice => I18n.t("iugu.account_destruction_in") + account.destruction_job.run_at.to_s)
|
31
24
|
end
|
32
25
|
|
33
26
|
def cancel_destruction
|
34
|
-
|
35
|
-
|
36
|
-
notice = I18n.t("iugu.account_destruction_undone")
|
37
|
-
rescue
|
38
|
-
notice = I18n.t("iugu.notices.account_not_found")
|
39
|
-
end
|
27
|
+
current_user.accounts.find(params[:id]).cancel_destruction
|
28
|
+
notice = I18n.t("iugu.account_destruction_undone")
|
40
29
|
redirect_to(account_settings_path, :notice => notice)
|
41
30
|
end
|
42
31
|
|
43
32
|
def select
|
44
|
-
|
33
|
+
set_account(current_user, params[:id])
|
45
34
|
redirect_to(account_settings_path, :notice => "Account selected")
|
46
35
|
end
|
47
36
|
|
48
37
|
def update
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
redirect_to account_view_path(params[:id]), :notice => I18n.t("iugu.notices.account_updated")
|
53
|
-
rescue
|
54
|
-
raise ActionController::RoutingError.new('Not Found')
|
55
|
-
end
|
38
|
+
@account = Account.find(params[:id])
|
39
|
+
@account.update_attributes(params[:account])
|
40
|
+
redirect_to account_view_path(params[:id]), :notice => I18n.t("iugu.notices.account_updated")
|
56
41
|
end
|
57
42
|
|
58
43
|
def create
|
@@ -60,4 +45,15 @@ class Iugu::AccountController < Iugu::AccountSettingsController
|
|
60
45
|
redirect_to account_settings_path
|
61
46
|
end
|
62
47
|
|
48
|
+
def generate_new_token
|
49
|
+
if IuguSDK::enable_account_api_token == true
|
50
|
+
@account = current_user.accounts.find(params[:account_id])
|
51
|
+
@account.update_api_token
|
52
|
+
redirect_to account_view_path(params[:account_id]), :notice => I18n.t("iugu.notices.new_token_generated")
|
53
|
+
else
|
54
|
+
raise ActionController::RoutingError.new('Not found')
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
63
59
|
end
|
@@ -1,16 +1,25 @@
|
|
1
1
|
class Iugu::AccountDomainsController < Iugu::AccountSettingsController
|
2
2
|
|
3
|
+
before_filter :custom_domain_enabled?, :except => [:update_subdomain, :index]
|
4
|
+
|
5
|
+
before_filter(:only => [:index, :create, :destroy, :instruction, :verify, :primary, :update_subdomain]) { |c| c.must_be [:owner, :admin], :account_id }
|
6
|
+
|
3
7
|
def index
|
4
|
-
|
5
|
-
|
6
|
-
|
8
|
+
unless IuguSDK::enable_custom_domain == false && IuguSDK::enable_subdomain == false
|
9
|
+
@account = current_user.accounts.find(params[:account_id])
|
10
|
+
@account_domains = @account.account_domains.where(:account_id => params[:account_id])
|
11
|
+
@account_domain = AccountDomain.new
|
12
|
+
else
|
13
|
+
raise ActionController::RoutingError.new("Not found")
|
14
|
+
end
|
7
15
|
end
|
8
16
|
|
9
17
|
def create
|
10
18
|
@account = current_user.accounts.find(params[:account_id])
|
11
|
-
if @account.account_domains << @
|
12
|
-
redirect_to account_domains_instructions_path(:account_id => params[:account_id], :domain_id => @
|
19
|
+
if @account.account_domains << @account_domain = AccountDomain.create(params[:account_domain])
|
20
|
+
redirect_to account_domains_instructions_path(:account_id => params[:account_id], :domain_id => @account_domain.id)#, :notice => notice = I18n.t("iugu.notices.domain_created")
|
13
21
|
else
|
22
|
+
@account_domains = @account.account_domains.where(:account_id => params[:account_id])
|
14
23
|
render :index
|
15
24
|
end
|
16
25
|
end
|
@@ -60,5 +69,26 @@ class Iugu::AccountDomainsController < Iugu::AccountSettingsController
|
|
60
69
|
redirect_to account_domains_index_path(params[:account_id]), :notice => I18n.t("iugu.notices.domain_not_found")
|
61
70
|
end
|
62
71
|
end
|
72
|
+
|
73
|
+
def update_subdomain
|
74
|
+
if IuguSDK::enable_subdomain == true
|
75
|
+
@account = current_user.accounts.find(params[:account_id])
|
76
|
+
if @account.update_attributes(params[:account])
|
77
|
+
redirect_to account_domains_index_path(@account.id), :notice => I18n.t("iugu.notices.subdomain_updated")
|
78
|
+
else
|
79
|
+
@account_domains = @account.account_domains.where(:account_id => params[:account_id])
|
80
|
+
@account_domain = AccountDomain.new
|
81
|
+
render :index
|
82
|
+
end
|
83
|
+
else
|
84
|
+
raise ActionController::RoutingError.new('Not found')
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
private
|
89
|
+
|
90
|
+
def custom_domain_enabled?
|
91
|
+
raise ActionController::RoutingError.new('Not found') if IuguSDK::enable_custom_domain == false
|
92
|
+
end
|
63
93
|
|
64
94
|
end
|
@@ -1,13 +1,10 @@
|
|
1
1
|
class Iugu::AccountRolesController < Iugu::SettingsController
|
2
2
|
|
3
|
+
before_filter(:only => [:edit, :update]) { |c| c.must_be [:owner, :admin], :id }
|
4
|
+
|
3
5
|
def edit
|
4
6
|
@account = current_user.accounts.find(params[:id])
|
5
7
|
@account_user = @account.account_users.find_by_user_id(params[:user_id])
|
6
|
-
if current_user.is?(:owner, @account) || current_user.is?(:admin, @account)
|
7
|
-
render 'iugu/account_roles/edit'
|
8
|
-
else
|
9
|
-
render :file => "#{Rails.root}/public/422.html", :status => 550
|
10
|
-
end
|
11
8
|
end
|
12
9
|
|
13
10
|
def update
|
@@ -1,5 +1,7 @@
|
|
1
1
|
class Iugu::AccountUsersController < Iugu::AccountSettingsController
|
2
2
|
|
3
|
+
before_filter(:only => [:destroy, :cancel_destruction]) { |c| c.must_be [:owner, :admin], :account_id }
|
4
|
+
|
3
5
|
def index
|
4
6
|
@account = Account.find(params[:account_id])
|
5
7
|
@account_users = @account.account_users
|
@@ -17,24 +19,16 @@ class Iugu::AccountUsersController < Iugu::AccountSettingsController
|
|
17
19
|
else
|
18
20
|
raise ActionController::RoutingError.new('Not Found')
|
19
21
|
end
|
20
|
-
|
21
|
-
|
22
|
-
@account_user.destroy
|
23
|
-
else
|
24
|
-
raise ActionController::RoutingError.new('Access Denied')
|
25
|
-
end
|
22
|
+
raise ActionController::RoutingError.new('Access Denied') if @account_user.user_id == current_user.id || @account_user.is?(:owner)
|
23
|
+
@account_user.destroy
|
26
24
|
redirect_to account_users_index_path(params[:account_id]), :notice => I18n.t("iugu.account_user_destruction_in") + @account_user.destruction_job.run_at.to_s
|
27
25
|
end
|
28
26
|
|
29
27
|
def cancel_destruction
|
30
28
|
if @account_user = AccountUser.find_by_account_id_and_user_id(params[:account_id], params[:user_id])
|
31
29
|
@account = Account.find(params[:account_id])
|
32
|
-
|
33
|
-
|
34
|
-
redirect_to account_users_index_path(params[:account_id]), :notice => I18n.t("iugu.account_user_destruction_undone")
|
35
|
-
else
|
36
|
-
raise ActionController::RoutingError.new('Access Denied')
|
37
|
-
end
|
30
|
+
@account_user.cancel_destruction
|
31
|
+
redirect_to account_users_index_path(params[:account_id]), :notice => I18n.t("iugu.account_user_destruction_undone")
|
38
32
|
else
|
39
33
|
raise ActionController::RoutingError.new('Not Found')
|
40
34
|
end
|
@@ -1,18 +1,23 @@
|
|
1
1
|
class Iugu::InvitationsController < Iugu::SettingsController
|
2
|
-
|
2
|
+
|
3
|
+
before_filter(:only => [:new, :create]) { |c| c.must_be [:owner, :admin], :account_id }
|
3
4
|
|
4
5
|
def new
|
5
6
|
@user_invitation = UserInvitation.new
|
6
|
-
@
|
7
|
+
@account = Account.find(params[:account_id])
|
7
8
|
end
|
8
9
|
|
9
10
|
def create
|
10
11
|
params[:user_invitation][:roles] = params[:user_invitation][:roles].try(:join, ',')
|
11
|
-
|
12
|
-
|
13
|
-
@user_invitation
|
14
|
-
@user_invitation.
|
15
|
-
|
12
|
+
params[:user_invitation][:account_id] = params[:account_id]
|
13
|
+
params[:user_invitation][:invited_by] = current_user.id
|
14
|
+
@user_invitation = UserInvitation.create(params[:user_invitation])
|
15
|
+
unless @user_invitation.new_record?
|
16
|
+
redirect_to account_users_index_path(params[:account_id]), :notice => I18n.t("iugu.notices.user_invited")
|
17
|
+
else
|
18
|
+
@account = Account.find(params[:account_id])
|
19
|
+
render :new
|
20
|
+
end
|
16
21
|
end
|
17
22
|
|
18
23
|
def edit
|
@@ -25,25 +30,14 @@ class Iugu::InvitationsController < Iugu::SettingsController
|
|
25
30
|
|
26
31
|
def update
|
27
32
|
if @user_invitation = UserInvitation.find_by_invitation_token(params[:invitation_token])
|
28
|
-
@user_invitation.accept(current_user)
|
29
|
-
|
33
|
+
if @user_invitation.accept(current_user)
|
34
|
+
redirect_to root_path
|
35
|
+
else
|
36
|
+
redirect_to root_path, :notice => I18n.t("iugu.notices.you_are_already_member_of_this_account")
|
37
|
+
end
|
30
38
|
else
|
31
39
|
raise ActionController::RoutingError.new('Not Found')
|
32
40
|
end
|
33
41
|
end
|
34
42
|
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
def check_permissions
|
39
|
-
if params[:account_id]
|
40
|
-
begin
|
41
|
-
account = current_user.accounts.find(params[:account_id])
|
42
|
-
rescue
|
43
|
-
raise ActionController::RoutingError.new('Access denied')
|
44
|
-
end
|
45
|
-
raise ActionController::RoutingError.new('Access denied') unless current_user.is?(:owner, account) || current_user.is?(:admin, account)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
43
|
end
|
@@ -3,12 +3,14 @@ class Iugu::OmniauthCallbacksController < Devise::OmniauthCallbacksController
|
|
3
3
|
def method_missing(provider)
|
4
4
|
if !User.omniauth_providers.index(provider).nil?
|
5
5
|
if current_user
|
6
|
+
raise ActionController::RoutingError.new("Not found") unless IuguSDK::enable_social_linking
|
6
7
|
current_user.find_or_create_social(env["omniauth.auth"])
|
7
8
|
redirect_to after_sign_in_path_for( current_user )
|
8
9
|
else
|
10
|
+
raise ActionController::RoutingError.new("Not found") unless IuguSDK::enable_social_login
|
9
11
|
if user = User.find_or_create_by_social(env["omniauth.auth"])
|
10
|
-
select_account user
|
11
12
|
sign_in user
|
13
|
+
select_account
|
12
14
|
redirect_to after_sign_in_path_for( user )
|
13
15
|
else
|
14
16
|
redirect_to (env["omniauth.origin"] || root_path), :notice => I18n.t('errors.messages.email_already_in_use')
|
@@ -1,3 +1,14 @@
|
|
1
1
|
class Iugu::RegistrationsController < Devise::RegistrationsController
|
2
|
+
after_filter :select_account, :only => [:create,:update]
|
3
|
+
|
4
|
+
def try_first
|
5
|
+
@user = User.create_guest
|
6
|
+
@user.remember_me = true
|
7
|
+
sign_in @user
|
8
|
+
select_account
|
9
|
+
flash[:notice] = I18n.t("iugu.notices.guest_login")
|
10
|
+
redirect_to root_path
|
11
|
+
#respond_with @user, :location => sign_up_path_for(@user)
|
12
|
+
end
|
2
13
|
end
|
3
14
|
|
@@ -8,4 +8,18 @@ class Iugu::SettingsController < ApplicationController
|
|
8
8
|
redirect_to :profile_settings, :notice => flash[:notice]
|
9
9
|
end
|
10
10
|
|
11
|
+
def must_be (roles, param_name)
|
12
|
+
access = false
|
13
|
+
@account_user = AccountUser.find_by_user_id_and_account_id(current_user.id, params[param_name])
|
14
|
+
raise ActionController::RoutingError.new("Not Found") unless @account_user
|
15
|
+
if roles.class == Array
|
16
|
+
roles.each do |role|
|
17
|
+
access = true if @account_user.is?(role)
|
18
|
+
end
|
19
|
+
else
|
20
|
+
access = true if @account_user.is?(roles)
|
21
|
+
end
|
22
|
+
raise ActionController::RoutingError.new("Access Denied") if access == false
|
23
|
+
end
|
24
|
+
|
11
25
|
end
|
data/app/mailers/iugu_mailer.rb
CHANGED
data/app/models/account.rb
CHANGED
@@ -8,8 +8,11 @@ class Account < ActiveRecord::Base
|
|
8
8
|
:run_at => Proc.new { DateTime.now + IuguSDK::delay_account_exclusion }
|
9
9
|
|
10
10
|
validates :subdomain, :uniqueness => true, :unless => Proc.new { |a| a.subdomain.blank? }
|
11
|
+
validates :api_token, :uniqueness => true, :if => :api_token?
|
11
12
|
validate :subdomain_blacklist
|
12
13
|
|
14
|
+
before_create :set_first_token
|
15
|
+
|
13
16
|
def self.get_from_domain(domain)
|
14
17
|
AccountDomain.verified.find_by_url(domain).try(:account) || Account.find_by_subdomain(domain.gsub(".#{IuguSDK::application_main_host}",""))
|
15
18
|
end
|
@@ -39,9 +42,21 @@ class Account < ActiveRecord::Base
|
|
39
42
|
def name
|
40
43
|
(super.blank? ? "#{I18n.t('iugu.account')} ##{id}" : super)
|
41
44
|
end
|
45
|
+
|
46
|
+
def update_api_token
|
47
|
+
self.update_attribute(:api_token, generate_api_token)
|
48
|
+
end
|
42
49
|
|
43
50
|
private
|
44
51
|
|
52
|
+
def set_first_token
|
53
|
+
self.api_token = generate_api_token
|
54
|
+
end
|
55
|
+
|
56
|
+
def generate_api_token
|
57
|
+
Digest::MD5.hexdigest("#{SecureRandom.hex(10)}-#{DateTime.now.to_s}")
|
58
|
+
end
|
59
|
+
|
45
60
|
def subdomain_blacklist
|
46
61
|
if subdomain
|
47
62
|
IuguSDK::custom_domain_invalid_prefixes.each do |invalid_prefix|
|
@@ -5,6 +5,11 @@ class AccountDomain < ActiveRecord::Base
|
|
5
5
|
validates :url, :account_id, :presence => true
|
6
6
|
validate :validate_pattern, :validate_blacklist
|
7
7
|
|
8
|
+
before_create :validate_not_repeated
|
9
|
+
|
10
|
+
before_destroy { |record| record.update_attributes(:verified => false, :primary => false) }
|
11
|
+
before_destroy :set_first_domain
|
12
|
+
|
8
13
|
scope :verified, where(:verified => true)
|
9
14
|
|
10
15
|
def normalize_host
|
@@ -41,12 +46,15 @@ class AccountDomain < ActiveRecord::Base
|
|
41
46
|
end
|
42
47
|
AccountDomain.where(:url => self.url).update_all(:verified => false) if checked == true
|
43
48
|
update_attribute(:verified, checked)
|
49
|
+
set_first_domain
|
44
50
|
checked
|
45
51
|
end
|
46
52
|
|
47
53
|
def set_primary
|
48
|
-
|
49
|
-
|
54
|
+
if verified == true
|
55
|
+
AccountDomain.where(:account_id => account_id).update_all(:primary => false)
|
56
|
+
update_attribute(:primary, true)
|
57
|
+
end
|
50
58
|
end
|
51
59
|
|
52
60
|
private
|
@@ -64,6 +72,21 @@ class AccountDomain < ActiveRecord::Base
|
|
64
72
|
end
|
65
73
|
end
|
66
74
|
end
|
75
|
+
|
76
|
+
def validate_not_repeated
|
77
|
+
if url
|
78
|
+
if !AccountDomain.where(:account_id => account_id, :url => url).empty?
|
79
|
+
errors.add(:url, "already used for this account")
|
80
|
+
false
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def set_first_domain
|
86
|
+
if AccountDomain.where(:account_id => account_id, :primary => true).empty?
|
87
|
+
AccountDomain.where(:account_id => account_id, :verified => true).first.try(:update_attribute, :primary, true)
|
88
|
+
end
|
89
|
+
end
|
67
90
|
|
68
91
|
|
69
92
|
end
|
data/app/models/user.rb
CHANGED
@@ -14,11 +14,15 @@ class User < ActiveRecord::Base
|
|
14
14
|
:recoverable, :rememberable, :validatable, :omniauthable
|
15
15
|
|
16
16
|
# Setup accessible (or protected) attributes for your model
|
17
|
-
attr_accessible :email, :password, :password_confirmation, :remember_me, :locale, :name, :birthdate
|
17
|
+
attr_accessible :email, :password, :password_confirmation, :remember_me, :locale, :name, :birthdate, :guest
|
18
|
+
|
19
|
+
before_create :skip_confirmation!, :unless => Proc.new { IuguSDK::enable_user_confirmation }
|
18
20
|
|
19
21
|
after_create :create_account_for_user
|
20
22
|
|
21
|
-
|
23
|
+
before_save :skip_reconfirmation!, :unless => Proc.new { IuguSDK::enable_email_reconfirmation }
|
24
|
+
|
25
|
+
validates :email, :email => true, :unless => :guest?
|
22
26
|
|
23
27
|
def destruction_job
|
24
28
|
Delayed::Job.find_by_queue("user_#{id}_destroy")
|
@@ -44,6 +48,17 @@ class User < ActiveRecord::Base
|
|
44
48
|
social_accounts.where("provider = ? AND social_id = ?", auth["provider"], auth["uid"]).first || create_social(auth)
|
45
49
|
end
|
46
50
|
|
51
|
+
def self.create_guest(locale = "en")
|
52
|
+
user = User.new({
|
53
|
+
:guest => true,
|
54
|
+
:name => "Guest",
|
55
|
+
:locale => locale
|
56
|
+
})
|
57
|
+
user.skip_confirmation!
|
58
|
+
user.save
|
59
|
+
user
|
60
|
+
end
|
61
|
+
|
47
62
|
def self.find_or_create_by_social(auth)
|
48
63
|
social_account = SocialAccount.where("provider = ? AND social_id = ?", auth["provider"], auth["uid"]).first
|
49
64
|
unless user = social_account.try(:user)
|
@@ -89,9 +104,10 @@ class User < ActiveRecord::Base
|
|
89
104
|
private
|
90
105
|
|
91
106
|
def email_required?
|
92
|
-
!has_social?
|
107
|
+
!(has_social? || guest?)
|
93
108
|
end
|
94
109
|
|
110
|
+
|
95
111
|
#def self.reconfirmable
|
96
112
|
# true
|
97
113
|
#end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
class UserInvitation < ActiveRecord::Base
|
2
2
|
validates :email, :email => true, :presence => true
|
3
|
+
validate :email_already_used?
|
3
4
|
before_save :set_token
|
4
5
|
before_create :set_sent_at
|
5
6
|
after_create :send_email
|
@@ -20,8 +21,14 @@ class UserInvitation < ActiveRecord::Base
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def accept(user)
|
23
|
-
Account.find(account_id)
|
24
|
-
|
24
|
+
account = Account.find(account_id)
|
25
|
+
if account.account_users.where(:user_id => user.id).empty?
|
26
|
+
account.account_users << account_user = AccountUser.create(:user_id => user.id)
|
27
|
+
account_user.set_roles(roles.split(',')) if roles
|
28
|
+
true
|
29
|
+
else
|
30
|
+
false
|
31
|
+
end
|
25
32
|
end
|
26
33
|
|
27
34
|
private
|
@@ -37,5 +44,11 @@ class UserInvitation < ActiveRecord::Base
|
|
37
44
|
def send_email
|
38
45
|
IuguMailer.invitation(self).deliver
|
39
46
|
end
|
47
|
+
|
48
|
+
def email_already_used?
|
49
|
+
if !AccountUser.joins(:user).where(:account_id => account_id, 'users.email' => email).empty?
|
50
|
+
errors.add(:email, "already used in this account")
|
51
|
+
end
|
52
|
+
end
|
40
53
|
end
|
41
54
|
|
@@ -1,32 +1,57 @@
|
|
1
1
|
%h2
|
2
2
|
= I18n.t("iugu.account_domains") + " (##{@account.id})"
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
=
|
7
|
-
|
8
|
-
|
9
|
-
%
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
- if
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
4
|
+
- if IuguSDK::enable_subdomain == true
|
5
|
+
%div
|
6
|
+
= simple_form_for @account, :url => update_subdomain_path(:id => @account.id), :method => :put do |f|
|
7
|
+
- if @account.errors.any?
|
8
|
+
#error_explanation{ :style => "margin-bottom: 15px" }
|
9
|
+
%ul
|
10
|
+
- @account.errors.full_messages.each do |msg|
|
11
|
+
%li
|
12
|
+
= msg
|
13
|
+
|
14
|
+
= f.label :subdomain
|
15
|
+
= f.text_field :subdomain
|
16
|
+
= f.submit I18n.t("iugu.save")
|
17
|
+
|
18
|
+
- if IuguSDK::enable_custom_domain == true
|
19
|
+
|
20
|
+
%div
|
21
|
+
= simple_form_for @account_domain, :url => create_domain_path(@account.id) do |f|
|
22
|
+
- if @account_domain.errors.any?
|
23
|
+
#error_explanation{ :style => "margin-bottom: 15px" }
|
24
|
+
%ul
|
25
|
+
- @account_domain.errors.full_messages.each do |msg|
|
26
|
+
%li
|
27
|
+
= msg
|
28
|
+
|
29
|
+
= f.text_field :url
|
30
|
+
= f.submit I18n.t("iugu.add")
|
31
|
+
%br
|
32
|
+
%div
|
33
|
+
- @account_domains.each do |domain|
|
34
|
+
%div
|
35
|
+
|
36
|
+
= domain.url
|
37
|
+
|
38
|
+
- if domain.primary
|
39
|
+
|
|
40
|
+
= I18n.t("iugu.primary")
|
41
|
+
- else
|
42
|
+
- if domain.verified
|
43
|
+
|
|
44
|
+
= link_to I18n.t("iugu.set_primary"), primary_domain_path(:account_id => @account.id, :domain_id => domain.id), :method => :post
|
45
|
+
|
28
46
|
|
|
29
|
-
|
47
|
+
- if domain.verified
|
48
|
+
= I18n.t("iugu.verified")
|
49
|
+
- else
|
50
|
+
= link_to I18n.t("iugu.not_verified"), account_domains_instructions_path(:account_id => @account.id, :domain_id => domain.id)
|
51
|
+
|
52
|
+
- if current_user.is?(:owner, @account)
|
53
|
+
|
|
54
|
+
= link_to I18n.t("iugu.remove"), account_domains_destroy_path(:account_id => @account.id, :domain_id => domain.id), :method => :delete
|
30
55
|
|
31
56
|
|
32
57
|
|
@@ -16,5 +16,7 @@
|
|
16
16
|
= I18n.t("iugu.removing")
|
17
17
|
- else
|
18
18
|
= link_to I18n.t("iugu.undo"), account_users_cancel_destruction_path(:account_id => account_user.account_id, :user_id => account_user.user_id), :method => 'delete'
|
19
|
-
|
20
|
-
|
19
|
+
|
20
|
+
- if current_user.is?(:owner, @account) || current_user.is?(:admin, @account)
|
21
|
+
%div
|
22
|
+
= link_to I18n.t("iugu.invite"), new_invite_path(:account_id => @account.id)
|
@@ -1,12 +1,26 @@
|
|
1
|
-
= simple_form_for @user_invitation, :url => create_invite_path(
|
1
|
+
= simple_form_for @user_invitation, :url => create_invite_path(@account.id), :method => :post do |f|
|
2
|
+
- if @user_invitation.errors.any?
|
3
|
+
#error_explanation{ :style => "margin-bottom: 15px" }
|
4
|
+
%ul
|
5
|
+
- @user_invitation.errors.full_messages.each do |msg|
|
6
|
+
%li
|
7
|
+
= msg
|
2
8
|
|
3
9
|
%div
|
4
10
|
= f.label :email
|
5
11
|
= f.email_field :email
|
6
|
-
-
|
7
|
-
|
8
|
-
|
9
|
-
|
12
|
+
- if current_user.is?(:owner, @account)
|
13
|
+
- APP_ROLES['roles'].each do |role|
|
14
|
+
%div
|
15
|
+
= check_box_tag "user_invitation[roles][]", role, false, :id => "#{role}_checkbox"
|
16
|
+
= label_tag "#{role}_checkbox", role
|
17
|
+
|
18
|
+
- if current_user.is?(:admin, @account)
|
19
|
+
- APP_ROLES['roles'].each do |role|
|
20
|
+
- unless role == APP_ROLES['owner_role'] || role == APP_ROLES['admin_role']
|
21
|
+
%div
|
22
|
+
= check_box_tag "user_invitation[roles][]", role, false, :id => "#{role}_checkbox"
|
23
|
+
= label_tag "#{role}_checkbox", role
|
10
24
|
|
11
25
|
%div
|
12
26
|
= f.submit I18n.t("iugu.invite")
|
@@ -8,4 +8,7 @@
|
|
8
8
|
= f.hidden_field :locale, :value => @matched_locale_from_browser
|
9
9
|
.actions
|
10
10
|
= f.button :submit, "Sign up"
|
11
|
-
|
11
|
+
|
12
|
+
= link_to I18n.t("iugu.try_first"), try_first_path, :method => :post
|
13
|
+
%br
|
14
|
+
= render :partial => "iugu/shared/links"
|