diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryInterface.java b/app/src/main/java/fr/free/nrw/commons/category/CategoryInterface.java deleted file mode 100644 index 232a60e23e..0000000000 --- a/app/src/main/java/fr/free/nrw/commons/category/CategoryInterface.java +++ /dev/null @@ -1,71 +0,0 @@ -package fr.free.nrw.commons.category; - -import io.reactivex.Single; -import java.util.Map; -import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse; -import retrofit2.http.GET; -import retrofit2.http.Query; -import retrofit2.http.QueryMap; - -/** - * Interface for interacting with Commons category related APIs - */ -public interface CategoryInterface { - - /** - * Searches for categories with the specified name. - * - * @param filter The string to be searched - * @param itemLimit How many results are returned - * @return - */ - @GET("w/api.php?action=query&format=json&formatversion=2" - + "&generator=search&prop=description|pageimages&piprop=thumbnail&pithumbsize=70" - + "&gsrnamespace=14") - Single searchCategories(@Query("gsrsearch") String filter, - @Query("gsrlimit") int itemLimit, - @Query("gsroffset") int offset); - - /** - * Searches for categories starting with the specified prefix. - * - * @param prefix The string to be searched - * @param itemLimit How many results are returned - * @return - */ - @GET("w/api.php?action=query&format=json&formatversion=2" - + "&generator=allcategories&prop=categoryinfo|description|pageimages&piprop=thumbnail" - + "&pithumbsize=70") - Single searchCategoriesForPrefix(@Query("gacprefix") String prefix, - @Query("gaclimit") int itemLimit, - @Query("gacoffset") int offset); - - /** - * Fetches categories starting and ending with a specified name. - * - * @param startingCategory Name of the category to start - * @param endingCategory Name of the category to end - * @param itemLimit How many categories to return - * @param offset offset - * @return MwQueryResponse - */ - @GET("w/api.php?action=query&format=json&formatversion=2" - + "&generator=allcategories&prop=categoryinfo|description|pageimages&piprop=thumbnail" - + "&pithumbsize=70") - Single getCategoriesByName(@Query("gacfrom") String startingCategory, - @Query("gacto") String endingCategory, - @Query("gaclimit") int itemLimit, - @Query("gacoffset") int offset); - - @GET("w/api.php?action=query&format=json&formatversion=2" - + "&generator=categorymembers&gcmtype=subcat" - + "&prop=info&gcmlimit=50") - Single getSubCategoryList(@Query("gcmtitle") String categoryName, - @QueryMap(encoded = true) Map continuation); - - @GET("w/api.php?action=query&format=json&formatversion=2" - + "&generator=categories&prop=info&gcllimit=50") - Single getParentCategoryList(@Query("titles") String categoryName, - @QueryMap(encoded = true) Map continuation); - -} diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryInterface.kt b/app/src/main/java/fr/free/nrw/commons/category/CategoryInterface.kt new file mode 100644 index 0000000000..c3c8ae4c7d --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryInterface.kt @@ -0,0 +1,69 @@ +package fr.free.nrw.commons.category + +import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse +import io.reactivex.Single +import retrofit2.http.GET +import retrofit2.http.Query +import retrofit2.http.QueryMap + +/** + * Interface for interacting with Commons category related APIs + */ +interface CategoryInterface { + /** + * Searches for categories with the specified name. + * + * @param filter The string to be searched + * @param itemLimit How many results are returned + * @return + */ + @GET("w/api.php?action=query&format=json&formatversion=2&generator=search&prop=description|pageimages&piprop=thumbnail&pithumbsize=70&gsrnamespace=14") + fun searchCategories( + @Query("gsrsearch") filter: String?, + @Query("gsrlimit") itemLimit: Int, + @Query("gsroffset") offset: Int + ): Single + + /** + * Searches for categories starting with the specified prefix. + * + * @param prefix The string to be searched + * @param itemLimit How many results are returned + * @return + */ + @GET("w/api.php?action=query&format=json&formatversion=2&generator=allcategories&prop=categoryinfo|description|pageimages&piprop=thumbnail&pithumbsize=70") + fun searchCategoriesForPrefix( + @Query("gacprefix") prefix: String?, + @Query("gaclimit") itemLimit: Int, + @Query("gacoffset") offset: Int + ): Single + + /** + * Fetches categories starting and ending with a specified name. + * + * @param startingCategory Name of the category to start + * @param endingCategory Name of the category to end + * @param itemLimit How many categories to return + * @param offset offset + * @return MwQueryResponse + */ + @GET("w/api.php?action=query&format=json&formatversion=2&generator=allcategories&prop=categoryinfo|description|pageimages&piprop=thumbnail&pithumbsize=70") + fun getCategoriesByName( + @Query("gacfrom") startingCategory: String?, + @Query("gacto") endingCategory: String?, + @Query("gaclimit") itemLimit: Int, + @Query("gacoffset") offset: Int + ): Single + + @GET("w/api.php?action=query&format=json&formatversion=2&generator=categorymembers&gcmtype=subcat&prop=info&gcmlimit=50") + fun getSubCategoryList( + @Query("gcmtitle") categoryName: String, + @QueryMap(encoded = true) continuation: Map + ): Single + + @GET("w/api.php?action=query&format=json&formatversion=2&generator=categories&prop=info&gcllimit=50") + fun getParentCategoryList( + @Query("titles") categoryName: String?, + @QueryMap(encoded = true) continuation: Map + ): Single +} diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailInterface.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailInterface.java deleted file mode 100644 index 2a6fcd4371..0000000000 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailInterface.java +++ /dev/null @@ -1,51 +0,0 @@ -package fr.free.nrw.commons.media; - -import static fr.free.nrw.commons.wikidata.WikidataConstants.MW_API_PREFIX; - -import fr.free.nrw.commons.wikidata.model.Entities; -import io.reactivex.Observable; -import io.reactivex.Single; -import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse; -import retrofit2.http.GET; -import retrofit2.http.Query; - -/** - * Interface for interacting with Commons Structured Data related APIs - */ -public interface MediaDetailInterface { - - /** - * Fetches entity using file name - * - * @param filename name of the file to be used for fetching captions - */ - @GET("w/api.php?action=wbgetentities&props=labels&format=json&languagefallback=1&sites=commonswiki") - Observable fetchEntitiesByFileName(@Query("languages") String language, @Query("titles") String filename); - - /** - * Gets labels for Depictions using Entity Id from MediaWikiAPI - * @param entityId EntityId (Ex: Q81566) of the depict entity - * - */ - @GET("/w/api.php?format=json&action=wbgetentities&props=labels&languagefallback=1") - Single getEntity(@Query("ids") String entityId); - - /** - * Fetches caption using wikibaseIdentifier - * - * @param wikibaseIdentifier pageId for the media - */ - @GET("/w/api.php?action=wbgetentities&props=labels&format=json&languagefallback=1&sites=commonswiki") - Observable getEntityForImage(@Query("languages") String language, @Query("ids") String wikibaseIdentifier); - - /** - * Fetches current wikitext - * @param title file name - * @return Single - */ - @GET(MW_API_PREFIX + "action=query&prop=revisions&rvprop=content|timestamp&rvlimit=1&converttitles=") - Single getWikiText( - @Query("titles") String title - ); - -} diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailInterface.kt b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailInterface.kt new file mode 100644 index 0000000000..a77271d787 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailInterface.kt @@ -0,0 +1,53 @@ +package fr.free.nrw.commons.media + +import fr.free.nrw.commons.wikidata.WikidataConstants +import fr.free.nrw.commons.wikidata.model.Entities +import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse +import io.reactivex.Observable +import io.reactivex.Single +import retrofit2.http.GET +import retrofit2.http.Query + +/** + * Interface for interacting with Commons Structured Data related APIs + */ +interface MediaDetailInterface { + /** + * Fetches entity using file name + * + * @param filename name of the file to be used for fetching captions + */ + @GET("w/api.php?action=wbgetentities&props=labels&format=json&languagefallback=1&sites=commonswiki") + fun fetchEntitiesByFileName( + @Query("languages") language: String?, + @Query("titles") filename: String? + ): Observable + + /** + * Gets labels for Depictions using Entity Id from MediaWikiAPI + * @param entityId EntityId (Ex: Q81566) of the depict entity + */ + @GET("/w/api.php?format=json&action=wbgetentities&props=labels&languagefallback=1") + fun getEntity(@Query("ids") entityId: String?): Single + + /** + * Fetches caption using wikibaseIdentifier + * + * @param wikibaseIdentifier pageId for the media + */ + @GET("/w/api.php?action=wbgetentities&props=labels&format=json&languagefallback=1&sites=commonswiki") + fun getEntityForImage( + @Query("languages") language: String?, + @Query("ids") wikibaseIdentifier: String? + ): Observable + + /** + * Fetches current wikitext + * @param title file name + * @return Single + */ + @GET(WikidataConstants.MW_API_PREFIX + "action=query&prop=revisions&rvprop=content|timestamp&rvlimit=1&converttitles=") + fun getWikiText( + @Query("titles") title: String? + ): Single +} diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaInterface.java b/app/src/main/java/fr/free/nrw/commons/media/MediaInterface.java deleted file mode 100644 index 902a99ffb5..0000000000 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaInterface.java +++ /dev/null @@ -1,166 +0,0 @@ -package fr.free.nrw.commons.media; - -import static fr.free.nrw.commons.OkHttpConnectionFactory.UnsuccessfulResponseInterceptor.SUPPRESS_ERROR_LOG_HEADER; - -import io.reactivex.Single; -import java.util.Map; -import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse; -import retrofit2.http.GET; -import retrofit2.http.Headers; -import retrofit2.http.Query; -import retrofit2.http.QueryMap; - -/** - * Interface for interacting with Commons media related APIs - */ -public interface MediaInterface { - String MEDIA_PARAMS="&prop=imageinfo|coordinates&iiprop=url|extmetadata|user&&iiurlwidth=640" + - "&iiextmetadatafilter=DateTime|Categories|GPSLatitude|GPSLongitude|ImageDescription|DateTimeOriginal" + - "|Artist|LicenseShortName|LicenseUrl"; - - /** - * fetches category detail(title, hidden) for each category along with File information - */ - String MEDIA_PARAMS_WITH_CATEGORY_DETAILS ="&clprop=hidden&prop=categories|imageinfo&iiprop=url|extmetadata|user&&iiurlwidth=640" + - "&iiextmetadatafilter=DateTime|GPSLatitude|GPSLongitude|ImageDescription|DateTimeOriginal" + - "|Artist|LicenseShortName|LicenseUrl"; - - /** - * Checks if a page exists or not. - * - * @param title the title of the page to be checked - * @return - */ - @GET("w/api.php?action=query&format=json&formatversion=2") - Single checkPageExistsUsingTitle(@Query("titles") String title); - - /** - * Check if file exists - * - * @param aisha1 the SHA of the media file to be checked - * @return - */ - @GET("w/api.php?action=query&format=json&formatversion=2&list=allimages") - Single checkFileExistsUsingSha(@Query("aisha1") String aisha1); - - /** - * This method retrieves a list of Media objects filtered using image generator query - * - * @param category the category name. Must start with "Category:" - * @param itemLimit how many images are returned - * @param continuation the continuation string from the previous query or empty map - * @return - */ - @GET("w/api.php?action=query&format=json&formatversion=2" + //Basic parameters - "&generator=categorymembers&gcmtype=file&gcmsort=timestamp&gcmdir=desc" + //Category parameters - MEDIA_PARAMS) - Single getMediaListFromCategory(@Query("gcmtitle") String category, @Query("gcmlimit") int itemLimit, @QueryMap Map continuation); - - - /** - * This method retrieves a list of Media objects for a given user name - * - * @param username user's Wikimedia Commons username. - * @param itemLimit how many images are returned - * @param continuation the continuation string from the previous query or empty map - * @return - */ - @GET("w/api.php?action=query&format=json&formatversion=2" + //Basic parameters - "&generator=allimages&gaisort=timestamp&gaidir=older" + MEDIA_PARAMS) - Single getMediaListForUser(@Query("gaiuser") String username, - @Query("gailimit") int itemLimit, @QueryMap(encoded = true) Map continuation); - - /** - * This method retrieves a list of Media objects filtered using image generator query - * - * @param keyword the searched keyword - * @param itemLimit how many images are returned - * @param offset the offset in the result set - * @return - */ - @GET("w/api.php?action=query&format=json&formatversion=2" + //Basic parameters - "&generator=search&gsrwhat=text&gsrnamespace=6" + //Search parameters - MEDIA_PARAMS) - Single getMediaListFromSearch(@Query("gsrsearch") String keyword, - @Query("gsrlimit") int itemLimit, @Query("gsroffset") int offset); - - /** - * This method retrieves a list of Media objects filtered using list geosearch query. Example: https://commons.wikimedia.org/w/api.php?action=query&format=json&formatversion=2&generator=geosearch&ggsnamespace=6&prop=imageinfo|coordinates&iiprop=url|extmetadata|user&&iiurlwidth=640&iiextmetadatafilter=DateTime|Categories|GPSLatitude|GPSLongitude|ImageDescription|DateTimeOriginal|Artist|LicenseShortName|LicenseUrl&ggscoord=37.45579%7C-122.31369&ggslimit=30&ggsradius=10000 - * - * @param location the search location - * @param itemLimit how many images are returned - * @return - */ - @GET("w/api.php?action=query&format=json&formatversion=2" + //Basic parameters - "&generator=geosearch&ggsnamespace=6" + //Search parameters - MEDIA_PARAMS) - Single getMediaListFromGeoSearch(@Query("ggscoord") String location, @Query("ggslimit") int itemLimit, @Query("ggsradius") int radius); - - /** - * Fetches Media object from the imageInfo API - * - * @param title the tiles to be searched for. Can be filename or template name - * @return - */ - @GET("w/api.php?action=query&format=json&formatversion=2" + - MEDIA_PARAMS_WITH_CATEGORY_DETAILS) - Single getMedia(@Query("titles") String title); - - /** - * Fetches Media object from the imageInfo API but suppress (known) errors - * - * @param title the tiles to be searched for. Can be filename or template name - * @return - */ - @GET("w/api.php?action=query&format=json&formatversion=2" + - MEDIA_PARAMS_WITH_CATEGORY_DETAILS) - @Headers(SUPPRESS_ERROR_LOG_HEADER) - Single getMediaSuppressingErrors(@Query("titles") String title); - - /** - * Fetches Media object from the imageInfo API - * - * @param pageIds the ids to be searched for - * @return - */ - @GET("w/api.php?action=query&format=json&formatversion=2" + - MEDIA_PARAMS) - @Headers(SUPPRESS_ERROR_LOG_HEADER) - Single getMediaById(@Query("pageids") String pageIds); - - /** - * Fetches Media object from the imageInfo API - * Passes an image generator parameter - * - * @param title the tiles to be searched for. Can be filename or template name - * @return - */ - @GET("w/api.php?action=query&format=json&formatversion=2&generator=images" + - MEDIA_PARAMS) - Single getMediaWithGenerator(@Query("titles") String title); - - @GET("w/api.php?format=json&action=parse&prop=text") - @Headers(SUPPRESS_ERROR_LOG_HEADER) - Single getPageHtml(@Query("page") String title); - - /** - * Fetches caption using file name - * - * @param filename name of the file to be used for fetching captions - * */ - @GET("w/api.php?action=wbgetentities&props=labels&format=json&languagefallback=1") - Single fetchCaptionByFilename(@Query("language") String language, @Query("titles") String filename); - - /** - * Fetches list of images from a depiction entity - * @param query depictionEntityId - * @param srlimit the number of items to fetch - * @param sroffset number od depictions already fetched, this is useful in implementing pagination - */ - @GET("w/api.php?action=query&format=json&formatversion=2" + //Basic parameters - "&generator=search&gsrnamespace=6" + //Search parameters - MEDIA_PARAMS) - Single fetchImagesForDepictedItem(@Query("gsrsearch") String query, - @Query("gsrlimit")String srlimit, @Query("gsroffset") String sroffset); - -} diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaInterface.kt b/app/src/main/java/fr/free/nrw/commons/media/MediaInterface.kt new file mode 100644 index 0000000000..c1b2f7ab57 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaInterface.kt @@ -0,0 +1,182 @@ +package fr.free.nrw.commons.media + +import fr.free.nrw.commons.OkHttpConnectionFactory.UnsuccessfulResponseInterceptor.SUPPRESS_ERROR_LOG_HEADER +import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse +import io.reactivex.Single +import retrofit2.http.GET +import retrofit2.http.Headers +import retrofit2.http.Query +import retrofit2.http.QueryMap + +/** + * Interface for interacting with Commons media related APIs + */ +interface MediaInterface { + /** + * Checks if a page exists or not. + * + * @param title the title of the page to be checked + * @return + */ + @GET("w/api.php?action=query&format=json&formatversion=2") + fun checkPageExistsUsingTitle(@Query("titles") title: String?): Single + + /** + * Check if file exists + * + * @param aisha1 the SHA of the media file to be checked + * @return + */ + @GET("w/api.php?action=query&format=json&formatversion=2&list=allimages") + fun checkFileExistsUsingSha(@Query("aisha1") aisha1: String?): Single + + /** + * This method retrieves a list of Media objects filtered using image generator query + * + * @param category the category name. Must start with "Category:" + * @param itemLimit how many images are returned + * @param continuation the continuation string from the previous query or empty map + * @return + */ + @GET( + "w/api.php?action=query&format=json&formatversion=2" + //Basic parameters + "&generator=categorymembers&gcmtype=file&gcmsort=timestamp&gcmdir=desc$MEDIA_PARAMS" //Category parameters + ) + fun getMediaListFromCategory( + @Query("gcmtitle") category: String?, + @Query("gcmlimit") itemLimit: Int, + @QueryMap continuation: Map + ): Single + + /** + * This method retrieves a list of Media objects for a given user name + * + * @param username user's Wikimedia Commons username. + * @param itemLimit how many images are returned + * @param continuation the continuation string from the previous query or empty map + * @return + */ + @GET( + "w/api.php?action=query&format=json&formatversion=2" + //Basic parameters + "&generator=allimages&gaisort=timestamp&gaidir=older$MEDIA_PARAMS" + ) + fun getMediaListForUser( + @Query("gaiuser") username: String?, + @Query("gailimit") itemLimit: Int, + @QueryMap(encoded = true) continuation: Map + ): Single + + /** + * This method retrieves a list of Media objects filtered using image generator query + * + * @param keyword the searched keyword + * @param itemLimit how many images are returned + * @param offset the offset in the result set + * @return + */ + @GET( + "w/api.php?action=query&format=json&formatversion=2" + //Basic parameters + "&generator=search&gsrwhat=text&gsrnamespace=6$MEDIA_PARAMS" //Search parameters + ) + fun getMediaListFromSearch( + @Query("gsrsearch") keyword: String?, + @Query("gsrlimit") itemLimit: Int, @Query("gsroffset") offset: Int + ): Single + + /** + * This method retrieves a list of Media objects filtered using list geosearch query. Example: https://commons.wikimedia.org/w/api.php?action=query&format=json&formatversion=2&generator=geosearch&ggsnamespace=6&prop=imageinfo|coordinates&iiprop=url|extmetadata|user&&iiurlwidth=640&iiextmetadatafilter=DateTime|Categories|GPSLatitude|GPSLongitude|ImageDescription|DateTimeOriginal|Artist|LicenseShortName|LicenseUrl&ggscoord=37.45579%7C-122.31369&ggslimit=30&ggsradius=10000 + * + * @param location the search location + * @param itemLimit how many images are returned + * @return + */ + @GET( + "w/api.php?action=query&format=json&formatversion=2" + //Basic parameters + "&generator=geosearch&ggsnamespace=6$MEDIA_PARAMS" //Search parameters + ) + fun getMediaListFromGeoSearch( + @Query("ggscoord") location: String?, + @Query("ggslimit") itemLimit: Int, + @Query("ggsradius") radius: Int + ): Single + + /** + * Fetches Media object from the imageInfo API + * + * @param title the tiles to be searched for. Can be filename or template name + * @return + */ + @GET("w/api.php?action=query&format=json&formatversion=2$MEDIA_PARAMS_WITH_CATEGORY_DETAILS") + fun getMedia(@Query("titles") title: String?): Single + + /** + * Fetches Media object from the imageInfo API but suppress (known) errors + * + * @param title the tiles to be searched for. Can be filename or template name + * @return + */ + @GET("w/api.php?action=query&format=json&formatversion=2$MEDIA_PARAMS_WITH_CATEGORY_DETAILS") + @Headers(SUPPRESS_ERROR_LOG_HEADER) + fun getMediaSuppressingErrors(@Query("titles") title: String?): Single + + /** + * Fetches Media object from the imageInfo API + * + * @param pageIds the ids to be searched for + * @return + */ + @GET("w/api.php?action=query&format=json&formatversion=2$MEDIA_PARAMS") + @Headers(SUPPRESS_ERROR_LOG_HEADER) + fun getMediaById(@Query("pageids") pageIds: String?): Single + + /** + * Fetches Media object from the imageInfo API + * Passes an image generator parameter + * + * @param title the tiles to be searched for. Can be filename or template name + * @return + */ + @GET("w/api.php?action=query&format=json&formatversion=2&generator=images$MEDIA_PARAMS") + fun getMediaWithGenerator(@Query("titles") title: String?): Single + + @GET("w/api.php?format=json&action=parse&prop=text") + @Headers(SUPPRESS_ERROR_LOG_HEADER) + fun getPageHtml(@Query("page") title: String?): Single + + /** + * Fetches caption using file name + * + * @param filename name of the file to be used for fetching captions + */ + @GET("w/api.php?action=wbgetentities&props=labels&format=json&languagefallback=1") + fun fetchCaptionByFilename( + @Query("language") language: String?, + @Query("titles") filename: String? + ): Single + + /** + * Fetches list of images from a depiction entity + * @param query depictionEntityId + * @param srlimit the number of items to fetch + * @param sroffset number od depictions already fetched, this is useful in implementing pagination + */ + @GET( + "w/api.php?action=query&format=json&formatversion=2" + //Basic parameters + "&generator=search&gsrnamespace=6$MEDIA_PARAMS" //Search parameters + ) + fun fetchImagesForDepictedItem( + @Query("gsrsearch") query: String?, + @Query("gsrlimit") srlimit: String?, @Query("gsroffset") sroffset: String? + ): Single + + companion object { + const val MEDIA_PARAMS = + "&prop=imageinfo|coordinates&iiprop=url|extmetadata|user&&iiurlwidth=640&iiextmetadatafilter=DateTime|Categories|GPSLatitude|GPSLongitude|ImageDescription|DateTimeOriginal|Artist|LicenseShortName|LicenseUrl" + + /** + * fetches category detail(title, hidden) for each category along with File information + */ + const val MEDIA_PARAMS_WITH_CATEGORY_DETAILS = + "&clprop=hidden&prop=categories|imageinfo&iiprop=url|extmetadata|user&&iiurlwidth=640&iiextmetadatafilter=DateTime|GPSLatitude|GPSLongitude|ImageDescription|DateTimeOriginal|Artist|LicenseShortName|LicenseUrl" + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/media/WikidataMediaInterface.java b/app/src/main/java/fr/free/nrw/commons/media/WikidataMediaInterface.java deleted file mode 100644 index cab214845d..0000000000 --- a/app/src/main/java/fr/free/nrw/commons/media/WikidataMediaInterface.java +++ /dev/null @@ -1,29 +0,0 @@ -package fr.free.nrw.commons.media; - -import static fr.free.nrw.commons.media.MediaInterface.MEDIA_PARAMS; - -import io.reactivex.Single; -import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse; -import retrofit2.http.GET; -import retrofit2.http.Query; - -/** - * Interface for getting Wikidata images from production server - */ -public interface WikidataMediaInterface { - - /** - * Fetches list of images from a depiction entity - * @param query depictionEntityId ex. "haswbstatement:P180=Q9394" - * @param srlimit the number of items to fetch - * @param sroffset number of depictions already fetched, - * this is useful in implementing pagination - * @return Single - */ - @GET("w/api.php?action=query&format=json&formatversion=2" + //Basic parameters - "&generator=search&gsrnamespace=6" + //Search parameters - MEDIA_PARAMS) - Single fetchImagesForDepictedItem(@Query("gsrsearch") String query, - @Query("gsrlimit")String srlimit, @Query("gsroffset") String sroffset); - -} diff --git a/app/src/main/java/fr/free/nrw/commons/media/WikidataMediaInterface.kt b/app/src/main/java/fr/free/nrw/commons/media/WikidataMediaInterface.kt new file mode 100644 index 0000000000..f250f7ac75 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/media/WikidataMediaInterface.kt @@ -0,0 +1,29 @@ +package fr.free.nrw.commons.media + +import fr.free.nrw.commons.media.MediaInterface.Companion.MEDIA_PARAMS +import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse +import io.reactivex.Single +import retrofit2.http.GET +import retrofit2.http.Query + +/** + * Interface for getting Wikidata images from production server + */ +interface WikidataMediaInterface { + /** + * Fetches list of images from a depiction entity + * @param query depictionEntityId ex. "haswbstatement:P180=Q9394" + * @param srlimit the number of items to fetch + * @param sroffset number of depictions already fetched, + * this is useful in implementing pagination + * @return Single + */ + @GET( + "w/api.php?action=query&format=json&formatversion=2" + //Basic parameters + "&generator=search&gsrnamespace=6$MEDIA_PARAMS" //Search parameters + ) + fun fetchImagesForDepictedItem( + @Query("gsrsearch") query: String?, + @Query("gsrlimit") srlimit: String?, @Query("gsroffset") sroffset: String? + ): Single +} diff --git a/app/src/main/java/fr/free/nrw/commons/mwapi/UserInterface.java b/app/src/main/java/fr/free/nrw/commons/mwapi/UserInterface.java deleted file mode 100644 index fb90749a84..0000000000 --- a/app/src/main/java/fr/free/nrw/commons/mwapi/UserInterface.java +++ /dev/null @@ -1,31 +0,0 @@ -package fr.free.nrw.commons.mwapi; - -import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse; - -import java.util.Map; - -import io.reactivex.Observable; -import retrofit2.http.GET; -import retrofit2.http.Query; -import retrofit2.http.QueryMap; - -import static fr.free.nrw.commons.wikidata.WikidataConstants.MW_API_PREFIX; - -public interface UserInterface { - - /** - * Gets the log events of user - * @param user name of user without prefix - * @param continuation continuation params returned in previous query - * @return query response - */ - - @GET(MW_API_PREFIX + "action=query&list=logevents&letype=upload&leprop=title|timestamp|ids&lelimit=500") - Observable getUserLogEvents(@Query("leuser") String user, @QueryMap Map continuation); - - /** - * Checks to see if a user is currently blocked from Commons - */ - @GET(MW_API_PREFIX + "action=query&meta=userinfo&uiprop=blockinfo") - Observable getUserBlockInfo(); -} diff --git a/app/src/main/java/fr/free/nrw/commons/mwapi/UserInterface.kt b/app/src/main/java/fr/free/nrw/commons/mwapi/UserInterface.kt new file mode 100644 index 0000000000..cd8c7ecae0 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/mwapi/UserInterface.kt @@ -0,0 +1,28 @@ +package fr.free.nrw.commons.mwapi + +import fr.free.nrw.commons.wikidata.WikidataConstants +import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse +import io.reactivex.Observable +import retrofit2.http.GET +import retrofit2.http.Query +import retrofit2.http.QueryMap + +interface UserInterface { + /** + * Gets the log events of user + * @param user name of user without prefix + * @param continuation continuation params returned in previous query + * @return query response + */ + @GET(WikidataConstants.MW_API_PREFIX + "action=query&list=logevents&letype=upload&leprop=title|timestamp|ids&lelimit=500") + fun getUserLogEvents( + @Query("leuser") user: String?, + @QueryMap continuation: Map? + ): Observable + + /** + * Checks to see if a user is currently blocked from Commons + */ + @GET(WikidataConstants.MW_API_PREFIX + "action=query&meta=userinfo&uiprop=blockinfo") + fun getUserBlockInfo(): Observable +} diff --git a/app/src/main/java/fr/free/nrw/commons/review/ReviewInterface.java b/app/src/main/java/fr/free/nrw/commons/review/ReviewInterface.kt similarity index 67% rename from app/src/main/java/fr/free/nrw/commons/review/ReviewInterface.java rename to app/src/main/java/fr/free/nrw/commons/review/ReviewInterface.kt index a48bdd40d5..1fe9e1107b 100644 --- a/app/src/main/java/fr/free/nrw/commons/review/ReviewInterface.java +++ b/app/src/main/java/fr/free/nrw/commons/review/ReviewInterface.kt @@ -1,16 +1,14 @@ -package fr.free.nrw.commons.review; +package fr.free.nrw.commons.review -import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse; - -import io.reactivex.Observable; -import retrofit2.http.GET; -import retrofit2.http.Query; +import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse +import io.reactivex.Observable +import retrofit2.http.GET +import retrofit2.http.Query /** * Interface class for peer review calls */ -public interface ReviewInterface { - +interface ReviewInterface { /** * Fetch recent changes from MediaWiki API * Calls the API for the latest 50 changes (the default limit is 10) @@ -21,11 +19,11 @@ public interface ReviewInterface { * */ @GET("w/api.php?action=query&format=json&formatversion=2&generator=categorymembers&gcmtype=file&gcmsort=timestamp&gcmdir=desc&gcmtitle=Category:Uploaded_with_Mobile/Android&gcmlimit=50") - Observable getRecentChanges(); + fun getRecentChanges(): Observable @GET("w/api.php?action=query&format=json&formatversion=2&prop=revisions&rvprop=timestamp|ids|user&rvdir=newer&rvlimit=1") - Observable getFirstRevisionOfFile(@Query("titles") String titles); + fun getFirstRevisionOfFile(@Query("titles") titles: String?): Observable @GET("w/api.php?action=query&format=json&formatversion=2&prop=fileusage|globalusage") - Observable getGlobalUsageInfo(@Query("titles") String title); + fun getGlobalUsageInfo(@Query("titles") title: String?): Observable } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadInterface.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadInterface.java deleted file mode 100644 index 57cf7b8b19..0000000000 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadInterface.java +++ /dev/null @@ -1,37 +0,0 @@ -package fr.free.nrw.commons.upload; - -import static fr.free.nrw.commons.wikidata.WikidataConstants.MW_API_PREFIX; - -import androidx.annotation.NonNull; -import com.google.gson.JsonObject; -import io.reactivex.Observable; -import okhttp3.MultipartBody; -import okhttp3.RequestBody; -import retrofit2.http.Field; -import retrofit2.http.FormUrlEncoded; -import retrofit2.http.Headers; -import retrofit2.http.Multipart; -import retrofit2.http.POST; -import retrofit2.http.Part; - -public interface UploadInterface { - - @Multipart - @POST(MW_API_PREFIX + "action=upload&stash=1&ignorewarnings=1") - Observable uploadFileToStash(@Part("filename") RequestBody filename, - @Part("filesize") RequestBody totalFileSize, - @Part("offset") RequestBody offset, - @Part("filekey") RequestBody fileKey, - @Part("token") RequestBody token, - @Part MultipartBody.Part filePart); - - @Headers("Cache-Control: no-cache") - @POST(MW_API_PREFIX + "action=upload&ignorewarnings=1") - @FormUrlEncoded - @NonNull - Observable uploadFileFromStash(@NonNull @Field("token") String token, - @NonNull @Field("text") String text, - @NonNull @Field("comment") String comment, - @NonNull @Field("filename") String filename, - @NonNull @Field("filekey") String filekey); -} 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 new file mode 100644 index 0000000000..a9386fc6aa --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadInterface.kt @@ -0,0 +1,37 @@ +package fr.free.nrw.commons.upload + +import com.google.gson.JsonObject +import fr.free.nrw.commons.wikidata.WikidataConstants +import io.reactivex.Observable +import okhttp3.RequestBody +import retrofit2.http.Field +import retrofit2.http.FormUrlEncoded +import retrofit2.http.Headers +import retrofit2.http.Multipart +import retrofit2.http.POST +import retrofit2.http.Part +import okhttp3.MultipartBody.Part as MultipartBodyPart + +interface UploadInterface { + @Multipart + @POST(WikidataConstants.MW_API_PREFIX + "action=upload&stash=1&ignorewarnings=1") + fun uploadFileToStash( + @Part("filename") filename: RequestBody?, + @Part("filesize") totalFileSize: RequestBody?, + @Part("offset") offset: RequestBody?, + @Part("filekey") fileKey: RequestBody?, + @Part("token") token: RequestBody?, + @Part filePart: MultipartBodyPart + ): Observable + + @Headers("Cache-Control: no-cache") + @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 + ): Observable +} diff --git a/app/src/main/java/fr/free/nrw/commons/upload/WikiBaseInterface.java b/app/src/main/java/fr/free/nrw/commons/upload/WikiBaseInterface.java deleted file mode 100644 index 8a0e8ec5d7..0000000000 --- a/app/src/main/java/fr/free/nrw/commons/upload/WikiBaseInterface.java +++ /dev/null @@ -1,61 +0,0 @@ -package fr.free.nrw.commons.upload; - -import static fr.free.nrw.commons.wikidata.WikidataConstants.MW_API_PREFIX; - -import androidx.annotation.NonNull; -import io.reactivex.Observable; -import fr.free.nrw.commons.wikidata.mwapi.MwPostResponse; -import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse; -import retrofit2.http.Field; -import retrofit2.http.FormUrlEncoded; -import retrofit2.http.GET; -import retrofit2.http.Headers; -import retrofit2.http.POST; -import retrofit2.http.Query; - -/** - * Retrofit calls for managing responses network calls of entity ids required for uploading depictions - */ - -public interface WikiBaseInterface { - - @Headers("Cache-Control: no-cache") - @FormUrlEncoded - @POST(MW_API_PREFIX + "action=wbeditentity") - Observable postEditEntity(@NonNull @Field("id") String fileEntityId, - @NonNull @Field("token") String editToken, - @NonNull @Field("data") String data); - - /** - * Uploads depicts for a file in the server - * - * @param filename name of the file - * @param editToken editToken for the file - * @param data data of the depicts to be uploaded - * @return Observable - */ - @Headers("Cache-Control: no-cache") - @FormUrlEncoded - @POST(MW_API_PREFIX + "action=wbeditentity&site=commonswiki&clear=1") - Observable postEditEntityByFilename(@NonNull @Field("title") String filename, - @NonNull @Field("token") String editToken, - @NonNull @Field("data") String data); - - @GET(MW_API_PREFIX + "action=query&prop=info") - Observable getFileEntityId(@Query("titles") String fileName); - - /** - * Upload Captions for the image when upload is successful - * - * @param fileEntityId enityId for the uploaded file - * @param editToken editToken for the file - * @param captionValue value of the caption to be uploaded - */ - @FormUrlEncoded - @POST(MW_API_PREFIX + "action=wbsetlabel") - Observable addLabelstoWikidata(@Field("id") String fileEntityId, - @Field("token") String editToken, - @Field("language") String language, - @Field("value") String captionValue); - -} diff --git a/app/src/main/java/fr/free/nrw/commons/upload/WikiBaseInterface.kt b/app/src/main/java/fr/free/nrw/commons/upload/WikiBaseInterface.kt new file mode 100644 index 0000000000..62cf4bfbd9 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/upload/WikiBaseInterface.kt @@ -0,0 +1,62 @@ +package fr.free.nrw.commons.upload + +import fr.free.nrw.commons.wikidata.WikidataConstants +import fr.free.nrw.commons.wikidata.mwapi.MwPostResponse +import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse +import io.reactivex.Observable +import retrofit2.http.Field +import retrofit2.http.FormUrlEncoded +import retrofit2.http.GET +import retrofit2.http.Headers +import retrofit2.http.POST +import retrofit2.http.Query + +/** + * Retrofit calls for managing responses network calls of entity ids required for uploading depictions + */ +interface WikiBaseInterface { + @Headers("Cache-Control: no-cache") + @FormUrlEncoded + @POST(WikidataConstants.MW_API_PREFIX + "action=wbeditentity") + fun postEditEntity( + @Field("id") fileEntityId: String, + @Field("token") editToken: String, + @Field("data") data: String + ): Observable + + /** + * Uploads depicts for a file in the server + * + * @param filename name of the file + * @param editToken editToken for the file + * @param data data of the depicts to be uploaded + * @return Observable + */ + @Headers("Cache-Control: no-cache") + @FormUrlEncoded + @POST(WikidataConstants.MW_API_PREFIX + "action=wbeditentity&site=commonswiki&clear=1") + fun postEditEntityByFilename( + @Field("title") filename: String, + @Field("token") editToken: String, + @Field("data") data: String + ): Observable + + @GET(WikidataConstants.MW_API_PREFIX + "action=query&prop=info") + fun getFileEntityId(@Query("titles") fileName: String?): Observable + + /** + * Upload Captions for the image when upload is successful + * + * @param fileEntityId enityId for the uploaded file + * @param editToken editToken for the file + * @param captionValue value of the caption to be uploaded + */ + @FormUrlEncoded + @POST(WikidataConstants.MW_API_PREFIX + "action=wbsetlabel") + fun addLabelstoWikidata( + @Field("id") fileEntityId: String?, + @Field("token") editToken: String?, + @Field("language") language: String?, + @Field("value") captionValue: String? + ): Observable +} diff --git a/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsInterface.java b/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsInterface.java deleted file mode 100644 index c7debff84a..0000000000 --- a/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsInterface.java +++ /dev/null @@ -1,28 +0,0 @@ -package fr.free.nrw.commons.upload.depicts; - -import fr.free.nrw.commons.wikidata.model.DepictSearchResponse; -import fr.free.nrw.commons.wikidata.model.Entities; -import io.reactivex.Single; -import retrofit2.http.GET; -import retrofit2.http.Query; - -/** - * Manges retrofit calls for Searching of depicts from DepictsFragment - */ - -public interface DepictsInterface { - - /** - * Search for depictions using the wbsearchentities API - * @param query search for depictions based on user query - * @param limit number of depictions to be retrieved - * @param language current locale of the phone - * @param uselang current locale of the phone - * @param offset number of depictions already fetched useful in implementing pagination - */ - @GET("/w/api.php?action=wbsearchentities&format=json&type=item&uselang=en") - Single searchForDepicts(@Query("search") String query, @Query("limit") String limit, @Query("language") String language, @Query("uselang") String uselang, @Query("continue") String offset); - - @GET("/w/api.php?format=json&action=wbgetentities") - Single getEntities(@Query("ids") String ids); -} diff --git a/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsInterface.kt b/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsInterface.kt new file mode 100644 index 0000000000..27c4c6f56e --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsInterface.kt @@ -0,0 +1,32 @@ +package fr.free.nrw.commons.upload.depicts + +import fr.free.nrw.commons.wikidata.model.DepictSearchResponse +import fr.free.nrw.commons.wikidata.model.Entities +import io.reactivex.Single +import retrofit2.http.GET +import retrofit2.http.Query + +/** + * Manges retrofit calls for Searching of depicts from DepictsFragment + */ +interface DepictsInterface { + /** + * Search for depictions using the wbsearchentities API + * @param query search for depictions based on user query + * @param limit number of depictions to be retrieved + * @param language current locale of the phone + * @param uselang current locale of the phone + * @param offset number of depictions already fetched useful in implementing pagination + */ + @GET("/w/api.php?action=wbsearchentities&format=json&type=item&uselang=en") + fun searchForDepicts( + @Query("search") query: String?, + @Query("limit") limit: String?, + @Query("language") language: String?, + @Query("uselang") uselang: String?, + @Query("continue") offset: String? + ): Single + + @GET("/w/api.php?format=json&action=wbgetentities") + fun getEntities(@Query("ids") ids: String?): Single +} diff --git a/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataInterface.java b/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataInterface.java deleted file mode 100644 index 4f97607d57..0000000000 --- a/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataInterface.java +++ /dev/null @@ -1,36 +0,0 @@ -package fr.free.nrw.commons.wikidata; - -import androidx.annotation.NonNull; - -import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse; - -import fr.free.nrw.commons.wikidata.model.WbCreateClaimResponse; -import io.reactivex.Observable; -import retrofit2.http.Field; -import retrofit2.http.FormUrlEncoded; -import retrofit2.http.GET; -import retrofit2.http.Headers; -import retrofit2.http.POST; - -import static fr.free.nrw.commons.wikidata.WikidataConstants.MW_API_PREFIX; - -public interface WikidataInterface { - - /** - * Get edit token for wikidata wiki site - */ - @Headers("Cache-Control: no-cache") - @GET(MW_API_PREFIX + "action=query&meta=tokens&type=csrf") - @NonNull - Observable getCsrfToken(); - - /** - * Wikidata create claim API. Posts a new claim for the given entity ID - */ - @Headers("Cache-Control: no-cache") - @POST("w/api.php?format=json&action=wbsetclaim") - @FormUrlEncoded - Observable postSetClaim(@NonNull @Field("claim") String request, - @NonNull @Field("tags") String tags, - @NonNull @Field("token") String token); -} diff --git a/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataInterface.kt b/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataInterface.kt new file mode 100644 index 0000000000..35b3e15935 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataInterface.kt @@ -0,0 +1,31 @@ +package fr.free.nrw.commons.wikidata + +import fr.free.nrw.commons.wikidata.model.WbCreateClaimResponse +import fr.free.nrw.commons.wikidata.mwapi.MwQueryResponse +import io.reactivex.Observable +import retrofit2.http.Field +import retrofit2.http.FormUrlEncoded +import retrofit2.http.GET +import retrofit2.http.Headers +import retrofit2.http.POST + +interface WikidataInterface { + /** + * Get edit token for wikidata wiki site + */ + @Headers("Cache-Control: no-cache") + @GET(WikidataConstants.MW_API_PREFIX + "action=query&meta=tokens&type=csrf") + fun getCsrfToken(): Observable + + /** + * Wikidata create claim API. Posts a new claim for the given entity ID + */ + @Headers("Cache-Control: no-cache") + @POST("w/api.php?format=json&action=wbsetclaim") + @FormUrlEncoded + fun postSetClaim( + @Field("claim") request: String, + @Field("tags") tags: String, + @Field("token") token: String + ): Observable +} diff --git a/app/src/test/kotlin/fr/free/nrw/commons/mwapi/UserClientTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/mwapi/UserClientTest.kt index 58f9918152..c1075562d0 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/mwapi/UserClientTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/mwapi/UserClientTest.kt @@ -33,7 +33,7 @@ class UserClientTest{ Mockito.`when`(mwQueryResult.userInfo()).thenReturn(userInfo) val mockResponse = Mockito.mock(MwQueryResponse::class.java) Mockito.`when`(mockResponse.query()).thenReturn(mwQueryResult) - Mockito.`when`(userInterface!!.userBlockInfo) + Mockito.`when`(userInterface!!.getUserBlockInfo()) .thenReturn(Observable.just(mockResponse)) val isBanned = userClient!!.isUserBlockedFromCommons.blockingGet() @@ -51,7 +51,7 @@ class UserClientTest{ Mockito.`when`(mwQueryResult.userInfo()).thenReturn(userInfo) val mockResponse = Mockito.mock(MwQueryResponse::class.java) Mockito.`when`(mockResponse.query()).thenReturn(mwQueryResult) - Mockito.`when`(userInterface!!.userBlockInfo) + Mockito.`when`(userInterface!!.getUserBlockInfo()) .thenReturn(Observable.just(mockResponse)) val isBanned = userClient!!.isUserBlockedFromCommons.blockingGet() @@ -66,7 +66,7 @@ class UserClientTest{ Mockito.`when`(mwQueryResult.userInfo()).thenReturn(userInfo) val mockResponse = Mockito.mock(MwQueryResponse::class.java) Mockito.`when`(mockResponse.query()).thenReturn(mwQueryResult) - Mockito.`when`(userInterface!!.userBlockInfo) + Mockito.`when`(userInterface!!.getUserBlockInfo()) .thenReturn(Observable.just(mockResponse)) val isBanned = userClient!!.isUserBlockedFromCommons.blockingGet()