From 8d5efafc45a13da3940f28c9b0e633c8a7c71649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EA=B1=B4=ED=9D=AC?= Date: Fri, 25 Jul 2025 15:19:05 +0900 Subject: [PATCH 1/6] =?UTF-8?q?#309=20-=20feat=20:=20AnnounceRepository=20?= =?UTF-8?q?=ED=9E=90=ED=8A=B8=20=EB=AA=A8=EB=93=88=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/data/src/main/java/com/youthtalk/di/DataModule.kt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/core/data/src/main/java/com/youthtalk/di/DataModule.kt b/core/data/src/main/java/com/youthtalk/di/DataModule.kt index cbc01b1e..6f60013a 100644 --- a/core/data/src/main/java/com/youthtalk/di/DataModule.kt +++ b/core/data/src/main/java/com/youthtalk/di/DataModule.kt @@ -1,6 +1,5 @@ package com.youthtalk.di -import com.core.dataapi.repository.AnnounceRepository import com.core.dataapi.repository.CommentRepository import com.core.dataapi.repository.CommunityRepository import com.core.dataapi.repository.HomeRepository @@ -13,7 +12,6 @@ import com.core.dataapi.repository.SseRepository import com.core.dataapi.repository.UserRepository import com.core.datastore.datasource.DataSource import com.core.datastore.datasource.DataStoreDataSource -import com.youthtalk.repository.AnnounceRepositoryImpl import com.youthtalk.repository.CommentRepositoryImpl import com.youthtalk.repository.CommunityRepositoryImpl import com.youthtalk.repository.HomeRepositoryImpl @@ -60,9 +58,6 @@ abstract class DataModule { @Binds abstract fun bindsSearchRepository(repository: SearchRepositoryImpl): SearchRepository - @Binds - abstract fun bindsAnnounceRepository(repository: AnnounceRepositoryImpl): AnnounceRepository - @Binds abstract fun bindsReportRepository(repository: ReportRepositoryImpl): ReportRepository From 3ed1da2e73b932487d2a8ff9d7b38c9747ba6549 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EA=B1=B4=ED=9D=AC?= Date: Fri, 25 Jul 2025 15:20:23 +0900 Subject: [PATCH 2/6] =?UTF-8?q?#309=20-=20remove=20:=20AnnounceRepository?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/AnnounceRepositoryImpl.kt | 48 ------------------- .../dataapi/repository/AnnounceRepository.kt | 11 ----- 2 files changed, 59 deletions(-) delete mode 100644 core/data/src/main/java/com/youthtalk/repository/AnnounceRepositoryImpl.kt delete mode 100644 core/dataApi/src/main/java/com/core/dataapi/repository/AnnounceRepository.kt diff --git a/core/data/src/main/java/com/youthtalk/repository/AnnounceRepositoryImpl.kt b/core/data/src/main/java/com/youthtalk/repository/AnnounceRepositoryImpl.kt deleted file mode 100644 index 8a305381..00000000 --- a/core/data/src/main/java/com/youthtalk/repository/AnnounceRepositoryImpl.kt +++ /dev/null @@ -1,48 +0,0 @@ -package com.youthtalk.repository - -import androidx.paging.Pager -import androidx.paging.PagingConfig -import androidx.paging.PagingData -import com.core.dataapi.repository.AnnounceRepository -import com.core.exception.NoDataException -import com.youthtalk.data.AnnounceService -import com.youthtalk.datasource.announce.AnnouncePagingSource -import com.youthtalk.dto.mypage.AnnounceDetailResponse -import com.youthtalk.mapper.toData -import com.youthtalk.model.Announce -import com.youthtalk.model.AnnounceDetail -import com.youthtalk.utils.ErrorUtils.throwableError -import javax.inject.Inject -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flow - -class AnnounceRepositoryImpl @Inject constructor( - private val announceService: AnnounceService -) : AnnounceRepository { - - override fun getAnnounces(): Flow> { - return Pager( - config = PagingConfig( - pageSize = 10, - initialLoadSize = 10 - ), - pagingSourceFactory = { - AnnouncePagingSource(announceService) - } - ).flow - } - - override fun getAnnounceDetail(id: Long): Flow = flow { - runCatching { - announceService.getAnnounceDetail(id) - } - .onSuccess { response -> - response.data?.let { - emit(it.toData()) - } ?: throw NoDataException() - } - .onFailure { - throwableError(it) - } - } -} diff --git a/core/dataApi/src/main/java/com/core/dataapi/repository/AnnounceRepository.kt b/core/dataApi/src/main/java/com/core/dataapi/repository/AnnounceRepository.kt deleted file mode 100644 index 71c6ee88..00000000 --- a/core/dataApi/src/main/java/com/core/dataapi/repository/AnnounceRepository.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.core.dataapi.repository - -import androidx.paging.PagingData -import com.youthtalk.model.Announce -import com.youthtalk.model.AnnounceDetail -import kotlinx.coroutines.flow.Flow - -interface AnnounceRepository { - fun getAnnounces(): Flow> - fun getAnnounceDetail(id: Long): Flow -} From dd89598b6163e715bd9798d4dce45a9b50260e3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EA=B1=B4=ED=9D=AC?= Date: Fri, 25 Jul 2025 15:21:00 +0900 Subject: [PATCH 3/6] =?UTF-8?q?#309=20-=20remove=20:=20AnnounceService=20?= =?UTF-8?q?=ED=9E=90=ED=8A=B8=20=EB=AA=A8=EB=93=88=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/data/src/main/java/com/youthtalk/di/ApiModule.kt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/core/data/src/main/java/com/youthtalk/di/ApiModule.kt b/core/data/src/main/java/com/youthtalk/di/ApiModule.kt index 741fe1c7..d97ea2e7 100644 --- a/core/data/src/main/java/com/youthtalk/di/ApiModule.kt +++ b/core/data/src/main/java/com/youthtalk/di/ApiModule.kt @@ -2,7 +2,6 @@ package com.youthtalk.di import com.core.datastore.datasource.DataStoreDataSource import com.youth.app.core.data.BuildConfig -import com.youthtalk.data.AnnounceService import com.youthtalk.data.CommentService import com.youthtalk.data.CommunityService import com.youthtalk.data.LoginService @@ -191,10 +190,6 @@ object ApiModule { @Singleton fun provideCommunityService(@Main retrofit: Retrofit): CommunityService = retrofit.create(CommunityService::class.java) - @Provides - @Singleton - fun provideAnnounceService(@Main retrofit: Retrofit): AnnounceService = retrofit.create(AnnounceService::class.java) - @Provides @Singleton fun provideReportService(@Main retrofit: Retrofit): ReportService = retrofit.create(ReportService::class.java) From 31baf678f50294d127a867765c2a6944bb93392a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EA=B1=B4=ED=9D=AC?= Date: Fri, 25 Jul 2025 15:21:25 +0900 Subject: [PATCH 4/6] =?UTF-8?q?#309=20-=20remove=20:=20AnnouncePaging=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../announce/AnnouncePagingSource.kt | 45 ------------------- 1 file changed, 45 deletions(-) delete mode 100644 core/data/src/main/java/com/youthtalk/datasource/announce/AnnouncePagingSource.kt diff --git a/core/data/src/main/java/com/youthtalk/datasource/announce/AnnouncePagingSource.kt b/core/data/src/main/java/com/youthtalk/datasource/announce/AnnouncePagingSource.kt deleted file mode 100644 index 4935bcde..00000000 --- a/core/data/src/main/java/com/youthtalk/datasource/announce/AnnouncePagingSource.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.youthtalk.datasource.announce - -import androidx.paging.PagingSource -import androidx.paging.PagingState -import com.youthtalk.data.AnnounceService -import com.youthtalk.mapper.toData -import com.youthtalk.model.Announce -import java.io.IOException -import javax.inject.Inject -import retrofit2.HttpException - -class AnnouncePagingSource @Inject constructor( - private val announceService: AnnounceService -) : PagingSource() { - - override fun getRefreshKey(state: PagingState): Int? { - return state.anchorPosition?.let { anchorPosition -> - val close = state.closestPageToPosition(anchorPosition) - close?.prevKey?.plus(1) ?: close?.nextKey?.minus(1) - } - } - - override suspend fun load(params: LoadParams): LoadResult { - try { - val pageNumber = params.key ?: 0 - - val response = announceService.getAllAnnounce( - page = pageNumber, - size = params.loadSize - ) - - val data = response.data?.announcementList?.map { it.toData() } ?: listOf() - - return LoadResult.Page( - data = data, - prevKey = if (pageNumber == 0) null else pageNumber - 1, - nextKey = if (response.data?.totalPage == pageNumber) null else pageNumber + 1 - ) - } catch (e: IOException) { - return LoadResult.Error(e) - } catch (e: HttpException) { - return LoadResult.Error(e) - } - } -} From 09eab8320ae77c27bf613ce22366184abf2a4eab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EA=B1=B4=ED=9D=AC?= Date: Fri, 25 Jul 2025 15:22:05 +0900 Subject: [PATCH 5/6] =?UTF-8?q?#309=20-=20remove=20:=20announceService=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BD=94=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/announceService/GetAnnounceTest.kt | 139 ------------------ .../announceService/json/GetAnnounceJson.kt | 50 ------- 2 files changed, 189 deletions(-) delete mode 100644 core/data/src/test/java/com/youthtalk/api/announceService/GetAnnounceTest.kt delete mode 100644 core/data/src/test/java/com/youthtalk/api/announceService/json/GetAnnounceJson.kt diff --git a/core/data/src/test/java/com/youthtalk/api/announceService/GetAnnounceTest.kt b/core/data/src/test/java/com/youthtalk/api/announceService/GetAnnounceTest.kt deleted file mode 100644 index eca934d1..00000000 --- a/core/data/src/test/java/com/youthtalk/api/announceService/GetAnnounceTest.kt +++ /dev/null @@ -1,139 +0,0 @@ -package com.youthtalk.api.announceService - -import com.youthtalk.api.ApiTestUtils -import com.youthtalk.api.ApiTestUtils.createRetrofit -import com.youthtalk.api.announceService.json.getAllAnnounceSuccessJson -import com.youthtalk.api.announceService.json.getAnnounceSuccessJson -import com.youthtalk.api.announceService.json.getNoExistAnnounceErrorJson -import com.youthtalk.api.interceptor.TestAuthInterceptor -import com.youthtalk.data.AnnounceService -import com.youthtalk.dto.CommonResponse -import kotlinx.coroutines.runBlocking -import kotlinx.serialization.json.Json -import okhttp3.OkHttpClient -import okhttp3.mockwebserver.MockResponse -import okhttp3.mockwebserver.MockWebServer -import org.junit.After -import org.junit.Assert.assertEquals -import org.junit.Assert.assertNotNull -import org.junit.Assert.assertNull -import org.junit.Assert.assertThrows -import org.junit.Before -import org.junit.Test -import retrofit2.HttpException - -class GetAnnounceTest { - - private lateinit var mockWebServer: MockWebServer - private lateinit var sut: AnnounceService - - @Before - fun setUp() { - mockWebServer = MockWebServer() - mockWebServer.start() - - val okHttpClient = OkHttpClient.Builder() - .addInterceptor(ApiTestUtils.httpLoggingInterceptor) - .addInterceptor(TestAuthInterceptor()) - .build() - - val retrofit = createRetrofit( - baseUrl = mockWebServer.url("/"), - client = okHttpClient - ) - - sut = retrofit.create(AnnounceService::class.java) - } - - @After - fun tearDown() { - mockWebServer.shutdown() - } - - @Test - fun givenAnnounceId_whenGet_thenWorksFine() = runBlocking { - // given - val announceId = 3L - val responseJson = getAnnounceSuccessJson - - mockWebServer.enqueue( - MockResponse() - .setResponseCode(200) - .setBody(responseJson) - ) - - // when - val response = sut.getAnnounceDetail(announceId) - val recordedRequest = mockWebServer.takeRequest() - - // then - assertEquals("/api/v1/announcements/$announceId", recordedRequest.path) - - // 응답 body 검증 - assertEquals(200, response.status) - assertEquals("요청에 성공하였습니다.", response.message) - assertEquals("S01", response.code) - - assertEquals(announceId, response.data?.id) - } - - @Test - fun givenNoExistAnnounceId_whenGet_thenThrows404Exception() = runBlocking { - // given - val noExistAnnounceId = 2L - val responseJson = getNoExistAnnounceErrorJson - - mockWebServer.enqueue( - MockResponse() - .setResponseCode(404) - .setBody(responseJson) - ) - - // when - val exception = assertThrows(HttpException::class.java) { - runBlocking { - sut.getAnnounceDetail(noExistAnnounceId) - } - } - - // then - val errorBody = exception.response()?.errorBody()?.string() - assertNotNull(errorBody) - - val errorResponse = Json.decodeFromString>(errorBody!!) - assertEquals(404, errorResponse.status) - assertEquals("해당 공지사항을 찾을 수 없습니다.", errorResponse.message) - assertEquals("A01", errorResponse.code) - assertNull(errorResponse.data) - } - - @Test - fun given_whenGetAllAnnounce_thenWorksFine() = runBlocking { - // given - val size = 1 - val page = 0 - val responseJson = getAllAnnounceSuccessJson - - mockWebServer.enqueue( - MockResponse() - .setResponseCode(200) - .setBody(responseJson) - ) - - // when - val response = sut.getAllAnnounce(size, page) - val recordedRequest = mockWebServer.takeRequest() - - // then - // then - assertEquals("/api/v1/announcements?size=$size&page=$page", recordedRequest.path) - - // 응답 body 검증 - assertEquals(200, response.status) - assertEquals("요청에 성공하였습니다.", response.message) - assertEquals("S01", response.code) - - assertEquals(page, response.data?.pageNum) - assertEquals(size, response.data?.pageSize) - } -} diff --git a/core/data/src/test/java/com/youthtalk/api/announceService/json/GetAnnounceJson.kt b/core/data/src/test/java/com/youthtalk/api/announceService/json/GetAnnounceJson.kt deleted file mode 100644 index 23cbb3b8..00000000 --- a/core/data/src/test/java/com/youthtalk/api/announceService/json/GetAnnounceJson.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.youthtalk.api.announceService.json - -val getAnnounceSuccessJson = """ - { - "status": 200, - "message": "요청에 성공하였습니다.", - "code": "S01", - "data": { - "id": 3, - "title": "test", - "content": "test", - "imageList": [ - { - "id": 9, - "imgUrl": "https://youthtalktalk.s3.ap-northeast-2.amazonaws.com/e5326552-618d-4456-8ec6-3329c70a7d66-elmo.jpeg" - } - ], - "updateAt": "2024-09-08T19:07:25.536651" - } - } -""".trimIndent() - -val getNoExistAnnounceErrorJson = """ - { - "status": 404, - "message": "해당 공지사항을 찾을 수 없습니다.", - "code": "A01", - "data": null - } -""".trimIndent() - -val getAllAnnounceSuccessJson = """ - { - "status": 200, - "message": "요청에 성공하였습니다.", - "code": "S01", - "data": { - "pageNum": 0, - "pageSize": 1, - "totalPage": 3, - "announcementList": [ - { - "id": 4, - "title": "test", - "updateAt": "2024-09-08T19:22:15.681713" - } - ] - } - } -""".trimIndent() From b72f7a2c1f89e7b180c33dc1e3224ae62cd0e847 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EA=B1=B4=ED=9D=AC?= Date: Fri, 25 Jul 2025 15:22:15 +0900 Subject: [PATCH 6/6] =?UTF-8?q?#309=20-=20remove=20:=20AnnounceService=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/youthtalk/data/AnnounceService.kt | 22 ------------------- 1 file changed, 22 deletions(-) delete mode 100644 core/data/src/main/java/com/youthtalk/data/AnnounceService.kt diff --git a/core/data/src/main/java/com/youthtalk/data/AnnounceService.kt b/core/data/src/main/java/com/youthtalk/data/AnnounceService.kt deleted file mode 100644 index f0a8e2c0..00000000 --- a/core/data/src/main/java/com/youthtalk/data/AnnounceService.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.youthtalk.data - -import com.youthtalk.dto.CommonResponse -import com.youthtalk.dto.mypage.AnnounceDetailResponse -import com.youthtalk.dto.mypage.AnnouncesResponse -import retrofit2.http.GET -import retrofit2.http.Path -import retrofit2.http.Query - -interface AnnounceService { - - /** - * 회원 > 회원 탈퇴 - * @see PostMan 링크 - * @return [Unit] - * */ - @GET("/api/v1/announcements") - suspend fun getAllAnnounce(@Query("size") size: Int, @Query("page") page: Int): CommonResponse - - @GET("/api/v1/announcements/{id}") - suspend fun getAnnounceDetail(@Path("id") id: Long): CommonResponse -}