client_manager 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +128 -0
  3. data/Rakefile +37 -0
  4. data/app/assets/config/client_manager_manifest.js +2 -0
  5. data/app/assets/javascripts/client_manager/application.js +16 -0
  6. data/app/assets/javascripts/client_manager/clipboard.min.js +7 -0
  7. data/app/assets/javascripts/client_manager/oneui.min.js +5 -0
  8. data/app/assets/javascripts/client_manager/passwords.js +2 -0
  9. data/app/assets/javascripts/client_manager/sessions.js +2 -0
  10. data/app/assets/javascripts/client_manager/users.js +2 -0
  11. data/app/assets/stylesheets/client_manager/application.css +17 -0
  12. data/app/assets/stylesheets/client_manager/bootstrap.min.css +5 -0
  13. data/app/assets/stylesheets/client_manager/custom.css +23 -0
  14. data/app/assets/stylesheets/client_manager/oneui.min.css +4 -0
  15. data/app/assets/stylesheets/client_manager/passwords.css +4 -0
  16. data/app/assets/stylesheets/client_manager/sessions.css +4 -0
  17. data/app/assets/stylesheets/client_manager/users.css +4 -0
  18. data/app/controllers/client_manager/application_controller.rb +31 -0
  19. data/app/controllers/client_manager/clients_controller.rb +46 -0
  20. data/app/controllers/client_manager/concerns/set_client_by_token.rb +40 -0
  21. data/app/controllers/client_manager/passwords_controller.rb +26 -0
  22. data/app/controllers/client_manager/sessions_controller.rb +38 -0
  23. data/app/controllers/client_manager/users_controller.rb +121 -0
  24. data/app/helpers/client_manager/application_helper.rb +5 -0
  25. data/app/helpers/client_manager/passwords_helper.rb +4 -0
  26. data/app/helpers/client_manager/sessions_helper.rb +4 -0
  27. data/app/helpers/client_manager/users_helper.rb +4 -0
  28. data/app/jobs/client_manager/application_job.rb +4 -0
  29. data/app/mailers/client_manager/application_mailer.rb +6 -0
  30. data/app/mailers/client_manager/registration_mailer.rb +12 -0
  31. data/app/models/client_manager/application_record.rb +5 -0
  32. data/app/models/client_manager/client.rb +33 -0
  33. data/app/models/client_manager/user.rb +42 -0
  34. data/app/views/client_manager/clients/index.html.erb +37 -0
  35. data/app/views/client_manager/clients/new.html.erb +27 -0
  36. data/app/views/client_manager/clients/show.html.erb +41 -0
  37. data/app/views/client_manager/passwords/change.html.erb +46 -0
  38. data/app/views/client_manager/registration_mailer/registration_email.html.erb +90 -0
  39. data/app/views/client_manager/sessions/login.html.erb +53 -0
  40. data/app/views/client_manager/users/edit.html.erb +55 -0
  41. data/app/views/client_manager/users/index.html.erb +53 -0
  42. data/app/views/client_manager/users/new.html.erb +39 -0
  43. data/app/views/layouts/client_manager/application.html.erb +20 -0
  44. data/app/views/layouts/client_manager/none.html.erb +1 -0
  45. data/app/views/layouts/client_manager/partials/_header.html.erb +40 -0
  46. data/app/views/layouts/client_manager/partials/_modal.html.erb +15 -0
  47. data/config/locales/devise.en.yml +62 -0
  48. data/config/routes.rb +10 -0
  49. data/db/migrate/20160816183756_create_client_manager_users.rb +11 -0
  50. data/db/migrate/20160822112804_create_client_manager_clients.rb +11 -0
  51. data/db/migrate/20160905184226_add_password_digest_to_user.rb +5 -0
  52. data/db/migrate/20160930152731_add_password_changed_flag_to_users.rb +5 -0
  53. data/db/migrate/20161007235114_add_super_admin_flag_to_users.rb +5 -0
  54. data/lib/client_manager.rb +5 -0
  55. data/lib/client_manager/engine.rb +32 -0
  56. data/lib/client_manager/version.rb +3 -0
  57. data/lib/generators/client_manager/install_generator.rb +107 -0
  58. data/lib/generators/client_manager/templates/client_manager.rb +3 -0
  59. data/lib/tasks/client_manager_tasks.rake +12 -0
  60. metadata +217 -0
@@ -0,0 +1,90 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
6
+ <title>ClientManager</title>
7
+ <meta name="viewport" content="width=device-width"/>
8
+ <style type="text/css">
9
+ @media only screen and (max-width: 550px), screen and (max-device-width: 550px) {
10
+ body[yahoo] .buttonwrapper {
11
+ background-color: transparent !important;
12
+ }
13
+
14
+ body[yahoo] .button {
15
+ padding: 0 !important;
16
+ }
17
+
18
+ body[yahoo] .button a {
19
+ background-color: #777777;
20
+ padding: 15px 25px !important;
21
+ }
22
+ }
23
+
24
+ @media only screen and (min-device-width: 601px) {
25
+ .content {
26
+ width: 600px !important;
27
+ }
28
+
29
+ .col387 {
30
+ width: 387px !important;
31
+ }
32
+ }
33
+ </style>
34
+ </head>
35
+ <body bgcolor="#4b4b4b" style="margin: 0; padding: 0;" yahoo="fix">
36
+ <!--[if (gte mso 9)|(IE)]>
37
+ <table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
38
+ <tr>
39
+ <td>
40
+ <![endif]-->
41
+ <table align="center" border="0" cellpadding="0" cellspacing="0"
42
+ style="border-collapse: collapse; width: 100%; max-width: 600px;" class="content">
43
+ <tr>
44
+ <td align="center"
45
+ style="padding: 20px 20px 20px 20px; color: #ffffff; font-family: Arial, sans-serif; font-size: 36px; font-weight: bold;">
46
+ </td>
47
+ </tr>
48
+ <tr>
49
+ <td align="center" bgcolor="#ffffff"
50
+ style="padding: 40px 20px 0 20px; color: #555555; font-family: Arial, sans-serif; font-size: 20px; line-height: 30px;">
51
+ <b>Hey <%= @user.name %>, <br>
52
+ You can now use <%= @application_name %>'s API</b>
53
+ </td>
54
+ </tr>
55
+ <tr>
56
+ <td align="center" bgcolor="#ffffff"
57
+ style="padding: 0 20px 40px 20px; color: #777777; font-family: Arial, sans-serif; font-size: 18px; line-height: 30px; border-bottom: 1px solid #f6f6f6;">
58
+ Password: <%= @user.password %>
59
+ </td>
60
+ </tr>
61
+ <tr>
62
+ <td align="center" bgcolor="#ffffff"
63
+ style="padding: 20px 20px 20px 20px; color: #555555; font-family: Arial, sans-serif; font-size: 15px; line-height: 24px;">
64
+ You'll have to change your password upon signing in the first time.
65
+ </td>
66
+ </tr>
67
+ <tr>
68
+ <td align="center" bgcolor="#f9f9f9" style="padding: 30px 20px 30px 20px; font-family: Arial, sans-serif;">
69
+ <table bgcolor="#777777" border="0" cellspacing="0" cellpadding="0" class="buttonwrapper">
70
+ <tr>
71
+ <td align="center" height="55"
72
+ style=" padding: 0 35px 0 35px; font-family: Arial, sans-serif; font-size: 22px;"
73
+ class="button">
74
+ <!--TODO change URL-->
75
+ <a href="<%= @url %>" style="color: #ffffff; text-align: center; text-decoration: none;">Go To
76
+ ClientManager</a>
77
+ </td>
78
+ </tr>
79
+
80
+ </table>
81
+ </td>
82
+ </tr>
83
+ </table>
84
+ <!--[if (gte mso 9)|(IE)]>
85
+ </td>
86
+ </tr>
87
+ </table>
88
+ <![endif]-->
89
+ </body>
90
+ </html>
@@ -0,0 +1,53 @@
1
+ <!-- Login Content -->
2
+ <div class="bg-white pulldown">
3
+ <div class="content content-boxed overflow-hidden">
4
+ <div class="row">
5
+ <div class="col-sm-8 col-sm-offset-2 col-md-6 col-md-offset-3 col-lg-4 col-lg-offset-4">
6
+ <div class="push-30-t push-50 animated fadeIn">
7
+ <!-- Login Title -->
8
+ <div class="text-center">
9
+ <i class="fa fa-2x fa-circle-o-notch text-primary" aria-hidden="true "></i>
10
+ <h1 class="text-muted push-15-t">Login</h1>
11
+ </div>
12
+ <!-- END Login Title -->
13
+
14
+ <!-- Login Form -->
15
+ <!-- jQuery Validation (.js-validation-login class is initialized in js/pages/base_pages_login.js) -->
16
+ <!-- For more examples you can check out https://github.com/jzaefferer/jquery-validation -->
17
+ <%= form_tag({action: :login_attempt}, class: "js-validation-login form-horizontal push-30-t") do %>
18
+ <div class="form-group">
19
+ <div class="col-xs-12">
20
+ <div class="form-material form-material-primary floating">
21
+ <%= text_field_tag(:email, "", class: "form-control", id: "login-email") %>
22
+ <label for="login-email">Email</label>
23
+ </div>
24
+ </div>
25
+ </div>
26
+ <div class="form-group">
27
+ <div class="col-xs-12">
28
+ <div class="form-material form-material-primary floating">
29
+ <%= password_field_tag(:password, "", class: "form-control", id: "login-password") %>
30
+ <label for="login-password">Password</label>
31
+ </div>
32
+ </div>
33
+ </div>
34
+ <!--<div class="form-group">-->
35
+ <!--<div class="col-xs-12">-->
36
+ <!--<div class="font-s13 text-right push-5-t">-->
37
+ <!--<a href="#">Forgot Password?</a>-->
38
+ <!--</div>-->
39
+ <!--</div>-->
40
+ <!--</div>-->
41
+ <div class="form-group push-30-t">
42
+ <div class="col-xs-12 col-sm-6 col-sm-offset-3 col-md-4 col-md-offset-4">
43
+ <button class="btn btn-sm btn-block btn-primary" type="submit">Log in</button>
44
+ </div>
45
+ </div>
46
+ <% end %>
47
+ <!-- END Login Form -->
48
+ </div>
49
+ </div>
50
+ </div>
51
+ </div>
52
+ </div>
53
+ <!-- END Login Content -->
@@ -0,0 +1,55 @@
1
+ <%= form_for @user, html: {class: "form-horizontal push-5-t"} do |user_form| %>
2
+ <div class="block block-themed block-transparent remove-margin-b">
3
+ <div class="block-header bg-primary-dark">
4
+ <ul class="block-options">
5
+ <li>
6
+ <button data-dismiss="modal" type="button">
7
+ <span class="sr-only">Close Modal</span>
8
+ <i class="fa fa-close" aria-hidden="true"></i>
9
+ </button>
10
+ </li>
11
+ </ul>
12
+ <h3 class="block-title">Edit <%= @modal_title %></h3>
13
+ </div>
14
+ <div class="block-content">
15
+ <div class="form-group">
16
+ <%= user_form.label :name, class: "col-xs-12", required: true %>
17
+ <div class="col-xs-12">
18
+ <%= user_form.text_field :name, class: "form-control", required: true %>
19
+ </div>
20
+ </div>
21
+ <div class="form-group">
22
+ <%= user_form.label :email, class: "col-xs-12", required: true %>
23
+ <div class="col-xs-12">
24
+ <%= user_form.text_field :email, class: "form-control", type: "email", required: true, disabled: true %>
25
+ </div>
26
+ </div>
27
+ <% if client_manager_current_user.superadmin %>
28
+ <div class="form-group">
29
+ <%= user_form.label :maximum_number_of_clients, class: "col-xs-12", required: true %>
30
+ <div class="col-xs-12">
31
+ <%= user_form.text_field :maximum_number_of_clients, class: "form-control", type: @input_type, value: @max_clients, required: true, disabled: @client_manager_current_user_is_superadmin %>
32
+ </div>
33
+ </div>
34
+ <% end %>
35
+ <% if client_manager_current_user == @user %>
36
+ <div class="form-group">
37
+ <%= user_form.label "New Password", class: "col-xs-12", required: true %>
38
+ <div class="col-xs-12">
39
+ <%= user_form.password_field :new_password, class: "form-control" %>
40
+ </div>
41
+ </div>
42
+ <div class="form-group">
43
+ <%= user_form.label "Confirm New Password", class: "col-xs-12", required: true %>
44
+ <div class="col-xs-12">
45
+ <%= user_form.password_field :new_password_confirmation, class: "form-control" %>
46
+ </div>
47
+ </div>
48
+ <% end %>
49
+ <div class="modal-footer">
50
+ <button class="btn btn-sm btn-success" type="submit"><i class="fa fa-check" aria-hidden="true"></i> <%= @button_text %></button>
51
+ <button class="btn btn-sm btn-danger" type="button" data-dismiss="modal">Close</button>
52
+ </div>
53
+ </div>
54
+ </div>
55
+ <% end %>
@@ -0,0 +1,53 @@
1
+ <%= render 'layouts/client_manager/partials/header', path: new_user_path, path_title: 'Add New User' %>
2
+ <main id="main-container">
3
+ <div class="content bg-gray-lighter">
4
+ <div class="row items-push">
5
+ <div class="col-sm-7">
6
+ <h1 class="page-heading">
7
+ Users
8
+ </h1>
9
+ </div>
10
+ </div>
11
+ </div>
12
+ <div class="content">
13
+ <div class="block">
14
+
15
+ <div class="block-content">
16
+ <!-- DataTables init on table by adding .js-dataTable-full class, functionality initialized in js/pages/base_tables_datatables.js -->
17
+ <table class="table table-bordered table-striped js-dataTable-full">
18
+ <thead>
19
+ <tr>
20
+ <th>Name</th>
21
+ <th class="hidden-xs">Email</th>
22
+ <th class="hidden-xs">Max Clients</th>
23
+ <th class="hidden-xs">Clients</th>
24
+ <th class="text-center" style="width: 10%;">Actions</th>
25
+ </tr>
26
+ </thead>
27
+ <tbody>
28
+ <% @users.each do |user| %>
29
+ <tr>
30
+ <td class="font-w600"><%= user.name %></td>
31
+ <td class="hidden-xs"><%= user.email %></td>
32
+ <td class="hidden-xs"><%= user.maximum_number_of_clients %> </td>
33
+ <td class="hidden-xs"><%= user.client_count %> </td>
34
+ <td class="text-center">
35
+ <div class="btn-group">
36
+ <a href="<%= edit_user_path(user) %>" data-toggle="modal" data-target="#modal">
37
+ <span class="sr-only">Edit User <%= user.name %></span>
38
+ <i class="fa fa-pencil" aria-hidden="true"></i>
39
+ </a>
40
+ <a href="<%= user_path(user)%>" data-confirm="Are you sure you want to delete this user?" data-method="delete">
41
+ <span class="sr-only">Delete User <%= user.name %></span>
42
+ <i class="fa fa-times text-danger" aria-hidden="true"></i>
43
+ </a>
44
+ </div>
45
+ </td>
46
+ </tr>
47
+ <% end %>
48
+ </tbody>
49
+ </table>
50
+ </div>
51
+ </div>
52
+ </div>
53
+ </main>
@@ -0,0 +1,39 @@
1
+ <%= form_for @user, html: {class: "form-horizontal push-5-t"} do |user_form| %>
2
+ <div class="block block-themed block-transparent remove-margin-b">
3
+ <div class="block-header bg-primary-dark">
4
+ <ul class="block-options">
5
+ <li>
6
+ <button data-dismiss="modal" type="button">
7
+ <span class="sr-only">Close Modal</span>
8
+ <i class="fa fa-close" aria-hidden="true"></i>
9
+ </button>
10
+ </li>
11
+ </ul>
12
+ <h3 class="block-title">New User</h3>
13
+ </div>
14
+ <div class="block-content">
15
+ <div class="form-group">
16
+ <%= user_form.label :name, class: "col-xs-12", required: true %>
17
+ <div class="col-xs-12">
18
+ <%= user_form.text_field :name, class: "form-control", required: true %>
19
+ </div>
20
+ </div>
21
+ <div class="form-group">
22
+ <%= user_form.label :email, class: "col-xs-12", required: true %>
23
+ <div class="col-xs-12">
24
+ <%= user_form.text_field :email, class: "form-control", type: "email", required: true%>
25
+ </div>
26
+ </div>
27
+ <div class="form-group">
28
+ <%= user_form.label :maximum_number_of_clients, class: "col-xs-12", required: true %>
29
+ <div class="col-xs-12">
30
+ <%= user_form.text_field :maximum_number_of_clients, class: "form-control", type: "number", required: true %>
31
+ </div>
32
+ </div>
33
+ <div class="modal-footer">
34
+ <button class="btn btn-sm btn-success" type="submit"><i class="fa fa-check" aria-hidden="true"></i> Save user</button>
35
+ <button class="btn btn-sm btn-danger" type="button" data-dismiss="modal">Close</button>
36
+ </div>
37
+ </div>
38
+ </div>
39
+ <% end %>
@@ -0,0 +1,20 @@
1
+ <!DOCTYPE html>
2
+ <html class="no-focus" lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>ClientManager</title>
6
+ <meta name="viewport" content="width=device-width,initial-scale=1">
7
+ <%= csrf_meta_tags %>
8
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400italic,600,700%7COpen+Sans:300,400,400italic,600,700">
9
+ <%= growlyflash_static_notices %>
10
+ <%= stylesheet_link_tag "client_manager/application", media: "all" %>
11
+ <%= javascript_include_tag "client_manager/application" %>
12
+ </head>
13
+ <body>
14
+ <%= yield %>
15
+ </body>
16
+ </html>
17
+
18
+ <%= render 'layouts/client_manager/partials/modal' %>
19
+
20
+
@@ -0,0 +1 @@
1
+ <%= yield %>
@@ -0,0 +1,40 @@
1
+ <header id="header-navbar" class="content-mini content-mini-full">
2
+ <nav>
3
+ <ul class="nav-header pull-right">
4
+ <li>
5
+ <a href="<%= path %>" class="btn btn-success" data-toggle="modal" data-target="#modal">
6
+ <span class="sr-only"><%= path_title %></span>
7
+ <i class="fa fa-plus" aria-hidden="true"></i>
8
+ </a>
9
+ </li>
10
+ <% if controller_name != "clients" %>
11
+ <li>
12
+ <a href="<%= clients_path %>" class="btn btn-default">
13
+ <span class="sr-only">Clients</span>
14
+ <i class="fa fa-server" aria-hidden="true"></i>
15
+ </a>
16
+ </li>
17
+ <% end %>
18
+ <% if client_manager_current_user.superadmin && controller_name != "users" %>
19
+ <li>
20
+ <a href="<%= users_path %>" class="btn btn-warning">
21
+ <span class="sr-only">Users</span>
22
+ <i class="fa fa-users" aria-hidden="true"></i>
23
+ </a>
24
+ </li>
25
+ <% end %>
26
+ <li>
27
+ <a href="<%= edit_user_path(client_manager_current_user) %>" class="btn btn-primary" data-toggle="modal" data-target="#modal">
28
+ <span class="sr-only">Your Profile</span>
29
+ <i class="fa fa-user" aria-hidden="true"></i>
30
+ </a>
31
+ </li>
32
+ <li>
33
+ <a href="<%= logout_path %>" class="btn btn-danger" type="button" data-confirm="Are you sure you want to sign out?">
34
+ <span class="sr-only">Sign Out</span>
35
+ <i class="fa fa-sign-out" aria-hidden="true"></i>
36
+ </a>
37
+ </li>
38
+ </ul>
39
+ </nav>
40
+ </header>
@@ -0,0 +1,15 @@
1
+ <div class="modal fade" id="modal" tabindex="-1" role="dialog" aria-hidden="true">
2
+ <div class="modal-dialog modal-dialog-popout">
3
+ <div class="modal-content">
4
+
5
+ </div>
6
+ </div>
7
+ </div>
8
+
9
+ <script>
10
+ $(function () {
11
+ $('.modal').on('hidden.bs.modal', function () {
12
+ $(this).removeData('bs.modal');
13
+ });
14
+ });
15
+ </script>
@@ -0,0 +1,62 @@
1
+ # Additional translations at https://github.com/plataformatec/devise/wiki/I18n
2
+
3
+ en:
4
+ devise:
5
+ confirmations:
6
+ confirmed: "Your email address has been successfully confirmed."
7
+ send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes."
8
+ send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
9
+ failure:
10
+ already_authenticated: "You are already signed in."
11
+ inactive: "Your account is not activated yet."
12
+ invalid: "Invalid %{authentication_keys} or password."
13
+ locked: "Your account is locked."
14
+ last_attempt: "You have one more attempt before your account is locked."
15
+ not_found_in_database: "Invalid %{authentication_keys} or password."
16
+ timeout: "Your session expired. Please sign in again to continue."
17
+ unauthenticated: "You need to sign in or sign up before continuing."
18
+ unconfirmed: "You have to confirm your email address before continuing."
19
+ mailer:
20
+ confirmation_instructions:
21
+ subject: "Confirmation instructions"
22
+ reset_password_instructions:
23
+ subject: "Reset password instructions"
24
+ unlock_instructions:
25
+ subject: "Unlock instructions"
26
+ password_change:
27
+ subject: "Password Changed"
28
+ omniauth_callbacks:
29
+ failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
30
+ success: "Successfully authenticated from %{kind} account."
31
+ passwords:
32
+ no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided."
33
+ send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes."
34
+ send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes."
35
+ updated: "Your password has been changed successfully. You are now signed in."
36
+ updated_not_active: "Your password has been changed successfully."
37
+ registrations:
38
+ destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon."
39
+ signed_up: "Welcome! You have signed up successfully."
40
+ signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
41
+ signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
42
+ signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
43
+ update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address."
44
+ updated: "Your account has been updated successfully."
45
+ sessions:
46
+ signed_in: "Signed in successfully."
47
+ signed_out: "Signed out successfully."
48
+ already_signed_out: "Signed out successfully."
49
+ unlocks:
50
+ send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes."
51
+ send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
52
+ unlocked: "Your account has been unlocked successfully. Please sign in to continue."
53
+ errors:
54
+ messages:
55
+ already_confirmed: "was already confirmed, please try signing in"
56
+ confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
57
+ expired: "has expired, please request a new one"
58
+ not_found: "not found"
59
+ not_locked: "was not locked"
60
+ not_saved:
61
+ one: "1 error prohibited this %{resource} from being saved:"
62
+ other: "%{count} errors prohibited this %{resource} from being saved:"
@@ -0,0 +1,10 @@
1
+ ClientManager::Engine.routes.draw do
2
+ root to: 'sessions#login'
3
+ get 'login', to: 'sessions#login'
4
+ get 'logout', to: 'sessions#logout'
5
+ post 'login_attempt', to: 'sessions#login_attempt'
6
+ get 'change_password', to: 'passwords#change'
7
+ post 'change_password_attempt', to: 'passwords#change_password_attempt'
8
+ resources :clients
9
+ resources :users
10
+ end