Migration tests

multistore
Laurent 2 years ago
parent c3c82e805b
commit d6db7324e6
  1. 20
      PadelClub.xcodeproj/project.pbxproj
  2. 4
      PadelClub/Data/Club.swift
  3. 4
      PadelClub/Data/DataStore.swift
  4. 39
      PadelClub/Data/Migration/ClubV1.swift
  5. 34
      PadelClub/Data/Migration/TournamentV1.swift
  6. 36
      PadelClub/Data/Migration/TournamentV2.swift
  7. 11
      PadelClub/Data/Tournament.swift
  8. 2
      PadelClub/Views/ClubView.swift
  9. 2
      PadelClub/Views/ContentView.swift

@ -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 = "<group>"; };
C4A47D622B6D3D6500ADC637 /* Club.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Club.swift; sourceTree = "<group>"; };
C4A47D732B72881F00ADC637 /* ClubView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClubView.swift; sourceTree = "<group>"; };
C4A47D762B73789100ADC637 /* TournamentV1.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TournamentV1.swift; sourceTree = "<group>"; };
C4A47D7A2B73C0F900ADC637 /* TournamentV2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TournamentV2.swift; sourceTree = "<group>"; };
C4A47D7C2B73CDC300ADC637 /* ClubV1.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClubV1.swift; sourceTree = "<group>"; };
/* 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 = "<group>";
};
C4A47D752B73787D00ADC637 /* Migration */ = {
isa = PBXGroup;
children = (
C4A47D762B73789100ADC637 /* TournamentV1.swift */,
C4A47D7A2B73C0F900ADC637 /* TournamentV2.swift */,
C4A47D7C2B73CDC300ADC637 /* ClubV1.swift */,
);
path = Migration;
sourceTree = "<group>";
};
/* 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;
};

@ -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] {

@ -20,6 +20,10 @@ class DataStore: ObservableObject {
let store = Store.main
store.synchronizationApiURL = "http://127.0.0.1:8000/api/"
// store.addMigration(Migration<ClubV1, Club>(version: 2))
// store.addMigration(Migration<TournamentV1, TournamentV2>(version: 2))
// store.addMigration(Migration<TournamentV2, Tournament>(version: 3))
self.clubs = store.registerCollection(synchronized: true)
self.tournaments = store.registerCollection(synchronized: false)

@ -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")
}
}

@ -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)
}
}

@ -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)
}
}

@ -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) }
}

@ -19,5 +19,5 @@ struct ClubView: View {
}
#Preview {
ClubView(club: Club(name: "AUC"))
ClubView(club: Club(name: "AUC", address: ""))
}

@ -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)
}

Loading…
Cancel
Save