diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryClient.kt b/app/src/main/java/fr/free/nrw/commons/category/CategoryClient.kt index 5571e0ea7..e72da2aff 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategoryClient.kt +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryClient.kt @@ -16,124 +16,123 @@ const val CATEGORY_NEEDING_CATEGORIES = "needing categories" */ @Singleton class CategoryClient - @Inject - constructor( - private val categoryInterface: CategoryInterface, - ) : ContinuationClient() { - /** - * Searches for categories containing the specified string. - * - * @param filter The string to be searched - * @param itemLimit How many results are returned - * @param offset Starts returning items from the nth result. If offset is 9, the response starts with the 9th item of the search result - * @return - */ - @JvmOverloads - fun searchCategories( - filter: String?, - itemLimit: Int, - offset: Int = 0, - ): Single> = responseMapper(categoryInterface.searchCategories(filter, itemLimit, offset)) +@Inject +constructor( + private val categoryInterface: CategoryInterface, +) : ContinuationClient() { + /** + * Searches for categories containing the specified string. + * + * @param filter The string to be searched + * @param itemLimit How many results are returned + * @param offset Starts returning items from the nth result. If offset is 9, the response starts with the 9th item of the search result + * @return + */ + @JvmOverloads + fun searchCategories( + filter: String?, + itemLimit: Int, + offset: Int = 0, + ): Single> = responseMapper(categoryInterface.searchCategories(filter, itemLimit, offset)) - /** - * Searches for categories starting with the specified string. - * - * @param prefix The prefix to be searched - * @param itemLimit How many results are returned - * @param offset Starts returning items from the nth result. If offset is 9, the response starts with the 9th item of the search result - * @return - */ - @JvmOverloads - fun searchCategoriesForPrefix( - prefix: String?, - itemLimit: Int, - offset: Int = 0, - ): Single> = - responseMapper( - categoryInterface.searchCategoriesForPrefix(prefix, itemLimit, offset), + /** + * Searches for categories starting with the specified string. + * + * @param prefix The prefix to be searched + * @param itemLimit How many results are returned + * @param offset Starts returning items from the nth result. If offset is 9, the response starts with the 9th item of the search result + * @return + */ + @JvmOverloads + fun searchCategoriesForPrefix( + prefix: String?, + itemLimit: Int, + offset: Int = 0, + ): Single> = + responseMapper( + categoryInterface.searchCategoriesForPrefix(prefix, itemLimit, offset), + ) + + /** + * Fetches categories starting and ending with a specified name. + * + * @param startingCategoryName Name of the category to start + * @param endingCategoryName Name of the category to end + * @param itemLimit How many categories to return + * @param offset offset + * @return MwQueryResponse + */ + @JvmOverloads + fun getCategoriesByName( + startingCategoryName: String?, + endingCategoryName: String?, + itemLimit: Int, + offset: Int = 0, + ): Single> = + responseMapper( + categoryInterface.getCategoriesByName( + startingCategoryName, + endingCategoryName, + itemLimit, + offset, + ), + ) + + /** + * The method takes categoryName as input and returns a List of Subcategories + * It uses the generator query API to get the subcategories in a category, 500 at a time. + * + * @param categoryName Category name as defined on commons + * @return Observable emitting the categories returned. If our search yielded "Category:Test", "Test" is emitted. + */ + fun getSubCategoryList(categoryName: String): Single> = + continuationRequest(SUB_CATEGORY_CONTINUATION_PREFIX, categoryName) { + categoryInterface.getSubCategoryList( + categoryName, + it, ) - - /** - * Fetches categories starting and ending with a specified name. - * - * @param startingCategoryName Name of the category to start - * @param endingCategoryName Name of the category to end - * @param itemLimit How many categories to return - * @param offset offset - * @return MwQueryResponse - */ - @JvmOverloads - fun getCategoriesByName( - startingCategoryName: String?, - endingCategoryName: String?, - itemLimit: Int, - offset: Int = 0, - ): Single> = - responseMapper( - categoryInterface.getCategoriesByName( - startingCategoryName, - endingCategoryName, - itemLimit, - offset, - ), - ) - - /** - * The method takes categoryName as input and returns a List of Subcategories - * It uses the generator query API to get the subcategories in a category, 500 at a time. - * - * @param categoryName Category name as defined on commons - * @return Observable emitting the categories returned. If our search yielded "Category:Test", "Test" is emitted. - */ - fun getSubCategoryList(categoryName: String): Single> = - continuationRequest(SUB_CATEGORY_CONTINUATION_PREFIX, categoryName) { - categoryInterface.getSubCategoryList( - categoryName, - it, - ) - } - - /** - * The method takes categoryName as input and returns a List of parent categories - * It uses the generator query API to get the parent categories of a category, 500 at a time. - * - * @param categoryName Category name as defined on commons - * @return - */ - fun getParentCategoryList(categoryName: String): Single> = - continuationRequest(PARENT_CATEGORY_CONTINUATION_PREFIX, categoryName) { - categoryInterface.getParentCategoryList(categoryName, it) - } - - fun resetSubCategoryContinuation(category: String) { - resetContinuation(SUB_CATEGORY_CONTINUATION_PREFIX, category) } - fun resetParentCategoryContinuation(category: String) { - resetContinuation(PARENT_CATEGORY_CONTINUATION_PREFIX, category) + /** + * The method takes categoryName as input and returns a List of parent categories + * It uses the generator query API to get the parent categories of a category, 500 at a time. + * + * @param categoryName Category name as defined on commons + * @return + */ + fun getParentCategoryList(categoryName: String): Single> = + continuationRequest(PARENT_CATEGORY_CONTINUATION_PREFIX, categoryName) { + categoryInterface.getParentCategoryList(categoryName, it) } - override fun responseMapper( - networkResult: Single, - key: String?, - ): Single> = - networkResult - .map { - handleContinuationResponse(it.continuation(), key) - it.query()?.pages() ?: emptyList() - }.map { - it - .filter { page -> - // Null check is not redundant because some values could be null - // for mocks when running unit tests - page.categoryInfo()?.isHidden != true - }.map { - CategoryItem( - it.title().replace(CATEGORY_PREFIX, ""), - it.description().toString(), - it.thumbUrl().toString(), - false, - ) - } - } + fun resetSubCategoryContinuation(category: String) { + resetContinuation(SUB_CATEGORY_CONTINUATION_PREFIX, category) } + + fun resetParentCategoryContinuation(category: String) { + resetContinuation(PARENT_CATEGORY_CONTINUATION_PREFIX, category) + } + + override fun responseMapper( + networkResult: Single, + key: String?, + ): Single> = + networkResult + .map { + handleContinuationResponse(it.continuation(), key) + it.query()?.pages() ?: emptyList() + }.map { + it + .filter { page -> + // Null values are treated as "not hidden" for unit test mocks + !(page.categoryInfo()?.isHidden ?: false) + }.map { + CategoryItem( + it.title().replace(CATEGORY_PREFIX, ""), + it.description().toString(), + it.thumbUrl().toString(), + false, + ) + } + } +}