diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb index 3bc151a..2d091b7 100644 --- a/app/controllers/admin_controller.rb +++ b/app/controllers/admin_controller.rb @@ -1,26 +1,24 @@ class AdminController < ApplicationController - before_action :authenticate_user! - load_and_authorize_resource class: User - - def new_user - @user = User.new - end - - def create_user - @user = User.new(user_params) - if @user.save - # Add role to the user here if needed e.g., user.add_role :new_role - redirect_to admin_users_path, notice: 'User was successfully created.' - else - render :new_user - end - end - - private - - def user_params - params.require(:user).permit(:email, :password, :password_confirmation) - # Add other fields as needed + before_action :authenticate_user! + load_and_authorize_resource class: User + + def new_user + @user = User.new + end + + def create_user + @user = User.new(user_params) + if @user.save + redirect_to some_admin_path, notice: 'User was successfully created.' # Update the redirect path as needed + else + render :new_user end end - \ No newline at end of file + + private + + def user_params + params.require(:user).permit(:email, :password, :password_confirmation) + # Ensure you permit the right parameters + end +end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 8bef056..f11d93a 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -8,6 +8,11 @@ class UsersController < ApplicationController @users = User.all end + def new + @user = User.new + end + + def edit end @@ -31,6 +36,11 @@ class UsersController < ApplicationController end end + def show + @user = User.includes(:access_periods).find(params[:id]) + end + + def destroy @user.destroy redirect_to users_path, notice: 'User was successfully deleted.' @@ -46,7 +56,8 @@ class UsersController < ApplicationController params.require(:user).permit( :email, :password, :password_confirmation, :remember_me, :first_name, :last_name, :phone, :company, - :access_revoked, :access_start_date, :access_end_date, + :access_revoked, :access_start_date, :access_end_date, + access_periods_attributes: [:id, :start_date, :end_date, :destroy], roles: [] ) end @@ -67,12 +78,14 @@ class UsersController < ApplicationController def update_user_roles(user, roles_names) - user.roles.delete_all # Remove existing roles if you want to reset roles on update - roles_names = ['user'] if roles_names.blank? # Ensure there's a default role + return if roles_names.blank? # Do nothing if no roles provided + + user.roles.delete_all # Consider keeping this if role reset is truly intended roles_names.each do |role_name| - user.add_role(role_name) + user.add_role(role_name) unless role_name.blank? end end + end diff --git a/app/models/access_period.rb b/app/models/access_period.rb new file mode 100644 index 0000000..4525b6d --- /dev/null +++ b/app/models/access_period.rb @@ -0,0 +1,3 @@ +class AccessPeriod < ApplicationRecord + belongs_to :user +end diff --git a/app/models/user.rb b/app/models/user.rb index 040caa1..7c87fb4 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,9 +1,31 @@ class User < ApplicationRecord rolify devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable + has_many :access_periods, dependent: :destroy + accepts_nested_attributes_for :access_periods, allow_destroy: true + after_create :assign_default_role + + # Validation for date fields + validate :end_date_after_start_date, if: -> { access_revoked && access_end_date.present? } + + # Override Devise method to consider access_revoked def active_for_authentication? super && !access_revoked end - -end \ No newline at end of file + + private + + def assign_default_role + self.add_role(:user) unless self.has_any_role? + end + + def end_date_after_start_date + if access_start_date.present? + errors.add(:access_end_date, 'must be provided when access is revoked') unless access_end_date.present? + if access_end_date && access_end_date < access_start_date + errors.add(:access_end_date, 'must be after the start date') + end + end + end +end diff --git a/app/views/admin/new_user.html.erb b/app/views/admin/new_user.html.erb index 486d9c7..6ddeeb7 100644 --- a/app/views/admin/new_user.html.erb +++ b/app/views/admin/new_user.html.erb @@ -3,22 +3,42 @@

Create New User

- <%= form_for(@user, url: admin_users_path, html: { class: 'needs-validation', novalidate: true }) do |f| %> + <%= form_for(@user, url: users_path, html: { class: 'needs-validation', novalidate: true }) do |f| %> +
+ <%= f.label :first_name, 'First Name', class: 'form-label' %> + <%= f.text_field :first_name, class: 'form-control', placeholder: 'Enter first name', required: true %> +
+ +
+ <%= f.label :last_name, 'Last Name', class: 'form-label' %> + <%= f.text_field :last_name, class: 'form-control', placeholder: 'Enter last name', required: true %> +
+
<%= f.label :email, class: 'form-label' %> - <%= f.email_field :email, class: 'form-control', placeholder: 'Enter email', required: true %> + <%= f.email_field :email, class: 'form-control', placeholder: 'Enter email', required: true, autocomplete: "new-password" %>
- +
- <%= f.label :password, class: 'form-label' %> - <%= f.password_field :password, class: 'form-control', placeholder: 'Password', required: true %> + <%= f.label :password, 'Password', class: 'form-label' %> + <%= f.password_field :password, class: 'form-control', placeholder: 'Password', required: true, autocomplete: "new-password" %>
- +
- <%= f.label :password_confirmation, "Confirm Password", class: 'form-label' %> + <%= f.label :password_confirmation, 'Confirm Password', class: 'form-label' %> <%= f.password_field :password_confirmation, class: 'form-control', placeholder: 'Confirm Password', required: true %>
- + +
+ <%= f.label :phone, 'Phone Number', class: 'form-label' %> + <%= f.telephone_field :phone, class: 'form-control', placeholder: 'Enter phone number' %> +
+ +
+ <%= f.label :company, 'Company', class: 'form-label' %> + <%= f.text_field :company, class: 'form-control', placeholder: 'Enter company name' %> +
+
<%= f.submit "Create User", class: 'btn btn-dark' %>
@@ -26,6 +46,7 @@
+ <%# This is to indicate to the User if the passwords didn't match %> +<% end %> \ No newline at end of file diff --git a/app/views/users/index.html.erb b/app/views/users/index.html.erb index 1ca70bd..06df59c 100644 --- a/app/views/users/index.html.erb +++ b/app/views/users/index.html.erb @@ -41,7 +41,7 @@
<% if can?(:create, User) %> - <%= link_to 'Add New User', new_admin_user_path, class: "btn btn-dark" %> + <%= link_to 'Add New User', new_user_admin_path, class: "btn btn-dark" %> <% end %> <%= link_to 'Back to Home', root_path, class: "btn btn-secondary" %> diff --git a/config/routes.rb b/config/routes.rb index a04d0da..487bffd 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -85,12 +85,13 @@ Rails.application.routes.draw do resources :forms resources :users - # Custom route for admin to create a new user - get 'admin/users/new', to: 'admin#new_user', as: :new_admin_user - post 'admin/users', to: 'admin#create_user', as: :admin_users - + resource :admin, controller: 'admin', only: [] do + get 'users/new', to: 'admin#new_user', as: 'new_user' + post 'users', to: 'admin#create_user', as: 'create_user' + # Define other routes as needed + end + - get 'home/index' # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html diff --git a/db/migrate/20240411215819_create_access_periods.rb b/db/migrate/20240411215819_create_access_periods.rb new file mode 100644 index 0000000..bcf6ddb --- /dev/null +++ b/db/migrate/20240411215819_create_access_periods.rb @@ -0,0 +1,11 @@ +class CreateAccessPeriods < ActiveRecord::Migration[7.1] + def change + create_table :access_periods do |t| + t.date :start_date + t.date :end_date + t.references :user, null: false, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 4ac86c5..cc315ae 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,16 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.1].define(version: 2024_04_09_215110) do +ActiveRecord::Schema[7.1].define(version: 2024_04_11_215819) do + create_table "access_periods", force: :cascade do |t| + t.date "start_date" + t.date "end_date" + t.integer "user_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["user_id"], name: "index_access_periods_on_user_id" + end + create_table "bank_accounts", force: :cascade do |t| t.string "institution_name" t.string "account_type" @@ -236,6 +245,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_04_09_215110) do t.index ["ssn"], name: "index_workers_on_ssn", unique: true end + add_foreign_key "access_periods", "users" add_foreign_key "employer_records", "employers" add_foreign_key "employer_records", "participants" add_foreign_key "employments", "participants" diff --git a/test/fixtures/access_periods.yml b/test/fixtures/access_periods.yml new file mode 100644 index 0000000..4c9ab21 --- /dev/null +++ b/test/fixtures/access_periods.yml @@ -0,0 +1,11 @@ +# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + start_date: 2024-04-11 + end_date: 2024-04-11 + user: one + +two: + start_date: 2024-04-11 + end_date: 2024-04-11 + user: two diff --git a/test/models/access_period_test.rb b/test/models/access_period_test.rb new file mode 100644 index 0000000..9e775ca --- /dev/null +++ b/test/models/access_period_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +class AccessPeriodTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end