From 57eab2274678b123242a125b8d2cf3440a3f08f7 Mon Sep 17 00:00:00 2001 From: Trey t Date: Wed, 14 Jan 2026 23:59:40 -0600 Subject: [PATCH] fix(polls): fetch existing CloudKit record before updating vote When updating a vote, CloudKit requires the server's changeTag to modify existing records. Creating a new CKRecord caused "record to insert already exists" errors. Now fetches the existing record first before saving. Co-Authored-By: Claude Opus 4.5 --- SportsTime/Core/Services/PollService.swift | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/SportsTime/Core/Services/PollService.swift b/SportsTime/Core/Services/PollService.swift index 6dd8821..19d864a 100644 --- a/SportsTime/Core/Services/PollService.swift +++ b/SportsTime/Core/Services/PollService.swift @@ -234,13 +234,26 @@ actor PollService { throw PollError.notPollOwner // Using this error for now - voter can only update own vote } - var updatedVote = vote - updatedVote.modifiedAt = Date() + // Fetch the existing record to get the server's changeTag + let recordID = CKRecord.ID(recordName: vote.id.uuidString) + let existingRecord: CKRecord + do { + existingRecord = try await publicDatabase.record(for: recordID) + } catch let error as CKError { + throw mapCloudKitError(error) + } catch { + throw PollError.unknown(error) + } - let ckVote = CKPollVote(vote: updatedVote) + // Update the fields on the fetched record + let now = Date() + existingRecord[CKPollVote.rankingsKey] = vote.rankings + existingRecord[CKPollVote.modifiedAtKey] = now do { - try await publicDatabase.save(ckVote.record) + try await publicDatabase.save(existingRecord) + var updatedVote = vote + updatedVote.modifiedAt = now return updatedVote } catch let error as CKError { throw mapCloudKitError(error)