Skip to content

Commit

Permalink
fix: Modified to allow ModelTimestamp to be specified.
Browse files Browse the repository at this point in the history
  • Loading branch information
mathrunet committed Feb 2, 2023
1 parent bd47e3e commit eeab90f
Show file tree
Hide file tree
Showing 7 changed files with 87 additions and 25 deletions.
2 changes: 1 addition & 1 deletion packages/katana_model/example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,7 @@ packages:
path: ".."
relative: true
source: path
version: "1.5.3"
version: "1.5.4"
lints:
dependency: transitive
description:
Expand Down
44 changes: 39 additions & 5 deletions packages/katana_model/lib/src/model_field_value.dart
Original file line number Diff line number Diff line change
Expand Up @@ -408,9 +408,8 @@ class ModelCounter extends ModelFieldValue<int> {
///
/// [json]のマップから[ModelCounter]に変換します。
factory ModelCounter.fromJson(DynamicMap json) {
return _ModelCounter(
return ModelCounter.fromServer(
json.getAsInt(kValueKey),
ModelFieldValueSource.server,
);
}

Expand Down Expand Up @@ -535,6 +534,16 @@ class ModelTimestamp extends ModelFieldValue<DateTime> {
/// これをサーバーに渡すことでサーバー側のタイムスタンプがデータとして保存されます。
const factory ModelTimestamp([DateTime? value]) = _ModelTimestamp;

/// Used to disguise the retrieval of data from the server.
///
/// Use for testing purposes.
///
/// サーバーからのデータの取得に偽装するために利用します。
///
/// テスト用途で用いてください。
const factory ModelTimestamp.fromServer([DateTime? value]) =
_ModelTimestamp.fromServer;

/// Convert from [json] map to [ModelTimestamp].
///
/// [json]のマップから[ModelTimestamp]に変換します。
Expand All @@ -543,20 +552,38 @@ class ModelTimestamp extends ModelFieldValue<DateTime> {
kTimeKey,
DateTime.now().millisecondsSinceEpoch,
);
return ModelTimestamp(DateTime.fromMillisecondsSinceEpoch(timestamp));
return ModelTimestamp.fromServer(
DateTime.fromMillisecondsSinceEpoch(timestamp),
);
}

const ModelTimestamp._([DateTime? value]) : _value = value;
const ModelTimestamp._([
DateTime? value,
ModelFieldValueSource source = ModelFieldValueSource.user,
]) : _value = value,
_source = source;

/// Key to save time.
///
/// 時間を保存しておくキー。
static const kTimeKey = "@time";

/// A value key that should be set to `true` if the current time is used.
///
/// 現在時間を利用する場合`true`にしておく値のキー。
static const kNowKey = "@now";

/// Key to store the data source.
///
/// データソースを保存しておくキー。
static const kSourceKey = "@source";

@override
DateTime get value => _value ?? DateTime.now();
final DateTime? _value;

final ModelFieldValueSource _source;

@override
String toString() {
return value.toString();
Expand All @@ -566,6 +593,8 @@ class ModelTimestamp extends ModelFieldValue<DateTime> {
DynamicMap toJson() => {
kTypeFieldKey: (ModelTimestamp).toString(),
kTimeKey: value.millisecondsSinceEpoch,
kNowKey: _value == null,
kSourceKey: _source.name,
};

@override
Expand All @@ -578,7 +607,12 @@ class ModelTimestamp extends ModelFieldValue<DateTime> {
@immutable
class _ModelTimestamp extends ModelTimestamp
with ModelFieldValueAsMapMixin<DateTime> {
const _ModelTimestamp([DateTime? value]) : super._(value);
const _ModelTimestamp([
DateTime? value,
ModelFieldValueSource source = ModelFieldValueSource.user,
]) : super._(value, source);
const _ModelTimestamp.fromServer([DateTime? value])
: super._(value, ModelFieldValueSource.server);
}

/// [ModelFieldValueConverter] to enable automatic conversion of [ModelTimestamp] as [ModelFieldValue].
Expand Down
4 changes: 2 additions & 2 deletions packages/katana_model/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -343,10 +343,10 @@ packages:
dependency: "direct dev"
description:
name: json_serializable
sha256: "040088d9eb2337f3a51ddabe35261e2fea1c351e3dd29d755ed1290b6b700a75"
sha256: dadc08bd61f72559f938dd08ec20dbfec6c709bba83515085ea943d2078d187a
url: "https://pub.dev"
source: hosted
version: "6.6.0"
version: "6.6.1"
katana:
dependency: "direct main"
description:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -309,13 +309,23 @@ class FirestoreModelAdapter extends ModelAdapter {
res[targetKey] = FieldValue.increment(increment);
}
} else if (type == (ModelTimestamp).toString()) {
final timestamp = ModelTimestamp.fromJson(val);
final fromUser = val.get(ModelTimestamp.kSourceKey, "") ==
ModelFieldValueSource.user.name;
final value = val.get(ModelTimestamp.kTimeKey, 0);
final useNow = val.get(ModelTimestamp.kNowKey, false);
final targetKey = "#$key";
res[key] = {
...timestamp.toJson(),
kTypeFieldKey: (ModelTimestamp).toString(),
ModelTimestamp.kTimeKey: value,
_kTargetKey: targetKey,
};
res[targetKey] = FieldValue.serverTimestamp();
if (fromUser) {
if (useNow) {
res[targetKey] = FieldValue.serverTimestamp();
} else {
res[targetKey] = Timestamp.fromMillisecondsSinceEpoch(value);
}
}
} else if (type.startsWith((ModelRefBase).toString())) {
final ref = ModelRefBase.fromJson(val);
res[key] = database.doc(_path(ref.modelQuery.path));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -281,21 +281,40 @@ class ListenableFirestoreModelAdapter extends ModelAdapter {
if (val is DynamicMap && val.containsKey(_kTypeKey)) {
final type = val.get(_kTypeKey, "");
if (type == (ModelCounter).toString()) {
final counter = ModelCounter.fromJson(val);
final fromUser = val.get(ModelCounter.kSourceKey, "") ==
ModelFieldValueSource.user.name;
final value = val.get(ModelCounter.kValueKey, 0);
final increment = val.get(ModelCounter.kIncrementKey, 0);
final targetKey = "#$key";
res[key] = {
...counter.toJson(),
kTypeFieldKey: (ModelCounter).toString(),
ModelCounter.kValueKey: value,
ModelCounter.kIncrementKey: increment,
_kTargetKey: targetKey,
};
res[targetKey] = FieldValue.increment(counter.incrementValue);
if (fromUser) {
res[targetKey] = value;
} else {
res[targetKey] = FieldValue.increment(increment);
}
} else if (type == (ModelTimestamp).toString()) {
final timestamp = ModelTimestamp.fromJson(val);
final fromUser = val.get(ModelTimestamp.kSourceKey, "") ==
ModelFieldValueSource.user.name;
final value = val.get(ModelTimestamp.kTimeKey, 0);
final useNow = val.get(ModelTimestamp.kNowKey, false);
final targetKey = "#$key";
res[key] = {
...timestamp.toJson(),
kTypeFieldKey: (ModelTimestamp).toString(),
ModelTimestamp.kTimeKey: value,
_kTargetKey: targetKey,
};
res[targetKey] = FieldValue.serverTimestamp();
if (fromUser) {
if (useNow) {
res[targetKey] = FieldValue.serverTimestamp();
} else {
res[targetKey] = Timestamp.fromMillisecondsSinceEpoch(value);
}
}
} else if (type.startsWith((ModelRefBase).toString())) {
final ref = ModelRefBase.fromJson(val);
res[key] = database.doc(_path(ref.modelQuery.path));
Expand Down
13 changes: 6 additions & 7 deletions packages/katana_model_firestore/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -299,11 +299,10 @@ packages:
katana_model:
dependency: "direct main"
description:
name: katana_model
sha256: "521693dddb1999f6ef04175e294f5676c2e29d5884b90e2e9ba3638eaa07ce1d"
url: "https://pub.dev"
source: hosted
version: "1.5.3"
path: "../katana_model"
relative: true
source: path
version: "1.5.4"
lints:
dependency: transitive
description:
Expand Down Expand Up @@ -500,10 +499,10 @@ packages:
dependency: transitive
description:
name: shared_preferences_foundation
sha256: "1ffa239043ab8baf881ec3094a3c767af9d10399b2839020b9e4d44c0bb23951"
sha256: "2b55c18636a4edc529fa5cd44c03d3f3100c00513f518c5127c951978efcccd0"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
version: "2.1.3"
shared_preferences_linux:
dependency: transitive
description:
Expand Down
2 changes: 1 addition & 1 deletion packages/katana_model_firestore/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: katana_model_firestore
description: Firestore plugin for katana_model. A package that models data into documents and collections and allows Firestore, local DB, and data mocks to be handled in the same interface.
version: 1.5.6
version: 1.5.5
homepage: https://mathru.net
repository: https://github.com/mathrunet/flutter_masamune/tree/master/packages/katana_model_firestore

Expand Down

0 comments on commit eeab90f

Please sign in to comment.