From d6db7324e6f78fa162cfac1df1d8afda1eb35d87 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 9 Feb 2024 14:53:41 +0100 Subject: [PATCH] Migration tests --- PadelClub.xcodeproj/project.pbxproj | 20 +++++++++++ PadelClub/Data/Club.swift | 4 ++- PadelClub/Data/DataStore.swift | 4 +++ PadelClub/Data/Migration/ClubV1.swift | 39 +++++++++++++++++++++ PadelClub/Data/Migration/TournamentV1.swift | 34 ++++++++++++++++++ PadelClub/Data/Migration/TournamentV2.swift | 36 +++++++++++++++++++ PadelClub/Data/Tournament.swift | 11 +++++- PadelClub/Views/ClubView.swift | 2 +- PadelClub/Views/ContentView.swift | 2 +- 9 files changed, 148 insertions(+), 4 deletions(-) create mode 100644 PadelClub/Data/Migration/ClubV1.swift create mode 100644 PadelClub/Data/Migration/TournamentV1.swift create mode 100644 PadelClub/Data/Migration/TournamentV2.swift diff --git a/PadelClub.xcodeproj/project.pbxproj b/PadelClub.xcodeproj/project.pbxproj index e12083b..623c894 100644 --- a/PadelClub.xcodeproj/project.pbxproj +++ b/PadelClub.xcodeproj/project.pbxproj @@ -19,6 +19,9 @@ C4A47D5E2B6D38EC00ADC637 /* DataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4A47D5D2B6D38EC00ADC637 /* DataStore.swift */; }; C4A47D632B6D3D6500ADC637 /* Club.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4A47D622B6D3D6500ADC637 /* Club.swift */; }; C4A47D742B72881F00ADC637 /* ClubView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4A47D732B72881F00ADC637 /* ClubView.swift */; }; + C4A47D772B73789100ADC637 /* TournamentV1.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4A47D762B73789100ADC637 /* TournamentV1.swift */; }; + C4A47D7B2B73C0F900ADC637 /* TournamentV2.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4A47D7A2B73C0F900ADC637 /* TournamentV2.swift */; }; + C4A47D7D2B73CDC300ADC637 /* ClubV1.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4A47D7C2B73CDC300ADC637 /* ClubV1.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -68,6 +71,9 @@ C4A47D5D2B6D38EC00ADC637 /* DataStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataStore.swift; sourceTree = ""; }; C4A47D622B6D3D6500ADC637 /* Club.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Club.swift; sourceTree = ""; }; C4A47D732B72881F00ADC637 /* ClubView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClubView.swift; sourceTree = ""; }; + C4A47D762B73789100ADC637 /* TournamentV1.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TournamentV1.swift; sourceTree = ""; }; + C4A47D7A2B73C0F900ADC637 /* TournamentV2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TournamentV2.swift; sourceTree = ""; }; + C4A47D7C2B73CDC300ADC637 /* ClubV1.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClubV1.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -174,6 +180,7 @@ C4A47D5F2B6D3B2D00ADC637 /* Data */ = { isa = PBXGroup; children = ( + C4A47D752B73787D00ADC637 /* Migration */, C4A47D5D2B6D38EC00ADC637 /* DataStore.swift */, C4A47D592B6D383C00ADC637 /* Tournament.swift */, C4A47D622B6D3D6500ADC637 /* Club.swift */, @@ -190,6 +197,16 @@ path = Views; sourceTree = ""; }; + C4A47D752B73787D00ADC637 /* Migration */ = { + isa = PBXGroup; + children = ( + C4A47D762B73789100ADC637 /* TournamentV1.swift */, + C4A47D7A2B73C0F900ADC637 /* TournamentV2.swift */, + C4A47D7C2B73CDC300ADC637 /* ClubV1.swift */, + ); + path = Migration; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -345,10 +362,13 @@ files = ( C4A47D742B72881F00ADC637 /* ClubView.swift in Sources */, C4A47D5A2B6D383C00ADC637 /* Tournament.swift in Sources */, + C4A47D7B2B73C0F900ADC637 /* TournamentV2.swift in Sources */, C4A47D5E2B6D38EC00ADC637 /* DataStore.swift in Sources */, + C4A47D7D2B73CDC300ADC637 /* ClubV1.swift in Sources */, C4A47D632B6D3D6500ADC637 /* Club.swift in Sources */, C425D4032B6D249D002A7B48 /* ContentView.swift in Sources */, C425D4012B6D249D002A7B48 /* PadelClubApp.swift in Sources */, + C4A47D772B73789100ADC637 /* TournamentV1.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/PadelClub/Data/Club.swift b/PadelClub/Data/Club.swift index 436cb37..dd9298a 100644 --- a/PadelClub/Data/Club.swift +++ b/PadelClub/Data/Club.swift @@ -14,9 +14,11 @@ class Club : ModelObject, Storable { var id: String = Store.randomId() var name: String + var address: String - init(name: String) { + init(name: String, address: String) { self.name = name + self.address = address } var tournaments: [Tournament] { diff --git a/PadelClub/Data/DataStore.swift b/PadelClub/Data/DataStore.swift index 57c0214..d74e818 100644 --- a/PadelClub/Data/DataStore.swift +++ b/PadelClub/Data/DataStore.swift @@ -20,6 +20,10 @@ class DataStore: ObservableObject { let store = Store.main store.synchronizationApiURL = "http://127.0.0.1:8000/api/" +// store.addMigration(Migration(version: 2)) +// store.addMigration(Migration(version: 2)) +// store.addMigration(Migration(version: 3)) + self.clubs = store.registerCollection(synchronized: true) self.tournaments = store.registerCollection(synchronized: false) diff --git a/PadelClub/Data/Migration/ClubV1.swift b/PadelClub/Data/Migration/ClubV1.swift new file mode 100644 index 0000000..57343c4 --- /dev/null +++ b/PadelClub/Data/Migration/ClubV1.swift @@ -0,0 +1,39 @@ +// +// ClubV1.swift +// PadelClub +// +// Created by Laurent Morvillier on 07/02/2024. +// + +import Foundation +import LeStorage + +class ClubV1 : ModelObject, Storable, MigrationSource { + + static func resourceName() -> String { return "clubs" } + + var id: String = Store.randomId() + var name: String + + init(name: String) { + self.name = name + } + + var tournaments: [Tournament] { + return Store.main.filter { $0.club_id == self.id } + } + + override func deleteDependencies() throws { + try Store.main.deleteDependencies(items: self.tournaments) + } + + // MARK: - MigrationSource + + typealias Destination = Club + + func migrate() -> Club { + return Club(name: self.name, address: "3 impasse des chevreuils") +// return Club(name: self.name, address: "3 impasse des chevreuils") + } + +} diff --git a/PadelClub/Data/Migration/TournamentV1.swift b/PadelClub/Data/Migration/TournamentV1.swift new file mode 100644 index 0000000..de24809 --- /dev/null +++ b/PadelClub/Data/Migration/TournamentV1.swift @@ -0,0 +1,34 @@ +// +// Tournament_v1.swift +// PadelClub +// +// Created by Laurent Morvillier on 07/02/2024. +// + +import Foundation +import LeStorage + +class TournamentV1 : ModelObject, Storable, MigrationSource { + + static func resourceName() -> String { "tournaments" } + + var id: String = Store.randomId() + var name: String + var club_id: String + + init(name: String, club_id: String) { + self.name = name + self.club_id = club_id + } + + var club: Club? { return self.findById(self.club_id) } + + // MARK: - MigrationSource + + typealias Destination = TournamentV2 + + func migrate() -> TournamentV2 { + return TournamentV2(name: self.name, club_id: self.club_id, category: 0) + } + +} diff --git a/PadelClub/Data/Migration/TournamentV2.swift b/PadelClub/Data/Migration/TournamentV2.swift new file mode 100644 index 0000000..841cc5a --- /dev/null +++ b/PadelClub/Data/Migration/TournamentV2.swift @@ -0,0 +1,36 @@ +// +// TournamentV2.swift +// PadelClub +// +// Created by Laurent Morvillier on 07/02/2024. +// + +import Foundation +import LeStorage + +class TournamentV2 : ModelObject, Storable, MigrationSource { + + static func resourceName() -> String { "tournaments" } + + var id: String = Store.randomId() + var name: String + var club_id: String + var category: Int + + init(name: String, club_id: String, category: Int) { + self.name = name + self.club_id = club_id + self.category = category + } + + var club: Club? { return self.findById(self.club_id) } + + // MARK: - MigrationSource + + typealias Destination = Tournament + + func migrate() -> Tournament { + return Tournament(name: self.name, club_id: self.club_id, category: 0, playerCount: 12) + } + +} diff --git a/PadelClub/Data/Tournament.swift b/PadelClub/Data/Tournament.swift index 4a8514d..c157166 100644 --- a/PadelClub/Data/Tournament.swift +++ b/PadelClub/Data/Tournament.swift @@ -14,7 +14,16 @@ class Tournament : ModelObject, Storable { var id: String = Store.randomId() var name: String var club_id: String + var category: Int + var playerCount: Int + + init(name: String, club_id: String, category: Int, playerCount: Int) { + self.name = name + self.club_id = club_id + self.category = category + self.playerCount = playerCount + } var club: Club? { return self.findById(self.club_id) } - + } diff --git a/PadelClub/Views/ClubView.swift b/PadelClub/Views/ClubView.swift index 44ebdd9..596e946 100644 --- a/PadelClub/Views/ClubView.swift +++ b/PadelClub/Views/ClubView.swift @@ -19,5 +19,5 @@ struct ClubView: View { } #Preview { - ClubView(club: Club(name: "AUC")) + ClubView(club: Club(name: "AUC", address: "")) } diff --git a/PadelClub/Views/ContentView.swift b/PadelClub/Views/ContentView.swift index 3fa501a..ac7f0e1 100644 --- a/PadelClub/Views/ContentView.swift +++ b/PadelClub/Views/ContentView.swift @@ -41,7 +41,7 @@ struct ContentView: View { func _add() { let id = (0...1000000).randomElement()! - let club: Club = Club(name: "test\(id)") + let club: Club = Club(name: "test\(id)", address: "some address") self.dataStore.clubs.addOrUpdate(instance: club) }