Class: BoatSerializer

Inherits:
AbstractSerializer show all
Defined in:
app/serializers/boat_serializer.rb

Class Method Summary collapse

Methods inherited from AbstractSerializer

opts

Class Method Details

.amenities(boat) ⇒ Object



212
213
214
215
216
217
218
# File 'app/serializers/boat_serializer.rb', line 212

def amenities(boat)
  {
      amenities: amenities_attributes.map do |f|
        [f, boat.send(f)]
      end.to_h
  }
end

.amenities_attributesObject



162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'app/serializers/boat_serializer.rb', line 162

def amenities_attributes
  %i[
    air_conditioner
    bow_thruster
    electric_toilet
    essentials
    family_kid_friendly
    gym
    hardtop
    heating
    helipad
    hot_cold_cockpit_shower
    jacuzzi_on_deck
    kitchen
    pet_allowed
    sauna
    soft_top
    stabilisers_underway
    stabilizers_at_anchor
    steam_room
    toilet
  ].freeze
end

.available_attributesObject



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'app/serializers/boat_serializer.rb', line 4

def available_attributes
  %i[
    amenities
    boat_beam
    boat_beam_metrics
    boat_contacts
    boat_cruise_speed
    boat_draft
    boat_draft_metrics
    boat_engines
    boat_hull_id
    boat_generators
    boat_length
    boat_length_metrics
    boat_length_metrics_ft
    boat_length_metrics_meters
    boat_locations_attributes
    boat_max_speed
    boat_model
    boat_photos
    boat_photos_attributes
    boat_range
    boat_stars
    boat_thumbups
    boat_type
    boat_type_id
    builder
    built_year
    charter_details
    charter_deposit
    crew_total
    crew_cabins
    description
    engine_hours
    exterior_color
    equipment
    for_rent
    for_sale
    fuel_type
    guest_cabins
    guest_heads
    guest_sleeps
    guests_total
    hull_material
    id
    interior_designer
    length
    latitude
    location_address
    locations
    longitude
    maximum_guests_during_cruise
    main_boat_photo_id
    motor
    motor_id
    name
    naval_architect
    picture_medium_url
    prices
    refit_year
    rent_prices
    rental_type
    reviews
    safety
    sale_price
    short_description
    state
    toys
    visits_today
    visits_total
  ].freeze
end

.boat_beam_metrics(boat) ⇒ Object

для формы редактирования в кабинете агента



344
345
346
347
348
349
350
351
# File 'app/serializers/boat_serializer.rb', line 344

def boat_beam_metrics(boat)
  {
      boat_beam_metrics: {
          value: boat.send('boat_beam_metrics_%s' % @opts[:uol]),
          uol:   @opts[:uol]
      }
  }
end

.boat_contacts(boat) ⇒ Object

Контакты владельцев: то, что приходит в boat_users_attributes из админской формы



464
465
466
467
468
469
470
471
# File 'app/serializers/boat_serializer.rb', line 464

def boat_contacts(boat)
  boat_contacts = boat.boat_users.map do |user|
    {
      user_id: user.user_id
    }
  end
  { boat_contacts: boat_contacts }
end

.boat_draft_metrics(boat) ⇒ Object

для формы редактирования в кабинете агента



354
355
356
357
358
359
360
361
# File 'app/serializers/boat_serializer.rb', line 354

def boat_draft_metrics(boat)
  {
      boat_draft_metrics: {
          value: boat.send('boat_draft_metrics_%s' % @opts[:uol]),
          uol:   @opts[:uol]
      }
  }
end

.boat_length(boat) ⇒ Object

используется в списке лодок агента, в preview-блоке на сайте



364
365
366
367
368
369
370
371
# File 'app/serializers/boat_serializer.rb', line 364

def boat_length(boat)
  {
      boat_length: {
          value: boat.send('boat_length_metrics_%s' % @opts[:uol]),
          uol:   @opts[:uol]
      }
  }
end

.boat_length_metrics(boat) ⇒ Object

для формы редактирования в кабинете агента



384
385
386
# File 'app/serializers/boat_serializer.rb', line 384

def boat_length_metrics(boat)
  { boat_length_metrics: boat_length(boat)[:boat_length] }
end

.boat_length_metrics_ft(boat) ⇒ Object

TODO
bcff00da

УДАЛИТЬ - пока используется при обновлении/создании лодки в админке



396
397
398
# File 'app/serializers/boat_serializer.rb', line 396

def boat_length_metrics_ft(boat)
  { boat_length_metrics_ft: boat.boat_length_metrics_ft }
end

.boat_length_metrics_meters(boat) ⇒ Object

TODO
bcff00da

УДАЛИТЬ - пока используется при обновлении/создании лодки в админке



391
392
393
# File 'app/serializers/boat_serializer.rb', line 391

def boat_length_metrics_meters(boat)
  { boat_length_metrics_meters: boat.boat_length_metrics_meters }
end

.boat_locations_attributes(boat) ⇒ Object

используется для валидации лодки при обновлении стейта



505
506
507
508
509
510
511
# File 'app/serializers/boat_serializer.rb', line 505

def boat_locations_attributes(boat)
  {
      boat_locations_attributes: boat.boat_locations.map do |location|
        ::BoatLocationSerializer.serialize location
      end
  }
end

.boat_photos(boat) ⇒ Object



441
442
443
444
445
446
447
448
449
450
451
452
# File 'app/serializers/boat_serializer.rb', line 441

def boat_photos(boat)
  # FIXME:: выяснить, нужно ли всётаки использовать .gsub('\'', ''') для строк с путями к фоткам?
  boat_photos = boat.boat_photos.map do |boat_photo|
    {
      id:           boat_photo.id,
      gallery_path: boat_photo.picture.url(:gallery),
      medium_path:  boat_photo.picture.url(:medium),
      thumb_path:   boat_photo.picture.url(:thumb)
    }
  end
  { boat_photos: boat_photos }
end

.boat_photos_attributes(boat) ⇒ Object

используется для валидации лодки при обновлении стейта



455
456
457
458
459
460
461
# File 'app/serializers/boat_serializer.rb', line 455

def boat_photos_attributes(boat)
  {
      boat_photos_attributes: boat.boat_photos.map do |boat_photo|
        { id: boat_photo.id }
      end
  }
end

.boat_stars(boat) ⇒ Object

выдаем 1 самое свежее значение



530
531
532
# File 'app/serializers/boat_serializer.rb', line 530

def boat_stars(boat)
  { boat_stars: boat.boat_stars.max_by(&:created_at)&.value }
end

.boat_thumbups(boat) ⇒ Object

выдаем 1 самое свежее значение



535
536
537
# File 'app/serializers/boat_serializer.rb', line 535

def boat_thumbups(boat)
  { boat_thumbups: boat.boat_thumbups.max_by(&:created_at)&.value }
end

.boat_type(boat) ⇒ Object



334
335
336
337
338
339
340
341
# File 'app/serializers/boat_serializer.rb', line 334

def boat_type(boat)
  {
      boat_type: {
          id:     boat.boat_type_id,
          title:  boat.boat_type&.name&.strip
      }
  }
end

.builder(boat) ⇒ Object



257
258
259
# File 'app/serializers/boat_serializer.rb', line 257

def builder(boat)
  { builder: boat.builder&.strip }
end

.charter_deposit(boat) ⇒ Object



525
526
527
# File 'app/serializers/boat_serializer.rb', line 525

def charter_deposit(boat)
  { charter_deposit: boat.charter_deposit }
end

.charter_details(boat) ⇒ Object



521
522
523
# File 'app/serializers/boat_serializer.rb', line 521

def charter_details(boat)
  { charter_details: boat.charter_details }
end

.default_optsObject



77
78
79
80
81
82
83
84
85
# File 'app/serializers/boat_serializer.rb', line 77

def default_opts
  {
    uol:         'ft',
    currency:    ::Dicts::Currency::USD.index,
    locale:      'en',
    is_for_rent: true,  # TODO:: [bcff00da] УДАЛИТЬ
    business:    ::Dicts::Business::RENT.index
  }
end

.equipment(boat) ⇒ Object



204
205
206
207
208
209
210
# File 'app/serializers/boat_serializer.rb', line 204

def equipment(boat)
  {
      equipment: equipment_attributes.map do |f|
        [f, boat.send(f)]
      end.to_h
  }
end

.equipment_attributesObject



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'app/serializers/boat_serializer.rb', line 140

def equipment_attributes
  %i[
    apple_tv
    autopilot
    cd_player
    chartplotter
    cockpit_loudspeakers
    entertainment
    excellent_sound_system
    gps
    internet
    lcd_tv
    navigation
    radar
    satellite_internet
    satellite_phone
    tv
    vhf
    wi_fi
  ].freeze
end

.exterior_color(boat) ⇒ Object



267
268
269
270
271
272
273
274
275
# File 'app/serializers/boat_serializer.rb', line 267

def exterior_color(boat)
  color = ::Dicts::ExteriorColor.find boat.exterior_color
  {
      exterior_color: {
          id:     (color.id    rescue nil),
          index:  (color.index rescue 'null')                                                                       # 'null' - индекс в локалях
      }
  }
end

.for_rent(boat) ⇒ Object



513
514
515
# File 'app/serializers/boat_serializer.rb', line 513

def for_rent(boat)
  { for_rent: boat.for_rent.to_i == 1 }
end

.for_sale(boat) ⇒ Object



517
518
519
# File 'app/serializers/boat_serializer.rb', line 517

def for_sale(boat)
  { for_sale: boat.for_sale.to_i == 1 }
end

.fuel_type(boat) ⇒ Object



328
329
330
331
332
# File 'app/serializers/boat_serializer.rb', line 328

def fuel_type(boat)
  {
    fuel_type: boat.fuel_type
  }
end

.hull_material(boat) ⇒ Object

12% def price_discount(boat)

value = if @opts[:is_for_rent]
          ::Lib::Boats::RentPricePerSeason.price_discount(boat, @opts[:currency])
        else
          ::Lib::Boats::SalePrice.price_discount(boat)
        end
{ price_discount: value }

end



308
309
310
311
312
313
314
315
316
# File 'app/serializers/boat_serializer.rb', line 308

def hull_material(boat)
  hm = ::Dicts::HullMaterial.find boat.hull_material
  {
      hull_material: {
          id:     (hm.id rescue nil),
          index:  (hm.index rescue 'null')                                                                          # 'null' - индекс в локалях
      }
  }
end

.latitude(boat) ⇒ Object

под видом этого атрибута будет приходить число - latitude главной локации



474
475
476
477
478
# File 'app/serializers/boat_serializer.rb', line 474

def latitude(boat)
  loc   = boat.boat_locations.select { |bl| bl.is_main }.first
  loc ||= boat.boat_locations.first
  { latitude: loc&.latitude || 0 }
end

.length(boat) ⇒ Object

используется для валидации лодки при обновлении стейта



374
375
376
377
378
379
380
381
# File 'app/serializers/boat_serializer.rb', line 374

def length(boat)
  {
      length: {
          value:     boat.send('boat_length_metrics_%s' % @opts[:uol]),
          length_id: ::Dicts::Length.find_by_index(@opts[:uol]).id
      }
  }
end

.location_address(boat) ⇒ Object

под видом этого атрибута будет приходить текст - название главной локации



488
489
490
491
492
493
494
# File 'app/serializers/boat_serializer.rb', line 488

def location_address(boat)
  loc   = boat.boat_locations.select { |bl| bl.is_main }.first                                                      # если не применяется поиск по адресу
  loc ||= boat.boat_locations.first                                                                                 # если поиск по адресу применён -- в результат поиска может не попасть главная локация
  {
      location_address: loc&.address || ''
  }
end

.locations(boat) ⇒ Object



496
497
498
499
500
501
502
# File 'app/serializers/boat_serializer.rb', line 496

def locations(boat)
  {
      locations: boat.boat_locations.map do |location|
        ::BoatLocationSerializer.serialize location
      end
  }
end

.longitude(boat) ⇒ Object

под видом этого атрибута будет приходить число - longitude главной локации



481
482
483
484
485
# File 'app/serializers/boat_serializer.rb', line 481

def longitude(boat)
  loc   = boat.boat_locations.select { |bl| bl.is_main }.first
  loc ||= boat.boat_locations.first
  { longitude: loc&.longitude || 0 }
end

.main_boat_photo_id(boat) ⇒ Object



249
250
251
252
253
254
255
# File 'app/serializers/boat_serializer.rb', line 249

def main_boat_photo_id(boat)
  boat_photo_id = if boat.boat_photo.present?
                    boat.boat_photo.id
                  end

  { main_boat_photo_id: boat_photo_id }
end

.motor(boat) ⇒ Object



239
240
241
242
243
244
245
246
247
# File 'app/serializers/boat_serializer.rb', line 239

def motor(boat)
  m = ::Dicts::Motor.find boat.motor
  {
      motor: {
          id:     (m.id    rescue nil),
          index:  (m.index rescue 'null')                                                                           # 'null' - индекс в локалях
      }
  }
end

.picture_medium_url(boat) ⇒ Object

noinspection RubyResolve



229
230
231
232
233
234
235
236
237
# File 'app/serializers/boat_serializer.rb', line 229

def picture_medium_url(boat)
  url = if boat.boat_photo.present?
          boat.boat_photo.picture.url(:medium)
        else
          ''
        end

  { picture_medium_url: url }
end

.prices(boat) ⇒ Object



400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
# File 'app/serializers/boat_serializer.rb', line 400

def prices(boat)
  currency_id  = ::Dicts::Currency.find_by_index(@opts[:currency]).id
  business     = ::Dicts::Business.find_by_index @opts[:business]

  prices       = if business.index == ::Dicts::Business::RENT.index
                   boat.boat_prices.select { |bp| bp.currency_id == currency_id }.map { |bp| ::BoatPriceSerializer.serialize bp }
                 else
                   # noinspection RubyResolve
                   boat.boat_sale_prices.select { |bp| bp.currency_id == currency_id }.map { |bps| ::BoatSalePriceSerializer.serialize bps }
                 end
  {
      prices:   {
          list:     prices,
          business: {
              index: business.index,
              id:    business.id
          }
      }
  }
end

.rent_prices(boat) ⇒ Object



421
422
423
424
425
426
427
428
429
# File 'app/serializers/boat_serializer.rb', line 421

def rent_prices(boat)
  currency_id = ::Dicts::Currency.find_by_index(@opts[:currency]).id

  {
      rent_prices: boat.boat_prices
                       .select { |bp| bp.currency_id == currency_id }
                       .map.each_with_index { |bp, index| ::BoatPriceSerializer.serialize(bp).merge(id:index) }
  }
end

.rental_type(boat) ⇒ Object



318
319
320
321
322
323
324
325
326
# File 'app/serializers/boat_serializer.rb', line 318

def rental_type(boat)
  hm = ::Dicts::RentSkipType.find boat.rental_type
  {
      rental_type: {
          id:     (hm.id rescue nil),
          index:  (hm.index rescue 'null')                                                                          # 'null' - индекс в локалях
      }
  }
end

.reviews(boat) ⇒ Object

TODO

impelement it



540
541
542
# File 'app/serializers/boat_serializer.rb', line 540

def reviews(boat)
  { reviews: [] }
end

.safety(boat) ⇒ Object



220
221
222
223
224
225
226
# File 'app/serializers/boat_serializer.rb', line 220

def safety(boat)
  {
      safety: safety_attributes.map do |f|
        [f, boat.send(f)]
      end.to_h
  }
end

.safety_attributesObject



186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
# File 'app/serializers/boat_serializer.rb', line 186

def safety_attributes
  %i[
    carbon_detector
    epirb
    fire_extinguisher
    first_aid_kit
    flares
    horn
    lifebuoy
    life_jackets
    personal_flotation_devices
    raft
    smoke_detector
    vessel_lighting
    visual_distress_signals
  ].freeze
end

.sale_price(boat) ⇒ Object

noinspection RubyResolve



432
433
434
435
436
437
438
439
# File 'app/serializers/boat_serializer.rb', line 432

def sale_price(boat)
  currency_id = ::Dicts::Currency.find_by_index(@opts[:currency]).id
  sale_price  = boat.boat_sale_prices.select { |bp| bp.currency_id == currency_id }.first

  {
      sale_price: (::BoatSalePriceSerializer.serialize sale_price rescue nil)
  }
end

.serialize(model, attributes: available_attributes, opts: {}) ⇒ Object



87
88
89
90
91
# File 'app/serializers/boat_serializer.rb', line 87

def serialize(model, attributes: available_attributes, opts: {})
  result = super(model, attributes: attributes, opts: default_opts.merge(opts))
  result[:opts] = serialize_opts
  result
end

.serialize_optsObject



544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
# File 'app/serializers/boat_serializer.rb', line 544

def serialize_opts
  locale   = ::Dicts::Locale.find_by_index   @opts[:locale].to_s
  uol      = ::Dicts::Length.find_by_index   @opts[:uol]
  business = ::Dicts::Business.find_by_index @opts[:business]
  currency = ::Dicts::Currency.find_by_index @opts[:currency]

  {
      locale: {
          index: locale.index,
          id:    locale.id
      },
      uol: {
          index: uol.index,
          id:    uol.id
      },
      business: {
          index: business.index,
          id:    business.id
      },
      currency: {
          index:  currency.index,
          id:     currency.id,
          symbol: currency.symbol
      }
  }
end

.short_description(boat) ⇒ Object



261
262
263
264
265
# File 'app/serializers/boat_serializer.rb', line 261

def short_description(boat)
  attr  = 'short_description_%s' % @opts[:locale]
  value = boat.send(attr.to_sym)
  { short_description: value }
end

.state(boat) ⇒ Object



103
104
105
# File 'app/serializers/boat_serializer.rb', line 103

def state(boat)
  { state: I18n.t('attributes.state_%s' % boat.state) }
end

.toys(boat) ⇒ Object



132
133
134
135
136
137
138
# File 'app/serializers/boat_serializer.rb', line 132

def toys(boat)
  {
    toys: toys_attributes.map do |f|
      [f, boat.send(f)]
    end.to_h
  }
end

.toys_attributesObject



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'app/serializers/boat_serializer.rb', line 107

def toys_attributes
  %i[
    banana
    beach_kids_toys
    donut
    exercise_equipment
    fishing_gear
    flyboard
    inflatable_sailboat
    jet_ski
    kayak
    kneeboard
    paddle_boards
    sailing_boat
    scuba_tanks
    skiboard
    snorkelling_gear
    stand_up_jet_ski
    underwater_gear
    wakeboard
    water_ski
    windsurfing_board
  ].freeze
end