Last active
December 4, 2024 08:16
-
-
Save Kovah/3f3ce850f90f9070784f30d6915893da to your computer and use it in GitHub Desktop.
Health Dashboard: Health Metric Model
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Modules\AppleHealth\Models; | |
use App\Modules\AppleHealth\Enums\Unit; // @see https://gist.github.com/Kovah/5a8b17e33ddeca54fd8e4a402a46e158 | |
use Illuminate\Database\Eloquent\Model; | |
class HealthMetric extends Model | |
{ | |
public static array $metricUnits = [ | |
'active_energy' => Unit::KILO_JOULE, | |
'apple_exercise_time' => Unit::MINUTES, | |
'apple_stand_hour' => Unit::COUNT, | |
'apple_stand_time' => Unit::MINUTES, | |
'basal_body_temperature' => Unit::DEGREES_CELSIUS, | |
'basal_energy_burned' => Unit::KILO_JOULE, | |
'blood_alcohol_content' => Unit::PERCENT, | |
'blood_glucose' => Unit::MOLARITY_LITRES, | |
'blood_oxygen_saturation' => Unit::PERCENT, | |
'blood_pressure' => Unit::MILLIMETRE_OF_MERCURY, | |
'body_fat_percentage' => Unit::PERCENT, | |
'body_mass_index' => Unit::COUNT, | |
'body_temperature' => Unit::DEGREES_CELSIUS, | |
'calcium' => Unit::MILLI_GRAMS, | |
'carbohydrates' => Unit::GRAMS, | |
'chloride' => Unit::MILLI_GRAMS, | |
'chromium' => Unit::MICRO_GRAMS, | |
'copper' => Unit::MILLI_GRAMS, | |
'cycling_distance' => Unit::KILO_METRES, | |
'dietary_biotin' => Unit::MICRO_GRAMS, | |
'dietary_caffeine' => Unit::MILLI_GRAMS, | |
'dietary_cholesterol' => Unit::MILLI_GRAMS, | |
'dietary_energy' => Unit::KILO_JOULE, | |
'dietary_sugar' => Unit::GRAMS, | |
'dietary_water' => Unit::MILLI_LITRES, | |
'distance_downhill_snow_sports' => Unit::KILO_METRES, | |
'environmental_audio_exposure' => Unit::SOUND_PRESSURE, | |
'fiber' => Unit::GRAMS, | |
'flights_climbed' => Unit::COUNT, | |
'folate' => Unit::MICRO_GRAMS, | |
'forced_expiratory_volume_1' => Unit::LITRES, | |
'forced_vital_capacity' => Unit::LITRES, | |
'handwashing' => Unit::SECONDS, | |
'headphone_audio_exposure' => Unit::SOUND_PRESSURE, | |
'heart_rate' => Unit::COUNT_PER_MIN, | |
'heart_rate_variability' => Unit::MILLI_SECONDS, | |
'height' => Unit::METRES, | |
'high_heart_rate_notifications' => Unit::COUNT, | |
'inhaler_usage' => Unit::COUNT, | |
'insulin_delivery' => Unit::INTERNATIONAL_UNITS, | |
'iodine' => Unit::MICRO_GRAMS, | |
'iron' => Unit::MILLI_GRAMS, | |
'irregular_heart_rate_notifications' => Unit::COUNT, | |
'lean_body_mass' => Unit::KILO_GRAMS, | |
'low_heart_rate_notifications' => Unit::COUNT, | |
'magnesium' => Unit::MILLI_GRAMS, | |
'manganese' => Unit::MILLI_GRAMS, | |
'mindful_minutes' => Unit::MINUTES, | |
'molybdenum' => Unit::MICRO_GRAMS, | |
'monounsaturated_fat' => Unit::GRAMS, | |
'niacin' => Unit::MILLI_GRAMS, | |
'number_of_times_fallen' => Unit::COUNT, | |
'pantothenic_acid' => Unit::MILLI_GRAMS, | |
'peak_expiratory_flow_rate' => Unit::LITRES_PER_MIN, | |
'peripheral_perfusion_index' => Unit::PERCENT, | |
'polyunsaturated_fat' => Unit::GRAMS, | |
'potassium' => Unit::MILLI_GRAMS, | |
'protein' => Unit::GRAMS, | |
'push_count' => Unit::COUNT, | |
'respiratory_rate' => Unit::COUNT_PER_MIN, | |
'resting_heart_rate' => Unit::COUNT_PER_MIN, | |
'riboflavin' => Unit::MILLI_GRAMS, | |
'saturated_fat' => Unit::GRAMS, | |
'selenium' => Unit::MICRO_GRAMS, | |
'sexual_activity' => Unit::COUNT, | |
'six_minute_walking_test_distance' => Unit::METRES, | |
'sleep_analysis' => Unit::HOURS, | |
'sodium' => Unit::MILLI_GRAMS, | |
'stair_speed_down' => Unit::METRES_PER_SECOND, | |
'stair_speed_up' => Unit::METRES_PER_SECOND, | |
'step_count' => Unit::COUNT, | |
'swimming_distance' => Unit::METRES, | |
'swimming_stroke_count' => Unit::COUNT, | |
'thiamin' => Unit::MILLI_GRAMS, | |
'toothbrushing' => Unit::SECONDS, | |
'total_fat' => Unit::GRAMS, | |
'vo2_max' => Unit::VO2_MAX, | |
'vitamin_a' => Unit::MICRO_GRAMS, | |
'vitamin_b12' => Unit::MICRO_GRAMS, | |
'vitamin_b6' => Unit::MILLI_GRAMS, | |
'vitamin_c' => Unit::MILLI_GRAMS, | |
'vitamin_d' => Unit::MICRO_GRAMS, | |
'vitamin_e' => Unit::MILLI_GRAMS, | |
'vitamin_k' => Unit::MICRO_GRAMS, | |
'waist_circumference' => Unit::CENTI_METRES, | |
'walking_running_distance' => Unit::KILO_METRES, | |
'walking_asymmetry_percentage' => Unit::PERCENT, | |
'walking_double_support_percentage' => Unit::PERCENT, | |
'walking_heart_rate_average' => Unit::COUNT_PER_MIN, | |
'walking_speed' => Unit::KILOMETRES_PER_HOUR, | |
'walking_step_length' => Unit::CENTI_METRES, | |
'weight_body_mass' => Unit::KILO_GRAMS, | |
'wheelchair_distance' => Unit::KILO_METRES, | |
'zinc' => Unit::MILLI_GRAMS, | |
]; | |
public $incrementing = false; | |
public $timestamps = false; | |
protected $table = 'applehealth_metrics'; | |
protected $keyType = 'string'; | |
protected $fillable = [ | |
'user_id', | |
'name', | |
'value', | |
'date', | |
]; | |
protected $casts = [ | |
'user_id' => 'int', | |
'date' => 'datetime', | |
]; | |
public function getKey() | |
{ | |
return 'date'; | |
} | |
public function getFormattedValueAttribute(): string | |
{ | |
$unit = self::$metricUnits[$this->name]?->value ?? ''; | |
return match ($this->name) { | |
'sleep_analysis' => json_encode(json_decode($this->value, true), JSON_PRETTY_PRINT), | |
default => sprintf('%f %s', $this->value, $unit), | |
}; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment