From aa6d1091e137c06a1440a56868e9c3a3a5b8c71a Mon Sep 17 00:00:00 2001 From: Sujal-Gupta-SG Date: Sun, 19 Jan 2025 03:38:53 +0530 Subject: [PATCH] fix/handle-shared-files-and-error-handling --- .../free/nrw/commons/upload/UploadClient.kt | 16 +++++++++- .../nrw/commons/upload/UploadInterface.kt | 10 +++---- .../nrw/commons/wikidata/WikiBaseClient.kt | 29 ++++++++++--------- .../commons/wikidata/WikidataEditService.kt | 1 + 4 files changed, 36 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadClient.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadClient.kt index 754ae05dd..52e9f202a 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadClient.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadClient.kt @@ -261,6 +261,7 @@ class UploadClient fileKey: String?, ): Observable = try { + Timber.d( "Step 1") uploadInterface .uploadFileFromStash( csrfTokenClient.getTokenBlocking(), @@ -269,12 +270,25 @@ class UploadClient uniqueFileName!!, fileKey!!, ).map { uploadResponse: JsonObject? -> + Timber.d("Step 2") + Timber.d(uploadResponse.toString()) val uploadResult = gson.fromJson(uploadResponse, UploadResponse::class.java) + Timber.d("Step 3: Upload result - ${uploadResult.upload}") + if (uploadResult.upload == null) { + // Parse the error to MwException val exception = gson.fromJson(uploadResponse, MwException::class.java) Timber.e(exception, "Error in uploading file from stash") - throw Exception(exception.errorCode) + + // Handle abuse filter warning explicitly + if (exception.errorCode?.contains("abusefilter-warning") == true) { + Timber.w("Abuse filter triggered: ${exception.errorCode}") + throw Exception("Abuse filter warning: ${exception.errorCode}. Please verify file content or metadata.") + } else { + throw Exception(exception.errorCode) + } } + Timber.d("Step 4") uploadResult.upload } } catch (throwable: Throwable) { diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadInterface.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadInterface.kt index c756f89da..0acc2bfb3 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadInterface.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadInterface.kt @@ -28,10 +28,10 @@ interface UploadInterface { @POST(WikidataConstants.MW_API_PREFIX + "action=upload&ignorewarnings=1") @FormUrlEncoded fun uploadFileFromStash( - @Field("token") token: String, - @Field("text") text: String, - @Field("comment") comment: String, - @Field("filename") filename: String, - @Field("filekey") filekey: String, + @Field("token") token: String?, + @Field("text") text: String?, + @Field("comment") comment: String?, + @Field("filename") filename: String?, + @Field("filekey") filekey: String?, ): Observable } diff --git a/app/src/main/java/fr/free/nrw/commons/wikidata/WikiBaseClient.kt b/app/src/main/java/fr/free/nrw/commons/wikidata/WikiBaseClient.kt index 773c83590..78a9b7806 100644 --- a/app/src/main/java/fr/free/nrw/commons/wikidata/WikiBaseClient.kt +++ b/app/src/main/java/fr/free/nrw/commons/wikidata/WikiBaseClient.kt @@ -78,21 +78,22 @@ class WikiBaseClient .toLong() } - fun addLabelsToWikidata( - fileEntityId: Long, - languageCode: String?, - captionValue: String?, - ): Observable = - csrfToken().switchMap { editToken -> - wikiBaseInterface.addLabelstoWikidata( - PAGE_ID_PREFIX + fileEntityId, - editToken, - languageCode, - captionValue, - ) - } + fun addLabelsToWikidata( + fileEntityId: Long, + languageCode: String?, + captionValue: String? + ): Observable { + return csrfToken().switchMap { editToken -> + wikiBaseInterface.addLabelstoWikidata( + PAGE_ID_PREFIX + fileEntityId, + editToken, + languageCode, + captionValue + ) + } + } - private fun csrfToken(): Observable = + private fun csrfToken(): Observable = Observable.fromCallable { csrfTokenClient.getTokenBlocking() } diff --git a/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataEditService.kt b/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataEditService.kt index 0b49c03e9..afe1eb891 100644 --- a/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataEditService.kt +++ b/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataEditService.kt @@ -235,6 +235,7 @@ class WikidataEditService @Inject constructor( } } + @SuppressLint("NewApi") private fun captionEdits(contribution: Contribution, fileEntityId: Long): Observable { return Observable.fromIterable(contribution.media.captions.entries) .concatMap { addCaption(fileEntityId, it.key, it.value) }