Skip to content

Commit 995fdae

Browse files
authored
SwiftData - simplify modelContainer initialization (#1122)
* feat(swiftData): move DataController to a value type that only contains methods for the initialization of a modelContainer * fix(tests): replace date formats in fixtures * fix(tests): replace date formats in fixtures
1 parent d187483 commit 995fdae

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+233
-254
lines changed

PocketKit/Sources/PocketKit/Main/RootView.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ private extension RootView {
4949
model.handleSpotlight(userActivity)
5050
})
5151
// TODO: SWIFTUI - Once we move away from Services, these need to be handled with DI
52-
.modelContainer(Services.shared.dataController)
52+
.modelContainer(Services.shared.modelContainer)
5353
.environmentObject(Services.shared.accessService)
5454
}
5555

PocketKit/Sources/PocketKit/Services.swift

+2-3
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ struct Services {
4949
let recentSavesWidgetUpdateService: RecentSavesWidgetUpdateService
5050
let recommendationsWidgetUpdateService: RecommendationsWidgetUpdateService
5151
let sharedWithYouStore: SharedWithYouStore
52-
let dataController: ModelContainer
52+
let modelContainer: ModelContainer
5353

5454
private let persistentContainer: PersistentContainer
5555
private let sceneTracker: SceneTracker
@@ -65,8 +65,7 @@ struct Services {
6565
notificationCenter = .default
6666
Log.breadcrumb(category: "SWiftUIHome", level: .debug, message: "Initializing data controller.")
6767
// Init the Group ID for Swift Data
68-
DataController.appGroupContainerID = Keys.shared.groupID
69-
dataController = DataController.sharedModelContainer
68+
modelContainer = DataController.makeModelContainer(groupID: Keys.shared.groupID)
7069
Log.breadcrumb(category: "SWiftUIHome", level: .debug, message: "Data controller initialized.")
7170
persistentContainer = .init(storage: .shared, groupID: Keys.shared.groupID)
7271
Log.breadcrumb(category: "SWiftUIHome", level: .debug, message: "Persistent container initialized.")

PocketKit/Sources/Sync/SwiftData/DataController.swift

+21-41
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,28 @@ import Foundation
77
import SwiftData
88
import SharedPocketKit
99

10-
@MainActor
11-
public class DataController {
12-
public static var appGroupContainerID: String?
10+
public struct DataController: Sendable {
11+
public static func makeModelContainer(groupID: String) -> ModelContainer {
12+
Log.breadcrumb(category: "SWiftUIHome", level: .debug, message: "Start initializing shared model container.")
13+
ArticleTransformer.register()
14+
Log.breadcrumb(category: "SWiftUIHome", level: .debug, message: "Article transformer registered.")
15+
SyncTaskTransformer.register()
16+
Log.breadcrumb(category: "SWiftUIHome", level: .debug, message: "SynkTask transformer registered.")
1317

14-
public static let schema = Schema([
18+
guard let appGroupContainer = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: groupID) else {
19+
Log.capture(message: "Shared file container could not be created.")
20+
fatalError("Shared file container could not be created.")
21+
}
22+
let url = appGroupContainer.appendingPathComponent("PocketModel.sqlite")
23+
do {
24+
return try ModelContainer(for: Self.schema, configurations: ModelConfiguration(url: url))
25+
} catch {
26+
Log.capture(message: "Could not create ModelContainer: \(error)")
27+
fatalError("Could not create ModelContainer: \(error)")
28+
}
29+
}
30+
31+
private static let schema = Schema([
1532
Author.self,
1633
Sync.Collection.self,
1734
CollectionAuthor.self,
@@ -32,41 +49,4 @@ public class DataController {
3249
Tag.self,
3350
UnresolvedSavedItem.self
3451
])
35-
36-
public static let previewContainer: ModelContainer = {
37-
ArticleTransformer.register()
38-
SyncTaskTransformer.register()
39-
do {
40-
let config = ModelConfiguration(isStoredInMemoryOnly: true)
41-
let container = try ModelContainer(for: schema, configurations: config)
42-
MockData.insertFakeData(container: container)
43-
return container
44-
} catch {
45-
fatalError("Failed to create model container for previewing: \(error.localizedDescription)")
46-
}
47-
}()
48-
49-
public static let sharedModelContainer: ModelContainer = {
50-
Log.breadcrumb(category: "SWiftUIHome", level: .debug, message: "Start initializing shared model container.")
51-
ArticleTransformer.register()
52-
Log.breadcrumb(category: "SWiftUIHome", level: .debug, message: "Article transformer registered.")
53-
SyncTaskTransformer.register()
54-
Log.breadcrumb(category: "SWiftUIHome", level: .debug, message: "SynkTask transformer registered.")
55-
56-
guard let appGroupContainerID = appGroupContainerID else {
57-
Log.capture(message: "appGroupContainerID must be set before accessing the sharedModelContainer.")
58-
fatalError("appGroupContainerID must be set before accessing the sharedModelContainer.")
59-
}
60-
guard let appGroupContainer = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroupContainerID) else {
61-
Log.capture(message: "Shared file container could not be created.")
62-
fatalError("Shared file container could not be created.")
63-
}
64-
let url = appGroupContainer.appendingPathComponent("PocketModel.sqlite")
65-
do {
66-
return try ModelContainer(for: schema, configurations: ModelConfiguration(url: url))
67-
} catch {
68-
Log.capture(message: "Could not create ModelContainer: \(error)")
69-
fatalError("Could not create ModelContainer: \(error)")
70-
}
71-
}()
7252
}

PocketKit/Tests/SaveToPocketKitTests/Fixtures/save-item.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
"authors": [],
3131
"excerpt": "Cursus Aenean Elit",
3232
"title": "Item 1",
33-
"datePublished": "2021-01-01 12:01:01",
33+
"datePublished": "2021-01-01T12:01:01.000Z",
3434
"image" : {
3535
"__typename": "[type-name-here]",
3636
"url": "https://example.com/item-1/top-image.jpg"

PocketKit/Tests/SyncTests/Fixtures/add-tags.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
"authors": [],
4040
"excerpt": "Cursus Aenean Elit",
4141
"title": "Item 1",
42-
"datePublished": "2021-01-01 12:01:01",
42+
"datePublished": "2021-01-01T12:01:01.000Z",
4343
"image" : {
4444
"__typename": "[type-name-here]",
4545
"url": "https://example.com/item-1/top-image.jpg"

PocketKit/Tests/SyncTests/Fixtures/archived-favorited-items.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
"authors": [],
4646
"excerpt": "Risus Aenean Ultricies Nullam Vehicula",
4747
"title": "Archived Item 1",
48-
"datePublished": "2021-01-01 12:01:01",
48+
"datePublished": "2021-01-01T12:01:01.000Z",
4949
"image" : {
5050
"__typename": "[type-name-here]",
5151
"url": "https://example.com/archived-item-1/top-image.jpg"
@@ -93,7 +93,7 @@
9393
"authors": [],
9494
"excerpt": "Vehicula Nibh Ligula Porta Magna",
9595
"title": "Archived Item 0",
96-
"datePublished": "2021-01-01 12:01:01",
96+
"datePublished": "2021-01-01T12:01:01.000Z",
9797
"image" : {
9898
"__typename": "[type-name-here]",
9999
"url": "https://example.com/items/archived-item-0/images/top-image.jpg"

PocketKit/Tests/SyncTests/Fixtures/archived-items-page-2.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
"authors": [],
4848
"excerpt": "Risus Aenean Ultricies Nullam Vehicula",
4949
"title": "Archived Item 0",
50-
"datePublished": "2021-01-01 12:01:01",
50+
"datePublished": "2021-01-01T12:01:01.000Z",
5151
"image" : {
5252
"__typename": "[type-name-here]",
5353
"url": "https://example.com/archived-item-0/top-image.jpg"
@@ -95,7 +95,7 @@
9595
"authors": [],
9696
"excerpt": "Risus Aenean Ultricies Nullam Vehicula",
9797
"title": "Archived Item -1",
98-
"datePublished": "2021-01-01 12:01:01",
98+
"datePublished": "2021-01-01T12:01:01.000Z",
9999
"image" : {
100100
"__typename": "[type-name-here]",
101101
"url": "https://example.com/items/archived-item--1/images/top-image.jpg"

PocketKit/Tests/SyncTests/Fixtures/archived-items-page-3.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
"authors": [],
4545
"excerpt": "Risus Aenean Ultricies Nullam Vehicula",
4646
"title": "Archived Item -2",
47-
"datePublished": "2021-01-01 12:01:01",
47+
"datePublished": "2021-01-01T12:01:01.000Z",
4848
"image": {
4949
"__typename": "[type-name-here]",
5050
"url": "https://example.com/archived-item--2/top-image.jpg"

PocketKit/Tests/SyncTests/Fixtures/archived-items.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
"authors": [],
5252
"excerpt": "Vehicula Nibh Ligula Porta Magna",
5353
"title": "Archived Item 2",
54-
"datePublished": "2021-01-01 12:01:01",
54+
"datePublished": "2021-01-01T12:01:01.000Z",
5555
"image" : {
5656
"__typename": "[type-name-here]",
5757
"url": "https://example.com/items/archived-item-2/images/top-image.jpg"
@@ -100,7 +100,7 @@
100100
],
101101
"excerpt": "Vehicula Nibh Ligula Porta Magna",
102102
"title": "Archived Item 2",
103-
"datePublished": "2021-01-01 12:01:01",
103+
"datePublished": "2021-01-01T12:01:01.000Z",
104104
"image" : {
105105
"__typename": "[type-name-here]",
106106
"url": "https://example.com/items/archived-item-1/images/top-image.jpg"

PocketKit/Tests/SyncTests/Fixtures/corpusSlates.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
"authors": [],
2727
"excerpt": "Cursus Aenean Elit",
2828
"title": "Slate 1, Recommendation 1",
29-
"datePublished": "2021-01-01 12:01:01",
29+
"datePublished": "2021-01-01T12:01:01.000Z",
3030
"image" : {
3131
"__typename": "[type-name-here]",
3232
"url": "http://example.com/slate-1-rec-1/top-image.png"
@@ -65,7 +65,7 @@
6565
"authors": [],
6666
"excerpt": "Cursus Aenean Elit",
6767
"title": "Slate 1, Recommendation 2",
68-
"datePublished": "2021-01-01 12:01:01",
68+
"datePublished": "2021-01-01T12:01:01.000Z",
6969
"image" : {
7070
"__typename": "[type-name-here]",
7171
"url": "http://example.com/slate-1-rec-2/top-image.png"
@@ -112,7 +112,7 @@
112112
"authors": [],
113113
"excerpt": "Cursus Aenean Elit",
114114
"title": "Slate 2, Recommendation 1",
115-
"datePublished": "2021-01-01 12:01:01",
115+
"datePublished": "2021-01-01T12:01:01.000Z",
116116
"image" : {
117117
"__typename": "[type-name-here]",
118118
"url": "http://example.com/slate-2-rec-1/top-image.png"

PocketKit/Tests/SyncTests/Fixtures/duplicate-list.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
"authors": [],
5656
"excerpt": "Risus Aenean Ultricies Nullam Vehicula",
5757
"title": "Item 1",
58-
"datePublished": "2021-01-01 12:01:01",
58+
"datePublished": "2021-01-01T12:01:01.000Z",
5959
"image": {
6060
"__typename": "[type-name-here]",
6161
"url": "https://example.com/archived-item--2/top-image.jpg"
@@ -113,7 +113,7 @@
113113
"authors": [],
114114
"excerpt": "Cursus Aenean Elit",
115115
"title": "Item-1",
116-
"datePublished": "2021-01-01 12:01:01",
116+
"datePublished": "2021-01-01T12:01:01.000Z",
117117
"image": {
118118
"__typename": "[type-name-here]",
119119
"url": "https://example.com/archived-item--2/top-image.jpg"

PocketKit/Tests/SyncTests/Fixtures/large-list-1.json

+15-15
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
"authors": [],
4343
"excerpt": "Cursus Aenean Elit",
4444
"title": "Item 1",
45-
"datePublished": "2021-01-01 12:01:01",
45+
"datePublished": "2021-01-01T12:01:01.000Z",
4646
"image": {
4747
"__typename": "[type-name-here]",
4848
"url": "https://example.com/archived-item--2/top-image.jpg"
@@ -100,7 +100,7 @@
100100
"authors": [],
101101
"excerpt": "Cursus Aenean Elit",
102102
"title": "Item 1",
103-
"datePublished": "2021-01-01 12:01:01",
103+
"datePublished": "2021-01-01T12:01:01.000Z",
104104
"image": {
105105
"__typename": "[type-name-here]",
106106
"url": "https://example.com/archived-item--2/top-image.jpg"
@@ -158,7 +158,7 @@
158158
"authors": [],
159159
"excerpt": "Cursus Aenean Elit",
160160
"title": "Item 1",
161-
"datePublished": "2021-01-01 12:01:01",
161+
"datePublished": "2021-01-01T12:01:01.000Z",
162162
"image": {
163163
"__typename": "[type-name-here]",
164164
"url": "https://example.com/archived-item--2/top-image.jpg"
@@ -216,7 +216,7 @@
216216
"authors": [],
217217
"excerpt": "Cursus Aenean Elit",
218218
"title": "Item 1",
219-
"datePublished": "2021-01-01 12:01:01",
219+
"datePublished": "2021-01-01T12:01:01.000Z",
220220
"image": {
221221
"__typename": "[type-name-here]",
222222
"url": "https://example.com/archived-item--2/top-image.jpg"
@@ -274,7 +274,7 @@
274274
"authors": [],
275275
"excerpt": "Cursus Aenean Elit",
276276
"title": "Item 1",
277-
"datePublished": "2021-01-01 12:01:01",
277+
"datePublished": "2021-01-01T12:01:01.000Z",
278278
"image": {
279279
"__typename": "[type-name-here]",
280280
"url": "https://example.com/archived-item--2/top-image.jpg"
@@ -332,7 +332,7 @@
332332
"authors": [],
333333
"excerpt": "Cursus Aenean Elit",
334334
"title": "Item 1",
335-
"datePublished": "2021-01-01 12:01:01",
335+
"datePublished": "2021-01-01T12:01:01.000Z",
336336
"image": {
337337
"__typename": "[type-name-here]",
338338
"url": "https://example.com/archived-item--2/top-image.jpg"
@@ -390,7 +390,7 @@
390390
"authors": [],
391391
"excerpt": "Cursus Aenean Elit",
392392
"title": "Item 1",
393-
"datePublished": "2021-01-01 12:01:01",
393+
"datePublished": "2021-01-01T12:01:01.000Z",
394394
"image": {
395395
"__typename": "[type-name-here]",
396396
"url": "https://example.com/archived-item--2/top-image.jpg"
@@ -448,7 +448,7 @@
448448
"authors": [],
449449
"excerpt": "Cursus Aenean Elit",
450450
"title": "Item 1",
451-
"datePublished": "2021-01-01 12:01:01",
451+
"datePublished": "2021-01-01T12:01:01.000Z",
452452
"image": {
453453
"__typename": "[type-name-here]",
454454
"url": "https://example.com/archived-item--2/top-image.jpg"
@@ -506,7 +506,7 @@
506506
"authors": [],
507507
"excerpt": "Cursus Aenean Elit",
508508
"title": "Item 1",
509-
"datePublished": "2021-01-01 12:01:01",
509+
"datePublished": "2021-01-01T12:01:01.000Z",
510510
"image": {
511511
"__typename": "[type-name-here]",
512512
"url": "https://example.com/archived-item--2/top-image.jpg"
@@ -564,7 +564,7 @@
564564
"authors": [],
565565
"excerpt": "Cursus Aenean Elit",
566566
"title": "Item 1",
567-
"datePublished": "2021-01-01 12:01:01",
567+
"datePublished": "2021-01-01T12:01:01.000Z",
568568
"image": {
569569
"__typename": "[type-name-here]",
570570
"url": "https://example.com/archived-item--2/top-image.jpg"
@@ -622,7 +622,7 @@
622622
"authors": [],
623623
"excerpt": "Cursus Aenean Elit",
624624
"title": "Item 1",
625-
"datePublished": "2021-01-01 12:01:01",
625+
"datePublished": "2021-01-01T12:01:01.000Z",
626626
"image": {
627627
"__typename": "[type-name-here]",
628628
"url": "https://example.com/archived-item--2/top-image.jpg"
@@ -680,7 +680,7 @@
680680
"authors": [],
681681
"excerpt": "Cursus Aenean Elit",
682682
"title": "Item 1",
683-
"datePublished": "2021-01-01 12:01:01",
683+
"datePublished": "2021-01-01T12:01:01.000Z",
684684
"image": {
685685
"__typename": "[type-name-here]",
686686
"url": "https://example.com/archived-item--2/top-image.jpg"
@@ -738,7 +738,7 @@
738738
"authors": [],
739739
"excerpt": "Cursus Aenean Elit",
740740
"title": "Item 1",
741-
"datePublished": "2021-01-01 12:01:01",
741+
"datePublished": "2021-01-01T12:01:01.000Z",
742742
"image": {
743743
"__typename": "[type-name-here]",
744744
"url": "https://example.com/archived-item--2/top-image.jpg"
@@ -796,7 +796,7 @@
796796
"authors": [],
797797
"excerpt": "Cursus Aenean Elit",
798798
"title": "Item 1",
799-
"datePublished": "2021-01-01 12:01:01",
799+
"datePublished": "2021-01-01T12:01:01.000Z",
800800
"image": {
801801
"__typename": "[type-name-here]",
802802
"url": "https://example.com/archived-item--2/top-image.jpg"
@@ -854,7 +854,7 @@
854854
"authors": [],
855855
"excerpt": "Cursus Aenean Elit",
856856
"title": "Item 1",
857-
"datePublished": "2021-01-01 12:01:01",
857+
"datePublished": "2021-01-01T12:01:01.000Z",
858858
"image": {
859859
"__typename": "[type-name-here]",
860860
"url": "https://example.com/archived-item--2/top-image.jpg"

0 commit comments

Comments
 (0)