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..ccb66a9 --- /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: %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 diff --git a/config/locales/en.yml b/config/locales/en.yml index 06801a3..375583f 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -55,6 +55,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 dcdd613..4ba5a2f 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 resources :categories, only: :create resources :departments, only: :create diff --git a/spec/acceptance/v1/tickets_spec.rb b/spec/acceptance/v1/tickets_spec.rb index fe2ef4a..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, department_id: department.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)