Skip to content

Commit

Permalink
Merge pull request #40 from Keyneez/feature/#33-feat-explore-view
Browse files Browse the repository at this point in the history
[FEAT/#33] explore, like / 탐색뷰, 좋아요뷰 서버 통신 구현
  • Loading branch information
0zlrlo authored Sep 26, 2023
2 parents b7c085c + 1fb8bd6 commit a404614
Show file tree
Hide file tree
Showing 36 changed files with 1,317 additions and 414 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package com.release.keyneez.data.entity.response

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class ResponseGetLikeDto(
@SerialName("content_pk") val content: Int,
@SerialName("title") val title: String,
@SerialName("category") val category: String,
@SerialName("img") val img: String?,
@SerialName("start_at") val start: String?,
@SerialName("end_at") val end: String?
@SerialName("end_at") val end: String?,
var isSelected: Boolean = false
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.release.keyneez.data.entity.response

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class ResponseGetPopularDto(
@SerialName("content_pk") val content: Int,
@SerialName("title") val title: String,
@SerialName("category") val category: String,
@SerialName("tag") val tag: String,
@SerialName("link") val link: String,
@SerialName("img") val img: String?,
@SerialName("place") val place: String,
@SerialName("introduction") val introduction: String,
@SerialName("inquiry") val inquiry: List<String>?,
@SerialName("price") val price: List<String>?,
@SerialName("benefit") val benefit: List<String>?,
@SerialName("start_at") val start: String?,
@SerialName("end_at") val end: String?,
@SerialName("created_at") val created: String?,
@SerialName("updated_at") val updated: String?,
var Likes: List<Liked>
) {
@Serializable
data class Liked(
@SerialName("liked_pk") val liked: Int,
@SerialName("user") val user: Int,
@SerialName("content") val content: Int
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.release.keyneez.data.entity.response

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class ResponseGetRecentDto(
@SerialName("content_pk") val content: Int,
@SerialName("title") val title: String,
@SerialName("category") val category: String,
@SerialName("tag") val tag: String,
@SerialName("link") val link: String,
@SerialName("img") val img: String?,
@SerialName("place") val place: String,
@SerialName("introduction") val introduction: String,
@SerialName("start_at") val start: String?,
@SerialName("end_at") val end: String?,
@SerialName("inquiry") val inquiry: List<String>?,
@SerialName("price") val price: List<String>?,
@SerialName("benefit") val benefit: List<String>?,
@SerialName("created_at") val created: String?,
@SerialName("updated_at") val updated: String?,
var Likes: List<Liked>
) {
@Serializable
data class Liked(
@SerialName("liked_pk") val liked: Int,
@SerialName("user") val user: Int,
@SerialName("content") val content: Int
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,19 @@ data class ResponseGetSearchResultDto(
@SerialName("content_pk") val content: Int,
@SerialName("title") val title: String,
@SerialName("category") val category: String,
@SerialName("tag") val tag: String,
@SerialName("link") val link: String,
@SerialName("img") val img: String?,
@SerialName("place") val place: String,
@SerialName("introduction") val introduction: String,
@SerialName("inquiry") val inquiry: List<String>?,
@SerialName("price") val price: List<String>?,
@SerialName("benefit") val benefit: List<String>?,
@SerialName("start_at") val start: String?,
@SerialName("end_at") val end: String?,
val Likes: List<Liked>
@SerialName("created_at") val created: String?,
@SerialName("updated_at") val updated: String?,
var Likes: List<Liked>
) {
@Serializable
data class Liked(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,13 @@ package com.release.keyneez.data.entity.response
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

data class ResponseGetContentDto(
@Serializable
data class ResponsePostLikeDto(
@SerialName("content_pk") val content: Int,
@SerialName("title") val title: String,
@SerialName("category") val category: String,
@SerialName("img") val img: String?,
@SerialName("start_at") val start: String?,
@SerialName("end_at") val end: String?,
val Likes: List<Liked>
) {
@Serializable
data class Liked(
@SerialName("liked_pk") val liked: Int,
@SerialName("user") val user: Int,
@SerialName("content") val content: Int
)
}
var isSelected: Boolean = false
)
Original file line number Diff line number Diff line change
@@ -1,13 +1,21 @@
package com.release.keyneez.data.repository

import com.release.keyneez.data.entity.response.ResponseGetContentDto
import com.release.keyneez.data.entity.response.ResponseGetLikeDto
import com.release.keyneez.data.entity.response.ResponseGetPopularDto
import com.release.keyneez.data.entity.response.ResponseGetRecentDto
import com.release.keyneez.data.entity.response.ResponseGetSearchResultDto
import com.release.keyneez.data.entity.response.ResponsePostLikeDto
import com.release.keyneez.data.entity.response.wrapper.BaseResponse

interface ContentRepository {

suspend fun getContent(filter: String): Result<BaseResponse<List<ResponseGetContentDto>>>
suspend fun getLike(): Result<BaseResponse<List<ResponseGetLikeDto>>>
suspend fun getRecent(filter: String): Result<BaseResponse<List<ResponseGetRecentDto>>>
suspend fun getAllRecent(): Result<BaseResponse<List<ResponseGetRecentDto>>>
suspend fun getPopular(filter: String): Result<BaseResponse<List<ResponseGetPopularDto>>>
suspend fun getAllPopular(): Result<BaseResponse<List<ResponseGetPopularDto>>>
suspend fun getLike(filter: String): Result<BaseResponse<List<ResponseGetLikeDto>>>
suspend fun getAllLike(): Result<BaseResponse<List<ResponseGetLikeDto>>>
suspend fun getSearch(keyword: String): Result<BaseResponse<List<ResponseGetSearchResultDto>>>
suspend fun postLike(pk: Int): Result<BaseResponse<ResponsePostLikeDto>>
suspend fun postUnlike(pk: List<Int>): Result<BaseResponse<Unit>>
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.release.keyneez.data.repository

import com.release.keyneez.data.entity.response.ResponseGetContentDto
import com.release.keyneez.data.entity.response.ResponseGetLikeDto
import com.release.keyneez.data.entity.response.ResponseGetPopularDto
import com.release.keyneez.data.entity.response.ResponseGetRecentDto
import com.release.keyneez.data.entity.response.ResponseGetSearchResultDto
import com.release.keyneez.data.entity.response.ResponsePostLikeDto
import com.release.keyneez.data.entity.response.wrapper.BaseResponse
import com.release.keyneez.data.source.ContentDataSource
import javax.inject.Inject
Expand All @@ -11,12 +13,30 @@ class ContentRepositoryImpl @Inject constructor(
private val contentDataSource: ContentDataSource
) : ContentRepository {

override suspend fun getContent(filter: String): Result<BaseResponse<List<ResponseGetContentDto>>> =
kotlin.runCatching { contentDataSource.getContent(filter) }
override suspend fun getRecent(filter: String): Result<BaseResponse<List<ResponseGetRecentDto>>> =
kotlin.runCatching { contentDataSource.getRecent(filter) }

override suspend fun getLike(): Result<BaseResponse<List<ResponseGetLikeDto>>> =
kotlin.runCatching { contentDataSource.getLike() }
override suspend fun getAllRecent(): Result<BaseResponse<List<ResponseGetRecentDto>>> =
kotlin.runCatching { contentDataSource.getAllRecent() }

override suspend fun getPopular(filter: String): Result<BaseResponse<List<ResponseGetPopularDto>>> =
kotlin.runCatching { contentDataSource.getPopular(filter) }

override suspend fun getAllPopular(): Result<BaseResponse<List<ResponseGetPopularDto>>> =
kotlin.runCatching { contentDataSource.getAllPopular() }

override suspend fun getLike(filter: String): Result<BaseResponse<List<ResponseGetLikeDto>>> =
kotlin.runCatching { contentDataSource.getLike(filter) }

override suspend fun getAllLike(): Result<BaseResponse<List<ResponseGetLikeDto>>> =
kotlin.runCatching { contentDataSource.getAllLike() }

override suspend fun getSearch(keyword: String): Result<BaseResponse<List<ResponseGetSearchResultDto>>> =
kotlin.runCatching { contentDataSource.getSearch(keyword) }

override suspend fun postLike(pk: Int): Result<BaseResponse<ResponsePostLikeDto>> =
kotlin.runCatching { contentDataSource.postLike(pk) }

override suspend fun postUnlike(pk: List<Int>): Result<BaseResponse<Unit>> =
kotlin.runCatching { contentDataSource.postUnlike(pk) }
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,43 @@
package com.release.keyneez.data.service

import com.release.keyneez.data.entity.response.ResponseGetContentDto
import com.release.keyneez.data.entity.response.ResponseGetLikeDto
import com.release.keyneez.data.entity.response.ResponseGetPopularDto
import com.release.keyneez.data.entity.response.ResponseGetRecentDto
import com.release.keyneez.data.entity.response.ResponseGetSearchResultDto
import com.release.keyneez.data.entity.response.ResponsePostLikeDto
import com.release.keyneez.data.entity.response.wrapper.BaseResponse
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.Path
import retrofit2.http.Query

interface ContentService {
@GET("contents/liked")
suspend fun getLike(): BaseResponse<List<ResponseGetLikeDto>>
@GET("api/v1/contents/liked")
suspend fun getLike(@Query("filter") filter: String): BaseResponse<List<ResponseGetLikeDto>>

@GET("contents/")
suspend fun getContent(@Query("filter") filter: String): BaseResponse<List<ResponseGetContentDto>>
@GET("api/v1/contents/liked")
suspend fun getAllLike(): BaseResponse<List<ResponseGetLikeDto>>

@GET("contents/search")
@GET("api/v1/contents/")
suspend fun getRecent(@Query("filter") filter: String): BaseResponse<List<ResponseGetRecentDto>>

@GET("api/v1/contents/")
suspend fun getAllRecent(): BaseResponse<List<ResponseGetRecentDto>>

@GET("api/v1/contents/popularity")
suspend fun getPopular(@Query("filter") filter: String): BaseResponse<List<ResponseGetPopularDto>>

@GET("api/v1/contents/popularity")
suspend fun getAllPopular(): BaseResponse<List<ResponseGetPopularDto>>

@GET("api/v1/contents/search")
suspend fun getSearch(
@Query("keyword") keyword: String
): BaseResponse<List<ResponseGetSearchResultDto>>

@POST("api/v1/contents/{pk}/like")
suspend fun postLike(@Path("pk") pk: Int): BaseResponse<ResponsePostLikeDto>

@POST("api/v1/contents/{pk}/unlike")
suspend fun postUnlike(@Path("pk") pk: List<Int>): BaseResponse<Unit>
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,41 @@
package com.release.keyneez.data.source

import com.release.keyneez.data.entity.response.ResponseGetContentDto
import com.release.keyneez.data.entity.response.ResponseGetLikeDto
import com.release.keyneez.data.entity.response.ResponseGetPopularDto
import com.release.keyneez.data.entity.response.ResponseGetRecentDto
import com.release.keyneez.data.entity.response.ResponseGetSearchResultDto
import com.release.keyneez.data.entity.response.ResponsePostLikeDto
import com.release.keyneez.data.entity.response.wrapper.BaseResponse
import com.release.keyneez.data.service.ContentService
import javax.inject.Inject

class ContentDataSource @Inject constructor(
private val contentService: ContentService
) {
suspend fun getContent(filter: String): BaseResponse<List<ResponseGetContentDto>> =
contentService.getContent(filter)
suspend fun getRecent(filter: String): BaseResponse<List<ResponseGetRecentDto>> =
contentService.getRecent(filter)

suspend fun getAllRecent(): BaseResponse<List<ResponseGetRecentDto>> =
contentService.getAllRecent()

suspend fun getPopular(filter: String): BaseResponse<List<ResponseGetPopularDto>> =
contentService.getPopular(filter)

suspend fun getAllPopular(): BaseResponse<List<ResponseGetPopularDto>> =
contentService.getAllPopular()

suspend fun getLike(filter: String): BaseResponse<List<ResponseGetLikeDto>> =
contentService.getLike(filter)

suspend fun getAllLike(): BaseResponse<List<ResponseGetLikeDto>> =
contentService.getAllLike()

suspend fun getLike(): BaseResponse<List<ResponseGetLikeDto>> = contentService.getLike()
suspend fun getSearch(keyword: String): BaseResponse<List<ResponseGetSearchResultDto>> =
contentService.getSearch(keyword)

suspend fun postLike(pk: Int): BaseResponse<ResponsePostLikeDto> =
contentService.postLike(pk)

suspend fun postUnlike(pk: List<Int>): BaseResponse<Unit> =
contentService.postUnlike(pk)
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.release.keyneez.presentation.main

import LikeFragment
import android.os.Bundle
import androidx.fragment.app.Fragment
import androidx.fragment.app.commit
Expand All @@ -10,6 +9,7 @@ import com.release.keyneez.R
import com.release.keyneez.databinding.ActivityMainBinding
import com.release.keyneez.presentation.main.explore.ExploreFragment
import com.release.keyneez.presentation.main.home.HomeFragment
import com.release.keyneez.presentation.main.like.LikeFragment
import com.release.keyneez.presentation.main.setting.SettingFragment
import com.release.keyneez.util.binding.BindingActivity
import dagger.hilt.android.AndroidEntryPoint
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,49 @@ import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.release.keyneez.data.entity.response.ResponseGetContentDto
import com.release.keyneez.databinding.ItemExploreContentBinding
import com.release.keyneez.data.entity.response.ResponseGetPopularDto
import com.release.keyneez.databinding.ItemPopularContentBinding
import com.release.keyneez.util.DiffCallback
import com.release.keyneez.util.extension.setOnSingleClickListener

class PopularAdapter : ListAdapter<ResponseGetContentDto, RecyclerView.ViewHolder>(diffUtil) {
var data = listOf<ResponseGetContentDto>()
class PopularAdapter(
private val clickLike: (Int, Boolean) -> Unit
) : ListAdapter<ResponseGetPopularDto, RecyclerView.ViewHolder>(diffUtil) {
var data = listOf<ResponseGetPopularDto>()

class PopularViewHolder(private val binding: ItemExploreContentBinding) :
class PopularViewHolder(
private val binding: ItemPopularContentBinding,
private val clickLike: (Int, Boolean) -> Unit
) :
RecyclerView.ViewHolder(binding.root) {
fun setPopularContent(popular: ResponseGetContentDto) {
fun setPopularContent(popular: ResponseGetPopularDto) {
binding.data = popular
// 여기도 누르면 상세뷰로 가는 코드짜기
binding.btnPopularLiked.setOnSingleClickListener {
clickLike(popular.content, popular.Likes.isNotEmpty())
if (popular.Likes.isNotEmpty()) {
popular.Likes = listOf()
return@setOnSingleClickListener
}
popular.Likes = listOf(ResponseGetPopularDto.Liked(0, 0, 0))
}
// binding.root.setOnClickListener {
// val intent = Intent(binding.root.context, DetailActivity::class.java)
// intent.putExtra("contentId", popular.content)
// ContextCompat.startActivity(binding.root.context, intent, null)
// }
}
}

override fun getItemCount(): Int = data.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val binding = ItemPopularContentBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
return PopularViewHolder(
ItemExploreContentBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
binding,
clickLike
)
}

Expand All @@ -35,7 +55,7 @@ class PopularAdapter : ListAdapter<ResponseGetContentDto, RecyclerView.ViewHolde
}

companion object {
private val diffUtil = DiffCallback<ResponseGetContentDto>(
private val diffUtil = DiffCallback<ResponseGetPopularDto>(
onItemsTheSame = { old, new -> old.content == new.content },
onContentsTheSame = { old, new -> old == new }
)
Expand Down
Loading

0 comments on commit a404614

Please sign in to comment.