initial requirements and direction for windsurf
This commit is contained in:
81
MODEL.md
Normal file
81
MODEL.md
Normal 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
|
Reference in New Issue
Block a user