Skip to content

Commit 396864d

Browse files
committed
refactor: Firestore transaction 비동기 처리 정리
1 parent 3e22f40 commit 396864d

4 files changed

Lines changed: 108 additions & 144 deletions

File tree

Application/DevLogInfra/Sources/Service/PushNotificationServiceImpl.swift

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -298,28 +298,19 @@ private extension PushNotificationServiceImpl {
298298
}
299299

300300
func toggleReadValue(for notificationRef: DocumentReference) async throws {
301-
try await withCheckedThrowingContinuation { (continuation: CheckedContinuation<Void, Error>) in
302-
store.runTransaction({ transaction, errorPointer in
303-
do {
304-
let snapshot = try transaction.getDocument(notificationRef)
305-
guard let currentValue = snapshot.data()?["isRead"] as? Bool else {
306-
throw FirestoreError.dataNotFound("isRead")
307-
}
308-
309-
transaction.updateData(["isRead": !currentValue], forDocument: notificationRef)
310-
} catch let error as NSError {
311-
errorPointer?.pointee = error
301+
_ = try await store.runTransaction { transaction, errorPointer in
302+
do {
303+
let snapshot = try transaction.getDocument(notificationRef)
304+
guard let currentValue = snapshot.data()?["isRead"] as? Bool else {
305+
throw FirestoreError.dataNotFound("isRead")
312306
}
313307

314-
return nil
315-
}) { _, error in
316-
if let error {
317-
continuation.resume(throwing: error)
318-
return
319-
}
320-
321-
continuation.resume(returning: ())
308+
transaction.updateData(["isRead": !currentValue], forDocument: notificationRef)
309+
} catch let error as NSError {
310+
errorPointer?.pointee = error
322311
}
312+
313+
return nil
323314
}
324315
}
325316

Application/DevLogInfra/Sources/Service/SocialLogin/AppleAuthenticationServiceImpl.swift

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -331,33 +331,24 @@ final class AppleAuthenticationServiceImpl: AuthenticationService {
331331

332332
private extension AppleAuthenticationServiceImpl {
333333
func deleteAppleRefreshToken(from tokensRef: DocumentReference) async throws {
334-
try await withCheckedThrowingContinuation { (continuation: CheckedContinuation<Void, Error>) in
335-
store.runTransaction({ transaction, errorPointer in
336-
let snapshot: DocumentSnapshot
337-
338-
do {
339-
snapshot = try transaction.getDocument(tokensRef)
340-
} catch let error as NSError {
341-
errorPointer?.pointee = error
342-
return nil
343-
}
344-
345-
if snapshot.exists {
346-
transaction.updateData(
347-
["appleRefreshToken": FieldValue.delete()],
348-
forDocument: tokensRef
349-
)
350-
}
334+
_ = try await store.runTransaction { transaction, errorPointer in
335+
let snapshot: DocumentSnapshot
351336

337+
do {
338+
snapshot = try transaction.getDocument(tokensRef)
339+
} catch let error as NSError {
340+
errorPointer?.pointee = error
352341
return nil
353-
}) { _, error in
354-
if let error {
355-
continuation.resume(throwing: error)
356-
return
357-
}
342+
}
358343

359-
continuation.resume(returning: ())
344+
if snapshot.exists {
345+
transaction.updateData(
346+
["appleRefreshToken": FieldValue.delete()],
347+
forDocument: tokensRef
348+
)
360349
}
350+
351+
return nil
361352
}
362353
}
363354

Application/DevLogInfra/Sources/Service/TodoServiceImpl.swift

Lines changed: 39 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -348,66 +348,57 @@ private extension TodoServiceImpl {
348348
for todoRef: DocumentReference,
349349
counterRef: DocumentReference
350350
) async throws {
351-
try await withCheckedThrowingContinuation { (continuation: CheckedContinuation<Void, Error>) in
352-
store.runTransaction({ transaction, errorPointer in
353-
let todoSnapshot: DocumentSnapshot
351+
_ = try await store.runTransaction { transaction, errorPointer in
352+
let todoSnapshot: DocumentSnapshot
353+
354+
do {
355+
todoSnapshot = try transaction.getDocument(todoRef)
356+
} catch let error as NSError {
357+
errorPointer?.pointee = error
358+
return nil
359+
}
360+
361+
var todoData = data
362+
363+
if !todoSnapshot.exists {
364+
let counterSnapshot: DocumentSnapshot
354365

355366
do {
356-
todoSnapshot = try transaction.getDocument(todoRef)
367+
counterSnapshot = try transaction.getDocument(counterRef)
357368
} catch let error as NSError {
358369
errorPointer?.pointee = error
359370
return nil
360371
}
361372

362-
var todoData = data
363-
364-
if !todoSnapshot.exists {
365-
let counterSnapshot: DocumentSnapshot
366-
367-
do {
368-
counterSnapshot = try transaction.getDocument(counterRef)
369-
} catch let error as NSError {
370-
errorPointer?.pointee = error
371-
return nil
372-
}
373-
374-
let nextNumberValue = counterSnapshot.data()?[CounterFieldKey.nextNumber.rawValue]
375-
let nextNumber: Int
376-
377-
if let storedNextNumber = nextNumberValue as? Int {
378-
nextNumber = storedNextNumber
379-
} else if counterSnapshot.exists {
380-
errorPointer?.pointee = NSError(
381-
domain: "TodoServiceImpl",
382-
code: 1,
383-
userInfo: [NSLocalizedDescriptionKey: "Todo counter is invalid."]
384-
)
385-
return nil
386-
} else {
387-
nextNumber = 1
388-
}
373+
let nextNumberValue = counterSnapshot.data()?[CounterFieldKey.nextNumber.rawValue]
374+
let nextNumber: Int
389375

390-
todoData[TodoFieldKey.number.rawValue] = nextNumber
391-
transaction.setData(
392-
[
393-
CounterFieldKey.nextNumber.rawValue: nextNumber + 1,
394-
CounterFieldKey.updatedAt.rawValue: FieldValue.serverTimestamp()
395-
],
396-
forDocument: counterRef,
397-
merge: true
376+
if let storedNextNumber = nextNumberValue as? Int {
377+
nextNumber = storedNextNumber
378+
} else if counterSnapshot.exists {
379+
errorPointer?.pointee = NSError(
380+
domain: "TodoServiceImpl",
381+
code: 1,
382+
userInfo: [NSLocalizedDescriptionKey: "Todo counter is invalid."]
398383
)
384+
return nil
385+
} else {
386+
nextNumber = 1
399387
}
400388

401-
transaction.setData(todoData, forDocument: todoRef, merge: true)
402-
return nil
403-
}) { _, error in
404-
if let error {
405-
continuation.resume(throwing: error)
406-
return
407-
}
408-
409-
continuation.resume(returning: ())
389+
todoData[TodoFieldKey.number.rawValue] = nextNumber
390+
transaction.setData(
391+
[
392+
CounterFieldKey.nextNumber.rawValue: nextNumber + 1,
393+
CounterFieldKey.updatedAt.rawValue: FieldValue.serverTimestamp()
394+
],
395+
forDocument: counterRef,
396+
merge: true
397+
)
410398
}
399+
400+
transaction.setData(todoData, forDocument: todoRef, merge: true)
401+
return nil
411402
}
412403
}
413404

Application/DevLogInfra/Sources/Service/UserServiceImpl.swift

Lines changed: 45 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -205,67 +205,58 @@ private extension UserServiceImpl {
205205
let settingsRef = store.document(FirestorePath.userData(uid, document: .settings))
206206
let todoCounterRef = store.document(FirestorePath.counter(uid, document: .todo))
207207

208-
try await withCheckedThrowingContinuation { (continuation: CheckedContinuation<Void, Error>) in
209-
store.runTransaction({ transaction, errorPointer in
210-
let userDocument: DocumentSnapshot
211-
let settingsDocument: DocumentSnapshot
212-
213-
do {
214-
userDocument = try transaction.getDocument(userRef)
215-
settingsDocument = try transaction.getDocument(settingsRef)
216-
} catch let error as NSError {
217-
errorPointer?.pointee = error
218-
return nil
219-
}
220-
221-
var infoField = userField
222-
if !userDocument.exists {
223-
infoField["statusMsg"] = ""
224-
infoField["createdAt"] = FieldValue.serverTimestamp()
225-
}
226-
227-
var settingsField: [String: Any] = [
228-
"timeZone": TimeZone.autoupdatingCurrent.identifier
229-
]
230-
if !settingsDocument.exists {
231-
settingsField["allowPushNotification"] = true
232-
settingsField["pushNotificationHour"] = 9
233-
settingsField["pushNotificationMinute"] = 0
234-
}
208+
_ = try await store.runTransaction { transaction, errorPointer in
209+
let userDocument: DocumentSnapshot
210+
let settingsDocument: DocumentSnapshot
211+
212+
do {
213+
userDocument = try transaction.getDocument(userRef)
214+
settingsDocument = try transaction.getDocument(settingsRef)
215+
} catch let error as NSError {
216+
errorPointer?.pointee = error
217+
return nil
218+
}
235219

236-
transaction.setData(
237-
["updatedAt": FieldValue.serverTimestamp()],
238-
forDocument: userRef,
239-
merge: true
240-
)
241-
transaction.setData(infoField, forDocument: infoRef, merge: true)
220+
var infoField = userField
221+
if !userDocument.exists {
222+
infoField["statusMsg"] = ""
223+
infoField["createdAt"] = FieldValue.serverTimestamp()
224+
}
242225

243-
if !tokenField.isEmpty {
244-
transaction.setData(tokenField, forDocument: tokensRef, merge: true)
245-
}
226+
var settingsField: [String: Any] = [
227+
"timeZone": TimeZone.autoupdatingCurrent.identifier
228+
]
229+
if !settingsDocument.exists {
230+
settingsField["allowPushNotification"] = true
231+
settingsField["pushNotificationHour"] = 9
232+
settingsField["pushNotificationMinute"] = 0
233+
}
246234

247-
transaction.setData(settingsField, forDocument: settingsRef, merge: true)
235+
transaction.setData(
236+
["updatedAt": FieldValue.serverTimestamp()],
237+
forDocument: userRef,
238+
merge: true
239+
)
240+
transaction.setData(infoField, forDocument: infoRef, merge: true)
248241

249-
if !userDocument.exists {
250-
transaction.setData(
251-
[
252-
"nextNumber": 1,
253-
"updatedAt": FieldValue.serverTimestamp()
254-
],
255-
forDocument: todoCounterRef,
256-
merge: true
257-
)
258-
}
242+
if !tokenField.isEmpty {
243+
transaction.setData(tokenField, forDocument: tokensRef, merge: true)
244+
}
259245

260-
return nil
261-
}) { _, error in
262-
if let error {
263-
continuation.resume(throwing: error)
264-
return
265-
}
246+
transaction.setData(settingsField, forDocument: settingsRef, merge: true)
266247

267-
continuation.resume(returning: ())
248+
if !userDocument.exists {
249+
transaction.setData(
250+
[
251+
"nextNumber": 1,
252+
"updatedAt": FieldValue.serverTimestamp()
253+
],
254+
forDocument: todoCounterRef,
255+
merge: true
256+
)
268257
}
258+
259+
return nil
269260
}
270261
}
271262
}

0 commit comments

Comments
 (0)