happy_seed 0.0.19 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +4 -69
- data/bin/rails +12 -0
- data/bin/rspec +16 -0
- data/happy_seed.rb +5 -1
- data/happy_seed.txt +25 -18
- data/lib/generators/happy_seed/admin/admin_generator.rb +40 -5
- data/lib/generators/happy_seed/admin/templates/app/admin/campaigns.rb +10 -14
- data/lib/generators/happy_seed/admin/templates/app/admin/newsletter.rb +2 -2
- data/lib/generators/happy_seed/admin/templates/app/admin/user.rb +4 -1
- data/lib/generators/happy_seed/admin/templates/app/controllers/admin/stats_controller.rb +1 -1
- data/lib/generators/happy_seed/admin/templates/docs/README.07.admin.rdoc +33 -4
- data/lib/generators/happy_seed/angular_view/templates/docs/README.11.angular_view.rdoc +2 -4
- data/lib/generators/happy_seed/api/api_generator.rb +38 -39
- data/lib/generators/happy_seed/api/templates/app/controllers/api/v1/base_controller.rb +4 -5
- data/lib/generators/happy_seed/api/templates/app/controllers/api/v1/model_hash.rb +3 -20
- data/lib/generators/happy_seed/api/templates/app/controllers/api/v1/user_tokens_controller.rb +13 -36
- data/lib/generators/happy_seed/api/templates/app/controllers/api/v1/users_controller.rb +14 -40
- data/lib/generators/happy_seed/api/templates/config/initializers/apitome.rb +1 -1
- data/lib/generators/happy_seed/api/templates/docs/README.01.api.rdoc +4 -1
- data/lib/generators/happy_seed/api/templates/docs/api.md +2 -2
- data/lib/generators/happy_seed/api/templates/spec/acceptance/api/v1/user_tokens_spec.rb +10 -53
- data/lib/generators/happy_seed/api/templates/spec/acceptance/api/v1/users_spec.rb +17 -61
- data/lib/generators/happy_seed/base/base_generator.rb +47 -19
- data/lib/generators/happy_seed/base/templates/app/controllers/setup_controller.rb +1 -1
- data/lib/generators/happy_seed/base/templates/app/views/setup/index.html.haml +6 -3
- data/lib/generators/happy_seed/base/templates/application_controller.rb +1 -1
- data/lib/generators/happy_seed/base/templates/docs/README.00.base.rdoc +3 -3
- data/lib/generators/happy_seed/bootstrap/bootstrap_generator.rb +5 -2
- data/lib/generators/happy_seed/bootstrap/templates/app/assets/stylesheets/application.scss +5 -1
- data/lib/generators/happy_seed/bootstrap/templates/app/assets/stylesheets/components/_profile_panels.scss +62 -0
- data/lib/generators/happy_seed/bootstrap/templates/app/assets/stylesheets/components/_slideup_header.scss +51 -0
- data/lib/generators/happy_seed/bootstrap/templates/app/assets/stylesheets/shared/_grid.scss +0 -12
- data/lib/generators/happy_seed/bootstrap/templates/app/views/application/_javascripts.html.haml +7 -4
- data/lib/generators/happy_seed/bootstrap/templates/docs/README.01.bootstrap.rdoc +3 -0
- data/lib/generators/happy_seed/ckeditor/ckeditor_generator.rb +31 -0
- data/lib/generators/happy_seed/ckeditor/templates/docs/README.01.ckeditor.rdoc +35 -0
- data/lib/generators/happy_seed/devise/devise_generator.rb +12 -19
- data/lib/generators/happy_seed/devise/templates/app/views/devise/confirmations/new.html.haml +17 -0
- data/lib/generators/happy_seed/devise/templates/app/views/devise/mailer/confirmation_instructions.html.erb +14 -0
- data/lib/generators/happy_seed/devise/templates/app/views/devise/mailer/confirmation_instructions.text.rhtml +7 -0
- data/lib/generators/happy_seed/devise/templates/app/views/devise/mailer/password_change.html.erb +3 -0
- data/lib/generators/happy_seed/devise/templates/app/views/devise/mailer/reset_password_instructions.html.erb +15 -0
- data/lib/generators/happy_seed/devise/templates/app/views/devise/mailer/reset_password_instructions.text.erb +11 -0
- data/lib/generators/happy_seed/devise/templates/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/lib/generators/happy_seed/devise/templates/app/views/devise/passwords/edit.html.haml +14 -13
- data/lib/generators/happy_seed/devise/templates/app/views/devise/passwords/new.html.haml +12 -16
- data/lib/generators/happy_seed/devise/templates/app/views/devise/registrations/edit.html.haml +28 -40
- data/lib/generators/happy_seed/devise/templates/app/views/devise/registrations/new.html.haml +16 -24
- data/lib/generators/happy_seed/devise/templates/app/views/devise/sessions/new.html.haml +13 -18
- data/lib/generators/happy_seed/devise/templates/app/views/devise/shared/_links.html.erb +25 -0
- data/lib/generators/happy_seed/devise/templates/app/views/devise/unlocks/new.html.erb +16 -0
- data/lib/generators/happy_seed/devise/templates/docs/README.03.devise.rdoc +2 -2
- data/lib/generators/happy_seed/devise/templates/spec/factories/users.rb +5 -4
- data/lib/generators/happy_seed/devise/templates/spec/features/registration_spec.rb +149 -0
- data/lib/generators/happy_seed/devise/templates/spec/mailers/previews/devise_preview.rb +28 -0
- data/lib/generators/happy_seed/devise_confirmable/devise_confirmable_generator.rb +45 -0
- data/lib/generators/happy_seed/devise_confirmable/templates/add_confirmable_to_devise.rb +24 -0
- data/lib/generators/happy_seed/devise_confirmable/templates/app/controllers/confirmations_controller.rb +10 -0
- data/lib/generators/happy_seed/devise_confirmable/templates/app/views/devise/invitations/edit.html.haml +22 -0
- data/lib/generators/happy_seed/devise_confirmable/templates/app/views/devise/invitations/new.html.haml +20 -0
- data/lib/generators/happy_seed/devise_confirmable/templates/app/views/devise/mailer/invitation_instructions.html.erb +20 -0
- data/lib/generators/happy_seed/devise_confirmable/templates/docs/README.03.devise_confirmable.rdoc +23 -0
- data/lib/generators/happy_seed/devise_invitable/devise_invitable_generator.rb +3 -1
- data/lib/generators/happy_seed/devise_invitable/templates/app/views/devise/invitations/edit.html.haml +3 -2
- data/lib/generators/happy_seed/devise_invitable/templates/app/views/devise/invitations/new.html.haml +3 -2
- data/lib/generators/happy_seed/devise_invitable/templates/app/views/devise/mailer/invitation_instructions.html.erb +20 -0
- data/lib/generators/happy_seed/devise_invitable/templates/spec/features/invitations_spec.rb +61 -0
- data/lib/generators/happy_seed/facebook/facebook_generator.rb +2 -0
- data/lib/generators/happy_seed/facebook/templates/spec/features/facebook_registration_spec.rb +72 -0
- data/lib/generators/happy_seed/googleoauth/googleoauth_generator.rb +1 -1
- data/lib/generators/happy_seed/happy_seed_generator.rb +1 -3
- data/lib/generators/happy_seed/html_email/html_email_generator.rb +32 -0
- data/lib/generators/happy_seed/html_email/templates/app/views/layouts/mailer.html.erb +244 -0
- data/lib/generators/happy_seed/html_email/templates/docs/README.01.html_email.rdoc +25 -0
- data/lib/generators/happy_seed/omniauth/omniauth_generator.rb +4 -2
- data/lib/generators/happy_seed/omniauth/templates/app/controllers/omniauth_callbacks_controller.rb +3 -13
- data/lib/generators/happy_seed/omniauth/templates/app/models/identity.rb +13 -9
- data/lib/generators/happy_seed/omniauth/templates/docs/README.04.omniauth.rdoc +5 -5
- data/lib/generators/happy_seed/omniauth/templates/spec/factories/oauth.rb +6 -1
- data/lib/generators/happy_seed/omniauth/templates/spec/features/oauth_registration_spec.rb +80 -0
- data/lib/generators/happy_seed/omniauth/templates/spec/models/identity_spec.rb +39 -12
- data/lib/generators/happy_seed/omniauth/templates/{app/models/form_user.rb → user.rb} +4 -5
- data/lib/generators/happy_seed/plugin/plugin_generator.rb +13 -11
- data/lib/generators/happy_seed/react/react_generator.rb +36 -0
- data/lib/generators/happy_seed/react/templates/docs/README.10.react.rdoc +20 -0
- data/lib/generators/happy_seed/roles/roles_generator.rb +38 -0
- data/lib/generators/happy_seed/roles/templates/ability.rb +9 -0
- data/lib/generators/happy_seed/roles/templates/docs/README.03.roles.rdoc +23 -0
- data/lib/generators/happy_seed/simple_cms/simple_cms_generator.rb +41 -0
- data/lib/generators/happy_seed/simple_cms/templates/app/admin/simple_content.rb +42 -0
- data/lib/generators/happy_seed/simple_cms/templates/app/controllers/simple_content_controller.rb +7 -0
- data/lib/generators/happy_seed/simple_cms/templates/app/models/simple_content.rb +5 -0
- data/lib/generators/happy_seed/simple_cms/templates/app/views/splash/faq.html.haml +13 -0
- data/lib/generators/happy_seed/simple_cms/templates/app/views/splash/index.html.haml +79 -0
- data/lib/generators/happy_seed/simple_cms/templates/application_helper.rb +18 -0
- data/lib/generators/happy_seed/simple_cms/templates/create_simple_contents.rb +14 -0
- data/lib/generators/happy_seed/simple_cms/templates/docs/README.04.simple_cms.rdoc +32 -0
- data/lib/generators/happy_seed/simple_cms/templates/spec/factories/oauth.rb +10 -0
- data/lib/generators/happy_seed/simple_cms/templates/spec/features/oauth_registration_spec.rb +80 -0
- data/lib/generators/happy_seed/simple_cms/templates/spec/models/identity_spec.rb +49 -0
- data/lib/generators/happy_seed/splash/templates/app/assets/stylesheets/splash.css.scss +119 -84
- data/lib/generators/happy_seed/splash/templates/app/controllers/splash_controller.rb +1 -1
- data/lib/generators/happy_seed/splash/templates/app/views/layouts/splash.html.haml +15 -18
- data/lib/generators/happy_seed/splash/templates/app/views/splash/index.html.haml +54 -92
- data/lib/generators/happy_seed/splash/templates/docs/README.02.splash.rdoc +2 -2
- data/lib/generators/happy_seed/splash/templates/spec/controllers/splash_controller_spec.rb +11 -3
- data/lib/generators/happy_seed/static/templates/source/stylesheets/application.css.scss +1 -1
- data/lib/generators/happy_seed/static_blog/templates/Gemfile.lock +45 -49
- data/lib/generators/happy_seed/twitter/templates/spec/features/twitter_oauth_registration_spec.rb +57 -0
- data/lib/generators/happy_seed/twitter/twitter_generator.rb +2 -1
- data/lib/happy_seed/cli.rb +1 -1
- data/lib/happy_seed/engine.rb +12 -0
- data/lib/happy_seed/version.rb +1 -1
- data/lib/tasks/seed.rake +56 -0
- data/{test → spec}/dummy/Rakefile +0 -0
- data/spec/dummy/app/assets/config/manifest.js +5 -0
- data/{test → spec}/dummy/app/assets/javascripts/application.js +3 -3
- data/spec/dummy/app/assets/javascripts/cable.coffee +11 -0
- data/{test → spec}/dummy/app/assets/stylesheets/application.css +4 -4
- data/spec/dummy/app/channels/application_cable/channel.rb +5 -0
- data/spec/dummy/app/channels/application_cable/connection.rb +5 -0
- data/{test → spec}/dummy/app/controllers/application_controller.rb +0 -0
- data/{test → spec}/dummy/app/helpers/application_helper.rb +0 -0
- data/spec/dummy/app/jobs/application_job.rb +2 -0
- data/spec/dummy/app/mailers/application_mailer.rb +4 -0
- data/spec/dummy/app/models/application_record.rb +3 -0
- data/spec/dummy/app/views/layouts/application.html.erb +15 -0
- data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
- data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/{test → spec}/dummy/bin/bundle +0 -0
- data/{test → spec}/dummy/bin/rails +1 -1
- data/{test → spec}/dummy/bin/rake +0 -0
- data/spec/dummy/bin/setup +34 -0
- data/spec/dummy/bin/update +29 -0
- data/spec/dummy/config.ru +8 -0
- data/spec/dummy/config/application.rb +21 -0
- data/{test → spec}/dummy/config/boot.rb +0 -0
- data/spec/dummy/config/cable.yml +10 -0
- data/{test → spec}/dummy/config/database.yml +0 -0
- data/{test → spec}/dummy/config/environment.rb +0 -0
- data/{test → spec}/dummy/config/environments/development.rb +28 -3
- data/{test → spec}/dummy/config/environments/production.rb +29 -24
- data/{test → spec}/dummy/config/environments/test.rb +6 -3
- data/spec/dummy/config/initializers/active_record_belongs_to_required_by_default.rb +6 -0
- data/spec/dummy/config/initializers/application_controller_renderer.rb +6 -0
- data/{test → spec}/dummy/config/initializers/assets.rb +3 -0
- data/{test → spec}/dummy/config/initializers/backtrace_silencers.rb +0 -0
- data/spec/dummy/config/initializers/callback_terminator.rb +6 -0
- data/{test → spec}/dummy/config/initializers/cookies_serializer.rb +3 -1
- data/{test → spec}/dummy/config/initializers/filter_parameter_logging.rb +0 -0
- data/{test → spec}/dummy/config/initializers/inflections.rb +0 -0
- data/{test → spec}/dummy/config/initializers/mime_types.rb +0 -0
- data/spec/dummy/config/initializers/per_form_csrf_tokens.rb +4 -0
- data/spec/dummy/config/initializers/request_forgery_protection.rb +4 -0
- data/{test → spec}/dummy/config/initializers/session_store.rb +0 -0
- data/{test → spec}/dummy/config/initializers/wrap_parameters.rb +2 -2
- data/{test → spec}/dummy/config/locales/en.yml +0 -0
- data/spec/dummy/config/puma.rb +47 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/{test → spec}/dummy/config/secrets.yml +3 -3
- data/spec/dummy/db/schema.rb +16 -0
- data/{test → spec}/dummy/public/404.html +0 -0
- data/{test → spec}/dummy/public/422.html +0 -0
- data/{test → spec}/dummy/public/500.html +0 -0
- data/{test/dummy/public/favicon.ico → spec/dummy/public/apple-touch-icon-precomposed.png} +0 -0
- data/spec/dummy/public/apple-touch-icon.png +0 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/rails_helper.rb +58 -0
- data/spec/spec_helper.rb +91 -0
- metadata +195 -89
- data/lib/generators/happy_seed/api/templates/app/controllers/api/v1/configurations_controller.rb +0 -11
- data/lib/generators/happy_seed/api/templates/spec/acceptance/api/v1/configurations_spec.rb +0 -21
- data/lib/generators/happy_seed/base/templates/config/puma.rb +0 -15
- data/lib/generators/happy_seed/base/templates/spec/support/controller_helpers.rb +0 -12
- data/lib/generators/happy_seed/bootstrap/templates/app/assets/stylesheets/sections/_profile_page.scss +0 -9
- data/lib/generators/happy_seed/bootstrap/templates/lib/templates/haml/scaffold/_form.html.haml +0 -5
- data/lib/generators/happy_seed/devise/templates/spec/features/forgot_password_spec.rb +0 -54
- data/lib/generators/happy_seed/devise/templates/test/mailers/previews/devise_preview.rb +0 -13
- data/lib/generators/happy_seed/omniauth/templates/spec/features/registration_spec.rb +0 -81
- data/lib/generators/happy_seed/static/templates/Gemfile.lock +0 -158
- data/lib/tasks/seed_tasks.rake +0 -4
- data/test/dummy/README.rdoc +0 -28
- data/test/dummy/app/views/layouts/application.html.erb +0 -14
- data/test/dummy/config.ru +0 -4
- data/test/dummy/config/application.rb +0 -23
- data/test/dummy/config/initializers/jazz_hands.rb +0 -5
- data/test/dummy/config/routes.rb +0 -56
- data/test/seed_test.rb +0 -7
- data/test/test_helper.rb +0 -15
@@ -1,7 +1,7 @@
|
|
1
1
|
class Api::V1::BaseController < ApplicationController
|
2
2
|
include ModelHash
|
3
3
|
|
4
|
-
attr_accessor :current_user, :current_user_token
|
4
|
+
attr_accessor :current_user, :current_user_token
|
5
5
|
|
6
6
|
protected
|
7
7
|
|
@@ -10,11 +10,10 @@ class Api::V1::BaseController < ApplicationController
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def requires_authentication_token
|
13
|
-
authenticate_or_request_with_http_token do |token,
|
14
|
-
self.
|
15
|
-
self.current_user_token = UserToken.where(token: token, installation_identifier: installation_identifier).first
|
13
|
+
authenticate_or_request_with_http_token do |token, _|
|
14
|
+
self.current_user_token = UserToken.find_by access_token: token
|
16
15
|
self.current_user = sign_in(:user, current_user_token.user) if current_user_token.try(:user).present?
|
17
16
|
current_user.present? ? (current_user_token.try(:touch); true) : false
|
18
17
|
end
|
19
18
|
end
|
20
|
-
end
|
19
|
+
end
|
@@ -1,34 +1,17 @@
|
|
1
1
|
module Api::V1::ModelHash
|
2
|
-
def configuration_hash
|
3
|
-
{
|
4
|
-
pusher: {
|
5
|
-
url: Rails.application.secrets.pusher_url
|
6
|
-
},
|
7
|
-
aws: {
|
8
|
-
access_key_id: Rails.application.secrets.aws_access_key_id,
|
9
|
-
secret_access_key: Rails.application.secrets.aws_secret_access_key,
|
10
|
-
s3_bucket: Rails.application.secrets.s3_bucket
|
11
|
-
}
|
12
|
-
}
|
13
|
-
end
|
14
|
-
|
15
2
|
def user_hash(user)
|
16
3
|
{
|
17
4
|
id: user.id,
|
18
|
-
|
19
|
-
email: user.email,
|
20
|
-
first_name: user.first_name,
|
21
|
-
last_name: user.last_name
|
5
|
+
email: user.email
|
22
6
|
}
|
23
7
|
end
|
24
8
|
|
25
9
|
def user_token_hash(user_token, *args)
|
26
10
|
options = args.extract_options!
|
27
11
|
output = {
|
28
|
-
|
29
|
-
push_token: user_token.push_token
|
12
|
+
access_token: user_token.access_token
|
30
13
|
}
|
31
14
|
output.update(user: user_hash(user_token.user)) if true == options[:user]
|
32
15
|
output
|
33
16
|
end
|
34
|
-
end
|
17
|
+
end
|
data/lib/generators/happy_seed/api/templates/app/controllers/api/v1/user_tokens_controller.rb
CHANGED
@@ -3,56 +3,33 @@ class Api::V1::UserTokensController < Api::V1::BaseController
|
|
3
3
|
|
4
4
|
def create
|
5
5
|
respond_to do |format|
|
6
|
-
user = User.where('LOWER(email) = ?',
|
6
|
+
user = User.where('LOWER(email) = ?', user_params[:email].try(:downcase)).first
|
7
7
|
if user.present?
|
8
|
-
if user.valid_password?(
|
8
|
+
if user.valid_password?(user_params[:password])
|
9
9
|
if user.active_for_authentication?
|
10
|
-
user_token = user.user_tokens.
|
11
|
-
user_token.update push_token: user_token_params[:push_token]
|
12
|
-
user_token.update form_factor: user_token_params[:form_factor]
|
13
|
-
user_token.update os: user_token_params[:os]
|
10
|
+
user_token = user.user_tokens.create
|
14
11
|
if user_token.persisted?
|
15
12
|
format.json do
|
16
|
-
render json: {user_token: user_token_hash(user_token, user: true)}, status: :ok
|
13
|
+
render json: { user_token: user_token_hash(user_token, user: true) }, status: :ok
|
17
14
|
end
|
18
15
|
else
|
19
16
|
format.json do
|
20
|
-
render json: {errors: user_token.errors}, status: :unprocessable_entity
|
17
|
+
render json: { errors: user_token.errors }, status: :unprocessable_entity
|
21
18
|
end
|
22
19
|
end
|
23
20
|
else
|
24
21
|
format.json do
|
25
|
-
render json: {errors: {user: 'is locked'}}, status: :forbidden
|
22
|
+
render json: { errors: { user: 'is locked' } }, status: :forbidden
|
26
23
|
end
|
27
24
|
end
|
28
25
|
else
|
29
26
|
format.json do
|
30
|
-
render json: {errors: {password: 'is invalid'}}, status: :forbidden
|
27
|
+
render json: { errors: { password: 'is invalid' } }, status: :forbidden
|
31
28
|
end
|
32
29
|
end
|
33
30
|
else
|
34
31
|
format.json do
|
35
|
-
render json: {errors: {email: 'not found'}}, status: :not_found
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def update
|
42
|
-
respond_to do |format|
|
43
|
-
if current_user_token.try(:persisted?)
|
44
|
-
if current_user_token.update(user_token_params.slice :push_token)
|
45
|
-
format.json do
|
46
|
-
render json: {user_token: user_token_hash(current_user_token)}, status: :ok
|
47
|
-
end
|
48
|
-
else
|
49
|
-
format.json do
|
50
|
-
render json: {errors: current_user_token.errors}, status: :unprocessable_entity
|
51
|
-
end
|
52
|
-
end
|
53
|
-
else
|
54
|
-
format.json do
|
55
|
-
render json: {errors: {token: 'not found'}}, status: :not_found
|
32
|
+
render json: { errors: { email: 'not found' } }, status: :not_found
|
56
33
|
end
|
57
34
|
end
|
58
35
|
end
|
@@ -63,11 +40,11 @@ class Api::V1::UserTokensController < Api::V1::BaseController
|
|
63
40
|
if current_user_token.try(:persisted?)
|
64
41
|
current_user_token.destroy
|
65
42
|
format.json do
|
66
|
-
render json: {user_token: user_token_hash(current_user_token, user: true)}, status: :ok
|
43
|
+
render json: { user_token: user_token_hash(current_user_token, user: true) }, status: :ok
|
67
44
|
end
|
68
45
|
else
|
69
46
|
format.json do
|
70
|
-
render json: {errors: {token: 'not found'}}, status: :not_found
|
47
|
+
render json: { errors: { token: 'not found' } }, status: :not_found
|
71
48
|
end
|
72
49
|
end
|
73
50
|
end
|
@@ -75,7 +52,7 @@ class Api::V1::UserTokensController < Api::V1::BaseController
|
|
75
52
|
|
76
53
|
private
|
77
54
|
|
78
|
-
def
|
79
|
-
params[:
|
55
|
+
def user_params
|
56
|
+
params[:user].permit :email, :password
|
80
57
|
end
|
81
|
-
end
|
58
|
+
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
class Api::V1::UsersController < Api::V1::BaseController
|
3
2
|
before_action :requires_authentication_token, except: %w(create forgot_password reset_password)
|
4
3
|
before_action :set_user, only: %w(show update)
|
@@ -7,11 +6,11 @@ class Api::V1::UsersController < Api::V1::BaseController
|
|
7
6
|
respond_to do |format|
|
8
7
|
if @user.present?
|
9
8
|
format.json do
|
10
|
-
render json: {user: user_hash(@user)}, status: :ok
|
9
|
+
render json: { user: user_hash(@user) }, status: :ok
|
11
10
|
end
|
12
11
|
else
|
13
12
|
format.json do
|
14
|
-
render json: {errors: {id: 'not found'}}, status: :not_found
|
13
|
+
render json: { errors: { id: 'not found' } }, status: :not_found
|
15
14
|
end
|
16
15
|
end
|
17
16
|
end
|
@@ -21,39 +20,19 @@ class Api::V1::UsersController < Api::V1::BaseController
|
|
21
20
|
respond_to do |format|
|
22
21
|
user = User.new user_params
|
23
22
|
if user.save
|
24
|
-
user_token = user.user_tokens.
|
23
|
+
user_token = user.user_tokens.create
|
25
24
|
if user_token.persisted?
|
26
25
|
format.json do
|
27
|
-
render json: {user_token: user_token_hash(user_token, user: true)}, status: :created
|
28
|
-
end
|
29
|
-
else
|
30
|
-
format.json do
|
31
|
-
render json: {errors: user_token.errors}, status: :unprocessable_entity
|
32
|
-
end
|
33
|
-
end
|
34
|
-
else
|
35
|
-
format.json do
|
36
|
-
render json: {errors: user.errors}, status: :unprocessable_entity
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def update
|
43
|
-
respond_to do |format|
|
44
|
-
if @user.present?
|
45
|
-
if @user.update(user_params)
|
46
|
-
format.json do
|
47
|
-
render json: {user: user_hash(@user)}, status: :ok
|
26
|
+
render json: { user_token: user_token_hash(user_token, user: true) }, status: :created
|
48
27
|
end
|
49
28
|
else
|
50
29
|
format.json do
|
51
|
-
render json: {errors:
|
30
|
+
render json: { errors: user_token.errors }, status: :unprocessable_entity
|
52
31
|
end
|
53
32
|
end
|
54
33
|
else
|
55
34
|
format.json do
|
56
|
-
render json: {errors:
|
35
|
+
render json: { errors: user.errors }, status: :unprocessable_entity
|
57
36
|
end
|
58
37
|
end
|
59
38
|
end
|
@@ -61,14 +40,14 @@ class Api::V1::UsersController < Api::V1::BaseController
|
|
61
40
|
|
62
41
|
def forgot_password
|
63
42
|
respond_to do |format|
|
64
|
-
user =
|
43
|
+
user = User.find_by email: user_params[:email]
|
65
44
|
format.json do
|
66
45
|
if user.present?
|
67
46
|
user.send_reset_password_instructions
|
68
47
|
user.save
|
69
|
-
render json: {user: user_hash(user).slice(:email)}, status: :ok
|
48
|
+
render json: { user: user_hash(user).slice(:email) }, status: :ok
|
70
49
|
else
|
71
|
-
render json: {errors: {email: 'not found'}}, status: :not_found
|
50
|
+
render json: { errors: { email: 'not found' } }, status: :not_found
|
72
51
|
end
|
73
52
|
end
|
74
53
|
end
|
@@ -80,13 +59,12 @@ class Api::V1::UsersController < Api::V1::BaseController
|
|
80
59
|
format.json do
|
81
60
|
if user.present?
|
82
61
|
if user.errors.empty?
|
83
|
-
render json: {user: user_hash(user)}, status: :ok
|
62
|
+
render json: { user: user_hash(user) }, status: :ok
|
84
63
|
else
|
85
|
-
|
86
|
-
render json: {errors: user.errors}, status: :unprocessable_entity
|
64
|
+
render json: { errors: user.errors }, status: :unprocessable_entity
|
87
65
|
end
|
88
66
|
else
|
89
|
-
render json: {errors: {email: 'not found'}}, status: :not_found
|
67
|
+
render json: { errors: { email: 'not found' } }, status: :not_found
|
90
68
|
end
|
91
69
|
end
|
92
70
|
end
|
@@ -99,10 +77,6 @@ class Api::V1::UsersController < Api::V1::BaseController
|
|
99
77
|
end
|
100
78
|
|
101
79
|
def user_params
|
102
|
-
params.require(:user).permit :email, :password, :username, :
|
103
|
-
end
|
104
|
-
|
105
|
-
def user_token_params
|
106
|
-
params[:user_token].permit :installation_identifier
|
80
|
+
params.require(:user).permit :email, :password, :username, :reset_password_token, :password_confirmation, invited: %w(email full_name).map(&:to_sym)
|
107
81
|
end
|
108
|
-
end
|
82
|
+
end
|
@@ -2,7 +2,7 @@ Apitome.setup do |config|
|
|
2
2
|
# This determines where the Apitome routes will be mounted. Changing this to '/api/documentation' for instance would
|
3
3
|
# allow you to browse to http://localhost:3000/api/documentation to see your api documentation. Set to nil and mount
|
4
4
|
# it yourself if you need to.
|
5
|
-
config.mount_at = '/api
|
5
|
+
config.mount_at = '/docs/api'
|
6
6
|
|
7
7
|
# This defaults to Rails.root if left nil. If you're providing documentation for an engine using a dummy application
|
8
8
|
# it can be useful to set this to your engines root.. E.g. Application::Engine.root
|
@@ -10,7 +10,10 @@ The `happy_seed:api` generator
|
|
10
10
|
|
11
11
|
### Why do you want this?
|
12
12
|
|
13
|
-
|
13
|
+
1. creates a base api framework for a project that is not exclusively api, and has html as well
|
14
|
+
2. creates user signup, login and logout endpoints
|
15
|
+
3. creates integration tests for these endpoints
|
16
|
+
4. generates documentation at docs/api for these endpoints
|
14
17
|
|
15
18
|
### Environment Variables
|
16
19
|
|
@@ -5,32 +5,25 @@ resource 'Token' do
|
|
5
5
|
let(:user) { FactoryGirl.create :user_with_token }
|
6
6
|
|
7
7
|
post '/v1/token', format: :json do
|
8
|
-
|
9
|
-
|
10
|
-
parameter :
|
11
|
-
parameter :
|
12
|
-
parameter :form_factor, 'smartphone tablet10 tablet7 desktop', required: true, scope: :user_token
|
13
|
-
parameter :os, 'ios android bb wp7', required: true, scope: :user_token
|
8
|
+
before { user.user_tokens.destroy }
|
9
|
+
|
10
|
+
parameter :email, 'Email', required: true, scope: :user
|
11
|
+
parameter :password, 'Password', required: true, scope: :user
|
14
12
|
|
15
13
|
let(:email) { user.email }
|
16
14
|
let(:password) { user.password }
|
17
|
-
let(:installation_identifier) { Faker::Lorem.characters 10 }
|
18
|
-
let(:push_token) { Faker::Lorem.characters 10 }
|
19
|
-
let(:form_factor) { %w(smartphone tablet10 tablet7 desktop).sample }
|
20
|
-
let(:os) { %w(ios android bb wp7).sample }
|
21
15
|
|
22
16
|
example_request 'sign in' do
|
23
17
|
response_json = JSON.parse response_body
|
24
18
|
|
25
19
|
expect(response_headers['Content-Type']).to eq('application/json; charset=utf-8')
|
26
20
|
expect(status).to eq(200)
|
27
|
-
expect(response_json['user_token']).to have_key('
|
28
|
-
expect(response_json['user_token']['push_token']).to eq(push_token)
|
21
|
+
expect(response_json['user_token']).to have_key('access_token')
|
29
22
|
expect(response_json['user_token']).to have_key('user')
|
30
23
|
end
|
31
24
|
|
32
25
|
example 'sign in with wrong email', document: false do
|
33
|
-
do_request params.tap { |parameters| parameters['
|
26
|
+
do_request params.tap { |parameters| parameters['user']['email'] = Faker::Internet.free_email }
|
34
27
|
response_json = JSON.parse response_body
|
35
28
|
|
36
29
|
expect(status).to eq(404)
|
@@ -38,62 +31,26 @@ resource 'Token' do
|
|
38
31
|
expect(response_json['errors']).to have_key('email')
|
39
32
|
end
|
40
33
|
|
41
|
-
# example 'sign in with locked user', document: false do
|
42
|
-
# user.lock_access! send_instructions: false
|
43
|
-
# do_request
|
44
|
-
# response_json = JSON.parse response_body
|
45
|
-
|
46
|
-
# expect(status).to eq(403)
|
47
|
-
# expect(response_json['id']).to be_nil
|
48
|
-
# expect(response_json['errors']).to have_key('user')
|
49
|
-
# end
|
50
|
-
|
51
34
|
example 'sign in with wrong password', document: false do
|
52
|
-
do_request params.tap { |parameters| parameters['
|
35
|
+
do_request params.tap { |parameters| parameters['user']['password'] = Faker::Lorem.characters 8 }
|
53
36
|
response_json = JSON.parse response_body
|
54
37
|
|
55
38
|
expect(status).to eq(403)
|
56
39
|
expect(response_json['id']).to be_nil
|
57
40
|
expect(response_json['errors']).to have_key('password')
|
58
41
|
end
|
59
|
-
|
60
|
-
example 'sign in without installation identifier', document: false do
|
61
|
-
do_request params.tap { |parameters| parameters['user_token'].delete 'installation_identifier' }
|
62
|
-
response_json = JSON.parse response_body
|
63
|
-
|
64
|
-
expect(status).to eq(422)
|
65
|
-
expect(response_json['id']).to be_nil
|
66
|
-
expect(response_json['errors']).to have_key('installation_identifier')
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
put '/v1/token', format: :json do
|
71
|
-
header 'AUTHORIZATION', :token
|
72
|
-
|
73
|
-
parameter :push_token, 'Unique push token', required: true, scope: :user_token
|
74
|
-
|
75
|
-
let(:token) { ActionController::HttpAuthentication::Token.encode_credentials user.user_tokens.first.try(:token), installation_identifier: user.user_tokens.first.try(:installation_identifier) }
|
76
|
-
let(:push_token) { Faker::Lorem.characters 10 }
|
77
|
-
|
78
|
-
example_request 'update' do
|
79
|
-
explanation 'At the moment, only push token can be updated'
|
80
|
-
response_json = JSON.parse response_body
|
81
|
-
|
82
|
-
expect(status).to eq(200)
|
83
|
-
expect(response_json['user_token']['push_token']).to eq(push_token)
|
84
|
-
end
|
85
42
|
end
|
86
43
|
|
87
44
|
delete '/v1/token', format: :json do
|
88
45
|
header 'AUTHORIZATION', :token
|
89
|
-
let(:token) { ActionController::HttpAuthentication::Token.encode_credentials user.user_tokens.first.try
|
46
|
+
let(:token) { ActionController::HttpAuthentication::Token.encode_credentials user.user_tokens.first.try :access_token }
|
90
47
|
|
91
48
|
example_request 'sign out' do
|
92
49
|
response_json = JSON.parse response_body
|
93
50
|
|
94
51
|
expect(status).to eq(200)
|
95
|
-
expect(response_json['user_token']).to have_key('
|
52
|
+
expect(response_json['user_token']).to have_key('access_token')
|
96
53
|
expect(response_json['user_token']).to have_key('user')
|
97
54
|
end
|
98
55
|
end
|
99
|
-
end
|
56
|
+
end
|
@@ -1,51 +1,35 @@
|
|
1
1
|
require 'rails_helper'
|
2
2
|
require 'rspec_api_documentation/dsl'
|
3
3
|
|
4
|
-
class User
|
5
|
-
def _set_reset_password_token
|
6
|
-
set_reset_password_token
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
4
|
resource 'User' do
|
11
5
|
let(:user) { FactoryGirl.build :user_with_token }
|
12
|
-
# before {
|
13
|
-
# @request.env["devise.mapping"] = Devise.mappings[:user]
|
14
|
-
# }
|
15
6
|
|
16
7
|
post '/v1/users', format: :json do
|
17
|
-
parameter :first_name, 'First Name', scope: :user
|
18
|
-
parameter :last_name, 'Last Name', scope: :user
|
19
|
-
parameter :login, 'Login', required: true, scope: :user
|
20
8
|
parameter :email, 'Email', required: true, scope: :user
|
21
9
|
parameter :password, 'Password', required: true, scope: :user
|
22
|
-
parameter :installation_identifier, 'Unique Installation Identifier', required: true, scope: :user_token
|
23
|
-
parameter :avatar, 'Avatar', scope: :user
|
24
10
|
|
25
|
-
let(:first_name) { user.first_name }
|
26
|
-
let(:last_name) { user.last_name }
|
27
|
-
let(:login) { user.login }
|
28
11
|
let(:email) { user.email }
|
29
12
|
let(:password) { user.password }
|
30
|
-
let(:installation_identifier) { Faker::Lorem.characters 10 }
|
31
|
-
# let(:avatar) { fixture_file_upload Rails.root.join('spec', 'resources', 'photo.jpg'), 'image/jpeg' }
|
32
13
|
|
33
14
|
example_request 'sign up' do
|
34
15
|
response_json = JSON.parse response_body
|
35
16
|
|
36
17
|
expect(status).to eq(201)
|
37
|
-
expect(response_json['user_token']).to have_key('
|
18
|
+
expect(response_json['user_token']).to have_key('access_token')
|
38
19
|
expect(response_json['user_token']).to have_key('user')
|
39
20
|
end
|
40
|
-
end
|
41
21
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
22
|
+
example 'sign up error', document: false do
|
23
|
+
do_request params.tap { |parameters| parameters['user']['email'] = nil }
|
24
|
+
response_json = JSON.parse response_body
|
25
|
+
|
26
|
+
expect(status).to eq(422)
|
27
|
+
expect(response_json['errors']).to have_key('email')
|
47
28
|
end
|
29
|
+
end
|
48
30
|
|
31
|
+
post '/v1/users/forgot_password', format: :json do
|
32
|
+
before { user.save }
|
49
33
|
|
50
34
|
parameter :email, 'Email', required: true, scope: :user
|
51
35
|
let(:email) { user.email }
|
@@ -53,28 +37,26 @@ resource 'User' do
|
|
53
37
|
example_request 'forgot password' do
|
54
38
|
response_json = JSON.parse response_body
|
55
39
|
|
56
|
-
expect(status).to eq
|
40
|
+
expect(status).to eq 200
|
57
41
|
expect(response_json['user']['email']).to eq(email)
|
58
42
|
end
|
59
43
|
end
|
60
44
|
|
61
45
|
put '/v1/users/reset_password', format: :json do
|
62
|
-
before
|
63
|
-
user.save
|
64
|
-
end
|
46
|
+
before { user.save }
|
65
47
|
|
66
48
|
parameter :reset_password_token, 'Reset password token', required: true, scope: :user
|
67
49
|
parameter :password, 'Password', required: true, scope: :user
|
68
50
|
parameter :password_confirmation, 'Password confirmation', required: true, scope: :user
|
69
51
|
|
70
|
-
let(:reset_password_token) { user.
|
52
|
+
let(:reset_password_token) { user.send :set_reset_password_token }
|
71
53
|
let(:password) { Faker::Internet.password 8 }
|
72
54
|
let(:password_confirmation) { password }
|
73
55
|
|
74
56
|
example_request 'reset password' do
|
75
57
|
response_json = JSON.parse response_body
|
76
58
|
|
77
|
-
expect(status).to eq
|
59
|
+
expect(status).to eq 200
|
78
60
|
expect(response_json['user']).to have_key('id')
|
79
61
|
end
|
80
62
|
end
|
@@ -86,40 +68,14 @@ resource 'User' do
|
|
86
68
|
|
87
69
|
parameter :id, 'User Unique Identifier', required: true
|
88
70
|
|
89
|
-
let(:token) { ActionController::HttpAuthentication::Token.encode_credentials user.user_tokens.first.try(:
|
71
|
+
let(:token) { ActionController::HttpAuthentication::Token.encode_credentials user.user_tokens.first.try(:access_token) }
|
90
72
|
let(:id) { user.id }
|
91
73
|
|
92
74
|
example_request 'show' do
|
93
75
|
response_json = JSON.parse response_body
|
94
76
|
|
95
|
-
expect(status).to eq
|
77
|
+
expect(status).to eq 200
|
96
78
|
expect(response_json['user']).to have_key('id')
|
97
79
|
end
|
98
80
|
end
|
99
|
-
|
100
|
-
put '/v1/users/:id', format: :json do
|
101
|
-
before { user.save }
|
102
|
-
|
103
|
-
header 'AUTHORIZATION', :token
|
104
|
-
|
105
|
-
parameter :id, 'User Unique Identifier', required: true
|
106
|
-
parameter :first_name, 'Full Name', scope: :user
|
107
|
-
parameter :last_name, 'Full Name', scope: :user
|
108
|
-
parameter :login, 'User Name', scope: :user
|
109
|
-
|
110
|
-
let(:token) { ActionController::HttpAuthentication::Token.encode_credentials user.user_tokens.first.try(:token), installation_identifier: user.user_tokens.first.try(:installation_identifier) }
|
111
|
-
let(:id) { user.id }
|
112
|
-
let(:first_name) { Faker::Name.first_name }
|
113
|
-
let(:last_name) { Faker::Name.last_name }
|
114
|
-
let(:login) { Faker::Internet.user_name }
|
115
|
-
# let(:avatar) { fixture_file_upload Rails.root.join('spec', 'resources', 'photo.jpg'), 'image/jpeg' }
|
116
|
-
|
117
|
-
example_request 'update' do
|
118
|
-
explanation 'While this illustrates all possible parameters, any subset can be used. Example: to change only full_name, omit other optional parameters'
|
119
|
-
response_json = JSON.parse response_body
|
120
|
-
|
121
|
-
expect(status).to eq(200)
|
122
|
-
expect(response_json['user']).to have_key('id')
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
81
|
+
end
|