onSaveDocument method
Future<void>
onSaveDocument(
- ModelAdapterDocumentQuery query, {
- DynamicMap? oldValue,
- required DynamicMap newValue,
This is the process when saving a document.
Specify the query passed from the document in query
.
Specify the value before saving in oldValue
.
Specify the value after saving in newValue
.
If oldValue
has no value and newValue
has a value, it is considered a new creation.
If oldValue
has a value and newValue
has a value, it is considered an update.
ドキュメントを保存する時の処理です。
query
にドキュメントから渡されたクエリを指定します。
oldValue
に保存前の値を指定します。
newValue
に保存後の値を指定します。
oldValue
に値がなく、newValue
に値がある場合は、新規作成とみなされます。
oldValue
に値があり、newValue
に値がある場合は、更新とみなされます。
Implementation
Future<void> onSaveDocument(
ModelAdapterDocumentQuery query, {
DynamicMap? oldValue,
required DynamicMap newValue,
}) async {
// 新規作成
if (oldValue.isEmpty && newValue.isNotEmpty) {
final validationQueries = query.query.validationQueries
?.where(
(e) =>
e.permission == ModelValidationQueryPermissionType.allowWrite ||
e.permission == ModelValidationQueryPermissionType.allowCreate,
)
.toList()
.sortTo((a, b) {
final permission = a.permission.index.compareTo(b.permission.index);
if (permission != 0) {
return permission;
}
return a.user.index.compareTo(b.user.index);
});
if (validationQueries == null) {
return;
}
if (validationQueries.isEmpty) {
throw DatabaseValidationExcepction(
"Not permitted: OnCreateDocument at ${query.query.path} $validationQueries $newValue",
);
}
final userId = await onRetrieveUserId();
for (final validationQuery in validationQueries) {
if (!validationQuery._checkPermission(
query: query.query,
userId: userId,
) ||
!validationQuery._checkPermissionWithValue(
query: query.query,
docId: query.query.path.last(),
userId: userId,
value: newValue,
)) {
throw DatabaseValidationExcepction(
"Not permitted: OnCreateDocument at ${query.query.path} $validationQueries $newValue",
);
}
}
// 更新
} else if (oldValue.isNotEmpty && newValue.isNotEmpty) {
final validationQueries = query.query.validationQueries
?.where(
(e) =>
e.permission == ModelValidationQueryPermissionType.allowWrite ||
e.permission == ModelValidationQueryPermissionType.allowUpdate,
)
.toList()
.sortTo((a, b) {
final permission = a.permission.index.compareTo(b.permission.index);
if (permission != 0) {
return permission;
}
return a.user.index.compareTo(b.user.index);
});
if (validationQueries == null) {
return;
}
if (validationQueries.isEmpty) {
throw DatabaseValidationExcepction(
"Not permitted: OnUpdateDocument at ${query.query.path} $validationQueries $oldValue -> $newValue",
);
}
final userId = await onRetrieveUserId();
for (final validationQuery in validationQueries) {
if (!validationQuery._checkPermission(
query: query.query,
userId: userId,
) ||
!validationQuery._checkPermissionWithValue(
query: query.query,
docId: query.query.path.last(),
userId: userId,
value: newValue,
)) {
throw DatabaseValidationExcepction(
"Not permitted: OnUpdateDocument at ${query.query.path} $validationQueries $oldValue -> $newValue",
);
}
}
}
}