Skip to content

Commit fe510c8

Browse files
committed
Fixed deleteAll
1 parent 5f1aec0 commit fe510c8

File tree

11 files changed

+276
-99
lines changed

11 files changed

+276
-99
lines changed

ParseSwift.playground/Pages/1 - Your first Object.xcplaygroundpage/Contents.swift

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -238,12 +238,13 @@ do {
238238
[scoreToFetch, score2ToFetch].deleteAll { result in
239239
switch result {
240240
case .success(let deletedScores):
241-
deletedScores.forEach { error in
242-
guard let error = error else {
243-
print("Successfully deleted scores")
244-
return
241+
deletedScores.forEach { result in
242+
switch result {
243+
case .success:
244+
print("Successfully deleted score")
245+
case .failure(let error):
246+
print("Error deleting: \(error)")
245247
}
246-
print("Error deleting: \(error)")
247248
}
248249
case .failure(let error):
249250
assertionFailure("Error deleting: \(error)")

ParseSwift.playground/Pages/4 - User - Continued.xcplaygroundpage/Contents.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,14 @@ User.current?.signup { result in
101101
}
102102
}
103103

104+
//: Logging out - synchronously.
105+
do {
106+
try User.logout()
107+
print("Successfully logged out")
108+
} catch let error {
109+
print("Error logging out: \(error)")
110+
}
111+
104112
//: Password Reset Request - synchronously.
105113
do {
106114
try User.verificationEmail(email: "[email protected]")

Sources/ParseSwift/API/API+Commands.swift

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -452,38 +452,41 @@ extension API.Command where T: ParseObject {
452452
}
453453

454454
// MARK: Batch - Deleting
455-
// swiftlint:disable:next line_length
456-
static func batch(commands: [API.NonParseBodyCommand<NoBody, ParseError?>]) -> RESTBatchCommandNoBodyType<ParseError?> {
457-
let commands = commands.compactMap { (command) -> API.NonParseBodyCommand<NoBody, ParseError?>? in
455+
static func batch(commands: [API.NonParseBodyCommand<NoBody, NoBody>]) -> RESTBatchCommandNoBodyType<NoBody> {
456+
let commands = commands.compactMap { (command) -> API.NonParseBodyCommand<NoBody, NoBody>? in
458457
let path = ParseConfiguration.mountPath + command.path.urlComponent
459-
return API.NonParseBodyCommand<NoBody, ParseError?>(
458+
return API.NonParseBodyCommand<NoBody, NoBody>(
460459
method: command.method,
461460
path: .any(path), mapper: command.mapper)
462461
}
463462

464-
let mapper = { (data: Data) -> [ParseError?] in
463+
let mapper = { (data: Data) -> [(Result<Void, ParseError>)] in
465464

466-
let decodingType = [ParseError?].self
465+
let decodingType = [BatchResponseItem<NoBody>].self
467466
do {
468467
let responses = try ParseCoding.jsonDecoder().decode(decodingType, from: data)
469-
return responses.enumerated().map({ (object) -> ParseError? in
468+
return responses.enumerated().map({ (object) -> (Result<Void, ParseError>) in
470469
let response = responses[object.offset]
471-
if let error = response {
472-
return error
470+
if response.success != nil {
471+
return .success(())
473472
} else {
474-
return nil
473+
guard let parseError = response.error else {
474+
return .failure(ParseError(code: .unknownError, message: "unknown error"))
475+
}
476+
477+
return .failure(parseError)
475478
}
476479
})
477480
} catch {
478-
guard (try? ParseCoding.jsonDecoder().decode(NoBody.self, from: data)) != nil else {
479-
return [ParseError(code: .unknownError, message: "decoding error: \(error)")]
481+
guard let parseError = error as? ParseError else {
482+
return [(.failure(ParseError(code: .unknownError, message: "decoding error: \(error)")))]
480483
}
481-
return [nil]
484+
return [(.failure(parseError))]
482485
}
483486
}
484487

485488
let batchCommand = BatchCommandNoBody(requests: commands)
486-
return RESTBatchCommandNoBodyType<ParseError?>(method: .POST, path: .batch, body: batchCommand, mapper: mapper)
489+
return RESTBatchCommandNoBodyType<NoBody>(method: .POST, path: .batch, body: batchCommand, mapper: mapper)
487490
}
488491
}
489492

@@ -642,17 +645,21 @@ internal extension API {
642645

643646
internal extension API.NonParseBodyCommand {
644647
// MARK: Deleting
645-
// swiftlint:disable:next line_length
646-
static func deleteCommand<T>(_ object: T) throws -> API.NonParseBodyCommand<NoBody, ParseError?> where T: ParseObject {
648+
static func deleteCommand<T>(_ object: T) throws -> API.NonParseBodyCommand<NoBody, NoBody> where T: ParseObject {
647649
guard object.isSaved else {
648650
throw ParseError(code: .unknownError, message: "Cannot Delete an object without id")
649651
}
650652

651-
return API.NonParseBodyCommand<NoBody, ParseError?>(
653+
return API.NonParseBodyCommand<NoBody, NoBody>(
652654
method: .DELETE,
653655
path: object.endpoint
654-
) { (data) -> ParseError? in
655-
try? ParseCoding.jsonDecoder().decode(ParseError.self, from: data)
656+
) { (data) -> NoBody in
657+
let error = try? ParseCoding.jsonDecoder().decode(ParseError.self, from: data)
658+
if let error = error {
659+
throw error
660+
} else {
661+
return NoBody()
662+
}
656663
}
657664
}
658665
} // swiftlint:disable:this file_length

Sources/ParseSwift/API/BatchUtils.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ typealias ParseObjectBatchResponse<T> = [(Result<T, ParseError>)]
1313
// swiftlint:disable line_length
1414
typealias RESTBatchCommandType<T> = API.Command<ParseObjectBatchCommand<T>, ParseObjectBatchResponse<T>> where T: ParseObject
1515

16-
typealias ParseObjectBatchCommandNoBody<T> = BatchCommandNoBody<NoBody, ParseError?>
17-
typealias ParseObjectBatchResponseNoBody<NoBody> = [ParseError?]
16+
typealias ParseObjectBatchCommandNoBody<T> = BatchCommandNoBody<NoBody, NoBody>
17+
typealias ParseObjectBatchResponseNoBody<NoBody> = [(Result<Void, ParseError>)]
1818
typealias RESTBatchCommandNoBodyType<T> = API.NonParseBodyCommand<ParseObjectBatchCommandNoBody<T>, ParseObjectBatchResponseNoBody<T>> where T: Encodable
1919
/*
2020
typealias ParseObjectBatchCommandEncodable<T> = BatchCommand<T, PointerType> where T: ParseType

Sources/ParseSwift/Objects/ParseInstallation.swift

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -558,16 +558,21 @@ extension ParseInstallation {
558558
}
559559
}
560560

561-
func deleteCommand() throws -> API.NonParseBodyCommand<NoBody, ParseError?> {
561+
func deleteCommand() throws -> API.NonParseBodyCommand<NoBody, NoBody> {
562562
guard isSaved else {
563563
throw ParseError(code: .unknownError, message: "Cannot Delete an object without id")
564564
}
565565

566-
return API.NonParseBodyCommand<NoBody, ParseError?>(
566+
return API.NonParseBodyCommand<NoBody, NoBody>(
567567
method: .DELETE,
568568
path: endpoint
569-
) { (data) -> ParseError? in
570-
try? ParseCoding.jsonDecoder().decode(ParseError.self, from: data)
569+
) { (data) -> NoBody in
570+
let error = try? ParseCoding.jsonDecoder().decode(ParseError.self, from: data)
571+
if let error = error {
572+
throw error
573+
} else {
574+
return NoBody()
575+
}
571576
}
572577
}
573578
}
@@ -858,13 +863,13 @@ public extension Sequence where Element: ParseInstallation {
858863
- important: If an object deleted has the same objectId as current, it will automatically update the current.
859864
*/
860865
func deleteAll(batchLimit limit: Int? = nil,
861-
options: API.Options = []) throws -> [ParseError?] {
866+
options: API.Options = []) throws -> [(Result<Void, ParseError>)] {
862867
let batchLimit = limit != nil ? limit! : ParseConstants.batchLimit
863-
var returnBatch = [ParseError?]()
868+
var returnBatch = [(Result<Void, ParseError>)]()
864869
let commands = try map { try $0.deleteCommand() }
865870
let batches = BatchUtils.splitArray(commands, valuesPerSegment: batchLimit)
866871
try batches.forEach {
867-
let currentBatch = try API.Command<Self.Element, ParseError?>
872+
let currentBatch = try API.Command<Self.Element, (Result<Void, ParseError>)>
868873
.batch(commands: $0)
869874
.execute(options: options)
870875
returnBatch.append(contentsOf: currentBatch)
@@ -897,11 +902,11 @@ public extension Sequence where Element: ParseInstallation {
897902
batchLimit limit: Int? = nil,
898903
options: API.Options = [],
899904
callbackQueue: DispatchQueue = .main,
900-
completion: @escaping (Result<[ParseError?], ParseError>) -> Void
905+
completion: @escaping (Result<[(Result<Void, ParseError>)], ParseError>) -> Void
901906
) {
902907
let batchLimit = limit != nil ? limit! : ParseConstants.batchLimit
903908
do {
904-
var returnBatch = [ParseError?]()
909+
var returnBatch = [(Result<Void, ParseError>)]()
905910
let commands = try map({ try $0.deleteCommand() })
906911
let batches = BatchUtils.splitArray(commands, valuesPerSegment: batchLimit)
907912
var completed = 0

Sources/ParseSwift/Objects/ParseObject.swift

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -331,13 +331,13 @@ public extension Sequence where Element: ParseObject {
331331
- throws: `ParseError`
332332
*/
333333
func deleteAll(batchLimit limit: Int? = nil,
334-
options: API.Options = []) throws -> [ParseError?] {
334+
options: API.Options = []) throws -> [(Result<Void, ParseError>)] {
335335
let batchLimit = limit != nil ? limit! : ParseConstants.batchLimit
336-
var returnBatch = [ParseError?]()
336+
var returnBatch = [(Result<Void, ParseError>)]()
337337
let commands = try map { try $0.deleteCommand() }
338338
let batches = BatchUtils.splitArray(commands, valuesPerSegment: batchLimit)
339339
try batches.forEach {
340-
let currentBatch = try API.Command<Self.Element, ParseError?>
340+
let currentBatch = try API.Command<Self.Element, (Result<Void, ParseError>)>
341341
.batch(commands: $0)
342342
.execute(options: options)
343343
returnBatch.append(contentsOf: currentBatch)
@@ -367,11 +367,11 @@ public extension Sequence where Element: ParseObject {
367367
batchLimit limit: Int? = nil,
368368
options: API.Options = [],
369369
callbackQueue: DispatchQueue = .main,
370-
completion: @escaping (Result<[ParseError?], ParseError>) -> Void
370+
completion: @escaping (Result<[(Result<Void, ParseError>)], ParseError>) -> Void
371371
) {
372372
let batchLimit = limit != nil ? limit! : ParseConstants.batchLimit
373373
do {
374-
var returnBatch = [ParseError?]()
374+
var returnBatch = [(Result<Void, ParseError>)]()
375375
let commands = try map({ try $0.deleteCommand() })
376376
let batches = BatchUtils.splitArray(commands, valuesPerSegment: batchLimit)
377377
var completed = 0
@@ -703,9 +703,7 @@ extension ParseObject {
703703
- throws: An error of `ParseError` type.
704704
*/
705705
public func delete(options: API.Options = []) throws {
706-
if let error = try deleteCommand().execute(options: options) {
707-
throw error
708-
}
706+
_ = try deleteCommand().execute(options: options)
709707
}
710708

711709
/**
@@ -727,12 +725,8 @@ extension ParseObject {
727725
callbackQueue.async {
728726
switch result {
729727

730-
case .success(let error):
731-
if let error = error {
732-
completion(.failure(error))
733-
} else {
734-
completion(.success(()))
735-
}
728+
case .success:
729+
completion(.success(()))
736730
case .failure(let error):
737731
completion(.failure(error))
738732
}
@@ -749,7 +743,7 @@ extension ParseObject {
749743
}
750744
}
751745

752-
internal func deleteCommand() throws -> API.NonParseBodyCommand<NoBody, ParseError?> {
753-
try API.NonParseBodyCommand<NoBody, ParseError?>.deleteCommand(self)
746+
internal func deleteCommand() throws -> API.NonParseBodyCommand<NoBody, NoBody> {
747+
try API.NonParseBodyCommand<NoBody, NoBody>.deleteCommand(self)
754748
}
755749
}// swiftlint:disable:this file_length

Sources/ParseSwift/Objects/ParseUser.swift

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -859,14 +859,10 @@ extension ParseUser {
859859
try deleteCommand().executeAsync(options: options) { result in
860860
switch result {
861861

862-
case .success(let error):
862+
case .success:
863863
callbackQueue.async {
864864
try? Self.updateKeychainIfNeeded([self], deleting: true)
865-
if let error = error {
866-
completion(.failure(error))
867-
} else {
868-
completion(.success(()))
869-
}
865+
completion(.success(()))
870866
}
871867
case .failure(let error):
872868
callbackQueue.async {
@@ -885,16 +881,21 @@ extension ParseUser {
885881
}
886882
}
887883

888-
func deleteCommand() throws -> API.NonParseBodyCommand<NoBody, ParseError?> {
884+
func deleteCommand() throws -> API.NonParseBodyCommand<NoBody, NoBody> {
889885
guard isSaved else {
890886
throw ParseError(code: .unknownError, message: "Cannot Delete an object without id")
891887
}
892888

893-
return API.NonParseBodyCommand<NoBody, ParseError?>(
889+
return API.NonParseBodyCommand<NoBody, NoBody>(
894890
method: .DELETE,
895891
path: endpoint
896-
) { (data) -> ParseError? in
897-
try? ParseCoding.jsonDecoder().decode(ParseError.self, from: data)
892+
) { (data) -> NoBody in
893+
let error = try? ParseCoding.jsonDecoder().decode(ParseError.self, from: data)
894+
if let error = error {
895+
throw error
896+
} else {
897+
return NoBody()
898+
}
898899
}
899900
}
900901
}
@@ -1183,9 +1184,9 @@ public extension Sequence where Element: ParseUser {
11831184
- important: If an object deleted has the same objectId as current, it will automatically update the current.
11841185
*/
11851186
func deleteAll(batchLimit limit: Int? = nil,
1186-
options: API.Options = []) throws -> [ParseError?] {
1187+
options: API.Options = []) throws -> [(Result<Void, ParseError>)] {
11871188
let batchLimit = limit != nil ? limit! : ParseConstants.batchLimit
1188-
var returnBatch = [ParseError?]()
1189+
var returnBatch = [(Result<Void, ParseError>)]()
11891190
let commands = try map { try $0.deleteCommand() }
11901191
let batches = BatchUtils.splitArray(commands, valuesPerSegment: batchLimit)
11911192
try batches.forEach {
@@ -1221,11 +1222,11 @@ public extension Sequence where Element: ParseUser {
12211222
batchLimit limit: Int? = nil,
12221223
options: API.Options = [],
12231224
callbackQueue: DispatchQueue = .main,
1224-
completion: @escaping (Result<[ParseError?], ParseError>) -> Void
1225+
completion: @escaping (Result<[(Result<Void, ParseError>)], ParseError>) -> Void
12251226
) {
12261227
let batchLimit = limit != nil ? limit! : ParseConstants.batchLimit
12271228
do {
1228-
var returnBatch = [ParseError?]()
1229+
var returnBatch = [(Result<Void, ParseError>)]()
12291230
let commands = try map({ try $0.deleteCommand() })
12301231
let batches = BatchUtils.splitArray(commands, valuesPerSegment: batchLimit)
12311232
var completed = 0

Tests/ParseSwiftTests/ParseInstallationTests.swift

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,8 +1095,7 @@ class ParseInstallationTests: XCTestCase { // swiftlint:disable:this type_body_l
10951095
return
10961096
}
10971097

1098-
let error: ParseError? = nil
1099-
let installationOnServer = [error]
1098+
let installationOnServer = [BatchResponseItem<NoBody>(success: NoBody(), error: nil)]
11001099

11011100
let encoded: Data!
11021101
do {
@@ -1113,7 +1112,7 @@ class ParseInstallationTests: XCTestCase { // swiftlint:disable:this type_body_l
11131112
do {
11141113
let deleted = try [installation].deleteAll()
11151114
deleted.forEach {
1116-
if let error = $0 {
1115+
if case let .failure(error) = $0 {
11171116
XCTFail("Should have deleted: \(error.localizedDescription)")
11181117
}
11191118
}
@@ -1138,8 +1137,7 @@ class ParseInstallationTests: XCTestCase { // swiftlint:disable:this type_body_l
11381137
return
11391138
}
11401139

1141-
let error: ParseError? = nil
1142-
let installationOnServer = [error]
1140+
let installationOnServer = [BatchResponseItem<NoBody>(success: NoBody(), error: nil)]
11431141

11441142
let encoded: Data!
11451143
do {
@@ -1158,7 +1156,7 @@ class ParseInstallationTests: XCTestCase { // swiftlint:disable:this type_body_l
11581156

11591157
case .success(let deleted):
11601158
deleted.forEach {
1161-
if let error = $0 {
1159+
if case let .failure(error) = $0 {
11621160
XCTFail("Should have deleted: \(error.localizedDescription)")
11631161
}
11641162
}

0 commit comments

Comments
 (0)