From a91293ab78b89f27a8d5384c0222f8f738abd4dc Mon Sep 17 00:00:00 2001 From: scott Date: Tue, 16 Jul 2019 16:24:33 -0600 Subject: [PATCH 1/4] Add agent availability toggle --- app/controllers/admin/base_controller.rb | 4 +-- app/controllers/api/v1/users.rb | 25 +++++++++++++++++-- app/models/entity/user.rb | 1 + app/models/user.rb | 1 + .../20190716202013_add_status_to_user.rb | 5 ++++ db/schema.rb | 1 + 6 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 db/migrate/20190716202013_add_status_to_user.rb diff --git a/app/controllers/admin/base_controller.rb b/app/controllers/admin/base_controller.rb index 8ceab2b6f..247380888 100644 --- a/app/controllers/admin/base_controller.rb +++ b/app/controllers/admin/base_controller.rb @@ -111,10 +111,10 @@ def get_tickets_by_status def fetch_counts if current_user.is_restricted? && teams? topics = Topic.tagged_with(current_user.team_list, :any => true) - @admins = User.agents #can_receive_ticket.tagged_with(current_user.team_list, :any => true) + @admins = User.agents.available #can_receive_ticket.tagged_with(current_user.team_list, :any => true) else topics = Topic.all - @admins = User.agents.includes(:topics) + @admins = User.agents.available.includes(:topics) end @new = topics.unread.size @unread = topics.unread.size diff --git a/app/controllers/api/v1/users.rb b/app/controllers/api/v1/users.rb index edf5f345a..7ef2a2263 100644 --- a/app/controllers/api/v1/users.rb +++ b/app/controllers/api/v1/users.rb @@ -81,6 +81,7 @@ class Users < Grape::API optional :active, type: Boolean, desc: "User active or deactivated", default: true optional :priority, type: String, desc: "Users Priority", values: ['low', 'normal', 'high', 'vip'], default: 'normal' optional :notes, type: String, desc: "Notes about the user" + optional :status, type: String, desc: "User/Agent status" end post "", root: :users do user = User.create!( @@ -107,7 +108,8 @@ class Users < Grape::API language: permitted_params[:language], active: permitted_params[:active], priority: permitted_params[:priority], - notes: permitted_params[:notes] + notes: permitted_params[:notes], + status: permitted_params[:status] ) present user, with: Entity::User end @@ -143,6 +145,7 @@ class Users < Grape::API optional :active, type: Boolean, desc: "User active or deactivated" optional :priority, type: String, desc: "Users Priority- low, normal, high or vip", default: 'normal' optional :notes, type: String, desc: "Notes about the user" + optional :status, type: String, desc: "User/Agent status" end patch ":id", root: :users do user = User.where(id: permitted_params[:id]).first @@ -170,7 +173,25 @@ class Users < Grape::API language: permitted_params[:language], active: permitted_params[:active], priority: permitted_params[:priority], - notes: permitted_params[:notes] + notes: permitted_params[:notes], + status: permitted_params[:status] + ) + present user, with: Entity::User + end + + # UPDATE AGENT STATUS + desc "Update agents status", { + entity: Entity::User, + notes: "Update a user" + } + params do + requires :id, type: Integer, desc: "User ID" + requires :status, type: String, desc: "User/Agent status" + end + patch "/status/:id/:status", root: :users do + user = User.where(id: permitted_params[:id]).first + user.update!( + status: permitted_params[:status] ) present user, with: Entity::User end diff --git a/app/models/entity/user.rb b/app/models/entity/user.rb index 113007ac2..b82355fbe 100644 --- a/app/models/entity/user.rb +++ b/app/models/entity/user.rb @@ -33,5 +33,6 @@ class User < Base expose :account_number expose :priority expose :notes + expose :status end end diff --git a/app/models/user.rb b/app/models/user.rb index f3e58f3a1..b9095051b 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -117,6 +117,7 @@ class User < ActiveRecord::Base scope :by_role, -> (role) { where(role: role) } scope :active_first, -> { order('updated_at desc') } scope :alpha, -> { order('name asc') } + scope :available, -> { where(status: 'available') } def set_role_on_invitation_accept self.role = self.role.presence || "agent" diff --git a/db/migrate/20190716202013_add_status_to_user.rb b/db/migrate/20190716202013_add_status_to_user.rb new file mode 100644 index 000000000..aa5ecc819 --- /dev/null +++ b/db/migrate/20190716202013_add_status_to_user.rb @@ -0,0 +1,5 @@ +class AddStatusToUser < ActiveRecord::Migration + def change + add_column :users, :status, :string, default: 'available' + end +end diff --git a/db/schema.rb b/db/schema.rb index 249b632f5..dba359f39 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -338,6 +338,7 @@ t.string "account_number" t.string "priority", default: "normal" t.text "notes" + t.string "status", default: "available" end add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree From 83bae823ed68952832bec6d4fabced381a440ff8 Mon Sep 17 00:00:00 2001 From: scott Date: Mon, 22 Jul 2019 08:49:07 -0600 Subject: [PATCH 2/4] Update schema --- db/schema.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index dba359f39..ab47298d0 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20190513145733) do +ActiveRecord::Schema.define(version: 20190716202013) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -307,14 +307,14 @@ t.integer "assigned_ticket_count", default: 0 t.integer "topics_count", default: 0 t.boolean "active", default: true - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.string "email", default: "", null: false - t.string "encrypted_password", default: "", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "email", default: "", null: false + t.string "encrypted_password", default: "", null: false t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" - t.integer "sign_in_count", default: 0, null: false + t.integer "sign_in_count", default: 0, null: false t.datetime "current_sign_in_at" t.datetime "last_sign_in_at" t.inet "current_sign_in_ip" From 909e0e799646dcfae5cb892e92f86758fe6f4e4c Mon Sep 17 00:00:00 2001 From: scott Date: Mon, 22 Jul 2019 09:14:48 -0600 Subject: [PATCH 3/4] clear PGSearch deprecation warning --- app/models/doc.rb | 2 +- app/models/topic.rb | 2 +- app/models/user.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/doc.rb b/app/models/doc.rb index 8db51b7db..0a88638f3 100644 --- a/app/models/doc.rb +++ b/app/models/doc.rb @@ -39,7 +39,7 @@ class Doc < ActiveRecord::Base validates :body, presence: true validates :category_id, presence: true - include PgSearch + include PgSearch::Model multisearchable against: [:title, :body, :keywords], :if => lambda { |record| record.category.present? && record.category.publicly_viewable? && record.active && record.category.active? } diff --git a/app/models/topic.rb b/app/models/topic.rb index 8754ef64a..22c892df8 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -45,7 +45,7 @@ class Topic < ActiveRecord::Base paginates_per 15 - include PgSearch + include PgSearch::Model multisearchable :against => [:id, :name, :post_cache], :if => :public? diff --git a/app/models/user.rb b/app/models/user.rb index b9095051b..f537ddc4e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -83,7 +83,7 @@ class User < ActiveRecord::Base include Gravtastic mount_uploader :profile_image, ProfileImageUploader - include PgSearch + include PgSearch::Model pg_search_scope :user_search, against: [:name, :login, :email, :company, :account_number, :home_phone, :work_phone, :cell_phone] From a06137e3270595563a7632532af2766ae48c2977 Mon Sep 17 00:00:00 2001 From: scott Date: Mon, 22 Jul 2019 09:17:28 -0600 Subject: [PATCH 4/4] Add test case --- app/controllers/api/v1/users.rb | 2 +- test/controllers/api/v1/users_test.rb | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/v1/users.rb b/app/controllers/api/v1/users.rb index 7ef2a2263..9a2ccc267 100644 --- a/app/controllers/api/v1/users.rb +++ b/app/controllers/api/v1/users.rb @@ -188,7 +188,7 @@ class Users < Grape::API requires :id, type: Integer, desc: "User ID" requires :status, type: String, desc: "User/Agent status" end - patch "/status/:id/:status", root: :users do + patch "status/:id", root: :users do user = User.where(id: permitted_params[:id]).first user.update!( status: permitted_params[:status] diff --git a/test/controllers/api/v1/users_test.rb b/test/controllers/api/v1/users_test.rb index 463522e00..4ceb35aae 100644 --- a/test/controllers/api/v1/users_test.rb +++ b/test/controllers/api/v1/users_test.rb @@ -212,4 +212,12 @@ def app assert_equal "anon", object['login'] assert_nil object['city'] end + + test "API users should be able to set status of users" do + user = User.find(6) + patch "/api/v1/users/status/#{user.id}.json?status=vacation", @default_params + + object = JSON.parse(last_response.body) + assert_equal "vacation", object['status'] + end end