Skip to content

Commit

Permalink
[feat] #9 6주차 과제
Browse files Browse the repository at this point in the history
  • Loading branch information
t1nm1ksun committed Nov 27, 2024
1 parent 80b9373 commit e4a1553
Show file tree
Hide file tree
Showing 41 changed files with 357 additions and 73 deletions.
6 changes: 5 additions & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ plugins {
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
alias(libs.plugins.kotlin.serialization)
alias(libs.plugins.dagger.hilt)
id("org.jetbrains.kotlin.kapt")
}

val properties = Properties().apply {
load(project.rootProject.file("local.properties").inputStream())
}
Expand Down Expand Up @@ -90,4 +91,7 @@ dependencies {
implementation(libs.converter.gson)
implementation(libs.coil.compose)

// Hilt
implementation(libs.bundles.hilt)
kapt(libs.hilt.compiler)
}
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<uses-permission android:name="android.permission.INTERNET" />

<application
android:name=".WavveApp"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
Expand Down
7 changes: 7 additions & 0 deletions app/src/main/java/org/sopt/and/WavveApp.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.sopt.and

import android.app.Application
import dagger.hilt.android.HiltAndroidApp

@HiltAndroidApp
class WavveApp : Application()
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.sopt.and.data.dataremote.datasource

import org.sopt.and.data.dataremote.model.request.RequestLoginDto
import org.sopt.and.data.dataremote.model.request.RequestSignUpDto
import org.sopt.and.data.dataremote.model.response.ResponseLoginDto
import org.sopt.and.data.dataremote.model.response.ResponseMyHobbyDto
import org.sopt.and.data.dataremote.model.response.ResponseSignUpDto


interface UserRemoteDataSource {
suspend fun postSignup(requestSignUpDto: RequestSignUpDto): ResponseSignUpDto

suspend fun postLogin(requestLoginDto: RequestLoginDto): ResponseLoginDto

suspend fun getUserHobby(token: String): ResponseMyHobbyDto
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package org.sopt.and.data.dataremote.datasourceimpl

import org.sopt.and.data.dataremote.datasource.UserRemoteDataSource
import org.sopt.and.data.dataremote.model.request.RequestLoginDto
import org.sopt.and.data.dataremote.model.request.RequestSignUpDto
import org.sopt.and.data.dataremote.model.response.ResponseLoginDto
import org.sopt.and.data.dataremote.model.response.ResponseMyHobbyDto
import org.sopt.and.data.dataremote.model.response.ResponseSignUpDto
import org.sopt.and.data.dataremote.service.UserService
import javax.inject.Inject

class UserRemoteDataSourceImpl @Inject constructor(
private val service: UserService
) : UserRemoteDataSource {
override suspend fun postSignup(requestSignUpDto: RequestSignUpDto): ResponseSignUpDto =
service.postSignup(requestSignUpDto = requestSignUpDto)


override suspend fun postLogin(requestLoginDto: RequestLoginDto): ResponseLoginDto =
service.postLogin(requestLoginDto = requestLoginDto)

override suspend fun getUserHobby(token: String): ResponseMyHobbyDto =
service.getUserHobby(token = token)

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.sopt.and.data.model.request
package org.sopt.and.data.dataremote.model.request

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.sopt.and.data.model.request
package org.sopt.and.data.dataremote.model.request

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.sopt.and.data.model.response
package org.sopt.and.data.dataremote.model.response

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package org.sopt.and.data.model.response
package org.sopt.and.data.dataremote.model.response

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

@Serializable
data class ResponseMyHobbyDto(
@SerialName("result")
val result: Result? = null,
val result: Result,
@SerialName("code")
val code: String? = null
val code: String
)

@Serializable
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.sopt.and.data.model.response
package org.sopt.and.data.dataremote.model.response

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.sopt.and.data.dataremote.service

import org.sopt.and.data.dataremote.model.request.RequestLoginDto
import org.sopt.and.data.dataremote.model.request.RequestSignUpDto
import org.sopt.and.data.dataremote.model.response.ResponseLoginDto
import org.sopt.and.data.dataremote.model.response.ResponseMyHobbyDto
import org.sopt.and.data.dataremote.model.response.ResponseSignUpDto
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.Header
import retrofit2.http.POST


interface UserService {
@POST("/user")
suspend fun postSignup(@Body requestSignUpDto: RequestSignUpDto): ResponseSignUpDto

@POST("/login")
suspend fun postLogin(@Body requestLoginDto: RequestLoginDto): ResponseLoginDto


@GET("/user/my-hobby")
suspend fun getUserHobby(
@Header("token") token: String
): ResponseMyHobbyDto

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.sopt.and.data.mapper.todomain

import org.sopt.and.data.dataremote.model.response.ResponseLoginDto
import org.sopt.and.domain.model.Token

fun ResponseLoginDto.toDomain(): Token = Token(
token = this.result.token
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.sopt.and.data.mapper.todomain

import org.sopt.and.data.dataremote.model.response.ResponseMyHobbyDto
import org.sopt.and.domain.model.Hobby

fun ResponseMyHobbyDto.toDomain(): Hobby = Hobby(
hobby = this.result.hobby
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.sopt.and.data.repositoryimpl

import org.sopt.and.data.dataremote.datasource.UserRemoteDataSource
import org.sopt.and.data.dataremote.model.request.RequestLoginDto
import org.sopt.and.data.dataremote.model.request.RequestSignUpDto
import org.sopt.and.data.mapper.todomain.toDomain
import org.sopt.and.domain.model.Hobby
import org.sopt.and.domain.model.Token
import org.sopt.and.domain.repository.UserRepository

class UserRepositoryImpl @Inject constructor(
private val userRemoteDataSource: UserRemoteDataSource
) : UserRepository {

override suspend fun postSignup(requestSignUpDto: RequestSignUpDto): Result<Unit> =
runCatching {
userRemoteDataSource.postSignup(requestSignUpDto = requestSignUpDto)
}

override suspend fun postLogin(requestLoginDto: RequestLoginDto): Result<Token> = runCatching {
userRemoteDataSource.postLogin(requestLoginDto = requestLoginDto).toDomain()
}

override suspend fun getUserHobby(token: String): Result<Hobby> = runCatching {
userRemoteDataSource.getUserHobby(token = token).toDomain()
}
}
21 changes: 0 additions & 21 deletions app/src/main/java/org/sopt/and/data/service/RetrofitInstance.kt

This file was deleted.

28 changes: 0 additions & 28 deletions app/src/main/java/org/sopt/and/data/service/UserService.kt

This file was deleted.

16 changes: 16 additions & 0 deletions app/src/main/java/org/sopt/and/di/DataSourceModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.sopt.and.di

import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import org.sopt.and.data.dataremote.datasource.UserRemoteDataSource
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
abstract class DataSourceModule {
@Binds
@Singleton
abstract fun bindsUserRemoteDataSource(userRemoteDataSourceImpl: UserRemoteDataSource): UserRemoteDataSource
}
71 changes: 71 additions & 0 deletions app/src/main/java/org/sopt/and/di/NetworkModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package org.sopt.and.di

import com.example.kakaowebtoon.BuildConfig
import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.json.Json
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import java.util.concurrent.TimeUnit
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
@OptIn(ExperimentalSerializationApi::class)
@Provides
@Singleton
fun providesJson(): Json =
Json {
isLenient = true
prettyPrint = true
explicitNulls = false
ignoreUnknownKeys = true
}

@Provides
@Singleton
fun providesOkHttpClient(
loggingInterceptor: HttpLoggingInterceptor
): OkHttpClient =
OkHttpClient.Builder().apply {
connectTimeout(10, TimeUnit.SECONDS)
writeTimeout(10, TimeUnit.SECONDS)
readTimeout(10, TimeUnit.SECONDS)
addInterceptor(loggingInterceptor)
addInterceptor { chain ->
val request = chain.request().newBuilder()
.addHeader("Accept", "*/*")
.build()
chain.proceed(request)
}
}.build()

@Provides
@Singleton
fun providesLoggingInterceptor(): HttpLoggingInterceptor =
HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY
}

@ExperimentalSerializationApi
@Provides
@Singleton
fun providesRetrofit(
okHttpClient: OkHttpClient,
json: Json
): Retrofit =
Retrofit.Builder()
.baseUrl(BuildConfig.BASE_URL)
.client(okHttpClient)
.addConverterFactory(
json.asConverterFactory(requireNotNull("application/json".toMediaTypeOrNull()))
)
.build()
}
17 changes: 17 additions & 0 deletions app/src/main/java/org/sopt/and/di/RepositoryModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.sopt.and.di

import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import org.sopt.and.data.repositoryimpl.UserRepositoryImpl
import org.sopt.and.domain.repository.UserRepository
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {
@Binds
@Singleton
abstract fun bindUserRepository(userRepositoryImpl: UserRepositoryImpl): UserRepository
}
20 changes: 20 additions & 0 deletions app/src/main/java/org/sopt/and/di/ServiceModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.sopt.and.di

import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import org.sopt.and.data.dataremote.service.UserService
import retrofit2.Retrofit
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object ServiceModule {
@Provides
@Singleton
fun providesService(retrofit: Retrofit): UserService =
retrofit.create(UserService::class.java)


}
5 changes: 5 additions & 0 deletions app/src/main/java/org/sopt/and/domain/model/Hobby.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.sopt.and.domain.model

data class Hobby(
var hobby: String = "",
)
5 changes: 5 additions & 0 deletions app/src/main/java/org/sopt/and/domain/model/Token.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.sopt.and.domain.model

data class Token(
var token: String = "",
)
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.sopt.and.domain
package org.sopt.and.domain.model

data class User(
val email: String = "",
Expand Down
Loading

0 comments on commit e4a1553

Please sign in to comment.