Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
0d88da5
[feat]: 피드 삭제 메서드 추가 (#96)
JJUYAAA Aug 18, 2025
620ffae
[feat]: 피드 삭제 로직 담당 usecase 생성 (#96)
JJUYAAA Aug 18, 2025
1b2bd68
[feat]: FeedCommentScreen에 삭제 로직 적용(#96)
JJUYAAA Aug 18, 2025
678d7ef
[feat]: FeedDetailViewModel 수정(#96)
JJUYAAA Aug 18, 2025
af34da1
[feat]: 피드 좋아요 상태 변경 usecase 생성(#96)
JJUYAAA Aug 18, 2025
14ec98c
[feat]: 피드 좋아요 상태 변경 요청, 응답 dto (#96)
JJUYAAA Aug 18, 2025
e6f026e
[feat]: 피드 좋아요 상태 변경 서비스, 레포지토리 (#96)
JJUYAAA Aug 18, 2025
e1d7446
[feat]: FeedId 타입 int -> Long 변경 (#96)
JJUYAAA Aug 18, 2025
b549e3c
[feat]: 피드 뷰모델 -> 좋아요 상태변경 함수 생성 (#96)
JJUYAAA Aug 18, 2025
189970a
[feat]: 다른 유저 피드 뷰모델 -> 좋아요 상태변경 함수 생성 (#96)
JJUYAAA Aug 18, 2025
98d3a65
[feat]: 다른 유저 피드 screen -> onLikeClick 추가 (#96)
JJUYAAA Aug 18, 2025
77274c9
[feat]: 피드 네비게이션 FeedId 타입 수정 (#96)
JJUYAAA Aug 18, 2025
80bdbae
[fix]: 충돌 해결 (#96)
JJUYAAA Aug 18, 2025
c8d0001
[feat]: 피드 저장 요청,응답 dto 생성 (#96)
JJUYAAA Aug 18, 2025
f623358
[feat]: 피드 저장 usecase 생성 (#96)
JJUYAAA Aug 18, 2025
bd96626
[feat]: 피드 저장 메서드 생성 (#96)
JJUYAAA Aug 18, 2025
32b5ce8
[feat]: 피드 저장 관련된 뷰모델 수정 (#96)
JJUYAAA Aug 18, 2025
d142f9a
[feat]: 피드 저장 feedscreen 적용(#96)
JJUYAAA Aug 18, 2025
18203f3
[feat]: 타입 오류 해결 (#96)
JJUYAAA Aug 18, 2025
12a5163
[feat]: 오타 수정,, (#96)
JJUYAAA Aug 18, 2025
27ba048
[feat]: 피드 삭제 ui에 바로 반영되도록 (#96)
JJUYAAA Aug 18, 2025
9efed10
[ui]: 피드 자세히 보기 수정중 (#96)
JJUYAAA Aug 18, 2025
8ca0632
[ui]: 피드 자세히 보기 수정중 - 오류 수정해야함 (#96)
JJUYAAA Aug 18, 2025
2fb8652
[ui]: 피드 자세히 보기 화면 ->ActionBarButton 추가 (#96)
JJUYAAA Aug 19, 2025
dacf9c9
[feat]: 피드 자세히 보기 화면 -> 뷰모델에 changeFeedSave 추가 (#96)
JJUYAAA Aug 19, 2025
4a4786d
[feat]: savedfeedcard 수정 -> 잠금 아이콘 (#96)
JJUYAAA Aug 19, 2025
022e0c4
Merge branch 'develop' into feat/#96-feeds_api
JJUYAAA Aug 19, 2025
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,9 @@
package com.texthip.thip.data.model.feed.request

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

@Serializable
data class FeedLikeRequest(
@SerialName("type") val type: Boolean
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.texthip.thip.data.model.feed.request

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

@Serializable
data class FeedSaveRequest(
@SerialName("type") val type: Boolean
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.texthip.thip.data.model.feed.response

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

@Serializable
data class FeedLikeResponse(
@SerialName("feedId") val feedId: Long,
@SerialName("isLiked") val isLiked: Boolean
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.texthip.thip.data.model.feed.response

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

@Serializable
data class FeedSaveResponse(
@SerialName("feedId") val feedId: Long,
@SerialName("isSaved") val isSaved: Boolean
)
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,18 @@ import android.content.Context
import android.net.Uri
import com.texthip.thip.data.model.base.handleBaseResponse
import com.texthip.thip.data.model.feed.request.CreateFeedRequest
import com.texthip.thip.data.model.feed.request.FeedLikeRequest
import com.texthip.thip.data.model.feed.request.FeedSaveRequest
import com.texthip.thip.data.model.feed.request.UpdateFeedRequest
import com.texthip.thip.data.model.feed.response.AllFeedResponse
import com.texthip.thip.data.model.feed.response.CreateFeedResponse
import com.texthip.thip.data.model.feed.response.FeedDetailResponse
import com.texthip.thip.data.model.feed.response.FeedWriteInfoResponse
import com.texthip.thip.data.model.feed.response.FeedLikeResponse
import com.texthip.thip.data.model.feed.response.FeedMineInfoResponse
import com.texthip.thip.data.model.feed.response.RelatedBooksResponse
import com.texthip.thip.data.model.feed.response.AllFeedResponse
import com.texthip.thip.data.model.feed.response.FeedSaveResponse
import com.texthip.thip.data.model.feed.response.FeedWriteInfoResponse
import com.texthip.thip.data.model.feed.response.MyFeedResponse
import com.texthip.thip.data.model.feed.response.RelatedBooksResponse
import com.texthip.thip.data.service.FeedService
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers
Expand Down Expand Up @@ -169,15 +173,15 @@ class FeedRepository @Inject constructor(
}

/** 피드 상세 조회 */
suspend fun getFeedDetail(feedId: Int): Result<FeedDetailResponse?> = runCatching {
suspend fun getFeedDetail(feedId: Long): Result<FeedDetailResponse?> = runCatching {
feedService.getFeedDetail(feedId)
.handleBaseResponse()
.getOrThrow()
}

/** 피드 수정 */
suspend fun updateFeed(
feedId: Int,
feedId: Long,
contentBody: String? = null,
isPublic: Boolean? = null,
tagList: List<String>? = null,
Expand All @@ -194,7 +198,6 @@ class FeedRepository @Inject constructor(
.handleBaseResponse()
.getOrThrow()
}

/** 임시 파일들을 정리하는 함수 */
private fun cleanupTempFiles(tempFiles: List<File>) {
tempFiles.forEach { file ->
Expand All @@ -219,4 +222,27 @@ class FeedRepository @Inject constructor(
.handleBaseResponse()
.getOrThrow()
}

/** 피드 삭제 */
suspend fun deleteFeed(feedId: Long): Result<String?> = runCatching {
feedService.deleteFeed(feedId)
.handleBaseResponse()
.getOrThrow()
}

suspend fun changeFeedLike(feedId: Long, newLikeStatus: Boolean): Result<FeedLikeResponse?> = runCatching {
val request = FeedLikeRequest(type = newLikeStatus)
feedService.changeFeedLike(feedId, request)
.handleBaseResponse()
.getOrThrow()
}

/** 피드 저장 */
suspend fun changeFeedSave(feedId: Long, newSaveStatus: Boolean): Result<FeedSaveResponse?> = runCatching {
val request = FeedSaveRequest(type = newSaveStatus)
feedService.changeFeedSave(feedId, request)
.handleBaseResponse()
.getOrThrow()
}

}
37 changes: 31 additions & 6 deletions app/src/main/java/com/texthip/thip/data/service/FeedService.kt
Original file line number Diff line number Diff line change
@@ -1,19 +1,24 @@
package com.texthip.thip.data.service

import com.texthip.thip.data.model.base.BaseResponse
import com.texthip.thip.data.model.feed.request.FeedLikeRequest
import com.texthip.thip.data.model.feed.request.FeedSaveRequest
import com.texthip.thip.data.model.feed.request.UpdateFeedRequest
import com.texthip.thip.data.model.feed.response.AllFeedResponse
import com.texthip.thip.data.model.feed.response.CreateFeedResponse
import com.texthip.thip.data.model.feed.response.FeedDetailResponse
import com.texthip.thip.data.model.feed.response.FeedLikeResponse
import com.texthip.thip.data.model.feed.response.FeedMineInfoResponse
import com.texthip.thip.data.model.feed.response.FeedSaveResponse
import com.texthip.thip.data.model.feed.response.FeedUsersInfoResponse
import com.texthip.thip.data.model.feed.response.FeedUsersResponse
import com.texthip.thip.data.model.feed.response.FeedWriteInfoResponse
import com.texthip.thip.data.model.feed.response.FeedMineInfoResponse
import com.texthip.thip.data.model.feed.response.RelatedBooksResponse
import com.texthip.thip.data.model.feed.response.AllFeedResponse
import com.texthip.thip.data.model.feed.response.MyFeedResponse
import com.texthip.thip.data.model.feed.request.UpdateFeedRequest
import com.texthip.thip.data.model.feed.response.RelatedBooksResponse
import okhttp3.MultipartBody
import okhttp3.RequestBody
import retrofit2.http.Body
import retrofit2.http.DELETE
import retrofit2.http.GET
import retrofit2.http.Multipart
import retrofit2.http.PATCH
Expand Down Expand Up @@ -64,7 +69,7 @@ interface FeedService {
/** 피드 상세 조회 */
@GET("feeds/{feedId}")
suspend fun getFeedDetail(
@Path("feedId") feedId: Int
@Path("feedId") feedId: Long
): BaseResponse<FeedDetailResponse>

@GET("feeds/users/{userId}/info")
Expand All @@ -77,10 +82,30 @@ interface FeedService {
@Path("userId") userId: Long
): BaseResponse<FeedUsersResponse>

/** 피드 삭제 */
@DELETE("feeds/{feedId}")
suspend fun deleteFeed(
@Path("feedId") feedId: Long
): BaseResponse<String>

/** 피드 좋아요 상태 변경 */
@POST("feeds/{feedId}/likes")
suspend fun changeFeedLike(
@Path("feedId") feedId: Long,
@Body request: FeedLikeRequest
): BaseResponse<FeedLikeResponse>

/** 피드 수정 */
@PATCH("feeds/{feedId}")
suspend fun updateFeed(
@Path("feedId") feedId: Int,
@Path("feedId") feedId: Long,
@Body request: UpdateFeedRequest
): BaseResponse<CreateFeedResponse>

/** 피드 저장 상태 변경 */
@POST("feeds/{feedId}/saved")
suspend fun changeFeedSave(
@Path("feedId") feedId: Long,
@Body request: FeedSaveRequest
): BaseResponse<FeedSaveResponse>
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ fun ActionBarButton(
isSaveVisible: Boolean = false,
isSaved: Boolean = false,
isPinVisible: Boolean = false,
isLockIcon: Boolean = false,
onLikeClick: () -> Unit = {},
onCommentClick: () -> Unit = {},
onBookmarkClick: () -> Unit = {},
Expand Down Expand Up @@ -88,12 +89,22 @@ fun ActionBarButton(
}

if (isSaveVisible) {
Icon(
modifier = Modifier.clickable { onBookmarkClick() },
painter = painterResource(if (isSaved) R.drawable.ic_save_filled else R.drawable.ic_save),
contentDescription = null,
tint = Color.Unspecified
)
if (isLockIcon) {
Icon(
painter = painterResource(R.drawable.ic_lock),
contentDescription = null,
tint = Color.Unspecified
)
} else {
Icon(
modifier = Modifier.clickable { onBookmarkClick() },
painter = painterResource(
if (isSaved) R.drawable.ic_save_filled else R.drawable.ic_save
),
contentDescription = null,
tint = Color.Unspecified
)
}
}
}
}
Expand All @@ -110,10 +121,11 @@ private fun ActionBarButtonPreview() {
commentCount = 45,
isSaveVisible = true,
isSaved = isSaved,
isPinVisible = true,
isPinVisible = false,
onLikeClick = { isLiked = !isLiked },
onCommentClick = {},
onBookmarkClick = { isSaved = !isSaved },
onPinClick = {}
onPinClick = {},
isLockIcon = true
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ fun MyFeedCard(
@Composable
private fun MyFeedCardPrev() {
val feed1 = FeedItem(
id = 1,
id = 1L,
userProfileImage = "https://example.com/profile1.jpg",
userName = "user.01",
userRole = stringResource(R.string.influencer),
Expand All @@ -144,7 +144,7 @@ private fun MyFeedCardPrev() {
imageUrls = emptyList()
)
val feed2 = FeedItem(
id = 2,
id = 2L,
userProfileImage = "https://example.com/profile2.jpg",
userName = "user.01",
userRole = stringResource(R.string.influencer),
Expand Down
Loading