This commit is contained in:
Christoph K.
2026-04-07 09:49:17 +02:00
parent 063aa67615
commit 4db170b467
37 changed files with 269 additions and 48 deletions

View File

@@ -157,6 +157,8 @@ func (s *Store) CreateLog(sessionID int64, req *model.CreateLogRequest) (*model.
return nil, err
}
// exercise_name wird denormalisiert gespeichert, damit historische Logs
// erhalten bleiben wenn die Übung später gelöscht wird.
var exerciseName string
err := s.db.QueryRow(`SELECT name FROM exercises WHERE id = ? AND deleted_at IS NULL`, req.ExerciseID).Scan(&exerciseName)
if err == sql.ErrNoRows {
@@ -197,6 +199,7 @@ func (s *Store) UpdateLog(sessionID, logID int64, req *model.UpdateLogRequest) (
return nil, nil
}
// Dynamisches UPDATE: nur explizit übergebene Felder werden geändert (Partial Update).
updates := []string{}
args := []any{}
if req.WeightKg != nil {
@@ -293,7 +296,8 @@ func (s *Store) DeleteSession(id, userID int64) error {
return nil
}
// checkSessionOpen prüft ob eine Session offen ist.
// checkSessionOpen prüft ob eine Session existiert und noch nicht beendet wurde.
// Gibt einen Fehler mit "SESSION_CLOSED" zurück wenn ended_at bereits gesetzt ist.
func (s *Store) checkSessionOpen(sessionID int64) error {
var endedAt *string
err := s.db.QueryRow(`SELECT ended_at FROM sessions WHERE id = ?`, sessionID).Scan(&endedAt)
@@ -309,7 +313,7 @@ func (s *Store) checkSessionOpen(sessionID int64) error {
return nil
}
// getLog gibt einen einzelnen Log-Eintrag zurück.
// getLog lädt einen einzelnen Session-Log-Eintrag anhand seiner ID.
func (s *Store) getLog(id int64) (*model.SessionLog, error) {
var log model.SessionLog
err := s.db.QueryRow(`
@@ -325,7 +329,7 @@ func (s *Store) getLog(id int64) (*model.SessionLog, error) {
return &log, nil
}
// getSessionLogs gibt alle Logs einer Session zurück.
// getSessionLogs lädt alle Logs einer Session, sortiert nach Übung und Satznummer.
func (s *Store) getSessionLogs(sessionID int64) ([]model.SessionLog, error) {
rows, err := s.db.Query(`
SELECT id, session_id, exercise_id, exercise_name, set_number, weight_kg, reps, note, logged_at

View File

@@ -168,7 +168,8 @@ func (s *Store) SoftDeleteSet(id, userID int64) error {
return nil
}
// getSetExercises lädt die Übungen eines Sets sortiert nach Position.
// getSetExercises lädt die nicht-gelöschten Übungen eines Sets, sortiert nach Position.
// Soft-gelöschte Übungen werden nicht zurückgegeben.
func (s *Store) getSetExercises(setID int64) ([]model.Exercise, error) {
rows, err := s.db.Query(`
SELECT e.id, e.name, e.description, e.muscle_group, e.weight_step_kg, e.created_at, e.updated_at

View File

@@ -5,7 +5,7 @@ import (
"krafttrainer/internal/model"
)
// StatsOverview enthält die Gesamtübersicht.
// StatsOverview enthält aggregierte Trainingsdaten eines Nutzers.
type StatsOverview struct {
TotalSessions int `json:"total_sessions"`
TotalVolumeKg float64 `json:"total_volume_kg"`

View File

@@ -59,6 +59,7 @@ func (s *Store) DeleteUser(id int64) error {
return nil
}
// getUser lädt einen Nutzer anhand seiner ID.
func (s *Store) getUser(id int64) (*model.User, error) {
var u model.User
err := s.db.QueryRow(`SELECT id, name, created_at FROM users WHERE id = ?`, id).