Skip to content

Commit aa4db7d

Browse files
authored
Merge pull request #286 from zapcannon87/developer
fix(storage): save file as child not right
2 parents 1a539f1 + 3edec1f commit aa4db7d

File tree

5 files changed

+70
-54
lines changed

5 files changed

+70
-54
lines changed

LeanCloudTests/LCFileTestCase.swift

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,20 +124,40 @@ class LCFileTestCase: BaseTestCase {
124124
}
125125
}
126126

127-
func testObjectAssociateFile() {
127+
func testObjectPointFile() {
128128
do {
129129
let file = LCFile(
130130
payload: .fileURL(
131131
fileURL: bundleResourceURL(name: "test", ext: "jpg")))
132132
XCTAssertTrue(file.save().isSuccess)
133+
133134
let object = LCObject(className: "AssociateFile")
134135
try object.set("image", value: file)
135136
XCTAssertTrue(object.save().isSuccess)
136-
let fetchObject = LCObject(className: "AssociateFile", objectId: object.objectId!.value)
137+
138+
let fetchObject = LCObject(className: "AssociateFile", objectId: object.objectId!)
137139
XCTAssertTrue(fetchObject.fetch().isSuccess)
138140
XCTAssertTrue(fetchObject["image"] is LCFile)
139141
} catch {
140142
XCTFail("\(error)")
141143
}
142144
}
145+
146+
func testObjectPointNewFile() {
147+
let object1 = TestObject()
148+
object1.fileField = LCFile(url: "https://example.com/image.png")
149+
XCTAssertTrue(object1.save().isSuccess)
150+
151+
let file = LCFile(objectId: object1.fileField!.objectId!)
152+
XCTAssertTrue(file.fetch().isSuccess)
153+
XCTAssertNotNil(file.metaData)
154+
XCTAssertNotNil(file.mimeType)
155+
XCTAssertNotNil(file.name)
156+
157+
let object2 = TestObject()
158+
object2.fileField = LCFile(
159+
payload: .fileURL(
160+
fileURL: bundleResourceURL(name: "test", ext: "jpg")))
161+
XCTAssertNotNil(object2.save().error)
162+
}
143163
}

Sources/Foundation/BatchRequest.swift

Lines changed: 12 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -35,43 +35,24 @@ class BatchRequest {
3535
}
3636

3737
func getBody(internalId: String) -> [String: Any] {
38-
var body: [String: Any] = [:]
39-
40-
body["__internalId"] = internalId
41-
38+
var body: [String: Any] = ["__internalId": internalId]
4239
var children: [(String, LCObject)] = []
43-
44-
operationTable?.forEach { (key, operation) in
45-
switch operation.name {
46-
case .set:
47-
/* If object is newborn, put it in __children field. */
48-
if let child = operation.value as? LCObject {
49-
if !child.hasObjectId {
50-
children.append((key, child))
51-
break
52-
}
53-
}
54-
55-
body[key] = operation.lconValue
56-
default:
40+
self.operationTable?.forEach { (key, operation) in
41+
if case .set = operation.name,
42+
let child = operation.value as? LCObject,
43+
!child.hasObjectId {
44+
children.append((key, child))
45+
} else {
5746
body[key] = operation.lconValue
5847
}
5948
}
60-
61-
if children.count > 0 {
62-
var list: [Any] = []
63-
64-
children.forEach { (key, child) in
65-
list.append([
66-
"className": child.actualClassName,
67-
"cid": child.internalId,
68-
"key": key
69-
])
49+
if !children.isEmpty {
50+
body["__children"] = children.map { (key, child) -> [String: String] in
51+
["className": child.actualClassName,
52+
"cid": child.internalId,
53+
"key": key]
7054
}
71-
72-
body["__children"] = list
7355
}
74-
7556
return body
7657
}
7758

Sources/Foundation/File.swift

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,22 @@ public class LCFile: LCObject {
153153
})
154154
}
155155

156+
func paddingInfo(from remoteURL: LCString) {
157+
if let metaData = self.metaData {
158+
metaData["__source"] = "external"
159+
} else {
160+
self.metaData = LCDictionary(["__source": "external"])
161+
}
162+
if self.name == nil {
163+
self.name = LCString((remoteURL.value as NSString).lastPathComponent)
164+
}
165+
if self.mimeType == nil {
166+
if let mimeType = FileUploader.FileAttributes.getMIMEType(filename: self.name?.value) {
167+
self.mimeType = LCString(mimeType)
168+
}
169+
}
170+
}
171+
156172
/**
157173
Save current file and call handler in background thread.
158174

@@ -184,21 +200,7 @@ public class LCFile: LCObject {
184200
self.handleUploadResult(result, completion: completion)
185201
})
186202
} else if let remoteURL = url {
187-
if let metaData = self.metaData {
188-
metaData["__source"] = "external".lcString
189-
} else {
190-
self.metaData = LCDictionary(["__source": "external".lcString])
191-
}
192-
193-
if self.name == nil {
194-
self.name = (remoteURL.value as NSString).lastPathComponent.lcString
195-
}
196-
197-
if self.mimeType == nil {
198-
if let mimeType = FileUploader.FileAttributes.getMIMEType(filename: self.name?.value) {
199-
self.mimeType = mimeType.lcString
200-
}
201-
}
203+
self.paddingInfo(from: remoteURL)
202204

203205
var parameters = dictionary.jsonValue as? [String: Any]
204206
parameters?.removeValue(forKey: "__type")

Sources/Foundation/FileUploader.swift

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -211,14 +211,18 @@ class FileUploader {
211211
static private func getMIMEType(filenameExtension: String) -> String? {
212212
if filenameExtension.isEmpty {
213213
return nil
214-
} else if
215-
let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, filenameExtension as CFString, nil)?.takeRetainedValue(),
216-
let mimeType = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)?.takeRetainedValue()
217-
{
214+
}
215+
#if canImport(MobileCoreServices)
216+
if let uti = UTTypeCreatePreferredIdentifierForTag(
217+
kUTTagClassFilenameExtension, filenameExtension as CFString, nil)?
218+
.takeRetainedValue(),
219+
let mimeType = UTTypeCopyPreferredTagWithClass(
220+
uti, kUTTagClassMIMEType)?
221+
.takeRetainedValue() {
218222
return mimeType as String
219-
} else {
220-
return nil
221223
}
224+
#endif
225+
return nil
222226
}
223227

224228
static func getMIMEType(filename: String?) -> String? {

Sources/Foundation/ObjectUpdater.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,15 @@ class ObjectUpdater {
5252
let toposort = try ObjectProfiler.shared.toposort(objects)
5353

5454
try toposort.forEach { object in
55+
if !object.hasObjectId,
56+
let file = object as? LCFile {
57+
guard let remoteURL = file.url else {
58+
throw LCError(
59+
code: .notFound,
60+
reason: "External URL not found.")
61+
}
62+
file.paddingInfo(from: remoteURL)
63+
}
5564
requests.append(contentsOf: try BatchRequestBuilder.buildRequests(object, parameters: parameters))
5665
}
5766

0 commit comments

Comments
 (0)