dawarich/app/models/user.rb

113 lines
2.9 KiB
Ruby
Raw Normal View History

2024-04-26 12:59:58 -04:00
# frozen_string_literal: true
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable, :trackable
2024-03-15 18:27:31 -04:00
2024-05-25 07:26:56 -04:00
has_many :tracked_points, class_name: 'Point', dependent: :destroy
2024-08-25 14:19:02 -04:00
has_many :imports, dependent: :destroy
has_many :stats, dependent: :destroy
has_many :exports, dependent: :destroy
has_many :notifications, dependent: :destroy
has_many :areas, dependent: :destroy
has_many :visits, dependent: :destroy
has_many :points, through: :imports
has_many :places, through: :visits
2025-01-23 10:03:21 -05:00
has_many :trips, dependent: :destroy
2024-03-23 16:16:11 -04:00
after_create :create_api_key
before_save :sanitize_input
validates :email, presence: true
validates :reset_password_token, uniqueness: true, allow_nil: true
attribute :admin, :boolean, default: false
def safe_settings
Users::SafeSettings.new(settings)
end
2024-04-26 12:59:58 -04:00
def countries_visited
stats.pluck(:toponyms).flatten.map { _1['country'] }.uniq.compact
end
def cities_visited
stats
.where.not(toponyms: nil)
.pluck(:toponyms)
.flatten
.reject { |toponym| toponym['cities'].blank? }
.pluck('cities')
.flatten
.pluck('city')
.uniq
.compact
2024-03-23 16:46:18 -04:00
end
2024-08-28 17:54:00 -04:00
def total_distance
# In km or miles, depending on the application settings (DISTANCE_UNIT)
2024-04-26 12:59:58 -04:00
stats.sum(:distance)
2024-03-23 16:16:11 -04:00
end
def total_countries
2024-04-26 12:59:58 -04:00
countries_visited.size
2024-03-23 16:16:11 -04:00
end
def total_cities
2024-04-26 12:59:58 -04:00
cities_visited.size
2024-03-23 16:16:11 -04:00
end
2024-03-24 13:55:35 -04:00
def total_reverse_geocoded_points
tracked_points.where.not(reverse_geocoded_at: nil).count
end
def total_reverse_geocoded_points_without_data
tracked_points.where(geodata: {}).count
2024-03-24 13:55:35 -04:00
end
def immich_integration_configured?
settings['immich_url'].present? && settings['immich_api_key'].present?
end
def photoprism_integration_configured?
settings['photoprism_url'].present? && settings['photoprism_api_key'].present?
end
2024-12-06 10:52:36 -05:00
def years_tracked
Rails.cache.fetch("dawarich/user_#{id}_years_tracked", expires_in: 1.day) do
# Use select_all for better performance with large datasets
sql = <<-SQL
SELECT DISTINCT
EXTRACT(YEAR FROM TO_TIMESTAMP(timestamp)) AS year,
TO_CHAR(TO_TIMESTAMP(timestamp), 'Mon') AS month
FROM points
WHERE user_id = #{id}
ORDER BY year DESC, month ASC
SQL
result = ActiveRecord::Base.connection.select_all(sql)
result
.map { |r| [r['year'].to_i, r['month']] }
.group_by { |year, _| year }
.transform_values { |year_data| year_data.map { |_, month| month } }
.map { |year, months| { year: year, months: months } }
2024-12-06 10:52:36 -05:00
end
end
private
def create_api_key
self.api_key = SecureRandom.hex(16)
2024-05-23 14:12:23 -04:00
save
end
def sanitize_input
2024-12-02 11:22:36 -05:00
settings['immich_url']&.gsub!(%r{/+\z}, '')
settings['photoprism_url']&.gsub!(%r{/+\z}, '')
settings['maps']['url']&.strip!
end
end