Tauri 2 + pure JS + SQLite personal health tracking app. Nutrition module: - 9299 products in DB (Magnit SSR scraping + KDV) - Product search with case-insensitive Cyrillic (name_lower column) - Food logging from product DB or manual entry - Supplement tracking with per-pill micronutrients - Micronutrient % strip on Today screen Fitness/GPS module: - FitoTrack .ftb and GPX import with seq-based ordering - Session detail view: map, speed/elevation charts (Chart.js) - Offline tile caching (IndexedDB) with region download - Track rendering with colored time-gradient points UI: - Fullscreen modals with back-button (history API) - Dark theme, desktop-responsive layout - 5 tabs: Today, Products, Track, Supplements, Profile Tools: - Magnit/KDV HTML parsers - Dedup import with discrepancy detection - FitoTrack backup analysis
196 lines
7.8 KiB
Rust
196 lines
7.8 KiB
Rust
use tauri_plugin_sql::{Migration, MigrationKind};
|
|
|
|
pub fn run() {
|
|
let migrations = vec![
|
|
Migration {
|
|
version: 1,
|
|
description: "full schema v1",
|
|
sql: r#"
|
|
PRAGMA foreign_keys = ON;
|
|
|
|
CREATE TABLE IF NOT EXISTS profile (
|
|
key TEXT PRIMARY KEY,
|
|
value TEXT
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS products (
|
|
id INTEGER PRIMARY KEY,
|
|
name TEXT NOT NULL,
|
|
brand TEXT,
|
|
category TEXT,
|
|
weight_g REAL,
|
|
kcal_per_100g REAL,
|
|
protein_per_100g REAL,
|
|
fat_per_100g REAL,
|
|
carbs_per_100g REAL,
|
|
fiber_per_100g REAL,
|
|
vit_a_mcg REAL,
|
|
vit_c_mg REAL,
|
|
vit_d_mcg REAL,
|
|
vit_e_mg REAL,
|
|
vit_k_mcg REAL,
|
|
vit_b1_mg REAL,
|
|
vit_b2_mg REAL,
|
|
vit_b3_mg REAL,
|
|
vit_b6_mg REAL,
|
|
vit_b12_mcg REAL,
|
|
folate_mcg REAL,
|
|
calcium_mg REAL,
|
|
iron_mg REAL,
|
|
magnesium_mg REAL,
|
|
zinc_mg REAL,
|
|
copper_mg REAL,
|
|
selenium_mcg REAL,
|
|
potassium_mg REAL,
|
|
sodium_mg REAL,
|
|
source TEXT,
|
|
store_id TEXT,
|
|
image_path TEXT,
|
|
created_at TEXT DEFAULT (datetime('now','localtime'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS supplements (
|
|
id INTEGER PRIMARY KEY,
|
|
name TEXT NOT NULL,
|
|
daily_dose_g REAL,
|
|
vit_a_mcg REAL,
|
|
vit_c_mg REAL,
|
|
vit_d_mcg REAL,
|
|
vit_e_mg REAL,
|
|
vit_k_mcg REAL,
|
|
vit_b1_mg REAL,
|
|
vit_b2_mg REAL,
|
|
vit_b3_mg REAL,
|
|
vit_b6_mg REAL,
|
|
vit_b12_mcg REAL,
|
|
folate_mcg REAL,
|
|
calcium_mg REAL,
|
|
iron_mg REAL,
|
|
magnesium_mg REAL,
|
|
zinc_mg REAL,
|
|
copper_mg REAL,
|
|
selenium_mcg REAL,
|
|
potassium_mg REAL,
|
|
sodium_mg REAL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS recipes (
|
|
id INTEGER PRIMARY KEY,
|
|
name TEXT NOT NULL,
|
|
cooking_method TEXT,
|
|
cooking_temp_c INTEGER,
|
|
servings INTEGER DEFAULT 1,
|
|
notes TEXT
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS recipe_ingredients (
|
|
id INTEGER PRIMARY KEY,
|
|
recipe_id INTEGER NOT NULL REFERENCES recipes(id) ON DELETE CASCADE,
|
|
product_id INTEGER NOT NULL REFERENCES products(id),
|
|
amount_g REAL NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS weight_log (
|
|
id INTEGER PRIMARY KEY,
|
|
date TEXT NOT NULL,
|
|
time TEXT,
|
|
weight_kg REAL NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS sleep_log (
|
|
id INTEGER PRIMARY KEY,
|
|
date TEXT NOT NULL,
|
|
bed_time TEXT,
|
|
asleep_time TEXT,
|
|
wake_time TEXT,
|
|
nap_minutes INTEGER DEFAULT 0,
|
|
notes TEXT
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS food_log (
|
|
id INTEGER PRIMARY KEY,
|
|
date TEXT NOT NULL,
|
|
time TEXT,
|
|
product_id INTEGER REFERENCES products(id),
|
|
recipe_id INTEGER REFERENCES recipes(id),
|
|
amount_g REAL NOT NULL,
|
|
kcal REAL,
|
|
protein_g REAL,
|
|
fat_g REAL,
|
|
carbs_g REAL,
|
|
fiber_g REAL,
|
|
note TEXT
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS supplement_log (
|
|
id INTEGER PRIMARY KEY,
|
|
date TEXT NOT NULL,
|
|
time TEXT,
|
|
supplement_id INTEGER NOT NULL REFERENCES supplements(id),
|
|
dose_g REAL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS gps_sessions (
|
|
id INTEGER PRIMARY KEY,
|
|
date TEXT NOT NULL,
|
|
start_time TEXT,
|
|
end_time TEXT,
|
|
activity_type TEXT,
|
|
total_distance_m REAL,
|
|
total_kcal REAL,
|
|
avg_speed_kmh REAL,
|
|
max_speed_kmh REAL,
|
|
elevation_gain_m REAL,
|
|
elevation_loss_m REAL,
|
|
source TEXT
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS gps_points (
|
|
id INTEGER PRIMARY KEY,
|
|
session_id INTEGER NOT NULL REFERENCES gps_sessions(id) ON DELETE CASCADE,
|
|
ts TEXT NOT NULL,
|
|
lat REAL NOT NULL,
|
|
lon REAL NOT NULL,
|
|
altitude_gps_m REAL,
|
|
altitude_srtm_m REAL,
|
|
speed_ms REAL,
|
|
heart_rate INTEGER
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS activity_log (
|
|
id INTEGER PRIMARY KEY,
|
|
date TEXT NOT NULL,
|
|
time TEXT,
|
|
type TEXT,
|
|
desc TEXT,
|
|
minutes INTEGER,
|
|
kcal REAL,
|
|
gps_session_id INTEGER REFERENCES gps_sessions(id)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_food_log_date ON food_log(date);
|
|
CREATE INDEX IF NOT EXISTS idx_activity_log_date ON activity_log(date);
|
|
CREATE INDEX IF NOT EXISTS idx_weight_log_date ON weight_log(date);
|
|
CREATE INDEX IF NOT EXISTS idx_sleep_log_date ON sleep_log(date);
|
|
CREATE INDEX IF NOT EXISTS idx_gps_points_sess ON gps_points(session_id);
|
|
CREATE INDEX IF NOT EXISTS idx_products_name ON products(name COLLATE NOCASE);
|
|
"#,
|
|
kind: MigrationKind::Up,
|
|
},
|
|
Migration {
|
|
version: 2,
|
|
description: "add composition column to products",
|
|
sql: "ALTER TABLE products ADD COLUMN composition TEXT;",
|
|
kind: MigrationKind::Up,
|
|
},
|
|
];
|
|
|
|
tauri::Builder::default()
|
|
.plugin(
|
|
tauri_plugin_sql::Builder::default()
|
|
.add_migrations("sqlite:baldav.db", migrations)
|
|
.build(),
|
|
)
|
|
.run(tauri::generate_context!())
|
|
.expect("error while running tauri application");
|
|
}
|