diff --git a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/MainActivity.kt b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/MainActivity.kt index 566b78c..05ef7c2 100644 --- a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/MainActivity.kt +++ b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/MainActivity.kt @@ -11,6 +11,7 @@ import androidx.navigation.fragment.NavHostFragment import fr.uca.iut.clfreville2.teaiswarm.fragment.RepositoryListFragment import fr.uca.iut.clfreville2.teaiswarm.fragment.SetupConfigFragment import fr.uca.iut.clfreville2.teaiswarm.model.Repository +import fr.uca.iut.clfreville2.teaiswarm.model.search.SearchSettings const val REPOSITORY_OWNER = "repository_owner" const val REPOSITORY_NAME = "repository_name" @@ -47,10 +48,7 @@ class MainActivity : AppCompatActivity() { override fun instantiate(classLoader: ClassLoader, className: String): Fragment = when (className) { RepositoryListFragment::class.java.name -> RepositoryListFragment( - preferences.getString( - USERNAME, - null - )!!, onClick + SearchSettings(), onClick ) SetupConfigFragment::class.java.name -> SetupConfigFragment(preferences) else -> super.instantiate(classLoader, className) diff --git a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/fragment/RepositoryListFragment.kt b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/fragment/RepositoryListFragment.kt index 823fddc..b1b1189 100644 --- a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/fragment/RepositoryListFragment.kt +++ b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/fragment/RepositoryListFragment.kt @@ -15,13 +15,17 @@ import fr.uca.iut.clfreville2.teaiswarm.R import fr.uca.iut.clfreville2.teaiswarm.TeaIsWarm import fr.uca.iut.clfreville2.teaiswarm.adapter.RepositoryListAdapter import fr.uca.iut.clfreville2.teaiswarm.model.Repository +import fr.uca.iut.clfreville2.teaiswarm.model.search.SearchSettings import fr.uca.iut.clfreville2.teaiswarm.network.RepositoryService import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import retrofit2.HttpException import java.io.IOException -class RepositoryListFragment(private val username: String, private val onClick: (Repository) -> Unit) : Fragment(R.layout.repository_list) { +class RepositoryListFragment( + private val search: SearchSettings, + private val onClick: (Repository) -> Unit +) : Fragment(R.layout.repository_list) { private val service = TeaIsWarm.service @@ -35,7 +39,7 @@ class RepositoryListFragment(private val username: String, private val onClick: factoryProducer = { RepositoryViewModelFactory( service, - username + search ) } ) @@ -53,13 +57,13 @@ class RepositoryListFragment(private val username: String, private val onClick: class RepositorySource( private val service: RepositoryService, - private val username: String + private val search: SearchSettings ) : PagingSource() { override suspend fun load(params: LoadParams): LoadResult = try { val nextPageNumber = params.key ?: 1 - val response = service.listActiveRepositories(username, nextPageNumber) + val response = service.searchRepositories(search.copy(page = nextPageNumber)) LoadResult.Page( data = response, prevKey = nextPageNumber - 1, @@ -80,23 +84,23 @@ class RepositoryListFragment(private val username: String, private val onClick: class RepositoryViewModel( private val service: RepositoryService, - private val username: String + private val search: SearchSettings ) : ViewModel() { val flow = Pager( PagingConfig(pageSize = 10, enablePlaceholders = true) ) { - RepositorySource(service, username) + RepositorySource(service, search) }.flow.cachedIn(viewModelScope) } class RepositoryViewModelFactory( private val service: RepositoryService, - private val username: String + private val search: SearchSettings ) : ViewModelProvider.Factory { override fun create(modelClass: Class): T { if (modelClass.isAssignableFrom(RepositoryViewModel::class.java)) { @Suppress("UNCHECKED_CAST") - return RepositoryViewModel(service, username) as T + return RepositoryViewModel(service, search) as T } throw IllegalArgumentException("Unknown ViewModel class") } diff --git a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/model/RepositoryMode.kt b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/model/RepositoryMode.kt new file mode 100644 index 0000000..5ca304e --- /dev/null +++ b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/model/RepositoryMode.kt @@ -0,0 +1,14 @@ +package fr.uca.iut.clfreville2.teaiswarm.model + +import com.squareup.moshi.Json + +enum class RepositoryMode { + @Json(name = "fork") + FORK, + @Json(name = "source") + SOURCE, + @Json(name = "mirror") + MIRROR, + @Json(name = "collaborative") + COLLABORATIVE, +} \ No newline at end of file diff --git a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/model/search/SearchResults.kt b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/model/search/SearchResults.kt new file mode 100644 index 0000000..b962596 --- /dev/null +++ b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/model/search/SearchResults.kt @@ -0,0 +1,3 @@ +package fr.uca.iut.clfreville2.teaiswarm.model.search + +data class SearchResults(val data: List) diff --git a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/model/search/SearchSettings.kt b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/model/search/SearchSettings.kt new file mode 100644 index 0000000..68e73fa --- /dev/null +++ b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/model/search/SearchSettings.kt @@ -0,0 +1,15 @@ +package fr.uca.iut.clfreville2.teaiswarm.model.search + +import fr.uca.iut.clfreville2.teaiswarm.model.RepositoryMode + +data class SearchSettings( + val query: String = "", + val userId: Int? = null, + val teamId: Int? = null, + val starredBy: Int? = null, + val mode: RepositoryMode? = null, + val sort: SortCriteria = SortCriteria.ALPHA, + val order: SortOrder = SortOrder.ASC, + val page: Int = 1, + val limit: Int = 10 +) diff --git a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/model/search/SortCriteria.kt b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/model/search/SortCriteria.kt new file mode 100644 index 0000000..4252327 --- /dev/null +++ b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/model/search/SortCriteria.kt @@ -0,0 +1,16 @@ +package fr.uca.iut.clfreville2.teaiswarm.model.search + +import com.squareup.moshi.Json + +enum class SortCriteria { + @Json(name = "alpha") + ALPHA, + @Json(name = "created") + CREATED, + @Json(name = "updated") + UPDATED, + @Json(name = "size") + SIZE, + @Json(name = "id") + ID +} diff --git a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/model/search/SortOrder.kt b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/model/search/SortOrder.kt new file mode 100644 index 0000000..0cda1f3 --- /dev/null +++ b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/model/search/SortOrder.kt @@ -0,0 +1,10 @@ +package fr.uca.iut.clfreville2.teaiswarm.model.search + +import com.squareup.moshi.Json + +enum class SortOrder { + @Json(name = "asc") + ASC, + @Json(name = "desc") + DESC +} \ No newline at end of file diff --git a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/GiteaService.kt b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/GiteaService.kt index 7069450..8c49b3b 100644 --- a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/GiteaService.kt +++ b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/GiteaService.kt @@ -4,6 +4,8 @@ import com.squareup.moshi.Moshi import com.squareup.moshi.adapters.Rfc3339DateJsonAdapter import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import fr.uca.iut.clfreville2.teaiswarm.model.* +import fr.uca.iut.clfreville2.teaiswarm.model.search.SearchResults +import fr.uca.iut.clfreville2.teaiswarm.model.search.SearchSettings import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -16,7 +18,7 @@ import retrofit2.http.Path import retrofit2.http.Query import java.util.* -const val HTTP_NOT_FOUND = 404; +const val HTTP_NOT_FOUND = 404 interface GiteaApiService { @@ -34,6 +36,19 @@ interface GiteaApiService { @GET("users/{owner}") suspend fun searchOwner(@Path("owner") owner: String): Owner? + + @GET("repos/search") + suspend fun searchRepositories( + @Query("q") query: String, + @Query("uid") uid: Int?, + @Query("team_id") teamId: Int?, + @Query("starred_by") starredBy: Int?, + @Query("mode") mode: String?, + @Query("sort") sort: String, + @Query("order") order: String, + @Query("page") page: Int, + @Query("limit") limit: Int + ): SearchResults } class GiteaService(private val handle: GiteaApiService) : RepositoryService { @@ -80,6 +95,19 @@ class GiteaService(private val handle: GiteaApiService) : RepositoryService { throw ex } } + + override suspend fun searchRepositories(settings: SearchSettings): List = + handle.searchRepositories( + settings.query, + settings.userId, + settings.teamId, + settings.starredBy, + settings.mode?.toString()?.lowercase(), + settings.sort.toString().lowercase(), + settings.order.toString().lowercase(), + settings.page, + settings.limit + ).data } private const val CODEFIRST_API_BASE = "https://codefirst.iut.uca.fr/git/api/v1/" diff --git a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/RepositoryService.kt b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/RepositoryService.kt index ed96c96..324549d 100644 --- a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/RepositoryService.kt +++ b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/RepositoryService.kt @@ -1,6 +1,7 @@ package fr.uca.iut.clfreville2.teaiswarm.network import fr.uca.iut.clfreville2.teaiswarm.model.* +import fr.uca.iut.clfreville2.teaiswarm.model.search.SearchSettings interface RepositoryService { @@ -13,4 +14,6 @@ interface RepositoryService { suspend fun retrieveFileContents(repository: RepositoryIdentifiable, filePath: String): FileContent suspend fun searchOwner(owner: String): Owner? + + suspend fun searchRepositories(settings: SearchSettings): List } diff --git a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/StubRepositoryService.kt b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/StubRepositoryService.kt index 758f6b2..7a78902 100644 --- a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/StubRepositoryService.kt +++ b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/network/StubRepositoryService.kt @@ -1,6 +1,7 @@ package fr.uca.iut.clfreville2.teaiswarm.network import fr.uca.iut.clfreville2.teaiswarm.model.* +import fr.uca.iut.clfreville2.teaiswarm.model.search.SearchSettings import java.util.Date import kotlin.random.Random @@ -69,6 +70,9 @@ class StubRepositoryService : RepositoryService { override suspend fun searchOwner(owner: String): Owner = Owner(1, owner) + + override suspend fun searchRepositories(settings: SearchSettings): List = + listActiveRepositories(settings.query, settings.page) } val CHAR_POOL = "abcdefghijklmnopqrstuvwxyz0123456789".toCharArray();