Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
eb56720
[Feat/#94] data
sonyerim Jan 21, 2026
e25ce4f
[Feat/#94] domain
sonyerim Jan 21, 2026
cda926b
[Feat/#94] presentation
sonyerim Jan 21, 2026
797c7e2
Merge branch 'develop' into feat/#94-party-list-api
sonyerim Jan 21, 2026
0d1b8b3
[Feat/#94] title 전달
sonyerim Jan 21, 2026
4d7b6bd
[Feat/#94] 마이페이지 BadgeButton 비활성화
sonyerim Jan 21, 2026
8e2780c
Merge remote-tracking branch 'origin/develop' into feat/#94-party-lis…
jyvnee Jan 21, 2026
a278770
[feat/#94] dto 수정
jyvnee Jan 21, 2026
29eecef
Merge remote-tracking branch 'origin/feat/#94-party-list-api' into fe…
jyvnee Jan 21, 2026
d0dff85
[feat/#94] title 정보 넘겨주기
jyvnee Jan 21, 2026
7f3392c
[feat/#94] title 정보 넘겨주기
jyvnee Jan 21, 2026
4921883
Merge branch 'develop' into feat/#94-party-list-api
jyvnee Jan 22, 2026
d301b78
[feat/#94] 패딩 수정
jyvnee Jan 22, 2026
4f57cee
[feat/#94] string 위치 수정
jyvnee Jan 22, 2026
3d6bcf3
Merge branch 'develop' into feat/#94-party-list-api
jyvnee Jan 22, 2026
019e4ac
[Feat/#94] 굿즈별 페이지 바텀시트 멤버 필터링
doyeon0307 Jan 22, 2026
4b62b2c
[Feat/#94] 굿즈별 페이지 정렬 옵션
doyeon0307 Jan 22, 2026
ed08062
[Feat/#94] 리로드 시 헤더 유지
doyeon0307 Jan 22, 2026
75cba1e
[Merge/#94] develop 병합
doyeon0307 Jan 22, 2026
eed3297
[Chore/#94] 오탈자 수정
doyeon0307 Jan 22, 2026
cdc789d
[Fix/#94] 멤버 선택 초기화 로직 수정
doyeon0307 Jan 22, 2026
ae9f5a1
[Fix/#94] 굿즈별페이지 정렬옵션 수정
doyeon0307 Jan 22, 2026
1b8698d
[Fix/#94] 정렬 바텀시트 분리 및 더보기 페이지 옵션 복구
doyeon0307 Jan 22, 2026
e21b8f7
[Chore/#94] ktlint 적용
doyeon0307 Jan 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.poti.android.data.mapper.party

import com.poti.android.data.remote.dto.response.party.PartyDto
import com.poti.android.data.remote.dto.response.party.ProductPartyListResponseDto
import com.poti.android.domain.model.party.PartySummary
import com.poti.android.domain.model.party.ProductPartyList

fun ProductPartyListResponseDto.toDomain(): ProductPartyList =
ProductPartyList(
partyTitle = postTitle,
artistName = artist,
partySummaries = pots.map { it.toDomain() },
)

private fun PartyDto.toDomain(): PartySummary =
PartySummary(
partyId = potId,
price = price,
goodsImageUrl = thumbnailUrl.orEmpty(),
currentCount = currentCount,
totalCount = totalCount,
availableMembers = availableMembers,
profileImageUrl = uploader.profileImage,
nickname = uploader.nickname,
rating = uploader.rating,
)
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.poti.android.data.remote.dto.response.party.CreatePartyResponseDto
import com.poti.android.data.remote.dto.response.party.PartyDetailResponseDto
import com.poti.android.data.remote.dto.response.party.PartyJoinOptionsDto
import com.poti.android.data.remote.dto.response.party.PartyJoinResponseDto
import com.poti.android.data.remote.dto.response.party.ProductPartyListResponseDto
import com.poti.android.data.remote.dto.response.party.ProductSearchResponseDto
import com.poti.android.data.remote.dto.response.party.ShippingOptionResponseDto
import com.poti.android.data.remote.service.PartyService
Expand Down Expand Up @@ -43,4 +44,21 @@ class PartyRemoteDataSource @Inject constructor(

suspend fun getMyRecruitList(status: String): BaseResponse<MyPartyListDto> =
partyService.getMyRecruitList(status)

suspend fun getProductPartyList(
page: Int?,
size: Int?,
title: String,
artistId: Long,
sort: String,
memberIds: List<Long>?,
): BaseResponse<ProductPartyListResponseDto> =
partyService.getProductPartyList(
page = page,
size = size,
title = title,
artistId = artistId,
sort = sort,
memberIds = memberIds,
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.poti.android.data.remote.dto.response.party

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

@Serializable
data class ProductPartyListResponseDto(
@SerialName("postTitle")
val postTitle: String,
@SerialName("artistId")
val artistId: Long,
@SerialName("artist")
val artist: String,
@SerialName("currentPage")
val currentPage: Int,
@SerialName("hasNext")
val hasNext: Boolean,
@SerialName("pots")
val pots: List<PartyDto>,
)

@Serializable
data class PartyDto(
@SerialName("potId")
val potId: Long,
@SerialName("price")
val price: Int,
@SerialName("thumbnailUrl")
val thumbnailUrl: String?,
@SerialName("currentCount")
val currentCount: Int,
@SerialName("totalCount")
val totalCount: Int,
@SerialName("status")
val status: String,
@SerialName("availableMembers")
val availableMembers: List<String>,
@SerialName("uploader")
val uploader: PartyUploaderDto,
)

@Serializable
data class PartyUploaderDto(
@SerialName("userId")
val userId: Long,
@SerialName("nickname")
val nickname: String,
@SerialName("profileImage")
val profileImage: String?,
@SerialName("rating")
val rating: Double,
)
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.poti.android.data.remote.dto.response.party.CreatePartyResponseDto
import com.poti.android.data.remote.dto.response.party.PartyDetailResponseDto
import com.poti.android.data.remote.dto.response.party.PartyJoinOptionsDto
import com.poti.android.data.remote.dto.response.party.PartyJoinResponseDto
import com.poti.android.data.remote.dto.response.party.ProductPartyListResponseDto
import com.poti.android.data.remote.dto.response.party.ProductSearchResponseDto
import com.poti.android.data.remote.dto.response.party.ShippingOptionResponseDto
import retrofit2.http.Body
Expand Down Expand Up @@ -56,4 +57,14 @@ interface PartyService {
suspend fun getMyRecruitList(
@Query("status") status: String,
): BaseResponse<MyPartyListDto>

@GET("/api/v1/posts/pots")
suspend fun getProductPartyList(
@Query("page") page: Int?,
@Query("size") size: Int?,
@Query("title") title: String,
@Query("artistId") artistId: Long,
@Query("sort") sort: String,
@Query("memberIds") memberIds: List<Long>?,
): BaseResponse<ProductPartyListResponseDto>
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import com.poti.android.domain.model.history.MyPartyList
import com.poti.android.domain.model.party.PartyDetail
import com.poti.android.domain.model.party.PartyJoinInfo
import com.poti.android.domain.model.party.PartyJoinOption
import com.poti.android.domain.model.party.ProductPartyList
import com.poti.android.domain.repository.PartyRepository
import javax.inject.Inject

Expand Down Expand Up @@ -106,4 +107,25 @@ class PartyRepositoryImpl @Inject constructor(
.getOrThrow()
.toDomain()
}

override suspend fun getProductPartyList(
page: Int?,
size: Int?,
title: String,
artistId: Long,
sort: String,
memberIds: List<Long>?,
): Result<ProductPartyList> = httpResponseHandler.safeApiCall {
partyRemoteDataSource.getProductPartyList(
page = page,
size = size,
title = title,
artistId = artistId,
sort = sort,
memberIds = memberIds,
)
.handleApiResponse()
.getOrThrow()
.toDomain()
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package com.poti.android.domain.model.party

import com.poti.android.domain.model.artist.Member

data class PartyList(
data class ProductPartyList(
val partyTitle: String,
val artistName: String,
val partySummaries: List<PartySummary>,
Expand All @@ -14,7 +12,7 @@ data class PartySummary(
val goodsImageUrl: String,
val currentCount: Int,
val totalCount: Int,
val availableMembers: List<Member>,
val availableMembers: List<String>,
val profileImageUrl: String?,
val nickname: String,
val rating: Double,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.poti.android.domain.model.history.MyPartyList
import com.poti.android.domain.model.party.PartyDetail
import com.poti.android.domain.model.party.PartyJoinInfo
import com.poti.android.domain.model.party.PartyJoinOption
import com.poti.android.domain.model.party.ProductPartyList

interface PartyRepository {
suspend fun searchProductTitle(
Expand Down Expand Up @@ -39,4 +40,13 @@ interface PartyRepository {
suspend fun postPartyJoin(joinInfo: PartyJoinInfo): Result<Long>

suspend fun getMyRecruitList(status: String): Result<MyPartyList>

suspend fun getProductPartyList(
page: Int?,
size: Int?,
title: String,
artistId: Long,
sort: String,
memberIds: List<Long>?,
): Result<ProductPartyList>
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package com.poti.android.presentation.party.goodsfilter

import com.poti.android.domain.model.artist.Member
import com.poti.android.domain.model.party.PartyList
import com.poti.android.domain.model.party.PartySummary
import com.poti.android.domain.model.party.ProductPartyList

val dummyPartyList = PartyList(
val dummyProductPartyList = ProductPartyList(
partyTitle = "러브다이브 위드뮤",
artistName = "IVE(아이브)",
partySummaries = listOf(
Expand All @@ -14,10 +13,7 @@ val dummyPartyList = PartyList(
goodsImageUrl = "",
currentCount = 3,
totalCount = 5,
availableMembers = listOf(
Member(1, "원영"),
Member(2, "유진"),
),
availableMembers = listOf("원영", "유진"),
profileImageUrl = "",
nickname = "포티공주",
rating = 4.8,
Expand All @@ -28,10 +24,7 @@ val dummyPartyList = PartyList(
goodsImageUrl = "",
currentCount = 6,
totalCount = 6,
availableMembers = listOf(
Member(1, "원영"),
Member(2, "유진"),
),
availableMembers = listOf("원영", "유진"),
profileImageUrl = "",
nickname = "굿즈요정",
rating = 4.5,
Expand All @@ -42,10 +35,7 @@ val dummyPartyList = PartyList(
goodsImageUrl = "",
currentCount = 1,
totalCount = 4,
availableMembers = listOf(
Member(1, "가을"),
Member(2, "이서"),
),
availableMembers = listOf("원영", "유진"),
profileImageUrl = "",
nickname = "공구마스터",
rating = 5.0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ fun GoodsCategoryRoute(
artistId: Long,
onPopBackStack: () -> Unit,
onNavigateToPartyCreate: () -> Unit,
onNavigateToGoodsPartyList: (Long) -> Unit,
onNavigateToGoodsPartyList: (Long, String) -> Unit,
modifier: Modifier = Modifier,
viewModel: GoodsCategoryViewModel = hiltViewModel(),
) {
Expand All @@ -48,7 +48,7 @@ fun GoodsCategoryRoute(
when (effect) {
GoodsCategoryUiEffect.NavigateBack -> onPopBackStack()
GoodsCategoryUiEffect.NavigateToPartyCreate -> onNavigateToPartyCreate()
GoodsCategoryUiEffect.NavigateToGoodsFilter -> onNavigateToGoodsPartyList(artistId)
is GoodsCategoryUiEffect.NavigateToGoodsFilter -> onNavigateToGoodsPartyList(artistId, effect.title)
}
}

Expand All @@ -72,8 +72,8 @@ fun GoodsCategoryRoute(
onSortDismiss = {
viewModel.processIntent(GoodsCategoryUiIntent.OnSortDismiss)
},
onCardClick = {
viewModel.processIntent(GoodsCategoryUiIntent.OnCardClick)
onCardClick = { title ->
viewModel.processIntent(GoodsCategoryUiIntent.OnCardClick(title))
},
modifier = modifier,
)
Expand All @@ -90,7 +90,7 @@ private fun GoodsCategoryScreen(
onSortFilterClick: () -> Unit,
onSortSelect: (GoodsSortType) -> Unit,
onSortDismiss: () -> Unit,
onCardClick: () -> Unit,
onCardClick: (String, Long) -> Unit,
modifier: Modifier = Modifier,
) {
if (isSortBottomSheetVisible) {
Expand Down Expand Up @@ -139,7 +139,7 @@ private fun GoodsCategoryScreen(
title = groupItem.postTitle,
partyCount = groupItem.postCount,
tag = groupItem.tag,
onClick = onCardClick, // TODO: [예림] 굿즈별 페이지로 이동; 타이틀, 아티스트 아이디
onClick = { onCardClick(groupItem.postTitle) },
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 16.dp),
Expand All @@ -165,7 +165,7 @@ private fun GoodsCategoryScreenPreview() {
onSortFilterClick = {},
onSortSelect = {},
onSortDismiss = {},
onCardClick = {},
onCardClick = { _, _ -> },
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,9 @@ class GoodsCategoryViewModel @Inject constructor(

override fun processIntent(intent: GoodsCategoryUiIntent) {
when (intent) {
GoodsCategoryUiIntent.OnBackClick ->
sendEffect(GoodsCategoryUiEffect.NavigateBack)

GoodsCategoryUiIntent.OnFloatingClick ->
sendEffect(GoodsCategoryUiEffect.NavigateToPartyCreate)

GoodsCategoryUiIntent.OnSortFilterClick -> {
updateState { copy(isSortBottomSheetVisible = true) }
}

GoodsCategoryUiIntent.OnBackClick -> sendEffect(GoodsCategoryUiEffect.NavigateBack)
GoodsCategoryUiIntent.OnFloatingClick -> sendEffect(GoodsCategoryUiEffect.NavigateToPartyCreate)
GoodsCategoryUiIntent.OnSortFilterClick -> updateState { copy(isSortBottomSheetVisible = true) }
is GoodsCategoryUiIntent.OnSortSelected -> {
updateState {
copy(
Expand All @@ -42,13 +35,8 @@ class GoodsCategoryViewModel @Inject constructor(
}
loadGoodsCategoryList(intent.sortType)
}

GoodsCategoryUiIntent.OnSortDismiss -> {
updateState { copy(isSortBottomSheetVisible = false) }
}

GoodsCategoryUiIntent.OnCardClick ->
sendEffect(GoodsCategoryUiEffect.NavigateToGoodsFilter)
GoodsCategoryUiIntent.OnSortDismiss -> updateState { copy(isSortBottomSheetVisible = false) }
is GoodsCategoryUiIntent.OnCardClick -> sendEffect(GoodsCategoryUiEffect.NavigateToGoodsFilter(intent.title))
}
}

Expand Down
Loading