initial requirements and direction for windsurf

This commit is contained in:
2025-07-13 08:55:07 -04:00
parent ba81f06c56
commit 6cd44579e2
9 changed files with 712 additions and 0 deletions

81
MODEL.md Normal file
View File

@ -0,0 +1,81 @@
# 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<Exercise>?) // deleteRule: nullify, inverse: Exercise.types
MuscleGroup
- name (String)
- descr (String)
- muscles (Set<Muscle>?) // deleteRule: nullify, inverse: Muscle.groups
Muscle
- name (String)
- descr (String)
- groups (Set<MuscleGroup>) // deleteRule: nullify, inverse: MuscleGroup.muscles
- exercises (Set<Exercise>?) // deleteRule: nullify, inverse: Exercise.muscles
Exercise
- types (Set<ExerciseType>?) // deleteRule: .nullify, inverse: ExerciseType.exercises
- name (String)
- setup (String)
- descr (String)
- muscles (Set<Muscle>?) // deleteRule: .nullify, inverse: Muscle.exercises
- sets (Int)
- reps (Int)
- weight (Int)
- splits (Set<SplitExerciseAssignment>?) // deleteRule: .nullify, inverse: SplitExerciseAssignment.exercise
- logs (Set<WorkoutLog>?) // deleteRule: .nullify, inverse: WorkoutLog.exercise
SplitExerciseAssignment
- split (Split?) // deleteRule: .nullify, inverse: Split.exercises
- exercise (Exercise?) // deleteRule: .nullify, inverse: Exercise.splits
- order (Int)
- sets (Int)
- reps (Int)
- weight (Int)
Split
- name (String)
- intro (String)
- exercises (Set<SplitExerciseAssignment>?) // deleteRule: .cascade, inverse: SplitExerciseAssignment.split
WorkoutLog
- workout (Workout?) // deleteRule: .nullify, inverse: Workout.logs
- exercise (Exercise?) // deleteRule: .nullify, inverse: Exercise.logs
- date (Date)
- sets (Int)
- reps (Int)
- weight (Int)
- completed (Bool)
Workout
- split (Split?) // deleteRule: .nullify, inverse: Split.workouts
- start (Date)
- end (Date?)
- logs (Set<WorkoutLog>?) // deleteRule: .cascade, inverse: WorkoutLog.workout