onSaveDocument method

Future<void> onSaveDocument(
  1. ModelAdapterDocumentQuery query, {
  2. DynamicMap? oldValue,
  3. 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",
        );
      }
    }
  }
}