From 8c5523cf136ba14550ec35edd338de0c1c0a77ee Mon Sep 17 00:00:00 2001 From: Shubham Kumar Date: Mon, 19 Sep 2022 14:36:54 +0530 Subject: [PATCH 1/2] Ticket Show API --- app/controllers/api/v1/tickets_controller.rb | 9 ++++++ app/models/ticket.rb | 8 +++++ app/services/tickets/v1/show.rb | 31 ++++++++++++++++++++ config/locales/en.yml | 1 + config/routes.rb | 2 +- spec/acceptance/v1/tickets_spec.rb | 28 ++++++++++++++++-- 6 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 app/services/tickets/v1/show.rb diff --git a/app/controllers/api/v1/tickets_controller.rb b/app/controllers/api/v1/tickets_controller.rb index 346926e..4c93e3c 100644 --- a/app/controllers/api/v1/tickets_controller.rb +++ b/app/controllers/api/v1/tickets_controller.rb @@ -10,5 +10,14 @@ def create render json: { message: I18n.t('tickets.error.create') }, status: :unprocessable_entity end end + + def show + result = Tickets::V1::Show.new(params).call + if result + render json: result + else + render json: { message: I18n.t('tickets.error.show') }, status: :unprocessable_entity + end + end end end diff --git a/app/models/ticket.rb b/app/models/ticket.rb index 5ef95a4..5c7b3f9 100644 --- a/app/models/ticket.rb +++ b/app/models/ticket.rb @@ -68,4 +68,12 @@ def send_notification description = I18n.t("ticket.#{status}", ticket_type: ticket_type, resolver: resolver.name, requester: requester.name) NotifyMailer.notify_status_change(resolver, requester, description, id).deliver_now end + + def department_name + self&.department&.name + end + + def category_name + self&.category&.name + end end diff --git a/app/services/tickets/v1/show.rb b/app/services/tickets/v1/show.rb new file mode 100644 index 0000000..6923b70 --- /dev/null +++ b/app/services/tickets/v1/show.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module Tickets::V1 + class Show + + def initialize(params) + @ticket_id = params[:id] + end + + def call + find_ticket && response + end + + def find_ticket + @ticket = Ticket.find_by(id: @ticket_id) + return true if @ticket + false + end + + def response + @ticket.as_json( + only: [:id, :status, :title, :description, :ticket_number, :ticket_type, :priority, :created_at, :resolved_at], + include:[{ + activities: { only: [:created_at, :asset_url, :description, :id]}, + resolver: { only: [:id, :name]} + }], + methods: [:department_name, :category_name] + ) + end + end +end diff --git a/config/locales/en.yml b/config/locales/en.yml index e1d6695..27f091b 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -42,6 +42,7 @@ en: create: "Ticket created successfully" error: create: "Unable to create ticket" + show: "Ticket not found" ticket: assigned: "%{ticket_type} has been assigned to: %{resolver}" inprogress: "The work has been started on the %{ticket_type}" diff --git a/config/routes.rb b/config/routes.rb index 10c4c1c..b1e5062 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,7 +2,7 @@ # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html api_version(:module => "Api::V1", :header => { name: "Accept", :value => "application/vnd.providesk; version=1"}) do - resources :tickets, only: [:create] + resources :tickets, only: [:create, :show] resources :sessions, only: :create end end diff --git a/spec/acceptance/v1/tickets_spec.rb b/spec/acceptance/v1/tickets_spec.rb index 149ecee..2ba2ab4 100644 --- a/spec/acceptance/v1/tickets_spec.rb +++ b/spec/acceptance/v1/tickets_spec.rb @@ -10,8 +10,9 @@ let!(:category) { FactoryBot.create(:category, name: "Hardware", priority: 0, department_id: department.id)} let!(:role) { FactoryBot.create(:role, name: 'super_admin')} let!(:role1) { FactoryBot.create(:role, name: 'employee')} - let(:user) { FactoryBot.create(:user, role_id: role.id) } - let(:user1) { FactoryBot.create(:user, role_id: role.id) } + let(:user) { FactoryBot.create(:user, role_id: role.id, email: "abcd@gmail.com") } + let(:user1) { FactoryBot.create(:user, role_id: role.id, email: "pqrs@gmail.com") } + let!(:ticket) { FactoryBot.create(:ticket, description: "For laptop with high graphics", ticket_number: "12", status: "assigned", priority: 0, department_id: department.id, category_id: category.id, ticket_type: "request", resolver_id: user.id, requester_id: user1.id) } post '/tickets' do before do @@ -43,6 +44,29 @@ end end + get '/tickets/:ticket_id'do + before do + header 'Accept', 'application/vnd.providesk; version=1' + header 'Authorization', JsonWebToken.encode({user_id: user.id, email: user.email, name: user.name}) + end + context '200' do + example 'Ticket show success' do + do_request({ticket_id: ticket.id}) + response_data = JSON.parse(response_body) + expect(response_status).to eq(200) + end + end + + context '404' do + example 'Unable to show ticket' do + do_request({ticket_id: Faker::Number.numerify('#')}) + response_data = JSON.parse(response_body) + expect(response_status).to eq(422) + expect(response_data["message"]).to eq(I18n.t('tickets.error.show')) + end + end + end + private def create_params(title, description, category_id, department_id, ticket_type, resolver_id) From df11844f58343e72b6202571e8f0d078d0f2097c Mon Sep 17 00:00:00 2001 From: Shubham Kumar Date: Mon, 19 Sep 2022 14:51:56 +0530 Subject: [PATCH 2/2] Changes updated according to comments --- app/services/tickets/v1/show.rb | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/app/services/tickets/v1/show.rb b/app/services/tickets/v1/show.rb index 6923b70..ccb66a9 100644 --- a/app/services/tickets/v1/show.rb +++ b/app/services/tickets/v1/show.rb @@ -2,30 +2,30 @@ module Tickets::V1 class Show - def initialize(params) @ticket_id = params[:id] end def call - find_ticket && response - end + find_ticket && response + end def find_ticket @ticket = Ticket.find_by(id: @ticket_id) - return true if @ticket - false + return true if @ticket + + false end def response - @ticket.as_json( - only: [:id, :status, :title, :description, :ticket_number, :ticket_type, :priority, :created_at, :resolved_at], - include:[{ - activities: { only: [:created_at, :asset_url, :description, :id]}, - resolver: { only: [:id, :name]} - }], - methods: [:department_name, :category_name] - ) - end + @ticket.as_json( + only: %i[id status title description ticket_number ticket_type priority created_at resolved_at], + include: [{ + activities: { only: %i[created_at asset_url description id] }, + resolver: { only: %i[id name] } + }], + methods: %i[department_name category_name] + ) + end end end