feat: replace age integer with date_of_birth across backend and client
Store date_of_birth (DATE) instead of a static age integer so that age is always computed dynamically from the stored date of birth. - Migration 011: adds date_of_birth, backfills from age, drops age - AgeFromDOB helper computes current age from YYYY-MM-DD string - User model, repository SQL, and service validation updated - Flutter: User.age becomes a computed getter; profile edit screen uses a date picker bounded to [today-120y, today-10y] Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -13,7 +13,8 @@ class User {
|
||||
final int? heightCm;
|
||||
@JsonKey(name: 'weight_kg')
|
||||
final double? weightKg;
|
||||
final int? age;
|
||||
@JsonKey(name: 'date_of_birth')
|
||||
final String? dateOfBirth;
|
||||
final String? gender;
|
||||
final String? activity;
|
||||
final String? goal;
|
||||
@@ -30,7 +31,7 @@ class User {
|
||||
this.avatarUrl,
|
||||
this.heightCm,
|
||||
this.weightKg,
|
||||
this.age,
|
||||
this.dateOfBirth,
|
||||
this.gender,
|
||||
this.activity,
|
||||
this.goal,
|
||||
@@ -42,6 +43,19 @@ class User {
|
||||
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
|
||||
Map<String, dynamic> toJson() => _$UserToJson(this);
|
||||
|
||||
int? get age {
|
||||
if (dateOfBirth == null) return null;
|
||||
final dob = DateTime.tryParse(dateOfBirth!);
|
||||
if (dob == null) return null;
|
||||
final now = DateTime.now();
|
||||
int years = now.year - dob.year;
|
||||
if (now.month < dob.month ||
|
||||
(now.month == dob.month && now.day < dob.day)) {
|
||||
years--;
|
||||
}
|
||||
return years;
|
||||
}
|
||||
|
||||
bool get hasCompletedOnboarding =>
|
||||
heightCm != null && weightKg != null && age != null && gender != null;
|
||||
heightCm != null && weightKg != null && dateOfBirth != null && gender != null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user