From e0632110c34e9f956107318d24338b306b012745 Mon Sep 17 00:00:00 2001 From: Hyun-Woo Lee <54518925+l2hyunwoo@users.noreply.github.com> Date: Thu, 5 Jan 2023 17:02:23 +0900 Subject: [PATCH] =?UTF-8?q?[feature/net-module]=20=EB=84=A4=ED=8A=B8?= =?UTF-8?q?=EC=9B=8C=ED=81=AC=20=EB=AA=A8=EB=93=88=20=EC=AA=BD=20Config=20?= =?UTF-8?q?(#35)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * .DS_STORE 파일 ignore 등록 * feat: Add BuildConfig api properties * [feature/net-module] 상수 주입받는 모듈 생성 * [feature/net-module] 어노테이션 명 변경 * [feature/net-module] Json, Retrofit, OkHttp 설정 * [feature/net-module] kotlinx-datetime 의존성 추가 * [feature/net-module] kotlinx-datatime 의존성 추가 * [feature/net-module] DTO 패키지/모델 추가 * [feature/net-module] Model명 변경 * [feature/net-module] 리모트 모듈 정의하고 StampService 만들기 * [feature/net-module] Lint 정리 * [feature/net-module] yml에 apiKey 정보 넣기 * [feature/net-module] Action 빌드 스텝 이름 변경 * [feature/net-module] 스탬프 수정 API * [feature/net-module] 스탬프 등록 API Co-authored-by: jinsu4755 --- .github/workflows/develop_PR_builder.yml | 5 +++ .github/workflows/develop_merge_builder.yml | 5 +++ .gitignore | 2 + app/build.gradle | 6 +++ .../sopt/stamp/data/model/request/.gitkeep | 0 .../model/response/ResponseModifyStampDto.kt | 8 ++++ .../data/model/response/ResponseStampDto.kt | 15 +++++++ .../stamp/data/remote/service/StampService.kt | 35 +++++++++++++++ .../java/org/sopt/stamp/di/ConfigModule.kt | 44 +++++++++++++++++++ .../java/org/sopt/stamp/di/ConstantModule.kt | 19 ++++++++ .../java/org/sopt/stamp/di/RemoteModule.kt | 19 ++++++++ .../org/sopt/stamp/di/constant/Constant.kt | 11 +++++ gradle/libs.versions.toml | 2 + 13 files changed, 171 insertions(+) create mode 100644 app/src/main/java/org/sopt/stamp/data/model/request/.gitkeep create mode 100644 app/src/main/java/org/sopt/stamp/data/model/response/ResponseModifyStampDto.kt create mode 100644 app/src/main/java/org/sopt/stamp/data/model/response/ResponseStampDto.kt create mode 100644 app/src/main/java/org/sopt/stamp/data/remote/service/StampService.kt create mode 100644 app/src/main/java/org/sopt/stamp/di/ConfigModule.kt create mode 100644 app/src/main/java/org/sopt/stamp/di/ConstantModule.kt create mode 100644 app/src/main/java/org/sopt/stamp/di/RemoteModule.kt create mode 100644 app/src/main/java/org/sopt/stamp/di/constant/Constant.kt diff --git a/.github/workflows/develop_PR_builder.yml b/.github/workflows/develop_PR_builder.yml index 2a8ecd7..893373f 100644 --- a/.github/workflows/develop_PR_builder.yml +++ b/.github/workflows/develop_PR_builder.yml @@ -36,6 +36,11 @@ jobs: - name: Change gradlew permissions run: chmod +x ./gradlew + - name: Add Network Base Url + env: + API_KEY: ${{ secrets.API_KEY }} + run: echo apiKey=\"$API_KEY\" >> ./local.properties + - name: Access Firebase Service run: echo '${{ secrets.GOOGLE_SERVICES_JSON }}' > ./app/google-services.json diff --git a/.github/workflows/develop_merge_builder.yml b/.github/workflows/develop_merge_builder.yml index a7f0b3f..64da2ae 100644 --- a/.github/workflows/develop_merge_builder.yml +++ b/.github/workflows/develop_merge_builder.yml @@ -36,6 +36,11 @@ jobs: - name: Change gradlew permissions run: chmod +x ./gradlew + - name: Add Network Base Url + env: + API_KEY: ${{ secrets.API_KEY }} + run: echo apiKey=\"$API_KEY\" >> ./local.properties + - name: Access Firebase Service run: echo '${{ secrets.GOOGLE_SERVICES_JSON }}' > ./app/google-services.json diff --git a/.gitignore b/.gitignore index 1862ad3..d94a12e 100644 --- a/.gitignore +++ b/.gitignore @@ -165,3 +165,5 @@ fabric.properties !/gradle/wrapper/gradle-wrapper.jar # End of https://www.toptal.com/developers/gitignore/api/android,androidstudio + +.DS_Store diff --git a/app/build.gradle b/app/build.gradle index 6d0c5b1..2ea668d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,6 +10,9 @@ plugins { alias libs.plugins.kotlinx.serialization } +Properties properties = new Properties() +properties.load(project.rootProject.file('local.properties').newDataInputStream()) + android { namespace 'org.sopt.stamp' compileSdk 33 @@ -25,6 +28,8 @@ android { vectorDrawables { useSupportLibrary true } + + buildConfigField "String", "SOPTAMP_API_KEY", properties["apiKey"] } buildTypes { @@ -62,6 +67,7 @@ android { } dependencies { + implementation libs.kotlin.datetime implementation libs.kotlin.serialization.json implementation libs.core.ktx implementation libs.bundles.compose diff --git a/app/src/main/java/org/sopt/stamp/data/model/request/.gitkeep b/app/src/main/java/org/sopt/stamp/data/model/request/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/app/src/main/java/org/sopt/stamp/data/model/response/ResponseModifyStampDto.kt b/app/src/main/java/org/sopt/stamp/data/model/response/ResponseModifyStampDto.kt new file mode 100644 index 0000000..e551e6a --- /dev/null +++ b/app/src/main/java/org/sopt/stamp/data/model/response/ResponseModifyStampDto.kt @@ -0,0 +1,8 @@ +package org.sopt.stamp.data.model.response + +import kotlinx.serialization.Serializable + +@Serializable +data class ResponseModifyStampDto( + val stampId: Int, +) diff --git a/app/src/main/java/org/sopt/stamp/data/model/response/ResponseStampDto.kt b/app/src/main/java/org/sopt/stamp/data/model/response/ResponseStampDto.kt new file mode 100644 index 0000000..c0b25df --- /dev/null +++ b/app/src/main/java/org/sopt/stamp/data/model/response/ResponseStampDto.kt @@ -0,0 +1,15 @@ +package org.sopt.stamp.data.model.response + +import kotlinx.datetime.Instant +import kotlinx.serialization.Serializable + +@Serializable +data class ResponseStampDto( + val createdAt: Instant? = null, + val updatedAt: Instant? = null, + val id: Long, + val contents: String, + val images: List, + val userId: Long, + val missionId: Int, +) diff --git a/app/src/main/java/org/sopt/stamp/data/remote/service/StampService.kt b/app/src/main/java/org/sopt/stamp/data/remote/service/StampService.kt new file mode 100644 index 0000000..b5d7560 --- /dev/null +++ b/app/src/main/java/org/sopt/stamp/data/remote/service/StampService.kt @@ -0,0 +1,35 @@ +package org.sopt.stamp.data.remote.service + +import okhttp3.MultipartBody +import okhttp3.RequestBody +import org.sopt.stamp.data.model.response.ResponseModifyStampDto +import org.sopt.stamp.data.model.response.ResponseStampDto +import retrofit2.http.GET +import retrofit2.http.Multipart +import retrofit2.http.POST +import retrofit2.http.PUT +import retrofit2.http.Part +import retrofit2.http.Path + +interface StampService { + @GET("stamp/{missionId}") + suspend fun retrieveStamp( + @Path("missionId") missionId: Int + ): ResponseStampDto + + @Multipart + @PUT("stamp/{missionId}") + suspend fun modifyStamp( + @Path("missionId") missionId: Int, + @Part stampContent: RequestBody, + @Part imageUrl: MultipartBody.Part? = null, + ): ResponseModifyStampDto + + @Multipart + @POST("stamp/{missionId}") + suspend fun registerStamp( + @Path("missionId") missionId: Int, + @Part stampContent: RequestBody, + @Part imageUrl: MultipartBody.Part? = null, + ): ResponseStampDto +} diff --git a/app/src/main/java/org/sopt/stamp/di/ConfigModule.kt b/app/src/main/java/org/sopt/stamp/di/ConfigModule.kt new file mode 100644 index 0000000..b57bb86 --- /dev/null +++ b/app/src/main/java/org/sopt/stamp/di/ConfigModule.kt @@ -0,0 +1,44 @@ +package org.sopt.stamp.di + +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.toMediaType +import okhttp3.OkHttpClient +import org.sopt.stamp.di.constant.Constant +import org.sopt.stamp.di.constant.Strings +import retrofit2.Retrofit +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object ConfigModule { + @Provides + @Singleton + fun provideSerializer() = Json { + prettyPrint = true + isLenient = true + } + + @Provides + @Singleton + fun provideHttpClient() = OkHttpClient.Builder() + .build() + + @OptIn(ExperimentalSerializationApi::class) + @Provides + @Singleton + fun provideRetrofit( + @Strings(Constant.SOPTAMP_API_KEY) baseUrl: String, + client: OkHttpClient, + json: Json + ): Retrofit = Retrofit.Builder() + .baseUrl(baseUrl) + .client(client) + .addConverterFactory(json.asConverterFactory("application/json".toMediaType())) + .build() +} diff --git a/app/src/main/java/org/sopt/stamp/di/ConstantModule.kt b/app/src/main/java/org/sopt/stamp/di/ConstantModule.kt new file mode 100644 index 0000000..402361d --- /dev/null +++ b/app/src/main/java/org/sopt/stamp/di/ConstantModule.kt @@ -0,0 +1,19 @@ +package org.sopt.stamp.di + +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import org.sopt.stamp.BuildConfig +import org.sopt.stamp.di.constant.Strings +import org.sopt.stamp.di.constant.Constant +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object ConstantModule { + @Provides + @Singleton + @Strings(Constant.SOPTAMP_API_KEY) + fun provideBaseUrl() = BuildConfig.SOPTAMP_API_KEY +} diff --git a/app/src/main/java/org/sopt/stamp/di/RemoteModule.kt b/app/src/main/java/org/sopt/stamp/di/RemoteModule.kt new file mode 100644 index 0000000..f8079f8 --- /dev/null +++ b/app/src/main/java/org/sopt/stamp/di/RemoteModule.kt @@ -0,0 +1,19 @@ +package org.sopt.stamp.di + +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import org.sopt.stamp.data.remote.service.StampService +import retrofit2.Retrofit +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal object RemoteModule { + @Provides + @Singleton + fun provideStampService( + retrofit: Retrofit + ): StampService = retrofit.create(StampService::class.java) +} diff --git a/app/src/main/java/org/sopt/stamp/di/constant/Constant.kt b/app/src/main/java/org/sopt/stamp/di/constant/Constant.kt new file mode 100644 index 0000000..874cecf --- /dev/null +++ b/app/src/main/java/org/sopt/stamp/di/constant/Constant.kt @@ -0,0 +1,11 @@ +package org.sopt.stamp.di.constant + +import javax.inject.Qualifier + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class Strings(val value: Constant) + +enum class Constant { + SOPTAMP_API_KEY +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4e76d75..6302f04 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,6 +2,7 @@ kotlin = "1.7.20" kotlinx-serialization-json = "1.4.1" kotlinx-serialization-converter = "0.8.0" +kotlinx-datetime = "0.4.0" compose = "1.3.1" corektx = "1.9.0" appcompat = "1.5.1" @@ -45,6 +46,7 @@ lottie = "5.2.0" agp = { module = "com.android.tools.build:gradle", version.ref = "gradleplugin" } kotlin-gradleplugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" } kotlin-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinx-serialization-json" } +kotlin-datetime = { group = "org.jetbrains.kotlinx", name = "kotlinx-datetime", version.ref = "kotlinx-datetime" } core-ktx = { module = "androidx.core:core-ktx", version.ref = "corektx" } appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" }