Skip to content

Commit

Permalink
feat: Addition of DatabaseValidator.
Browse files Browse the repository at this point in the history
  • Loading branch information
mathrunet committed Jan 22, 2024
1 parent aa3a5bc commit 9ca9e22
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,8 @@ class CsvDocumentSourceModelAdapter extends CsvSourceModelAdapter {
///
/// By passing data to [initialValue], the database can be used as a data mockup because it contains data in advance.
///
/// If [validator] is specified, validation is performed in the database.
///
/// CSVファイルをデータソースとして利用するデータベースアダプター。
///
/// CSVファイルで設定などを行う場合、設定ファイルとして利用することができます。
Expand All @@ -380,6 +382,8 @@ class CsvDocumentSourceModelAdapter extends CsvSourceModelAdapter {
/// [requestMethod]にはHTTPとしてリクエストする際に送るリクエストメソッドを指定します。
///
/// [initialValue]にデータを渡すことで予めデータが入った状態でデータベースを利用することができるためデータモックとして利用することができます。
///
/// [validator]を指定するとデータベース内でのバリデーションが行われます。
/// {@endtemplate}
///
/// CSV data is converted to [Map] by writing the process for conversion in [fromCsv].
Expand All @@ -400,6 +404,8 @@ abstract class CsvSourceModelAdapter extends ModelAdapter {
///
/// By passing data to [initialValue], the database can be used as a data mockup because it contains data in advance.
///
/// If [validator] is specified, validation is performed in the database.
///
/// CSVファイルをデータソースとして利用するデータベースアダプター。
///
/// CSVファイルで設定などを行う場合、設定ファイルとして利用することができます。
Expand All @@ -411,6 +417,8 @@ abstract class CsvSourceModelAdapter extends ModelAdapter {
/// [requestMethod]にはHTTPとしてリクエストする際に送るリクエストメソッドを指定します。
///
/// [initialValue]にデータを渡すことで予めデータが入った状態でデータベースを利用することができるためデータモックとして利用することができます。
///
/// [validator]を指定するとデータベース内でのバリデーションが行われます。
/// {@endtemplate}
///
/// CSV data is converted to [Map] by writing the process for conversion in [fromCsv].
Expand All @@ -423,6 +431,7 @@ abstract class CsvSourceModelAdapter extends ModelAdapter {
this.requestHeaders,
this.requestMethod,
this.collectionPath,
this.validator,
}) : _database = database;

final NoSqlDatabase? _database;
Expand Down Expand Up @@ -459,6 +468,15 @@ abstract class CsvSourceModelAdapter extends ModelAdapter {
/// アプリ内全体での共通のデータベース。
static final NoSqlDatabase sharedDatabase = NoSqlDatabase();

/// Specify the permission validator for the database.
///
/// If [Null], no validation is performed.
///
/// データベースのパーミッションバリデーターを指定します。
///
/// [Null]のときはバリデーションされません。
final DatabaseValidator? validator;

/// The path of the destination as a collection.
///
/// If [Null], the hash value of [source] is used.
Expand Down Expand Up @@ -582,21 +600,33 @@ abstract class CsvSourceModelAdapter extends ModelAdapter {

@override
Future<DynamicMap> loadDocument(ModelAdapterDocumentQuery query) async {
if (validator != null) {
await validator!.onPreloadDocument(query);
}
await _loadCSV(database);
final data = await database.loadDocument(
_replaceDocumentQuery(query),
);
if (validator != null) {
await validator!.onPostloadDocument(query, data);
}
return data != null ? Map.from(data) : {};
}

@override
Future<Map<String, DynamicMap>> loadCollection(
ModelAdapterCollectionQuery query,
) async {
if (validator != null) {
await validator!.onPreloadCollection(query);
}
await _loadCSV(database);
final data = await database.loadCollection(
_replaceCollectionQuery(query),
);
if (validator != null) {
await validator!.onPostloadCollection(query, data);
}
return data != null
? data.map((key, value) => MapEntry(key, Map.from(value)))
: {};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,8 @@ class JsonDocumentSourceModelAdapter extends JsonSourceModelAdapter {
///
/// By passing data to [initialValue], the database can be used as a data mockup because it contains data in advance.
///
/// If [validator] is specified, validation is performed in the database.
///
/// Jsonファイルをデータソースとして利用するデータベースアダプター。
///
/// Jsonファイルで設定などを行う場合、設定ファイルとして利用することができます。
Expand All @@ -301,6 +303,8 @@ class JsonDocumentSourceModelAdapter extends JsonSourceModelAdapter {
/// [requestMethod]にはHTTPとしてリクエストする際に送るリクエストメソッドを指定します。
///
/// [initialValue]にデータを渡すことで予めデータが入った状態でデータベースを利用することができるためデータモックとして利用することができます。
///
/// [validator]を指定するとデータベース内でのバリデーションが行われます。
/// {@endtemplate}
///
/// Json data is converted to [Map] by writing the process for conversion in [fromJson].
Expand All @@ -321,6 +325,8 @@ abstract class JsonSourceModelAdapter extends ModelAdapter {
///
/// By passing data to [initialValue], the database can be used as a data mockup because it contains data in advance.
///
/// If [validator] is specified, validation is performed in the database.
///
/// Jsonファイルをデータソースとして利用するデータベースアダプター。
///
/// Jsonファイルで設定などを行う場合、設定ファイルとして利用することができます。
Expand All @@ -332,6 +338,8 @@ abstract class JsonSourceModelAdapter extends ModelAdapter {
/// [requestMethod]にはHTTPとしてリクエストする際に送るリクエストメソッドを指定します。
///
/// [initialValue]にデータを渡すことで予めデータが入った状態でデータベースを利用することができるためデータモックとして利用することができます。
///
/// [validator]を指定するとデータベース内でのバリデーションが行われます。
/// {@endtemplate}
///
/// Json data is converted to [Map] by writing the process for conversion in [fromJson].
Expand All @@ -344,6 +352,7 @@ abstract class JsonSourceModelAdapter extends ModelAdapter {
this.requestHeaders,
this.requestMethod,
this.collectionPath,
this.validator,
}) : _database = database;

final NoSqlDatabase? _database;
Expand Down Expand Up @@ -380,6 +389,15 @@ abstract class JsonSourceModelAdapter extends ModelAdapter {
/// アプリ内全体での共通のデータベース。
static final NoSqlDatabase sharedDatabase = NoSqlDatabase();

/// Specify the permission validator for the database.
///
/// If [Null], no validation is performed.
///
/// データベースのパーミッションバリデーターを指定します。
///
/// [Null]のときはバリデーションされません。
final DatabaseValidator? validator;

/// The path of the destination as a collection.
///
/// If [Null], the hash value of [source] is used.
Expand Down Expand Up @@ -495,21 +513,33 @@ abstract class JsonSourceModelAdapter extends ModelAdapter {

@override
Future<DynamicMap> loadDocument(ModelAdapterDocumentQuery query) async {
if (validator != null) {
await validator!.onPreloadDocument(query);
}
await _loadJson(database);
final data = await database.loadDocument(
_replaceDocumentQuery(query),
);
if (validator != null) {
await validator!.onPostloadDocument(query, data);
}
return data != null ? Map.from(data) : {};
}

@override
Future<Map<String, DynamicMap>> loadCollection(
ModelAdapterCollectionQuery query,
) async {
if (validator != null) {
await validator!.onPreloadCollection(query);
}
await _loadJson(database);
final data = await database.loadCollection(
_replaceCollectionQuery(query),
);
if (validator != null) {
await validator!.onPostloadCollection(query, data);
}
return data != null
? data.map((key, value) => MapEntry(key, Map.from(value)))
: {};
Expand Down
39 changes: 39 additions & 0 deletions packages/katana_model_local/lib/adapter/local_model_adapter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ const _kLocalDatabaseId = "local://";
///
/// By adding [prefix], all paths can be prefixed, enabling operations such as separating data storage locations for each Flavor.
///
/// If [validator] is specified, validation is performed in the database.
///
/// ローカル端末にデータを保存するデータベースアダプター。
///
/// 外部に値を保存する必要のないアプリ開発に利用します。
Expand All @@ -21,6 +23,8 @@ const _kLocalDatabaseId = "local://";
/// [initialValue]にデータを渡すことで予めデータが入った状態でデータベースを利用することができるためデータモックとして利用することができます。
///
/// [prefix]を追加することですべてのパスにプレフィックスを付与することができ、Flavorごとにデータの保存場所を分けるなどの運用が可能です。
///
/// [validator]を指定するとデータベース内でのバリデーションが行われます。
@immutable
class LocalModelAdapter extends ModelAdapter {
/// A database adapter that stores data on a local terminal.
Expand All @@ -33,6 +37,8 @@ class LocalModelAdapter extends ModelAdapter {
///
/// By adding [prefix], all paths can be prefixed, enabling operations such as separating data storage locations for each Flavor.
///
/// If [validator] is specified, validation is performed in the database.
///
/// ローカル端末にデータを保存するデータベースアダプター。
///
/// 外部に値を保存する必要のないアプリ開発に利用します。
Expand All @@ -42,10 +48,13 @@ class LocalModelAdapter extends ModelAdapter {
/// [initialValue]にデータを渡すことで予めデータが入った状態でデータベースを利用することができるためデータモックとして利用することができます。
///
/// [prefix]を追加することですべてのパスにプレフィックスを付与することができ、Flavorごとにデータの保存場所を分けるなどの運用が可能です。
///
/// [validator]を指定するとデータベース内でのバリデーションが行われます。
const LocalModelAdapter({
NoSqlDatabase? database,
this.prefix,
this.initialValue,
this.validator,
}) : _database = database;

final NoSqlDatabase? _database;
Expand Down Expand Up @@ -110,6 +119,15 @@ class LocalModelAdapter extends ModelAdapter {
},
);

/// Specify the permission validator for the database.
///
/// If [Null], no validation is performed.
///
/// データベースのパーミッションバリデーターを指定します。
///
/// [Null]のときはバリデーションされません。
final DatabaseValidator? validator;

/// Path prefix.
///
/// パスのプレフィックス。
Expand All @@ -123,7 +141,13 @@ class LocalModelAdapter extends ModelAdapter {
@override
Future<DynamicMap> loadDocument(ModelAdapterDocumentQuery query) async {
_assert();
if (validator != null) {
await validator!.onPreloadDocument(query);
}
final data = await database.loadDocument(query, prefix: prefix);
if (validator != null) {
await validator!.onPostloadDocument(query, data);
}
return data != null ? Map.from(data) : {};
}

Expand All @@ -132,7 +156,13 @@ class LocalModelAdapter extends ModelAdapter {
ModelAdapterCollectionQuery query,
) async {
_assert();
if (validator != null) {
await validator!.onPreloadCollection(query);
}
final data = await database.loadCollection(query, prefix: prefix);
if (validator != null) {
await validator!.onPostloadCollection(query, data);
}
return data != null
? data.map((key, value) => MapEntry(key, Map.from(value)))
: {};
Expand Down Expand Up @@ -189,6 +219,10 @@ class LocalModelAdapter extends ModelAdapter {
@override
Future<void> deleteDocument(ModelAdapterDocumentQuery query) async {
_assert();
if (validator != null) {
final oldValue = await database.loadDocument(query, prefix: prefix);
await validator!.onDeleteDocument(query, oldValue);
}
await database.deleteDocument(query, prefix: prefix);
}

Expand All @@ -198,6 +232,11 @@ class LocalModelAdapter extends ModelAdapter {
DynamicMap value,
) async {
_assert();
if (validator != null) {
final oldValue = await database.loadDocument(query, prefix: prefix);
await validator!
.onSaveDocument(query, oldValue: oldValue, newValue: value);
}
await database.saveDocument(query, value, prefix: prefix);
}

Expand Down
2 changes: 1 addition & 1 deletion packages/katana_model_local/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ packages:
path: "../katana_model"
relative: true
source: path
version: "2.18.2"
version: "2.18.5"
lints:
dependency: transitive
description:
Expand Down

0 comments on commit 9ca9e22

Please sign in to comment.