Module: Api::Vendor::V1::Getyourguide::Concerns::Helpers

Extended by:
ActiveSupport::Concern
Includes:
Concerns::ReservationUtils
Included in:
AvailabilitiesController, BooksController, ReservesController
Defined in:
app/controllers/api/vendor/v1/getyourguide/concerns/helpers.rb

Overview

typed: ignore frozen_string_literal: true

Constant Summary collapse

GYG_PRODUCT_PREFIX =
'RP'

Instance Method Summary collapse

Instance Method Details

#find_channel_id!Object

Raises:

  • (NotImplementedError)


28
29
30
31
32
33
# File 'app/controllers/api/vendor/v1/getyourguide/concerns/helpers.rb', line 28

def find_channel_id!
  channel = Channel.find_by(uri_name: ApiVendorV1::Constants::GET_YOUR_GUIDE_CHANNEL_URI)
  raise NotImplementedError, 'Failed to find channel' if channel.blank?

  channel.channel_id
end

#find_restaurant_package(gyg_option_id) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'app/controllers/api/vendor/v1/getyourguide/concerns/helpers.rb', line 35

def find_restaurant_package(gyg_option_id)
  rest_pack_id = GetyourguidePackage.find_by(restaurant_id: @restaurant.id,
                                             gyg_option_id: gyg_option_id)&.restaurant_package_id

  @restaurant_package = HhPackage::RestaurantPackage.valid_to_have_agendas_and_not_preview.find_by(id: rest_pack_id)

  if restaurant_package.blank?
    error_message = "GetyourguidePackage not found for gyg_option_id: #{gyg_option_id}"
    BUSINESS_LOGGER.info(
      error_message,
      { gyg_option_id: gyg_option_id, params: permitted_params },
    )
    APMErrorHandler.report(error_message, params: permitted_params)
    return nil
  end

  restaurant_package
end

#load_restaurant_and_package(gyg_product_id, gyg_option_id) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'app/controllers/api/vendor/v1/getyourguide/concerns/helpers.rb', line 58

def load_restaurant_and_package(gyg_product_id, gyg_option_id)
  is_gyg_product_hh_package = gyg_product_id.to_s.start_with?(GYG_PRODUCT_PREFIX)

  if is_gyg_product_hh_package
    restaurant_package_id = gyg_product_id.delete_prefix(GYG_PRODUCT_PREFIX)
    @restaurant_package = HhPackage::RestaurantPackage.valid_to_have_agendas_and_not_preview.find_by(id: restaurant_package_id)
    return false if @restaurant_package.blank?

    @restaurant = @restaurant_package.restaurant
    return false if restaurant.blank? || !restaurant.active_and_not_expired?
  else
    @restaurant = Restaurant.active.not_expired.find_by(id: gyg_product_id)
    return false if restaurant.blank?

    @restaurant_package = find_restaurant_package(gyg_option_id)
    return false if restaurant_package.blank?
  end
  true
end

#render_empty_responseObject



107
108
109
110
111
# File 'app/controllers/api/vendor/v1/getyourguide/concerns/helpers.rb', line 107

def render_empty_response
  response = { data: {} }
  VendorLogger.log_event(:response, params[:route], payload: response)
  render json: response
end

#render_error_response(data) ⇒ Object



113
114
115
116
117
118
119
120
121
122
123
124
# File 'app/controllers/api/vendor/v1/getyourguide/concerns/helpers.rb', line 113

def render_error_response(data)
  report_error(data)

  response = {
    errorCode: data[:error_code],
    errorMessage: data[:error_message],
    detail: data[:error],
  }

  VendorLogger.log_event(:response, params[:route], payload: response)
  render json: response
end

#render_invalid_productObject



78
79
80
81
# File 'app/controllers/api/vendor/v1/getyourguide/concerns/helpers.rb', line 78

def render_invalid_product
  render_error_response(error_code: ApiVendorV1::Constants::GYG_INVALID_PRODUCT,
                        error_message: 'Invalid productId')
end

#render_invalid_reservation(reservation_id) ⇒ Object



88
89
90
91
92
# File 'app/controllers/api/vendor/v1/getyourguide/concerns/helpers.rb', line 88

def render_invalid_reservation(reservation_id)
  render_error_response(error_code: ApiVendorV1::Constants::GYG_INVALID_RESERVATION,
                        error_message: 'Invalid reservation',
                        reservation_id: reservation_id)
end

#render_invalid_ticket_categoryObject



83
84
85
86
# File 'app/controllers/api/vendor/v1/getyourguide/concerns/helpers.rb', line 83

def render_invalid_ticket_category
  render_error_response(error_code: ApiVendorV1::Constants::GYG_INVALID_TICKET_CATEGORY,
                        error_message: 'The ticket category is invalid')
end

#render_no_availability(error, backtrace: nil) ⇒ Object



100
101
102
103
104
105
# File 'app/controllers/api/vendor/v1/getyourguide/concerns/helpers.rb', line 100

def render_no_availability(error, backtrace: nil)
  render_error_response(error_code: ApiVendorV1::Constants::GYG_NO_AVAILABILITY,
                        error_message: 'This activity is sold out',
                        error: error,
                        backtrace: backtrace)
end

#render_validation_failure(error_message, reservation_id = nil) ⇒ Object



94
95
96
97
98
# File 'app/controllers/api/vendor/v1/getyourguide/concerns/helpers.rb', line 94

def render_validation_failure(error_message, reservation_id = nil)
  render_error_response(error_code: ApiVendorV1::Constants::GYG_VALIDATION_FAILURE,
                        error_message: error_message,
                        reservation_id: reservation_id)
end

#report_error(data) ⇒ Object



126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'app/controllers/api/vendor/v1/getyourguide/concerns/helpers.rb', line 126

def report_error(data)
  # Get product_id from instance variable or fallback to params
  product_id = gyg_product_id.presence || params.dig(:data,
                                                     :productId) || params.dig(:book, :data, :productId) || 'unknown'
  message = "getyourguide product_id #{product_id}: #{data[:error_code]}"
  log_type = data[:error_code] == ApiVendorV1::Constants::GYG_NO_AVAILABILITY ? :info : :error

  error_data = data.merge!(params.permit!).merge!(msg: message)
  error_data[:backtrace] = data[:backtrace] if data[:backtrace].present?

  BUSINESS_LOGGER.send(log_type, message, data: error_data)
  APMErrorHandler.report(message, data: error_data)
  send_notify_email(error_data)
end

#send_notify_email(data) ⇒ Object



141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'app/controllers/api/vendor/v1/getyourguide/concerns/helpers.rb', line 141

def send_notify_email(data)
  return if hh_reservation_inventory_errors.include?(data[:error])

  receivers = [::SUPPORT_EMAIL, ::SUPPORT_EMAIL_SLACK, ::VENDOR_TEAM_EMAIL]
  subject = data[:msg]

  body = <<~BODY
    Message: #{data[:error_message]}
    Error: #{data[:error]}
    Additional_info: #{data.except(:error, :backtrace)}
  BODY

  # Include backtrace in email if available
  if data[:backtrace].present?
    body += <<~BACKTRACE
      
      Backtrace:
      #{data[:backtrace].is_a?(Array) ? data[:backtrace].join("\n") : data[:backtrace]}
    BACKTRACE
  end

  StaffMailer.notify_html(subject, body, receivers).deliver_later!
end

#valid_category?(category) ⇒ Boolean

Returns:

  • (Boolean)


54
55
56
# File 'app/controllers/api/vendor/v1/getyourguide/concerns/helpers.rb', line 54

def valid_category?(category)
  ApiVendorV1::Constants::GYG_CATEGORY_TYPES.include?(category)
end