Finishing Sync
We have a problem: while syncing habits we're using our user id, but not while syncing our days. From the sync config code, these are the subscriptions we're adding:
SyncContentView.swift
subs.append(QuerySubscription<Days>(name: "user_days", query: {
$0.ownerId == user.id
}))
subs.append(QuerySubscription<Day>())
subs.append(QuerySubscription<Habits>(name: "user_habits", query: {
$0.ownerId == user.id
}))
subs.append(QuerySubscription<Habit>())
When we add a Day
we never set the ownerId
because our model class Day
doesn't have it. So when we insert a new Day
it will appear for all users, as we're getting Day
from all users, because we're not restricting the sync here:
SyncContentView.swift
subs.append(QuerySubscription<Day>())
So we need to do two things:
- subscribe just to our Days
- add the
ownnerId
when we create a newDay
Fixing the model: remove Days class
Let's get rid of Days, as we don't really use that class for anything.
Add ownerId field to Day class
We;ll add the ownerId
field to the Day class.
Day.swift
import Foundation
import RealmSwift
public class Day: Object, ObjectKeyIdentifiable {
@Persisted(primaryKey: true) var _id: ObjectId
@Persisted var date = Date()
@Persisted var habits = RealmSwift.List<Habit>()
@Persisted var ownerId = ""
// ... same as before
Remove sync on Days and add sync info to Day
We'll delete the sync subscription on Days
(as we just deleted that class) and add the correct subscription for Day
.
SyncContentView.swift
if let foundSubscription = subs.first(named: "user_days") {
return
} else {
subs.append(QuerySubscription<Day>(name: "user_days", query: {
$0.ownerId == user.id
}))
subs.append(QuerySubscription<Habits>(name: "user_habits", query: {
$0.ownerId == user.id
}))
subs.append(QuerySubscription<Habit>())
}
Set ownerId while creating a new Day
DaysView.swift
let day = Day.createDayWithHabitsInRealm(realm: realm)
day.ownerId = realm.syncSession?.parentUser()?.id ?? ""
try? realm.write({
$days.append(day)
})
Add ownerId when creating the initial set of Habits
MainView.swift
ProgressView()
.onAppear {
let habits = Habits()
habits.ownerId = realm.syncSession?.parentUser()?.id ?? ""
$allHabitGroups.append(habits)
}
Testing it
Now if we run the app new days are not appearing in other users' apps.