Add Doris Barbell live workout logger
This commit is contained in:
@@ -155,6 +155,7 @@ DEFAULT_STATE = {
|
||||
'weight_entries': [],
|
||||
'measurement_entries': [],
|
||||
'workout_sessions': [],
|
||||
'active_workout_sessions': [],
|
||||
}
|
||||
|
||||
LEGACY_TEMPLATE_ALIASES = {
|
||||
@@ -176,7 +177,11 @@ class JSONStore:
|
||||
self._write(seeded_state)
|
||||
|
||||
def _read(self) -> dict[str, Any]:
|
||||
return json.loads(self.state_path.read_text())
|
||||
payload = json.loads(self.state_path.read_text())
|
||||
seeded_payload = _ensure_seeded_library(payload)
|
||||
if seeded_payload != payload:
|
||||
self._write(seeded_payload)
|
||||
return seeded_payload
|
||||
|
||||
def _write(self, payload: dict[str, Any]) -> None:
|
||||
self.state_path.write_text(json.dumps(payload, indent=2, sort_keys=True))
|
||||
@@ -278,6 +283,84 @@ class JSONStore:
|
||||
return routine
|
||||
return None
|
||||
|
||||
def get_active_workout_session(self, routine_id: str, user_id: str) -> dict[str, Any] | None:
|
||||
state = self._read()
|
||||
self._user_or_raise(state, user_id)
|
||||
for session in state['active_workout_sessions']:
|
||||
if session['routine_id'] == routine_id and session['user_id'] == user_id:
|
||||
return session
|
||||
return None
|
||||
|
||||
def start_active_workout_session(self, payload: dict[str, Any]) -> dict[str, Any]:
|
||||
state = self._read()
|
||||
self._user_or_raise(state, payload['user_id'])
|
||||
state['active_workout_sessions'] = [
|
||||
session
|
||||
for session in state['active_workout_sessions']
|
||||
if not (
|
||||
session['routine_id'] == payload['routine_id'] and session['user_id'] == payload['user_id']
|
||||
)
|
||||
]
|
||||
saved = {
|
||||
'id': uuid4().hex,
|
||||
'routine_id': payload['routine_id'],
|
||||
'routine_name': payload['routine_name'],
|
||||
'user_id': payload['user_id'],
|
||||
'performed_at': payload['performed_at'],
|
||||
'notes': payload.get('notes'),
|
||||
'exercises': [],
|
||||
}
|
||||
state['active_workout_sessions'].append(saved)
|
||||
self._write(state)
|
||||
return saved
|
||||
|
||||
def add_active_workout_exercise(self, routine_id: str, user_id: str, exercise: dict[str, Any]) -> dict[str, Any]:
|
||||
state = self._read()
|
||||
self._user_or_raise(state, user_id)
|
||||
for session in state['active_workout_sessions']:
|
||||
if session['routine_id'] == routine_id and session['user_id'] == user_id:
|
||||
session['exercises'].append(
|
||||
{
|
||||
'exercise_name': exercise['exercise_name'],
|
||||
'notes': exercise.get('notes'),
|
||||
'sets': [dict(item) for item in exercise['sets']],
|
||||
}
|
||||
)
|
||||
self._write(state)
|
||||
return session
|
||||
raise KeyError((routine_id, user_id))
|
||||
|
||||
def finish_active_workout_session(self, routine_id: str, user_id: str, notes: str | None = None) -> dict[str, Any]:
|
||||
state = self._read()
|
||||
self._user_or_raise(state, user_id)
|
||||
for session in state['active_workout_sessions']:
|
||||
if session['routine_id'] != routine_id or session['user_id'] != user_id:
|
||||
continue
|
||||
workout_payload = {
|
||||
'user_id': user_id,
|
||||
'performed_at': session['performed_at'],
|
||||
'routine_name': session['routine_name'],
|
||||
'notes': notes,
|
||||
'exercises': [
|
||||
{
|
||||
'exercise_name': exercise['exercise_name'],
|
||||
'notes': exercise.get('notes'),
|
||||
'sets': [dict(item) for item in exercise['sets']],
|
||||
}
|
||||
for exercise in session['exercises']
|
||||
],
|
||||
}
|
||||
saved_workout = self.add_workout(workout_payload)
|
||||
refreshed_state = self._read()
|
||||
refreshed_state['active_workout_sessions'] = [
|
||||
active_session
|
||||
for active_session in refreshed_state['active_workout_sessions']
|
||||
if active_session.get('id') != session['id']
|
||||
]
|
||||
self._write(refreshed_state)
|
||||
return saved_workout
|
||||
raise KeyError((routine_id, user_id))
|
||||
|
||||
def add_workout(self, payload: dict[str, Any]) -> dict[str, Any]:
|
||||
state = self._read()
|
||||
self._user_or_raise(state, payload['user_id'])
|
||||
@@ -430,6 +513,7 @@ def _ensure_seeded_library(state: dict[str, Any]) -> dict[str, Any]:
|
||||
payload.setdefault('weight_entries', [])
|
||||
payload.setdefault('measurement_entries', [])
|
||||
payload.setdefault('workout_sessions', [])
|
||||
payload.setdefault('active_workout_sessions', [])
|
||||
|
||||
for template in payload['exercise_templates']:
|
||||
legacy_name = template.get('name', '').strip().lower()
|
||||
|
||||
Reference in New Issue
Block a user