dawarich/app/models/trip.rb

62 lines
1.5 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
class Trip < ApplicationRecord
2025-07-04 13:49:56 -04:00
include Calculateable
include DistanceConvertible
2025-07-04 13:49:56 -04:00
has_rich_text :notes
2024-11-28 06:00:54 -05:00
belongs_to :user
validates :name, :started_at, :ended_at, presence: true
2025-05-15 15:33:01 -04:00
after_create :enqueue_calculation_jobs
after_update :enqueue_calculation_jobs, if: -> { saved_change_to_started_at? || saved_change_to_ended_at? }
2025-05-15 15:33:01 -04:00
def enqueue_calculation_jobs
2025-05-19 13:10:07 -04:00
Trips::CalculateAllJob.perform_later(id, user.safe_settings.distance_unit)
2025-05-15 15:33:01 -04:00
end
def points
user.tracked_points.where(timestamp: started_at.to_i..ended_at.to_i).order(:timestamp)
end
def countries
return points.pluck(:country).uniq.compact if DawarichSettings.store_geodata?
visited_countries
end
2024-11-28 04:40:08 -05:00
def photo_previews
@photo_previews ||= select_dominant_orientation(photos).sample(12)
2024-12-10 12:49:37 -05:00
end
2024-11-28 04:40:08 -05:00
def photo_sources
@photo_sources ||= photos.map { _1[:source] }.uniq
2024-11-28 04:40:08 -05:00
end
2025-01-29 05:43:02 -05:00
def calculate_countries
2025-05-16 12:51:48 -04:00
countries =
Country.where(id: points.pluck(:country_id).compact.uniq).pluck(:name)
self.visited_countries = countries
end
2025-05-15 15:33:01 -04:00
private
def photos
@photos ||= Trips::Photos.new(self, user).call
end
def select_dominant_orientation(photos)
vertical_photos = photos.select { |photo| photo[:orientation] == 'portrait' }
horizontal_photos = photos.select { |photo| photo[:orientation] == 'landscape' }
# this is ridiculous, but I couldn't find my way around frontend
# to show all photos in the same height
vertical_photos.count > horizontal_photos.count ? vertical_photos : horizontal_photos
end
end