diff --git a/modules/storages/app/common/storages/adapters/providers/nextcloud/base.rb b/modules/storages/app/common/storages/adapters/providers/nextcloud/base.rb index 1e33b2d7506..76669773f54 100644 --- a/modules/storages/app/common/storages/adapters/providers/nextcloud/base.rb +++ b/modules/storages/app/common/storages/adapters/providers/nextcloud/base.rb @@ -78,6 +78,17 @@ module Storages Failure(error.with(payload: "No origin user ID or user token found. Cannot execute query without user context.")) end end + + # Validates the OCS Meta Statuscode for fatal errors (i.e. unexpected server-side errors). Client-side errors, + # such as a 404 File Not Found do not cause an error. + # @return [Dry::Result] + def fail_on_ocs_error(json, error) + if json.dig(:ocs, :meta, :statuscode) < 500 + Success(json) + else + Failure(error.with(code: :error)) + end + end end end end diff --git a/modules/storages/app/common/storages/adapters/providers/nextcloud/queries/file_info_query.rb b/modules/storages/app/common/storages/adapters/providers/nextcloud/queries/file_info_query.rb index e6b8427e29e..f477dc58c5b 100644 --- a/modules/storages/app/common/storages/adapters/providers/nextcloud/queries/file_info_query.rb +++ b/modules/storages/app/common/storages/adapters/providers/nextcloud/queries/file_info_query.rb @@ -55,7 +55,7 @@ module Storages case response in { status: 200..299 } - Success(response.json(symbolize_keys: true)) + fail_on_ocs_error(response.json(symbolize_keys: true), error) in { status: 404 } Failure(error.with(code: :not_found)) in { status: 401 } diff --git a/modules/storages/app/common/storages/adapters/providers/nextcloud/queries/files_info_query.rb b/modules/storages/app/common/storages/adapters/providers/nextcloud/queries/files_info_query.rb index e462e2c8f40..ee6c42e0dfb 100644 --- a/modules/storages/app/common/storages/adapters/providers/nextcloud/queries/files_info_query.rb +++ b/modules/storages/app/common/storages/adapters/providers/nextcloud/queries/files_info_query.rb @@ -57,7 +57,7 @@ module Storages case response in { status: 200..299 } - verify_successful_response(response.json(symbolize_keys: true), error) + fail_on_ocs_error(response.json(symbolize_keys: true), error) in { status: 404 } Failure(error.with(code: :not_found)) in { status: 401 } @@ -67,14 +67,6 @@ module Storages end end - def verify_successful_response(json, error) - if json.dig(:ocs, :meta, :status) == "ok" - Success(json) - else - Failure(error.with(code: :error)) - end - end - def create_storage_file_infos(parsed_json) parsed_json.dig(:ocs, :data)&.map do |(key, value)| if value[:statuscode] == 200 diff --git a/spec/support/storage_server_helpers.rb b/spec/support/storage_server_helpers.rb index 70e27915b69..63065473873 100644 --- a/spec/support/storage_server_helpers.rb +++ b/spec/support/storage_server_helpers.rb @@ -141,6 +141,7 @@ module StorageServerHelpers folder1_xml_response = build(:webdav_data_folder) folder1_fileinfo_response = { ocs: { + meta: { statuscode: 100 }, data: { status: "OK", statuscode: 200,