Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Expand Up @@ -2,8 +2,10 @@ package com.hsLink.hslink.data.di

import com.hsLink.hslink.data.remote.datasource.CommunityPostDataSource
import com.hsLink.hslink.data.remote.datasource.PostDataSource
import com.hsLink.hslink.data.remote.datasource.SearchDataSource
import com.hsLink.hslink.data.remote.datasourceimpl.CommunityPostDataSourceImpl
import com.hsLink.hslink.data.remote.datasourceimpl.PostDataSourceImpl
import com.hsLink.hslink.data.remote.datasourceimpl.SearchDataSourceImpl
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
Expand All @@ -21,4 +23,9 @@ interface DataSourceModule {
abstract fun bindsPostLocalDataSource(
communityPostDataSourceImpl: CommunityPostDataSourceImpl,
): CommunityPostDataSource

@Binds
abstract fun bindsSearchDataSource(
searchDataSourceImpl: SearchDataSourceImpl,
): SearchDataSource
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ import com.hsLink.hslink.data.repositoryimpl.AuthRepositoryImpl
import com.hsLink.hslink.data.repositoryimpl.CommunityRepositoryImpl
import com.hsLink.hslink.data.repositoryimpl.DummyRepositoryImpl
import com.hsLink.hslink.data.repositoryimpl.home.PostRepositoryImpl
import com.hsLink.hslink.data.repositoryimpl.search.SearchRepositoryImpl
import com.hsLink.hslink.domain.DummyRepository
import com.hsLink.hslink.domain.repository.AuthRepository
import com.hsLink.hslink.domain.repository.community.CommunityRepository
import com.hsLink.hslink.domain.repository.home.PostRepository
import com.hsLink.hslink.domain.repository.search.SearchRepository
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
Expand Down Expand Up @@ -38,4 +40,9 @@ interface RepositoryModule {
fun bindsCommunityPostRepository(
communityPostRepositoryImpl: CommunityRepositoryImpl,
): CommunityRepository

@Binds
fun bindsSearchRepository(
searchRepositoryImpl: SearchRepositoryImpl,
): SearchRepository
}
7 changes: 7 additions & 0 deletions app/src/main/java/com/hsLink/hslink/data/di/ServiceModule.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.hsLink.hslink.data.di

import com.hsLink.hslink.data.service.DummyService
import com.hsLink.hslink.data.service.search.SearchService
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
Expand All @@ -17,4 +18,10 @@ object ServiceModule {
fun providesDummyService(retrofit: Retrofit): DummyService =
retrofit.create(DummyService::class.java)

@Provides
@Singleton
fun provideSearchService(retrofit: Retrofit): SearchService {
return retrofit.create(SearchService::class.java)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.hsLink.hslink.data.dto.request
import kotlinx.serialization.Serializable

@Serializable
data class SocialLoginRequest(
data class SocialLoginRequestDto(
val provider: String,
val accessToken: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.hsLink.hslink.data.dto.response

import kotlinx.serialization.Serializable

@Serializable
data class MentorListResponseDto(
val isSuccess: Boolean,
val code: String,
val message: String,
val result: MentorListResultDto
)
@Serializable
data class MentorListResultDto(
val totalMentorCount: Long,
val page: Int,
val size: Int,
val totalPages: Int,
val items: List<MentorItemDto>
)
@Serializable
data class MentorItemDto(
val userId: Long,
val name: String,
val major: String,
val jobSeeking: Boolean,
val employed: Boolean,
val academicStatus: String
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.hsLink.hslink.data.dto.response
import kotlinx.serialization.Serializable

@Serializable
data class SocialLoginResponse(
data class SocialLoginResponseDto(
val accessToken: String,
val refreshToken: String,
val isNewUser: Boolean,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.hsLink.hslink.data.dto.response

import kotlinx.serialization.Serializable

@Serializable
data class UserProfileResponseDto(
val isSuccess: Boolean,
val code: String,
val message: String,
val result: UserProfileDto
)
@Serializable
data class UserProfileDto(
val userId: Long,
val name: String,
val studentNumberPrefix: String,
val major: String,
val email: String,
val jobSeeking: Boolean,
val employed: Boolean,
val academicStatus: String,
val careers: List<CareerItemDto>,
val links: List<LinkItemDto>
)
@Serializable
data class CareerItemDto(
val id: Long,
val companyName: String,
val position: String,
val jobType: String,
val employed: Boolean,
val startYm: String,
val endYm: String?
)
@Serializable
data class LinkItemDto(
val id: Long,
val type: String,
val url: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.hsLink.hslink.data.remote.datasource

import com.hsLink.hslink.data.dto.response.MentorListResponseDto
import com.hsLink.hslink.data.dto.response.UserProfileResponseDto

interface SearchDataSource {
suspend fun getMentors(page: Int, size: Int): MentorListResponseDto
suspend fun getUserProfile(userId: Long): UserProfileResponseDto
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.hsLink.hslink.data.remote.datasourceimpl

import com.hsLink.hslink.data.dto.response.MentorListResponseDto
import com.hsLink.hslink.data.dto.response.UserProfileResponseDto
import com.hsLink.hslink.data.remote.datasource.SearchDataSource
import com.hsLink.hslink.data.service.search.SearchService
import javax.inject.Inject

class SearchDataSourceImpl @Inject constructor(
private val searchService: SearchService
) : SearchDataSource {

override suspend fun getMentors(page: Int, size: Int): MentorListResponseDto {
return searchService.getMentors(page, size)
}

override suspend fun getUserProfile(userId: Long): UserProfileResponseDto {
return searchService.getUserProfile(userId)
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.hsLink.hslink.data.repositoryimpl

import com.hsLink.hslink.data.dto.request.SocialLoginRequest
import com.hsLink.hslink.data.dto.response.SocialLoginResponse
import com.hsLink.hslink.data.dto.request.SocialLoginRequestDto
import com.hsLink.hslink.data.dto.response.SocialLoginResponseDto
import com.hsLink.hslink.data.service.login.AuthService
import com.hsLink.hslink.domain.repository.AuthRepository
import javax.inject.Inject
Expand All @@ -13,9 +13,9 @@ class AuthRepositoryImpl @Inject constructor(
override suspend fun loginWithSocialToken(
provider: String,
accessToken: String
): Result<SocialLoginResponse> {
): Result<SocialLoginResponseDto> {
return try {
val request = SocialLoginRequest(provider, accessToken)
val request = SocialLoginRequestDto(provider, accessToken)
val response = authService.socialLogin(request)

if (response.isSuccessful) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package com.hsLink.hslink.data.repositoryimpl.search

import android.util.Log
import com.hsLink.hslink.data.remote.datasource.SearchDataSource
import com.hsLink.hslink.domain.model.search.MentorListEntity
import com.hsLink.hslink.domain.model.search.MentorEntity
import com.hsLink.hslink.domain.model.search.UserProfileEntity
import com.hsLink.hslink.domain.model.search.CareerEntity
import com.hsLink.hslink.domain.model.search.LinkEntity
import com.hsLink.hslink.domain.repository.search.SearchRepository
import javax.inject.Inject

class SearchRepositoryImpl @Inject constructor(
private val searchDataSource: SearchDataSource
) : SearchRepository {

override suspend fun getMentors(page: Int, size: Int): Result<MentorListEntity> {
Log.d("SearchRepository", "getMentors 호출: page=$page, size=$size")
return try {
val response = searchDataSource.getMentors(page, size)
Log.d("SearchRepository", "API 응답: isSuccess=${response.isSuccess}, message=${response.message}")

if (response.isSuccess) {
val mentorListEntity = MentorListEntity(
totalMentorCount = response.result.totalMentorCount,
page = response.result.page,
size = response.result.size,
totalPages = response.result.totalPages,
mentors = response.result.items.map { dto ->
MentorEntity(
userId = dto.userId,
name = dto.name,
major = dto.major,
jobSeeking = dto.jobSeeking,
employed = dto.employed,
academicStatus = dto.academicStatus
)
}
)
Log.d("SearchRepository", "변환 완료: ${mentorListEntity.mentors.size}개 멘토")
Result.success(mentorListEntity)
} else {
Log.e("SearchRepository", "API 실패: ${response.message}")
Result.failure(Exception(response.message))
}
} catch (e: Exception) {
Log.e("SearchRepository", "예외 발생: ${e.message}", e)
Result.failure(e)
}
}


override suspend fun getUserProfile(userId: Long): Result<UserProfileEntity> {
return try {
val response = searchDataSource.getUserProfile(userId)
if (response.isSuccess) {
val userProfileEntity = UserProfileEntity(
userId = response.result.userId,
name = response.result.name,
studentNumberPrefix = response.result.studentNumberPrefix,
major = response.result.major,
email = response.result.email,
jobSeeking = response.result.jobSeeking,
employed = response.result.employed,
academicStatus = response.result.academicStatus,
careers = response.result.careers.map { dto ->
CareerEntity(
id = dto.id,
companyName = dto.companyName,
position = dto.position,
jobType = dto.jobType,
employed = dto.employed,
startYm = dto.startYm,
endYm = dto.endYm
)
},
links = response.result.links.map { dto ->
LinkEntity(
id = dto.id,
type = dto.type,
url = dto.url
)
}
)
Result.success(userProfileEntity)
} else {
Result.failure(Exception(response.message))
}
} catch (e: Exception) {
Result.failure(e)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.hsLink.hslink.data.service.login

import com.hsLink.hslink.data.dto.request.SocialLoginRequest
import com.hsLink.hslink.data.dto.response.SocialLoginResponse
import com.hsLink.hslink.data.dto.request.SocialLoginRequestDto
import com.hsLink.hslink.data.dto.response.SocialLoginResponseDto
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.POST

interface AuthService {
@POST("auth/login")
suspend fun socialLogin(@Body request: SocialLoginRequest): Response<SocialLoginResponse>
suspend fun socialLogin(@Body request: SocialLoginRequestDto): Response<SocialLoginResponseDto>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.hsLink.hslink.data.service.search

import com.hsLink.hslink.data.dto.response.MentorListResponseDto
import com.hsLink.hslink.data.dto.response.UserProfileResponseDto
import retrofit2.http.GET
import retrofit2.http.Path
import retrofit2.http.Query

interface SearchService {

@GET("users/mentors")
suspend fun getMentors(
@Query("page") page: Int = 0,
@Query("size") size: Int = 15
): MentorListResponseDto

@GET("users/profiles/{userId}")
suspend fun getUserProfile(
@Path("userId") userId: Long
): UserProfileResponseDto
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.hsLink.hslink.domain.model.search

data class MentorListEntity(
val totalMentorCount: Long,
val page: Int,
val size: Int,
val totalPages: Int,
val mentors: List<MentorEntity>
)

data class MentorEntity(
val userId: Long,
val name: String,
val major: String,
val jobSeeking: Boolean,
val employed: Boolean,
val academicStatus: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.hsLink.hslink.domain.model.search

data class UserProfileEntity(
val userId: Long,
val name: String,
val studentNumberPrefix: String,
val major: String,
val email: String,
val jobSeeking: Boolean,
val employed: Boolean,
val academicStatus: String,
val careers: List<CareerEntity>,
val links: List<LinkEntity>
)

data class CareerEntity(
val id: Long,
val companyName: String,
val position: String,
val jobType: String,
val employed: Boolean,
val startYm: String,
val endYm: String?
)

data class LinkEntity(
val id: Long,
val type: String,
val url: String
)
Loading