happy_seed 0.0.19 → 0.0.21
Sign up to get free protection for your applications and to get access to all the features.
- 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
|