Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
32f65bc
- 유저 구조 변경 (TODO. 생년월일 받아와서 나이 구하기)
Dec 12, 2024
85d0c1f
Merge branch 'refs/heads/develop' into main_api_#78
yys7517 Dec 17, 2024
6eae296
메인화면 API 연결 작업
yys7517 Dec 18, 2024
6b9b4ab
메인화면 api
yys7517 Dec 19, 2024
af9d830
메인화면 무한 스크롤 로딩 뷰 추가
yys7517 Dec 19, 2024
f2fad76
로딩 뷰 크기 조정 및 중복 추가되던 부분 수정 #78
yys7517 Dec 26, 2024
603ace2
유저 마지막 페이지일 때, 아래 Padding으로 간격 설정 #78
yys7517 Dec 26, 2024
ec944f7
- 유저 좋아요, 좋아요 취소 API 연결
yys7517 Dec 27, 2024
cfbcdd0
Merge branch 'develop' into main_api_#78
yys7517 Dec 31, 2024
611a619
Merge branch 'develop' into main_api_#78
yys7517 Jan 7, 2025
62eb6d5
회원 조회 API 통합 #78
yys7517 Jan 8, 2025
b60a5bc
좋아요 버튼 drawable 수정 #78
yys7517 Jan 8, 2025
9686b6a
Merge branch 'develop' into main_api_#78
yys7517 Jan 9, 2025
745d2d4
로그인 여부에 따라 메인 아이템 초기화, 회원 좋아요 클릭 시 로그인 체크
yys7517 Jan 20, 2025
1a186df
메인화면 카테고리 클릭 시, 최상단으로 이동
yys7517 Jan 20, 2025
1440a2a
메인화면 인기 Teen API 연결
yys7517 Feb 3, 2025
e422f9f
Merge branch 'develop' into main_api_#78
yys7517 Feb 3, 2025
2a82ed3
Conflict 해결
yys7517 Feb 3, 2025
c46c3f7
스크롤 타이밍 이슈 해결
yys7517 Feb 6, 2025
8f6849f
카테고리 변경 시, 기존 데이터 초기화 및 로딩 적용
yys7517 Feb 6, 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
@@ -1,3 +1,5 @@
package com.eighteen.eighteenandroid.common

const val MEDIA_COUNT = 2
const val MEDIA_COUNT = 2
const val USER_TYPE_SIGNIN = "user"
const val USER_TYPE_GUEST = "guest"
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.eighteen.eighteenandroid.common

import android.content.Context
import androidx.annotation.StringRes
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject

class ResourceProvider @Inject constructor(
@ApplicationContext private val context: Context
) {
fun getString(@StringRes resId: Int): String {
return context.getString(resId)
}

fun getString(@StringRes resId: Int, vararg args: Any): String {
return context.getString(resId, *args)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.eighteen.eighteenandroid.common.enums
enum class Tag(val strValue: String) {
ALL("전체"),
BEAUTY("뷰티"),
EXERCISE("운동"),
SPORT("운동"),
STUDY("공부"),
ART("예술"),
GAME("게임"),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
package com.eighteen.eighteenandroid.data.datasource.remote.response

import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class UserResponse(
val userImage: String,
val userId: String,
val name: String,
val age: String,
val userSchoolName: String,
val tag: String
val users: List<UserDto>,
val totalPage: Int
)

data class UserDto(
val id: Int,
val profileImage: String?,
val uniqueId: String,
val nickName: String,
val birthDay: String,
val location: String,
val schoolName: String,
val likeStatus: Boolean
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.eighteen.eighteenandroid.data.datasource.remote.service
import com.eighteen.eighteenandroid.data.datasource.remote.request.SignUpRequest
import com.eighteen.eighteenandroid.data.datasource.remote.response.ApiResult
import com.eighteen.eighteenandroid.data.datasource.remote.response.ProfileDetailResponse
import com.eighteen.eighteenandroid.data.datasource.remote.response.UserDto
import com.eighteen.eighteenandroid.data.datasource.remote.response.UserResponse
import retrofit2.Response
import retrofit2.http.Body
Expand Down Expand Up @@ -31,6 +32,18 @@ interface UserService {
@POST("/v1/api/user/sign-in")
suspend fun postLogin(@Query("phoneNumber") phoneNumber: String): Response<ApiResult<String>>

@GET("/v1/api/{userType}/find-all/{category}")
suspend fun getCategoryUser(@Path("userType") userType: String, @Path("category") category: String, @Query("page") page: Int, @Query("size") size: Int = 10): Response<ApiResult<UserResponse>>

@POST("/v1/api/user/like")
suspend fun postLikeUser(@Query("likedId") likedId: Int): Response<ApiResult<String>>

@POST("/v1/api/user/like-cancel")
suspend fun postLikeCancelUser(@Query("likedId") likedId: Int): Response<ApiResult<String>>

@GET("/v1/api/teen/{userType}/famous/{category}")
suspend fun getPopularUser(@Path("userType") userType: String, @Path("category") category: String): Response<ApiResult<List<UserDto>>>

@DELETE("/v1/api/user/sign-out")
suspend fun signOut(): Response<ApiResult<String>>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,49 @@
package com.eighteen.eighteenandroid.data.mapper

import com.eighteen.eighteenandroid.data.datasource.remote.response.UserDto
import com.eighteen.eighteenandroid.data.datasource.remote.response.UserResponse
import com.eighteen.eighteenandroid.domain.model.User
import com.eighteen.eighteenandroid.domain.model.UserUseCaseModel
import java.time.LocalDate
import java.time.Period
import java.time.format.DateTimeFormatter

object UserMapper {
fun asUserCaseModel(userResponse: UserResponse) =
userResponse.run {
User(
userImage = userImage,
userId = userId,
userName = name,
userAge = age,
userSchoolName = userSchoolName,
tag = tag
)
fun UserDto.toUser(): User {
fun calculateAge(birthDay: String): Int {
// 날짜 포맷터 생성
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")

try {
// 문자열을 LocalDate 객체로 변환
val birthDate = LocalDate.parse(birthDay, formatter)

// 현재 날짜 가져오기
val currentDate = LocalDate.now()

// Period를 사용하여 두 날짜 사이의 기간 계산
val period = Period.between(birthDate, currentDate)

// 만 나이 계산
return period.years
} catch (e: Exception) {
throw IllegalArgumentException("올바른 날짜 형식이 아닙니다. 'yyyy-MM-dd' 형식으로 입력해주세요.")
}
}

return User(
userId = id,
userImage = profileImage?: "",
uniqueId = uniqueId,
userName = nickName,
userAge = calculateAge(birthDay).toString(),
userSchoolName = schoolName,
likeStatus = likeStatus
)
}

fun UserResponse.toUserUseCaseModel() = UserUseCaseModel(
users = users.map { it.toUser() },
totalPageCount = totalPage
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import com.eighteen.eighteenandroid.data.datasource.remote.request.SchoolRequest
import com.eighteen.eighteenandroid.data.datasource.remote.request.SignUpRequest
import com.eighteen.eighteenandroid.data.datasource.remote.service.UserService
import com.eighteen.eighteenandroid.data.mapper.ApiException
import com.eighteen.eighteenandroid.data.mapper.UserMapper.toUser
import com.eighteen.eighteenandroid.data.mapper.UserMapper.toUserUseCaseModel
import com.eighteen.eighteenandroid.data.mapper.mapper
import com.eighteen.eighteenandroid.domain.model.AuthToken
import com.eighteen.eighteenandroid.domain.model.Mbti
Expand All @@ -23,6 +25,7 @@ import com.eighteen.eighteenandroid.domain.model.School
import com.eighteen.eighteenandroid.domain.model.SignUpInfo
import com.eighteen.eighteenandroid.domain.model.SnsLink
import com.eighteen.eighteenandroid.domain.model.User
import com.eighteen.eighteenandroid.domain.model.UserUseCaseModel
import com.eighteen.eighteenandroid.domain.repository.UserRepository
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
Expand All @@ -32,40 +35,32 @@ class UserRepositoryImpl @Inject constructor(
private val userService: UserService,
private val preferenceDatastore: DataStore<Preferences>
) : UserRepository {
override suspend fun fetchUserData(): Result<List<User>> =
override suspend fun getAnotherUser(userType: String, category: String, page: Int): Result<UserUseCaseModel> =
runCatching {
// userService.getUserInfo().mapper {
// it.map { userResponse ->
// UserMapper.asUserCaseModel(userResponse)
// }
// }

listOf(
User(
userImage = "https://image.blip.kr/v1/file/021ec61ff1c9936943383b84236a0e69",
userId = "1",
userName = "김 에스더",
userAge = "16",
userSchoolName = "서울 중학교",
tag = "운동"
),
User(
userImage = "https://cdn.newsculture.press/news/photo/202308/529742_657577_5726.jpg",
userId = "2",
userName = "김 에스더",
userAge = "16",
userSchoolName = "부천 중학교",
tag = "스터디"
),
User(
userImage = "https://mblogthumb-phinf.pstatic.net/MjAyMTEwMzFfMTY1/MDAxNjM1NjUzMTI2NjI3.xXYQteLLoWLKcR9YnXS0Hk_y-DInauMzF25g7FxlcScg.2Y-neBBMVoP2IhcwzX2Zy2HB2d8EnM_cY76FVLuk_1Yg.JPEG.ssun2415/IMG_4148.jpg?type=w800",
userId = "3",
userName = "김 에스더",
userAge = "16",
userSchoolName = "인천 중학교",
tag = "프로젝트"
)
)
userService.getCategoryUser(userType, category, page).mapper {
it.data?.toUserUseCaseModel() ?: UserUseCaseModel(emptyList(), 0)
}
}

override suspend fun postLikeUser(likedId: Int): Result<String> =
runCatching {
userService.postLikeUser(likedId).mapper {
it.data ?: throw ApiException.Unknown
}
}

override suspend fun postLikeCancelUser(likedId: Int): Result<String> =
runCatching {
userService.postLikeCancelUser(likedId).mapper {
it.data ?: throw ApiException.Unknown
}
}

override suspend fun getPopularUser(userType: String, category: String): Result<List<User>> =
runCatching {
userService.getPopularUser(userType, category).mapper {
it.data?.map{ userDto -> userDto.toUser() } ?: throw ApiException.Unknown
}
}

override suspend fun fetchUserDetailInfo(id: String): Result<Profile> = runCatching {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@ import com.eighteen.eighteenandroid.domain.repository.MyPageRepository
import com.eighteen.eighteenandroid.domain.repository.UserRepository
import com.eighteen.eighteenandroid.domain.usecase.CheckIdDuplicationUseCase
import com.eighteen.eighteenandroid.domain.usecase.DeleteUserUseCase
import com.eighteen.eighteenandroid.domain.usecase.GetAnotherUserUseCase
import com.eighteen.eighteenandroid.domain.usecase.GetMyProfileUseCase
import com.eighteen.eighteenandroid.domain.usecase.GetPopularUserUseCase
import com.eighteen.eighteenandroid.domain.usecase.GetUserDetailInfoUseCase
import com.eighteen.eighteenandroid.domain.usecase.LoginUseCase
import com.eighteen.eighteenandroid.domain.usecase.SignOutUseCase
import com.eighteen.eighteenandroid.domain.usecase.SignUpUseCase
import com.eighteen.eighteenandroid.domain.usecase.UserUseCase
import com.eighteen.eighteenandroid.domain.usecase.UserLikeUseCase
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
Expand All @@ -19,10 +21,6 @@ import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
object UserUseCaseModule {
@Provides
@Singleton
fun provideUserUseCase(repository: UserRepository): UserUseCase =
UserUseCase(repository = repository)

@Provides
@Singleton
Expand Down Expand Up @@ -55,4 +53,16 @@ object UserUseCaseModule {
@Singleton
fun provideDeleteUserUseCase(repository: UserRepository) =
DeleteUserUseCase(repository = repository)

@Provides
@Singleton
fun provideGetAnotherUserUseCase(repository: UserRepository) = GetAnotherUserUseCase(repository = repository)

@Provides
@Singleton
fun provideGetPopularUserUseCase(repository: UserRepository) = GetPopularUserUseCase(repository = repository)

@Provides
@Singleton
fun provideUserLikeUseCase(repository: UserRepository) = UserLikeUseCase(repository = repository)
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,7 @@ sealed class MainItem{
data class UserView(
val user: User
): MainItem()

// LoadingView
object LoadingView: MainItem()
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package com.eighteen.eighteenandroid.domain.model

data class User(
val userId: Int,
val userImage: String,
val userId: String,
val uniqueId: String,
val userName: String,
val userAge: String,
val userSchoolName: String,
val tag: String
var likeStatus: Boolean
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.eighteen.eighteenandroid.domain.model

data class UserUseCaseModel(
val users: List<User>,
val totalPageCount: Int
)
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import com.eighteen.eighteenandroid.domain.model.AuthToken
import com.eighteen.eighteenandroid.domain.model.Profile
import com.eighteen.eighteenandroid.domain.model.SignUpInfo
import com.eighteen.eighteenandroid.domain.model.User
import com.eighteen.eighteenandroid.domain.model.UserUseCaseModel
import kotlinx.coroutines.flow.Flow

interface UserRepository {
suspend fun fetchUserData(): Result<List<User>>
suspend fun fetchUserDetailInfo(id: String): Result<Profile>
suspend fun postSignUp(signUpInfo: SignUpInfo): Result<AuthToken>
suspend fun checkIdDuplication(uniqueId: String): Result<Boolean>
Expand All @@ -17,4 +17,8 @@ interface UserRepository {
suspend fun signOut(): Result<String?>
suspend fun deleteUser(): Result<String?>
suspend fun deleteAuthToken()
suspend fun getAnotherUser(userType: String, category: String, page: Int): Result<UserUseCaseModel>
suspend fun getPopularUser(userType: String, category: String): Result<List<User>>
suspend fun postLikeUser(likedId: Int): Result<String>
suspend fun postLikeCancelUser(likedId: Int): Result<String>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.eighteen.eighteenandroid.domain.usecase

import com.eighteen.eighteenandroid.domain.repository.UserRepository
import javax.inject.Inject

class GetAnotherUserUseCase @Inject constructor(private val repository: UserRepository) {
suspend operator fun invoke(category: String, userType: String, page: Int) = repository.getAnotherUser(userType, category, page)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.eighteen.eighteenandroid.domain.usecase

import com.eighteen.eighteenandroid.domain.repository.UserRepository
import javax.inject.Inject

class GetPopularUserUseCase @Inject constructor(private val repository: UserRepository) {
suspend operator fun invoke(category: String, userType: String) = repository.getPopularUser(userType, category)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.eighteen.eighteenandroid.domain.usecase

import com.eighteen.eighteenandroid.domain.repository.UserRepository
import javax.inject.Inject

class UserLikeUseCase @Inject constructor(private val repository: UserRepository) {
suspend operator fun invoke(isLike: Boolean, likedId: Int) =
if(isLike) {
repository.postLikeUser(likedId)
} else {
repository.postLikeCancelUser(likedId)
}
}

This file was deleted.

Loading