diff --git a/app/src/main/java/com/sopt/now/data/ApiFactory.kt b/app/src/main/java/com/sopt/now/data/ApiFactory.kt index 010410b..6fde7c1 100644 --- a/app/src/main/java/com/sopt/now/data/ApiFactory.kt +++ b/app/src/main/java/com/sopt/now/data/ApiFactory.kt @@ -4,18 +4,17 @@ import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFact import com.sopt.now.BuildConfig.AUTH_BASE_URL import com.sopt.now.BuildConfig.USER_API_URL import com.sopt.now.data.service.AuthService -import com.sopt.now.data.service.UserService +import com.sopt.now.data.service.FriendService import kotlinx.serialization.json.Json import okhttp3.MediaType.Companion.toMediaType import retrofit2.Retrofit object ApiFactory { - fun retrofit(url: String) : Retrofit = - Retrofit.Builder() - .baseUrl(url) - .addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) - .build() - + fun retrofit(url: String): Retrofit = + Retrofit.Builder() + .baseUrl(url) + .addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) + .build() inline fun create(url: B): T = retrofit(url.toString()).create(T::class.java) @@ -23,5 +22,5 @@ object ApiFactory { object ServicePool { val authService = ApiFactory.create(AUTH_BASE_URL) - val userService = ApiFactory.create(USER_API_URL) + val friendService = ApiFactory.create(USER_API_URL) } \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/datasource/FriendRemoteDataSource.kt b/app/src/main/java/com/sopt/now/data/datasource/FriendRemoteDataSource.kt new file mode 100644 index 0000000..5c1a221 --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/datasource/FriendRemoteDataSource.kt @@ -0,0 +1,8 @@ +package com.sopt.now.data.datasource + +import com.sopt.now.data.model.response.ResponseFriendsDto +import com.sopt.now.util.BaseResponse + +interface FriendRemoteDataSource { + suspend fun getFriendsList(page: Int): BaseResponse +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/datasourceimpl/FriendRemoteDataSourceImpl.kt b/app/src/main/java/com/sopt/now/data/datasourceimpl/FriendRemoteDataSourceImpl.kt new file mode 100644 index 0000000..6e0e78e --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/datasourceimpl/FriendRemoteDataSourceImpl.kt @@ -0,0 +1,13 @@ +package com.sopt.now.data.datasourceimpl + +import com.sopt.now.data.ServicePool +import com.sopt.now.data.datasource.FriendRemoteDataSource +import com.sopt.now.data.model.response.ResponseFriendsDto +import com.sopt.now.util.BaseResponse + +class FriendRemoteDataSourceImpl : FriendRemoteDataSource { + private val friendService = ServicePool.friendService + + override suspend fun getFriendsList(page: Int): BaseResponse = + friendService.getFriendsList(page = page) +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/mapper/FriendResponseDtoMapper.kt b/app/src/main/java/com/sopt/now/data/mapper/FriendResponseDtoMapper.kt new file mode 100644 index 0000000..60fcc59 --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/mapper/FriendResponseDtoMapper.kt @@ -0,0 +1,13 @@ +package com.sopt.now.data.mapper + +import com.sopt.now.data.model.response.ResponseFriendsDto.ResponseFriend +import com.sopt.now.domain.model.Friend + +fun ResponseFriend.toFriendModel() = + Friend( + id = this.id, + email = this.email, + firstName = this.firstName, + lastName = this.lastName, + avatar = this.avatar + ) \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/mapper/FriendsListResponseDtoMapper.kt b/app/src/main/java/com/sopt/now/data/mapper/FriendsListResponseDtoMapper.kt new file mode 100644 index 0000000..2be9be1 --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/mapper/FriendsListResponseDtoMapper.kt @@ -0,0 +1,9 @@ +package com.sopt.now.data.mapper + +import com.sopt.now.data.model.response.ResponseFriendsDto +import com.sopt.now.domain.model.FriendsList + +fun ResponseFriendsDto.toFriendsListModel() = + FriendsList( + friendsList = this.data.map { it.toFriendModel() } + ) \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/model/response/ResponseFriendsDto.kt b/app/src/main/java/com/sopt/now/data/model/response/ResponseFriendsDto.kt new file mode 100644 index 0000000..08f000d --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/model/response/ResponseFriendsDto.kt @@ -0,0 +1,43 @@ +package com.sopt.now.data.model.response + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class ResponseFriendsDto( + @SerialName("page") + val page: Int, + @SerialName("per_page") + val perPage: Int, + @SerialName("total") + val total: Int, + @SerialName("total_pages") + val totalPages: Int, + @SerialName("data") + val data: List, + @SerialName("support") + val support: ResponseFriendsListSupportDto, +) { + @Serializable + data class ResponseFriend( + @SerialName("id") + val id: Int, + @SerialName("email") + val email: String, + @SerialName("firstName") + val firstName: String, + @SerialName("lastName") + val lastName: String, + @SerialName("avatar") + val avatar: String, + ) + + @Serializable + data class ResponseFriendsListSupportDto( + @SerialName("url") + val url: String, + @SerialName("text") + val text: String, + ) +} + diff --git a/app/src/main/java/com/sopt/now/data/model/response/ResponseUserListDto.kt b/app/src/main/java/com/sopt/now/data/model/response/ResponseUserListDto.kt deleted file mode 100644 index f863fd5..0000000 --- a/app/src/main/java/com/sopt/now/data/model/response/ResponseUserListDto.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.sopt.now.data.model.response - -import com.sopt.now.presentation.Home.Friend.Friend -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -data class ResponseUserListDto( - @SerialName("page") - val page: Int, - @SerialName("per_page") - val perPage: Int, - @SerialName("total") - val total: Int, - @SerialName("total_pages") - val totalPages: Int, - @SerialName("data") - val data: List, - @SerialName("support") - val support: ResponseUserListSupportDto, -) - -@Serializable -data class ResponseUserListSupportDto( - @SerialName("url") - val url: String, - @SerialName("text") - val text: String, -) \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/repository/FriendRepositoryImpl.kt b/app/src/main/java/com/sopt/now/data/repository/FriendRepositoryImpl.kt new file mode 100644 index 0000000..79ca59d --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/repository/FriendRepositoryImpl.kt @@ -0,0 +1,17 @@ +package com.sopt.now.data.repository + +import com.sopt.now.data.datasource.FriendRemoteDataSource +import com.sopt.now.data.mapper.toFriendsListModel +import com.sopt.now.data.model.response.ResponseFriendsDto +import com.sopt.now.data.service.FriendService +import com.sopt.now.domain.model.FriendsList +import com.sopt.now.domain.repository.FriendRepository + +class FriendRepositoryImpl( + private val friendRemoteDataSource: FriendRemoteDataSource +): FriendRepository { + override suspend fun getFriendsList(page: Int): Result = + runCatching { + friendRemoteDataSource.getFriendsList(page = page).data.toFriendsListModel() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/service/FriendService.kt b/app/src/main/java/com/sopt/now/data/service/FriendService.kt new file mode 100644 index 0000000..0b34fd0 --- /dev/null +++ b/app/src/main/java/com/sopt/now/data/service/FriendService.kt @@ -0,0 +1,13 @@ +package com.sopt.now.data.service + +import com.sopt.now.data.model.response.ResponseFriendsDto +import com.sopt.now.util.BaseResponse +import retrofit2.http.GET +import retrofit2.http.Query + +interface FriendService { + @GET("api/users") + fun getFriendsList( + @Query("page") page: Int, + ): BaseResponse +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/data/service/UserService.kt b/app/src/main/java/com/sopt/now/data/service/UserService.kt deleted file mode 100644 index c372396..0000000 --- a/app/src/main/java/com/sopt/now/data/service/UserService.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.sopt.now.data.service - -import com.sopt.now.data.model.response.ResponseUserListDto -import retrofit2.Call -import retrofit2.http.GET -import retrofit2.http.Query - -interface UserService { - @GET("api/users") - fun getUserList( - @Query("page") page: Int, - ): Call -} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/domain/model/Friend.kt b/app/src/main/java/com/sopt/now/domain/model/Friend.kt new file mode 100644 index 0000000..34d279c --- /dev/null +++ b/app/src/main/java/com/sopt/now/domain/model/Friend.kt @@ -0,0 +1,9 @@ +package com.sopt.now.domain.model + +data class Friend( + val id: Int, + val email: String, + val firstName: String, + val lastName: String, + val avatar: String, +) diff --git a/app/src/main/java/com/sopt/now/domain/model/FriendsList.kt b/app/src/main/java/com/sopt/now/domain/model/FriendsList.kt new file mode 100644 index 0000000..c7051a1 --- /dev/null +++ b/app/src/main/java/com/sopt/now/domain/model/FriendsList.kt @@ -0,0 +1,5 @@ +package com.sopt.now.domain.model + +data class FriendsList( + val friendsList: List +) diff --git a/app/src/main/java/com/sopt/now/domain/repository/FriendRepository.kt b/app/src/main/java/com/sopt/now/domain/repository/FriendRepository.kt new file mode 100644 index 0000000..2c8b3ff --- /dev/null +++ b/app/src/main/java/com/sopt/now/domain/repository/FriendRepository.kt @@ -0,0 +1,7 @@ +package com.sopt.now.domain.repository + +import com.sopt.now.domain.model.FriendsList + +interface FriendRepository { + suspend fun getFriendsList(page: Int): Result +} \ No newline at end of file diff --git a/app/src/main/java/com/sopt/now/presentation/Home/Friend/Friend.kt b/app/src/main/java/com/sopt/now/presentation/Home/Friend/Friend.kt deleted file mode 100644 index 5040d3d..0000000 --- a/app/src/main/java/com/sopt/now/presentation/Home/Friend/Friend.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.sopt.now.presentation.Home.Friend - -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -data class Friend( - @SerialName("id") - val id: Int, - @SerialName("email") - val email: String, - @SerialName("first_name") - val firstName: String, - @SerialName("last_name") - val lastName: String, - @SerialName("avatar") - val avatar: String, -) diff --git a/app/src/main/java/com/sopt/now/presentation/Home/Friend/FriendAdapter.kt b/app/src/main/java/com/sopt/now/presentation/Home/Friend/FriendAdapter.kt index 1b76ada..7122a93 100644 --- a/app/src/main/java/com/sopt/now/presentation/Home/Friend/FriendAdapter.kt +++ b/app/src/main/java/com/sopt/now/presentation/Home/Friend/FriendAdapter.kt @@ -4,6 +4,7 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.sopt.now.databinding.ItemFriendBinding +import com.sopt.now.domain.model.Friend class FriendAdapter(): RecyclerView.Adapter() { private var friendList: List = emptyList() diff --git a/app/src/main/java/com/sopt/now/presentation/Home/Friend/FriendViewHolder.kt b/app/src/main/java/com/sopt/now/presentation/Home/Friend/FriendViewHolder.kt index 7568050..cdb7b92 100644 --- a/app/src/main/java/com/sopt/now/presentation/Home/Friend/FriendViewHolder.kt +++ b/app/src/main/java/com/sopt/now/presentation/Home/Friend/FriendViewHolder.kt @@ -3,6 +3,7 @@ package com.sopt.now.presentation.Home.Friend import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.sopt.now.databinding.ItemFriendBinding +import com.sopt.now.domain.model.Friend class FriendViewHolder(private val binding: ItemFriendBinding): RecyclerView.ViewHolder(binding.root){ fun onBind(friendData: Friend) {