Skip to content

Commit 5336d2a

Browse files
author
Mantas Palaima
committedJan 6, 2015
added ParseFile (not tested)
1 parent b6f2164 commit 5336d2a

7 files changed

+170
-12
lines changed
 

‎lib/dart_parse.dart

+3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:http/http.dart';
44
import 'package:json_object/json_object.dart';
55
import 'package:http/http.dart' as http;
66
import 'package:logging/logging.dart';
7+
import 'package:mime_type/mime_type.dart';
78

89
import 'dart:convert';
910
import 'dart:math';
@@ -13,6 +14,7 @@ part 'src/ParseObject.dart';
1314
part 'src/ParseConstant.dart';
1415
part 'src/ParseException.dart';
1516
part 'src/ParseQuery.dart';
17+
part 'src/ParseFile.dart';
1618
part 'src/ParseResponse.dart';
1719
part 'src/Parse.dart';
1820
part 'src/util/ParseDecoder.dart';
@@ -29,3 +31,4 @@ part 'src/command/ParseGetCommand.dart';
2931
part 'src/command/ParsePostCommand.dart';
3032
part 'src/command/ParsePutCommand.dart';
3133
part 'src/command/ParseDeleteCommand.dart';
34+
part 'src/command/ParseUploadCommand.dart';

‎lib/src/ParseFile.dart

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
part of dart_parse;
2+
3+
class ParseFile {
4+
final Logger _log = new Logger("ParseFile");
5+
6+
String endPoint;
7+
bool isDirty = true;
8+
String name;
9+
String url;
10+
String contentType;
11+
List<int> data;
12+
13+
ParseFile(this.name, {this.data, this.contentType, this.url}) {
14+
this.endPoint = "files/";
15+
if (data.length > ParseConstant.MAX_PARSE_FILE_SIZE) {
16+
throw new ArgumentError("ParseFile must be less than $ParseConstant.MAX_PARSE_FILE_SIZE bytes, current $data.length");
17+
}
18+
}
19+
20+
Future<ParseFile> save() {
21+
var completer = new Completer();
22+
if (isDirty && data != null) {
23+
ParseUploadCommand command = new ParseUploadCommand(endPoint + name);
24+
command.setData(data);
25+
if (contentType == null) {
26+
String possibleFileExtension = mime(name);
27+
contentType = possibleFileExtension == null ? "text/plain" : possibleFileExtension;
28+
}
29+
command.setContentType(contentType);
30+
command.perform().then((ParseResponse response) {
31+
JsonObject jsonResponse = response.getJsonObject();
32+
if (!response.isFailed() && jsonResponse != null) {
33+
url = jsonResponse["url"];
34+
name = jsonResponse["name"];
35+
isDirty = false;
36+
completer.complete(this);
37+
} else {
38+
completer.completeError(response.getException());
39+
}
40+
}, onError: completer.completeError);
41+
42+
} else {
43+
completer.complete(this);
44+
}
45+
return completer.future;
46+
}
47+
48+
//TODO
49+
Future<ParseFile> getData() {
50+
var completer = new Completer();
51+
completer.complete(this);
52+
return completer.future;
53+
}
54+
55+
Future<bool> delete() {
56+
var completer = new Completer();
57+
ParseDeleteCommand command = new ParseDeleteCommand(endPoint + name);
58+
command.perform().then((ParseResponse response) {
59+
name = null;
60+
url = null;
61+
data = null;
62+
isDirty = false;
63+
if(response.isFailed()) {
64+
completer.completeError(response.getException());
65+
} else {
66+
completer.complete(true);
67+
}
68+
}, onError: completer.completeError);
69+
return completer.future;
70+
}
71+
72+
}

‎lib/src/ParseObject.dart

+33-4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,24 @@ class ParseObject {
2424
return result;
2525
}
2626

27+
//TODO batch
28+
static Future<List<ParseObject>> saveAll(List<ParseObject> objects) {
29+
List<Future<ParseObject>> futures;
30+
objects.forEach((ParseObject object) {
31+
futures.add(object.save());
32+
});
33+
return Future.wait(futures);
34+
}
35+
36+
//TODO batch
37+
static Future<List<bool>> deleteAll(List<ParseObject> objects) {
38+
List<Future<bool>> futures;
39+
objects.forEach((ParseObject object) {
40+
futures.add(object.delete());
41+
});
42+
return Future.wait(futures);
43+
}
44+
2745
String get className => _className;
2846
String get objectId => _objectId;
2947
DateTime get createdAt => _createdAt;
@@ -125,6 +143,18 @@ class ParseObject {
125143
return value;
126144
}
127145

146+
ParseFile getParseFile(String key) {
147+
if (!data.containsKey(key)) {
148+
return null;
149+
}
150+
Object value = data[key];
151+
if (!(value is ParseFile)) {
152+
_log.shout("called getParseFile(${key}) but the value is ${value.runtimeType}");
153+
return null;
154+
}
155+
return value;
156+
}
157+
128158
setData(Map result, [bool disableChecks = false]) {
129159
result.forEach((key, value) {
130160
if(Parse.isInvalidKey(key)) {
@@ -154,10 +184,9 @@ class ParseObject {
154184
throw new ArgumentError("ParseFile must be saved before being set on a ParseObject.");
155185
}
156186

157-
/*if (value instanceof ParseFile && !((ParseFile) value).isUploaded() && !disableChecks) {
158-
throw new IllegalArgumentException(
159-
"ParseFile must be saved before being set on a ParseObject.");
160-
}*/
187+
if (value is ParseFile && !value.isDirty && !disableChecks) {
188+
throw new ArgumentError("ParseFile must be saved before being set on a ParseObject.");
189+
}
161190

162191
if (Parse.isInvalidKey(key)) {
163192
throw new ArgumentError("reserved value for key: " + key);
+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
part of dart_parse;
2+
3+
class ParseUploadCommand extends ParseCommand {
4+
5+
6+
7+
String endPoint;
8+
String contentType;
9+
List<int> bytes;
10+
11+
ParseUploadCommand(this.endPoint);
12+
13+
String getRequest() {
14+
return "";
15+
}
16+
17+
String getEndPoint() {
18+
return endPoint;
19+
}
20+
21+
setContentType(contentType) {
22+
this.contentType = contentType;
23+
}
24+
25+
//TODO
26+
Future<Response> getClient(String url, Map header) {
27+
28+
/*FileReader reader = new FileReader();
29+
reader.onLoad.listen((e) {
30+
HttpRequest.request("http://localhost:8080/files/ method: 'POST',
31+
sendData: reader.result).then((request) {
32+
// Does something witht he response
33+
});
34+
});
35+
reader.readAsArrayBuffer(input.files[i]);
36+
*/
37+
if (contentType != null) {
38+
header.putIfAbsent(ParseConstant.HEADER_CONTENT_TYPE, () => contentType);
39+
}
40+
return http.post(url, headers : header, body : bytes);
41+
}
42+
43+
setData(List<int> bytes) {
44+
this.bytes = bytes;
45+
}
46+
47+
}

‎lib/src/util/ParseDecoder.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ class ParseDecoder {
1919
return _decodePointer(map["className"],map["objectId"]);
2020
}
2121

22-
/*if (typeString.equals("File")) {
23-
return new ParseFile(jsonObject.optString("name"),
24-
jsonObject.optString("url"));
22+
if (typeString == "File") {
23+
return new ParseFile(map["name"], url: map["url"]);
2524
}
25+
/*
2626
2727
if (typeString.equals("GeoPoint")) {
2828
double latitude, longitude;

‎lib/src/util/ParseEncoder.dart

+11-5
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,20 @@ class ParseEncoder {
88
return objectEncoder.encodeRelatedObject(value);
99
}
1010

11+
if (value is ParseFile) {
12+
ParseFile file = value;
13+
JsonObject json = new JsonObject();
14+
json["__type"] = "File";
15+
json["name"] = file.name;
16+
json["url"] = file.url;
17+
return json;
18+
}
19+
1120
if (value is DateTime) {
21+
DateTime date = value;
1222
JsonObject json = new JsonObject();
1323
json["__type"] = "Date";
14-
json["iso"] = value.toIso8601String();
24+
json["iso"] = date.toIso8601String();
1525
return json;
1626
}
1727

@@ -21,10 +31,6 @@ class ParseEncoder {
2131
list.forEach((val) {
2232
data.add(encode(val, objectEncoder));
2333
});
24-
//JsonObject
25-
/*JSONObject output = new JSONObject();
26-
output.put("__type", "Bytes");
27-
output.put("base64", Base64.encodeBase64String(bytes));*/
2834
return data;
2935
}
3036

‎pubspec.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ dev_dependencies:
1212
dependencies:
1313
http: any
1414
json_object: any
15+
mime_type: any

0 commit comments

Comments
 (0)
Please sign in to comment.