Files
workouts/MODEL.md
2025-07-25 17:42:25 -04:00

2.3 KiB

Data Model

Guidelines

General

  • When implementing a SwiftData model, allocate each model into its own file under "Models" directory.

Schema Versioning

  • Keep schema configurations in a separate folder called "Schema"
  • Setup an enum for schema versioning
  • Create SchemaMigrationPlan struct in Schema/SchemaMigrationPlan.swift for managing schema migrations
  • Use schema versioning to manage changes to the data model
  • When adding a new model, increment the schema version
  • When removing a model, increment the schema version
  • When modifying a model, increment the schema version

SwiftData Relationship Rules

  • DO NOT create any relationships that are not explicitly defined in the data model
  • AVOID circular references in all cases
  • Infer type of relationship from the property name (to many for plural, to one for singular)

Models

ExerciseType

  • name (String)
  • descr (String)
  • exercises (Set?) // deleteRule: nullify

MuscleGroup

  • name (String)
  • descr (String)
  • muscles (Set?) // deleteRule: nullify

Muscle

  • name (String)
  • descr (String)
  • muscleGroup (MuscleGroup?) // deleteRule: nullify, inverse: MuscleGroup.muscles
  • exercises (Set?) // deleteRule: nullify

Exercise

  • type (ExerciseType?) // deleteRule: .nullify, inverse: ExerciseType.exercises
  • name (String)
  • setup (String)
  • descr (String)
  • muscles (Set?) // deleteRule: .nullify, inverse: Muscle.exercises
  • sets (Int)
  • reps (Int)
  • weight (Int)
  • splits (Set?) // deleteRule: .nullify, inverse: SplitExerciseAssignment.exercise
  • logs (Set?) // deleteRule: .nullify, inverse: WorkoutLog.exercise

SplitExerciseAssignment

  • split (Split?) // deleteRule: .nullify
  • exercise (Exercise?) // deleteRule: .nullify
  • order (Int)
  • sets (Int)
  • reps (Int)
  • weight (Int)

Split

  • name (String)
  • intro (String)
  • exercises (Set?) // deleteRule: .cascade, inverse: SplitExerciseAssignment.split

WorkoutLog

  • workout (Workout?) // deleteRule: .nullify
  • exercise (Exercise?) // deleteRule: .nullify
  • date (Date)
  • sets (Int)
  • reps (Int)
  • weight (Int)
  • completed (Bool)

Workout

  • split (Split?) // deleteRule: .nullify
  • start (Date)
  • end (Date?)
  • logs (Set?) // deleteRule: .cascade, inverse: WorkoutLog.workout