diff --git a/packages/firestore/lib/firestore.dart b/packages/firestore/lib/firestore.dart index bdb02f9..352f572 100644 --- a/packages/firestore/lib/firestore.dart +++ b/packages/firestore/lib/firestore.dart @@ -1,7 +1,87 @@ -library firestore; +import 'package:http/http.dart' as http; -/// A Calculator. -class Calculator { - /// Returns [value] plus 1. - int addOne(int value) => value + 1; +import 'models/enums/primitive_types.dart'; + +class Firestore { + /// [apiKey] the key that is used to authenticate requests + late final String apiKey; + + /// [client] the http client to be used for this API. It is being passed in for testability. + late final http.Client _client; + + Firestore._(); + + static late final Firestore _instance; + + static Firestore get instance { + return _instance; + } + + factory Firestore.init({required String withApiKey, required http.Client client}) { + _instance = Firestore._(); + _instance._client = client; + _instance.apiKey = withApiKey; + return instance; + } + + static Map expandJson(Map json) { + Map messyJson = {}; + json.forEach((key, value) { + FireTypes type = PrimEx.tryParse(value: value.runtimeType.toString()); + if (type == FireTypes.arrayValue) { + messyJson[key] = { + FireTypes.arrayValue.stringVal: {'values': _expandList(value)} + }; + } else if (type == FireTypes.mapValue) { + Map map = _expandMap(value); + messyJson[key] = { + FireTypes.mapValue.stringVal: {"fields": map} + }; + } else { + messyJson[key] = typeWiseMatcher(key, value); + } + }); + return messyJson; + } +} + +Map typeWiseMatcher(String key, dynamic value) { + Map nestedJson = {}; + dynamic mutatedValue = value; + var keyVal = PrimEx.tryParse(value: key.runtimeType.toString()).stringVal; + switch (PrimEx.tryParse(value: key.runtimeType.toString())) { + case FireTypes.booleanValue: + mutatedValue = value == "true" ? true : false; + break; + case FireTypes.doubleValue: + mutatedValue = double.parse(value); + break; + case FireTypes.integerValue: + mutatedValue = int.parse(value); + break; + case FireTypes.stringValue: + RegExp dateMatcher = RegExp(r"\b[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z\b"); + if (dateMatcher.hasMatch(value.toString())) keyVal = FireTypes.timestampValue.stringVal; + mutatedValue = value.toString(); + break; + default: + } + nestedJson[keyVal] = mutatedValue; + return nestedJson; +} + +List _expandList(List list) { + List newList = []; + for (var element in list) { + newList.add(typeWiseMatcher(element, element)); + } + return newList; +} + +Map _expandMap(Map json) { + Map messyJson = {}; + json.forEach((key, value) { + messyJson[key] = typeWiseMatcher(key, value); + }); + return messyJson; } diff --git a/packages/firestore/lib/models/api_helper.dart b/packages/firestore/lib/models/api_helper.dart new file mode 100644 index 0000000..e69de29 diff --git a/packages/firestore/lib/models/enums/primitive_types.dart b/packages/firestore/lib/models/enums/primitive_types.dart new file mode 100644 index 0000000..6af79b3 --- /dev/null +++ b/packages/firestore/lib/models/enums/primitive_types.dart @@ -0,0 +1,48 @@ +import 'dart:core'; + +enum FireTypes { + stringValue, + arrayValue, + booleanValue, + timestampValue, + referenceValue, + doubleValue, + intValue, + integerValue, + mapValue +} + +extension PrimEx on FireTypes { + static FireTypes tryParse({required String value}) { + var val = _fromRawType[value]; + assert(val != null, "This type needs to be added to the types string map"); + return val!; + } + + String get stringVal { + var val = _stringVal[this]; + assert(val != null, "This type needs to be added to the types string map"); + return val!; + } +} + +final Map _stringVal = { + FireTypes.stringValue: "stringValue", + FireTypes.arrayValue: "arrayValue", + FireTypes.booleanValue: "booleanValue", + FireTypes.timestampValue: "timestampValue", + FireTypes.referenceValue: "referenceValue", + FireTypes.doubleValue: "doubleValue", + FireTypes.intValue: "intValue", + FireTypes.integerValue: "integerValue", + FireTypes.mapValue: "mapValue" +}; + +final Map _fromRawType = { + "int": FireTypes.integerValue, + "bool": FireTypes.booleanValue, + "_InternalLinkedHashMap": FireTypes.mapValue, + "List": FireTypes.arrayValue, + "String": FireTypes.stringValue, + "double": FireTypes.doubleValue +}; diff --git a/packages/firestore/lib/models/models.dart b/packages/firestore/lib/models/models.dart new file mode 100644 index 0000000..e69de29 diff --git a/packages/firestore/lib/models/primitives/array_value.dart b/packages/firestore/lib/models/primitives/array_value.dart new file mode 100644 index 0000000..19fc047 --- /dev/null +++ b/packages/firestore/lib/models/primitives/array_value.dart @@ -0,0 +1,9 @@ +import 'package:firestore/models/primitives/firestore_primitive_base.dart'; + +class ArrayValue extends FireStorePrimitive { + @override + convert() { + // TODO: implement convert + throw UnimplementedError(); + } +} diff --git a/packages/firestore/lib/models/primitives/document.dart b/packages/firestore/lib/models/primitives/document.dart new file mode 100644 index 0000000..19f74e5 --- /dev/null +++ b/packages/firestore/lib/models/primitives/document.dart @@ -0,0 +1,64 @@ +import 'package:json_annotation/json_annotation.dart'; + +part 'document.g.dart'; + +@JsonSerializable(explicitToJson: true) +class Document { + /// [ref] The document reference that can be used to lookup this document in firebase. + @JsonKey(name: "name") + late final String ref; + + /// [createTime] The time that this document was created. + late final DateTime createTime; + + /// [updateTime] The time when this document was last updated. + late final DateTime updateTime; + + /// [jsonData] The data that is included in this document. + @JsonKey(name: "fields", fromJson: _flattenJson) + late final Map jsonData; + + Document(); + + Map toJson() => _$DocumentToJson(this); + factory Document.fromJson(Map json) => _$DocumentFromJson(json); + + static Map _flattenJson(Map messyJson) { + Map cleanJson = {}; + // This should handle everything except list and map + messyJson.forEach((key, value) { + value.forEach((key2, value2) { + if (key2 == "mapValue") { + cleanJson[key] = _mapHandler(value2); + } else if (key2 == "arrayValue") { + cleanJson[key] = _listHandler(value2); + } else { + if (key2 == "integerValue") { + cleanJson[key] = int.parse(value2); + } else { + cleanJson[key] = value2; + } + } + }); + }); + return cleanJson; + } + + static List _listHandler(Map messyJson) { + List cleanJson = []; + messyJson['values'].forEach((value) { + cleanJson.add(value[value.keys.first]); + }); + return cleanJson; + } + + static Map _mapHandler(Map messyJson) { + Map cleanJson = {}; + messyJson['fields'].forEach((key, value) { + value.forEach((key2, value2) { + cleanJson[key] = value2; + }); + }); + return cleanJson; + } +} diff --git a/packages/firestore/lib/models/primitives/document.g.dart b/packages/firestore/lib/models/primitives/document.g.dart new file mode 100644 index 0000000..e51401e --- /dev/null +++ b/packages/firestore/lib/models/primitives/document.g.dart @@ -0,0 +1,20 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'document.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +Document _$DocumentFromJson(Map json) => Document() + ..ref = json['name'] as String + ..createTime = DateTime.parse(json['createTime'] as String) + ..updateTime = DateTime.parse(json['updateTime'] as String) + ..jsonData = Document._flattenJson(json['fields'] as Map); + +Map _$DocumentToJson(Document instance) => { + 'name': instance.ref, + 'createTime': instance.createTime.toIso8601String(), + 'updateTime': instance.updateTime.toIso8601String(), + 'fields': instance.jsonData, + }; diff --git a/packages/firestore/lib/models/primitives/firestore_primitive_base.dart b/packages/firestore/lib/models/primitives/firestore_primitive_base.dart new file mode 100644 index 0000000..707eba2 --- /dev/null +++ b/packages/firestore/lib/models/primitives/firestore_primitive_base.dart @@ -0,0 +1,3 @@ +abstract class FireStorePrimitive { + T convert(); +} diff --git a/packages/firestore/pubspec.lock b/packages/firestore/pubspec.lock index 816c48a..9acb9dd 100644 --- a/packages/firestore/pubspec.lock +++ b/packages/firestore/pubspec.lock @@ -1,6 +1,41 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + url: "https://pub.dartlang.org" + source: hosted + version: "34.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.0" + another_flushbar: + dependency: transitive + description: + name: another_flushbar + url: "https://pub.dartlang.org" + source: hosted + version: "1.10.28" + another_transformer_page_view: + dependency: transitive + description: + name: another_transformer_page_view + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.0" async: dependency: transitive description: @@ -15,6 +50,62 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + build: + dependency: transitive + description: + name: build + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" + build_config: + dependency: transitive + description: + name: build_config + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + build_daemon: + dependency: transitive + description: + name: build_daemon + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.6" + build_runner: + dependency: "direct dev" + description: + name: build_runner + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.7" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + url: "https://pub.dartlang.org" + source: hosted + version: "7.2.3" + built_collection: + dependency: transitive + description: + name: built_collection + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + url: "https://pub.dartlang.org" + source: hosted + version: "8.1.4" characters: dependency: transitive description: @@ -29,6 +120,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + cli_util: + dependency: transitive + description: + name: cli_util + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.5" clock: dependency: transitive description: @@ -36,6 +141,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.0" + code_builder: + dependency: transitive + description: + name: code_builder + url: "https://pub.dartlang.org" + source: hosted + version: "4.1.0" collection: dependency: transitive description: @@ -43,6 +155,34 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.15.0" + convert: + dependency: transitive + description: + name: convert + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + dart_style: + dependency: transitive + description: + name: dart_style + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" fake_async: dependency: transitive description: @@ -50,6 +190,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.0" + ffi: + dependency: transitive + description: + name: ffi + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.2" + fixnum: + dependency: transitive + description: + name: fixnum + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" flutter: dependency: "direct main" description: flutter @@ -62,18 +223,135 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.4" + flutter_login: + dependency: "direct main" + description: + name: flutter_login + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" + flutter_signin_button: + dependency: transitive + description: + name: flutter_signin_button + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" - lints: + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + font_awesome_flutter: + dependency: transitive + description: + name: font_awesome_flutter + url: "https://pub.dartlang.org" + source: hosted + version: "9.2.0" + frontend_server_client: dependency: transitive + description: + name: frontend_server_client + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.2" + get: + dependency: "direct main" + description: + name: get + url: "https://pub.dartlang.org" + source: hosted + version: "4.6.1" + get_storage: + dependency: "direct main" + description: + name: get_storage + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + glob: + dependency: transitive + description: + name: glob + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + graphs: + dependency: transitive + description: + name: graphs + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + http: + dependency: "direct main" + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.13.4" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.0" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" + io: + dependency: transitive + description: + name: io + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.3" + js: + dependency: transitive + description: + name: js + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.3" + json_annotation: + dependency: "direct main" + description: + name: json_annotation + url: "https://pub.dartlang.org" + source: hosted + version: "4.4.0" + json_serializable: + dependency: "direct dev" + description: + name: json_serializable + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.4" + lints: + dependency: "direct dev" description: name: lints url: "https://pub.dartlang.org" source: hosted version: "1.0.1" + logging: + dependency: transitive + description: + name: logging + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" matcher: dependency: transitive description: @@ -88,6 +366,34 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.7.0" + mime: + dependency: transitive + description: + name: mime + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + mockito: + dependency: "direct dev" + description: + name: mockito + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.0" + nested: + dependency: transitive + description: + name: nested + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + package_config: + dependency: transitive + description: + name: package_config + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" path: dependency: transitive description: @@ -95,11 +401,151 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.0" + path_provider: + dependency: transitive + description: + name: path_provider + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.9" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" + path_provider_ios: + dependency: transitive + description: + name: path_provider_ios + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.7" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.5" + path_provider_macos: + dependency: transitive + description: + name: path_provider_macos + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.2" + pool: + dependency: transitive + description: + name: pool + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.0" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "4.2.4" + provider: + dependency: transitive + description: + name: provider + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.2" + pub_semver: + dependency: transitive + description: + name: pub_semver + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + quiver: + dependency: transitive + description: + name: quiver + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1+1" + rxdart: + dependency: "direct main" + description: + name: rxdart + url: "https://pub.dartlang.org" + source: hosted + version: "0.27.3" + shelf: + dependency: transitive + description: + name: shelf + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.99" + source_gen: + dependency: transitive + description: + name: source_gen + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.1" + source_helper: + dependency: transitive + description: + name: source_helper + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.1" source_span: dependency: transitive description: @@ -121,6 +567,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + stream_transform: + dependency: transitive + description: + name: stream_transform + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" string_scanner: dependency: transitive description: @@ -142,6 +595,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.2" + timing: + dependency: transitive + description: + name: timing + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" typed_data: dependency: transitive description: @@ -149,6 +609,69 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.0" + url_launcher: + dependency: transitive + description: + name: url_launcher + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.20" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.14" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.14" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.7" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" + uuid: + dependency: "direct main" + description: + name: uuid + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.5" vector_math: dependency: transitive description: @@ -156,6 +679,41 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + watcher: + dependency: transitive + description: + name: watcher + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + win32: + dependency: transitive + description: + name: win32 + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.6" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0+1" + yaml: + dependency: transitive + description: + name: yaml + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" sdks: - dart: ">=2.12.0 <3.0.0" - flutter: ">=1.17.0" + dart: ">=2.14.0 <3.0.0" + flutter: ">=2.5.0" diff --git a/packages/firestore/test/firestore_test.dart b/packages/firestore/test/firestore_test.dart deleted file mode 100644 index 09961a1..0000000 --- a/packages/firestore/test/firestore_test.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; - -import 'package:firestore/firestore.dart'; - -void main() { - test('adds one to input values', () { - final calculator = Calculator(); - expect(calculator.addOne(2), 3); - expect(calculator.addOne(-7), -6); - expect(calculator.addOne(0), 1); - }); -} diff --git a/packages/firestore/test/models/models_test.dart b/packages/firestore/test/models/models_test.dart new file mode 100644 index 0000000..ca603d3 --- /dev/null +++ b/packages/firestore/test/models/models_test.dart @@ -0,0 +1,25 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:firestore/models/primitives/document.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group("Firestore data", () { + // test("expand data to match firestore requirements", () async { + // final data = File('packages/firestore/test/models/test_data/doc_structure.json'); + // final json = jsonDecode(await data.readAsString()); + // final flatData = File('packages/firestore/test/models/test_data/flat_doc.json'); + // final flatJson = jsonDecode(await flatData.readAsString()); + // expect(Firestore.expandJson(flatJson['fields']), json['fields']); + // }); + test("Flatten firestore data to meet requirements", () async { + final data = File('packages/firestore/test/models/test_data/doc_structure.json'); + final json = jsonDecode(await data.readAsString()); + final flatData = File('packages/firestore/test/models/test_data/flat_doc.json'); + final flatJson = jsonDecode(await flatData.readAsString()); + final Document doc = Document.fromJson(json); + expect(doc.toJson(), flatJson); + }); + }); +} diff --git a/packages/firestore/test/models/test_data/doc_structure.json b/packages/firestore/test/models/test_data/doc_structure.json new file mode 100644 index 0000000..86df236 --- /dev/null +++ b/packages/firestore/test/models/test_data/doc_structure.json @@ -0,0 +1,52 @@ +{ + "name": "projects/stackanswers-lite/databases/(default)/documents/users4/thI5LvOgOAkH8Hwt4JlL", + "fields": { + "number": { + "integerValue": 200 + }, + "bool": { + "booleanValue": true + }, + "map": { + "mapValue": { + "fields": { + "1": { + "stringValue": "20" + }, + "2": { + "stringValue": "40" + } + } + } + }, + "pointer": { + "referenceValue": "projects/stackanswers-lite/databases/(default)/documents/users/1" + }, + "array": { + "arrayValue": { + "values": [ + { + "stringValue": "1" + }, + { + "stringValue": "2" + }, + { + "stringValue": "3" + } + ] + } + }, + "hope": { + "stringValue": "sdfsdf" + }, + "date": { + "timestampValue": "2022-02-01T05:00:00Z" + }, + "float": { + "doubleValue": 100.5 + } + }, + "createTime": "2022-02-13T20:29:47.909905Z", + "updateTime": "2022-02-13T20:39:04.235983Z" +} \ No newline at end of file diff --git a/packages/firestore/test/models/test_data/firestore_primitives/array_structure.json b/packages/firestore/test/models/test_data/firestore_primitives/array_structure.json new file mode 100644 index 0000000..4ea97c9 --- /dev/null +++ b/packages/firestore/test/models/test_data/firestore_primitives/array_structure.json @@ -0,0 +1,15 @@ +{ + "arrayValue": { + "values": [ + { + "stringValue": "1" + }, + { + "stringValue": "2" + }, + { + "stringValue": "3" + } + ] + } +} \ No newline at end of file diff --git a/packages/firestore/test/models/test_data/firestore_primitives/bool_structure.json b/packages/firestore/test/models/test_data/firestore_primitives/bool_structure.json new file mode 100644 index 0000000..f3f99e3 --- /dev/null +++ b/packages/firestore/test/models/test_data/firestore_primitives/bool_structure.json @@ -0,0 +1,3 @@ +{ + "booleanValue": true +} \ No newline at end of file diff --git a/packages/firestore/test/models/test_data/firestore_primitives/date_structure.json b/packages/firestore/test/models/test_data/firestore_primitives/date_structure.json new file mode 100644 index 0000000..2c836a0 --- /dev/null +++ b/packages/firestore/test/models/test_data/firestore_primitives/date_structure.json @@ -0,0 +1,3 @@ +{ + "timestampValue": "2022-02-01T05:00:00Z" +} \ No newline at end of file diff --git a/packages/firestore/test/models/test_data/firestore_primitives/double_structure.json b/packages/firestore/test/models/test_data/firestore_primitives/double_structure.json new file mode 100644 index 0000000..a91fa8a --- /dev/null +++ b/packages/firestore/test/models/test_data/firestore_primitives/double_structure.json @@ -0,0 +1,3 @@ +{ + "doubleValue": 100.5 +} \ No newline at end of file diff --git a/packages/firestore/test/models/test_data/firestore_primitives/int_structure.json b/packages/firestore/test/models/test_data/firestore_primitives/int_structure.json new file mode 100644 index 0000000..8356b9b --- /dev/null +++ b/packages/firestore/test/models/test_data/firestore_primitives/int_structure.json @@ -0,0 +1,3 @@ +{ + "integerValue": "200" +} \ No newline at end of file diff --git a/packages/firestore/test/models/test_data/firestore_primitives/map_structure.json b/packages/firestore/test/models/test_data/firestore_primitives/map_structure.json new file mode 100644 index 0000000..4ca0869 --- /dev/null +++ b/packages/firestore/test/models/test_data/firestore_primitives/map_structure.json @@ -0,0 +1,12 @@ +{ + "mapValue": { + "fields": { + "2": { + "stringValue": "40" + }, + "1": { + "stringValue": "20" + } + } + } +} \ No newline at end of file diff --git a/packages/firestore/test/models/test_data/firestore_primitives/output.json b/packages/firestore/test/models/test_data/firestore_primitives/output.json new file mode 100644 index 0000000..15b7c62 --- /dev/null +++ b/packages/firestore/test/models/test_data/firestore_primitives/output.json @@ -0,0 +1,47 @@ +{ + "number":{ + "integerValue":200 + }, + "bool":{ + "booleanValue":true + }, + "map":{ + "mapValue":{ + "fields":{ + "1":{ + "stringValue":20 + }, + "2":{ + "stringValue":40 + } + } + } + }, + "pointer":{ + "stringValue":projects/stackanswers-lite/databases/(default)/documents/users/1 + }, + "array":{ + "arrayValue":{ + "values":[ + { + "stringValue":1 + }, + { + "stringValue":2 + }, + { + "stringValue":3 + } + ] + } + }, + "hope":{ + "stringValue":"sdfsdf" + }, + "date":{ + "stringValue":"2022-02-01T05":"00":00Z + }, + "float":{ + "doubleValue":100.5 + } +} \ No newline at end of file diff --git a/packages/firestore/test/models/test_data/firestore_primitives/ref_structure.json b/packages/firestore/test/models/test_data/firestore_primitives/ref_structure.json new file mode 100644 index 0000000..17feee2 --- /dev/null +++ b/packages/firestore/test/models/test_data/firestore_primitives/ref_structure.json @@ -0,0 +1,3 @@ +{ + "referenceValue": "projects/stackanswers-lite/databases/(default)/documents/users/1" +} \ No newline at end of file diff --git a/packages/firestore/test/models/test_data/firestore_primitives/string_structure.json b/packages/firestore/test/models/test_data/firestore_primitives/string_structure.json new file mode 100644 index 0000000..0914046 --- /dev/null +++ b/packages/firestore/test/models/test_data/firestore_primitives/string_structure.json @@ -0,0 +1,3 @@ +{ + "stringValue": "sdfsdf" +} \ No newline at end of file diff --git a/packages/firestore/test/models/test_data/flat_doc.json b/packages/firestore/test/models/test_data/flat_doc.json new file mode 100644 index 0000000..1e69f83 --- /dev/null +++ b/packages/firestore/test/models/test_data/flat_doc.json @@ -0,0 +1,22 @@ +{ + "name": "projects/stackanswers-lite/databases/(default)/documents/users4/thI5LvOgOAkH8Hwt4JlL", + "createTime":"2022-02-13T20:29:47.909905Z", + "updateTime":"2022-02-13T20:39:04.235983Z", + "fields":{ + "number": 200, + "bool":true, + "map":{ + "1": "20", + "2": "40" + }, + "pointer": "projects/stackanswers-lite/databases/(default)/documents/users/1", + "array":[ + "1", + "2", + "3" + ], + "hope":"sdfsdf", + "date":"2022-02-01T05:00:00Z", + "float":100.5 + } +} \ No newline at end of file diff --git a/test/models/models_test.dart b/test/models_test.dart similarity index 100% rename from test/models/models_test.dart rename to test/models_test.dart