blob: 9d45900d4d122acc44e9fed534a41b5867a31acc [file] [log] [blame]
// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:googleapis/firestore/v1.dart';
Map<String, Value> taggedMap(Map<String, dynamic> fields) {
return fields.map((key, value) => MapEntry(key, taggedValue(value)));
}
Value taggedValue(dynamic value) {
if (value is int) {
return Value()..integerValue = '$value';
} else if (value is String) {
return Value()..stringValue = value;
} else if (value is bool) {
return Value()..booleanValue = value;
} else if (value is DateTime) {
return Value()..timestampValue = value.toUtc().toIso8601String();
} else if (value is List) {
return Value()
..arrayValue = (ArrayValue()
..values = value.map((element) => taggedValue(element)).toList());
} else if (value == null) {
return Value()..nullValue = 'NULL_VALUE';
} else {
throw Exception('unsupported value type ${value.runtimeType}');
}
}
dynamic getValue(Value value) {
if (value.integerValue != null) {
return int.parse(value.integerValue);
} else if (value.stringValue != null) {
return value.stringValue;
} else if (value.booleanValue != null) {
return value.booleanValue;
} else if (value.arrayValue != null) {
return value.arrayValue.values.map(getValue).toList();
} else if (value.timestampValue != null) {
return DateTime.parse(value.timestampValue);
} else if (value.nullValue != null) {
return null;
}
throw Exception('unsupported value ${value.toJson()}');
}
/// Converts a map with normal Dart values to a map where the values are
/// JSON representation of firestore API values. For example: `{'x': 3}` is
/// translated to `{'x': {'integerValue': 3}}`.
Map<String, Object> taggedJsonMap(Map<String, dynamic> fields) {
return fields.map((key, value) => MapEntry(key, taggedValue(value).toJson()));
}
Map<String, dynamic> untagMap(Map<String, Value> map) {
return map.map((key, value) => MapEntry(key, getValue(value)));
}
List<CollectionSelector> inCollection(String name) {
return [CollectionSelector()..collectionId = name];
}
FieldReference field(String name) {
return FieldReference()..fieldPath = name;
}
Order orderBy(String fieldName, bool ascending) {
return Order()
..field = field(fieldName)
..direction = ascending ? 'ASCENDING' : 'DESCENDING';
}
Filter fieldEquals(String fieldName, dynamic value) {
return Filter()
..fieldFilter = (FieldFilter()
..field = field(fieldName)
..op = 'EQUAL'
..value = taggedValue(value));
}
Filter fieldLessThanOrEqual(String fieldName, dynamic value) {
return Filter()
..fieldFilter = (FieldFilter()
..field = field(fieldName)
..op = 'LESS_THAN_OR_EQUAL'
..value = taggedValue(value));
}
Filter fieldGreaterThanOrEqual(String fieldName, dynamic value) {
return Filter()
..fieldFilter = (FieldFilter()
..field = field(fieldName)
..op = 'GREATER_THAN_OR_EQUAL'
..value = taggedValue(value));
}
Filter arrayContains(String fieldName, dynamic value) {
return Filter()
..fieldFilter = (FieldFilter()
..field = field(fieldName)
..op = 'ARRAY_CONTAINS'
..value = taggedValue(value));
}
Filter compositeFilter(List<Filter> filters) {
return Filter()
..compositeFilter = (CompositeFilter()
..filters = filters
..op = 'AND');
}
class DataWrapper {
final Map<String, Value> fields;
DataWrapper(Document document) : fields = document.fields;
DataWrapper.fields(this.fields);
int getInt(String name) {
final value = fields[name]?.integerValue;
if (value == null) {
return null;
}
return int.parse(value);
}
String getString(String name) {
return fields[name]?.stringValue;
}
bool getBool(String name) {
return fields[name]?.booleanValue;
}
List<dynamic> getList(String name) {
return fields[name]?.arrayValue?.values?.map(getValue)?.toList();
}
bool isNull(String name) {
return !fields.containsKey(name) ||
fields['name'].nullValue == 'NULL_VALUE';
}
}