blob: 8c52d0ab20504076c8ebd78fb80693b54fb1fb09 [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';
class SafeDocument {
final String name;
final Map<String, Value> fields;
SafeDocument(Document document)
: name = document.name!,
fields = document.fields!;
Document toDocument() => Document(name: name, fields: 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!;
}
String? getStringOrNull(String name) {
return fields[name]?.stringValue;
}
bool? getBool(String name) {
return fields[name]?.booleanValue;
}
List<dynamic>? getList(String name) {
final arrayValue = fields[name]?.arrayValue;
if (arrayValue == null) return null;
return arrayValue.values?.map(getValue).toList() ?? [];
}
bool isNull(String name) {
return !fields.containsKey(name) ||
fields['name']!.nullValue == 'NULL_VALUE';
}
}
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()}');
}
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');
}