├── .github
├── ISSUE_TEMPLATE
│ └── terning-issue-template.md
├── pull_request_template.md
└── workflows
│ ├── dokka.yml
│ └── pr_checker.yml
├── .gitignore
├── README.md
├── app
├── .gitignore
├── build.gradle.kts
├── proguard-rules.pro
└── src
│ ├── debug
│ ├── ic_terning_launcher-playstore.png
│ └── res
│ │ ├── drawable
│ │ └── ic_terning_launcher_background.xml
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_terning_launcher.xml
│ │ └── ic_terning_launcher_round.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_terning_launcher.webp
│ │ ├── ic_terning_launcher_foreground.webp
│ │ └── ic_terning_launcher_round.webp
│ │ ├── mipmap-mdpi
│ │ ├── ic_terning_launcher.webp
│ │ ├── ic_terning_launcher_foreground.webp
│ │ └── ic_terning_launcher_round.webp
│ │ ├── mipmap-xhdpi
│ │ ├── ic_terning_launcher.webp
│ │ ├── ic_terning_launcher_foreground.webp
│ │ └── ic_terning_launcher_round.webp
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_terning_launcher.webp
│ │ ├── ic_terning_launcher_foreground.webp
│ │ └── ic_terning_launcher_round.webp
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_terning_launcher.webp
│ │ ├── ic_terning_launcher_foreground.webp
│ │ └── ic_terning_launcher_round.webp
│ │ └── values
│ │ └── strings.xml
│ ├── main
│ ├── AndroidManifest.xml
│ └── java
│ │ └── com
│ │ └── terning
│ │ └── point
│ │ └── MyApp.kt
│ └── release
│ ├── generated
│ └── baselineProfiles
│ │ ├── baseline-prof.txt
│ │ └── startup-prof.txt
│ └── res
│ ├── mipmap-anydpi-v26
│ ├── ic_terning_launcher.xml
│ └── ic_terning_launcher_round.xml
│ ├── mipmap-hdpi
│ ├── ic_terning_launcher.webp
│ ├── ic_terning_launcher_foreground.webp
│ └── ic_terning_launcher_round.webp
│ ├── mipmap-mdpi
│ ├── ic_terning_launcher.webp
│ ├── ic_terning_launcher_foreground.webp
│ └── ic_terning_launcher_round.webp
│ ├── mipmap-xhdpi
│ ├── ic_terning_launcher.webp
│ ├── ic_terning_launcher_foreground.webp
│ └── ic_terning_launcher_round.webp
│ ├── mipmap-xxhdpi
│ ├── ic_terning_launcher.webp
│ ├── ic_terning_launcher_foreground.webp
│ └── ic_terning_launcher_round.webp
│ ├── mipmap-xxxhdpi
│ ├── ic_terning_launcher.webp
│ ├── ic_terning_launcher_foreground.webp
│ └── ic_terning_launcher_round.webp
│ └── values
│ └── strings.xml
├── baselineprofile
├── .gitignore
├── build.gradle.kts
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── java
│ └── com
│ └── terning
│ └── point
│ └── baselineprofile
│ ├── BaselineProfileGenerator.kt
│ └── StartupBenchmarks.kt
├── build-logic
├── .gitignore
├── build.gradle.kts
├── settings.gradle.kts
└── src
│ └── main
│ └── java
│ ├── com
│ └── terning
│ │ └── build_logic
│ │ ├── convention
│ │ ├── ComposeAndroid.kt
│ │ ├── CoroutineAndroid.kt
│ │ ├── HiltAndroid.kt
│ │ ├── HiltKotlin.kt
│ │ ├── KotlinAndroid.kt
│ │ └── SerializationAndroid.kt
│ │ └── extension
│ │ ├── AndroidExtension.kt
│ │ ├── ComposeMetricsExtension.kt
│ │ └── NameSpaceExtension.kt
│ ├── terning.android.application.gradle.kts
│ ├── terning.android.compose.gradle.kts
│ ├── terning.android.data.gradle.kts
│ ├── terning.android.feature.gradle.kts
│ ├── terning.android.library.gradle.kts
│ └── terning.kotlin.library.gradle.kts
├── build.gradle.kts
├── core
├── analytics
│ ├── .gitignore
│ ├── build.gradle.kts
│ ├── proguard-rules.pro
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── core
│ │ └── analytics
│ │ ├── AmplitudeTracker.kt
│ │ └── EventType.kt
├── designsystem
│ ├── .gitignore
│ ├── build.gradle.kts
│ ├── docs.md
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── terning
│ │ │ └── core
│ │ │ └── designsystem
│ │ │ ├── component
│ │ │ ├── bottomsheet
│ │ │ │ ├── MyPageLogoutBottomSheet.kt
│ │ │ │ ├── MyPageQuitBottomSheet.kt
│ │ │ │ ├── ProfileBottomSheet.kt
│ │ │ │ ├── SortingBottomSheet.kt
│ │ │ │ └── TerningBasicBottomSheet.kt
│ │ │ ├── button
│ │ │ │ ├── ChangeFilterButton.kt
│ │ │ │ ├── DeleteRoundButton.kt
│ │ │ │ ├── FilteringButton.kt
│ │ │ │ ├── RectangleButton.kt
│ │ │ │ ├── RoundButton.kt
│ │ │ │ ├── SortingButton.kt
│ │ │ │ └── TerningBasicButton.kt
│ │ │ ├── dialog
│ │ │ │ ├── TerningBasicDialog.kt
│ │ │ │ └── TerningNoticeDialog.kt
│ │ │ ├── image
│ │ │ │ └── TerningImage.kt
│ │ │ ├── item
│ │ │ │ ├── InternItem.kt
│ │ │ │ ├── InternItemWithShadow.kt
│ │ │ │ ├── ProfileWithPlusButton.kt
│ │ │ │ ├── RadioButtonGroups.kt
│ │ │ │ ├── ScrapBox.kt
│ │ │ │ └── TerningLottieAnimation.kt
│ │ │ ├── snackbar
│ │ │ │ └── TerningBasicSnackBar.kt
│ │ │ ├── textfield
│ │ │ │ ├── NameTextField.kt
│ │ │ │ ├── SearchTextField.kt
│ │ │ │ └── TerningBasicTextField.kt
│ │ │ └── topappbar
│ │ │ │ ├── BackButtonTopAppBar.kt
│ │ │ │ ├── CalendarTopAppBar.kt
│ │ │ │ ├── MyPageTopAppBar.kt
│ │ │ │ └── TerningBasicTopAppBar.kt
│ │ │ ├── extension
│ │ │ ├── CalendarExt.kt
│ │ │ ├── ContextExt.kt
│ │ │ ├── FlowExt.kt
│ │ │ ├── LocalDateExt.kt
│ │ │ ├── Map.kt
│ │ │ ├── Modifier.kt
│ │ │ └── TextStyle.kt
│ │ │ ├── state
│ │ │ └── UiState.kt
│ │ │ ├── theme
│ │ │ ├── Color.kt
│ │ │ ├── Theme.kt
│ │ │ └── Type.kt
│ │ │ ├── type
│ │ │ ├── AlarmType.kt
│ │ │ ├── ColorType.kt
│ │ │ ├── Grade.kt
│ │ │ ├── JobType.kt
│ │ │ ├── NotificationRedirect.kt
│ │ │ ├── ProfileImage.kt
│ │ │ ├── SortBy.kt
│ │ │ └── WorkingPeriod.kt
│ │ │ └── util
│ │ │ ├── CalendarDefaults.kt
│ │ │ ├── DeeplinkDefaults.kt
│ │ │ ├── KakaoUtil.kt
│ │ │ ├── NoRippleInteractionSource.kt
│ │ │ ├── NoRippleTheme.kt
│ │ │ └── Regex.kt
│ │ └── res
│ │ ├── drawable
│ │ ├── ic_back.xml
│ │ ├── ic_bookmark_filled.xml
│ │ ├── ic_bookmark_outlined.xml
│ │ ├── ic_calendar_list_selected.xml
│ │ ├── ic_calendar_list_unselected.xml
│ │ ├── ic_calendar_next.xml
│ │ ├── ic_calendar_previous.xml
│ │ ├── ic_color_check.xml
│ │ ├── ic_dialog_x_32.xml
│ │ ├── ic_down_18.xml
│ │ ├── ic_down_22.xml
│ │ ├── ic_job_accounting_24.xml
│ │ ├── ic_job_all_24.xml
│ │ ├── ic_job_design_24.xml
│ │ ├── ic_job_extra_24.xml
│ │ ├── ic_job_it_24.xml
│ │ ├── ic_job_marketing_24.xml
│ │ ├── ic_job_plan_24.xml
│ │ ├── ic_job_research_24.xml
│ │ ├── ic_job_sales_24.xml
│ │ ├── ic_logo.xml
│ │ ├── ic_name_text_field_check.xml
│ │ ├── ic_name_text_field_error.xml
│ │ ├── ic_right.xml
│ │ ├── ic_selected_character.xml
│ │ ├── ic_sign_in_selected.xml
│ │ ├── ic_sign_up_button.xml
│ │ ├── ic_terning_intern_item_image_loading_128.xml
│ │ ├── ic_terning_intern_item_image_loading_76.xml
│ │ ├── ic_terning_intern_item_image_loading_popular.xml
│ │ ├── ic_terning_logo_typo.xml
│ │ ├── ic_terning_profile_00.xml
│ │ ├── ic_terning_profile_01.xml
│ │ ├── ic_terning_profile_02.xml
│ │ ├── ic_terning_profile_03.xml
│ │ ├── ic_terning_profile_04.xml
│ │ ├── ic_terning_profile_05.xml
│ │ ├── ic_terning_profile_default.xml
│ │ ├── ic_terning_selected_profile_00.xml
│ │ ├── ic_terning_selected_profile_01.xml
│ │ ├── ic_terning_selected_profile_02.xml
│ │ ├── ic_terning_selected_profile_03.xml
│ │ ├── ic_terning_selected_profile_04.xml
│ │ ├── ic_terning_selected_profile_05.xml
│ │ └── ic_up_22.xml
│ │ ├── font
│ │ ├── pretendard_light.otf
│ │ ├── pretendard_medium.otf
│ │ ├── pretendard_regular.otf
│ │ └── pretendard_semibold.otf
│ │ ├── raw
│ │ └── paging_loading_animation.json
│ │ └── values
│ │ └── strings.xml
├── firebase
│ ├── .gitignore
│ ├── build.gradle.kts
│ ├── consumer-rules.pro
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── terning
│ │ │ └── core
│ │ │ └── firebase
│ │ │ ├── di
│ │ │ ├── FcmTokenModule.kt
│ │ │ └── RemoteConfigModule.kt
│ │ │ ├── fcmtoken
│ │ │ ├── FcmTokenProvider.kt
│ │ │ └── FcmTokenProviderImpl.kt
│ │ │ ├── messageservice
│ │ │ └── TerningMessagingService.kt
│ │ │ └── remoteconfig
│ │ │ ├── RemoteConfigKey.kt
│ │ │ └── TerningRemoteConfig.kt
│ │ └── res
│ │ ├── mipmap-hdpi
│ │ └── ic_terning_launcher.webp
│ │ ├── mipmap-mdpi
│ │ └── ic_terning_launcher.webp
│ │ ├── mipmap-xhdpi
│ │ └── ic_terning_launcher.webp
│ │ ├── mipmap-xxhdpi
│ │ └── ic_terning_launcher.webp
│ │ └── mipmap-xxxhdpi
│ │ └── ic_terning_launcher.webp
├── local
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── core
│ │ └── local
│ │ ├── TerningDataStore.kt
│ │ ├── TerningDataStoreImpl.kt
│ │ └── di
│ │ └── DataStoreModule.kt
├── navigation
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ ├── androidTest
│ │ └── java
│ │ │ └── com
│ │ │ └── terning
│ │ │ └── core
│ │ │ └── navigation
│ │ │ └── ExampleInstrumentedTest.kt
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── core
│ │ └── navigation
│ │ ├── MainTabRoute.kt
│ │ └── Route.kt
├── navigator
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── navigator
│ │ └── NavigatorProvider.kt
├── network
│ ├── .gitignore
│ ├── build.gradle.kts
│ ├── proguard-rules.pro
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── core
│ │ └── network
│ │ ├── AuthInterceptor.kt
│ │ ├── BaseResponse.kt
│ │ ├── NonDataBaseResponse.kt
│ │ ├── RetrofitExt.kt
│ │ ├── RetrofitModule.kt
│ │ └── qualifier
│ │ └── RetrofitQualifier.kt
└── testing
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ ├── main
│ ├── AndroidManifest.xml
│ └── java
│ │ └── com
│ │ └── terning
│ │ └── testing
│ │ └── util
│ │ └── MainDispatcherRule.kt
│ └── test
│ └── java
│ └── com
│ └── terning
│ └── testing
│ └── ExampleUnitTest.kt
├── data
├── .gitignore
├── auth
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── data
│ │ └── auth
│ │ ├── datasource
│ │ └── AuthDataSource.kt
│ │ ├── datasourceimpl
│ │ └── AuthDataSourceImpl.kt
│ │ ├── di
│ │ ├── DataSourceModule.kt
│ │ ├── RepositoryModule.kt
│ │ └── ServiceModule.kt
│ │ ├── dto
│ │ ├── request
│ │ │ ├── SignInRequestDto.kt
│ │ │ └── SignUpRequestDto.kt
│ │ └── response
│ │ │ ├── SignInResponseDto.kt
│ │ │ └── SignUpResponseDto.kt
│ │ ├── mapper
│ │ ├── SignInRequestMapper.kt
│ │ ├── SignInResponseMapper.kt
│ │ ├── SignUpRequestMapper.kt
│ │ └── SignUpResponseMapper.kt
│ │ ├── repositoryimpl
│ │ └── AuthRepositoryImpl.kt
│ │ └── service
│ │ └── AuthService.kt
├── calendar
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── data
│ │ └── calendar
│ │ ├── datasource
│ │ └── CalendarDataSource.kt
│ │ ├── datasourceimpl
│ │ └── CalendarDataSourceImpl.kt
│ │ ├── di
│ │ ├── DataSourceModule.kt
│ │ ├── RepositoryModule.kt
│ │ └── ServiceModule.kt
│ │ ├── dto
│ │ ├── request
│ │ │ ├── CalendarDayListRequestDto.kt
│ │ │ ├── CalendarMonthListRequestDto.kt
│ │ │ └── CalendarMonthRequestDto.kt
│ │ └── response
│ │ │ ├── CalendarDayListResponseDto.kt
│ │ │ ├── CalendarMonthListResponseDto.kt
│ │ │ └── CalendarMonthResponseDto.kt
│ │ ├── mapper
│ │ ├── CalendarScrapDetailListMapper.kt
│ │ ├── CalendarScrapDetailMapper.kt
│ │ └── CalendarScrapMapper.kt
│ │ ├── repositoryimpl
│ │ └── CalendarRepositoryImpl.kt
│ │ └── service
│ │ └── CalendarService.kt
├── filtering
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── data
│ │ └── filtering
│ │ ├── datasource
│ │ └── FilteringDataSource.kt
│ │ ├── datasourceimpl
│ │ └── FilteringDataSourceImpl.kt
│ │ ├── di
│ │ ├── DataSourceModule.kt
│ │ ├── RepositoryModule.kt
│ │ └── ServiceModule.kt
│ │ ├── dto
│ │ └── request
│ │ │ └── FilteringRequestDto.kt
│ │ ├── mapper
│ │ └── FilteringMapper.kt
│ │ ├── repositoryimpl
│ │ └── FilteringRepositoryImpl.kt
│ │ └── service
│ │ └── FilteringService.kt
├── home
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── data
│ │ └── home
│ │ ├── datasource
│ │ └── HomeDataSource.kt
│ │ ├── datasourceimpl
│ │ └── HomeDataSourceImpl.kt
│ │ ├── di
│ │ ├── DataSourceModule.kt
│ │ ├── RepositoryModule.kt
│ │ └── ServiceModule.kt
│ │ ├── dto
│ │ ├── request
│ │ │ ├── ChangeFilterRequestDto.kt
│ │ │ └── FcmTokenRequestDto.kt
│ │ └── response
│ │ │ ├── HomeFilteringInfoResponseDto.kt
│ │ │ ├── HomeRecommendInternResponseDto.kt
│ │ │ └── HomeUpcomingInternResponseDto.kt
│ │ ├── mapper
│ │ ├── FcmTokenMapper.kt
│ │ ├── HomeFilteringInfoMapper.kt
│ │ ├── HomeRecommendInternMapper.kt
│ │ └── HomeUpcomingInternMapper.kt
│ │ ├── pagingsource
│ │ └── HomePagingSource.kt
│ │ ├── repositoryimpl
│ │ └── HomeRepositoryImpl.kt
│ │ └── service
│ │ └── HomeService.kt
├── intern
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── data
│ │ └── intern
│ │ ├── datasource
│ │ └── InternDataSource.kt
│ │ ├── datasourceimpl
│ │ └── InternDataSourceImpl.kt
│ │ ├── di
│ │ ├── DataSourceModule.kt
│ │ ├── RepositoryModule.kt
│ │ └── ServiceModule.kt
│ │ ├── dto
│ │ └── response
│ │ │ └── InternResponseDto.kt
│ │ ├── mapper
│ │ └── InternInfoMapper.kt
│ │ ├── repositoryimpl
│ │ └── InternRepositoryImpl.kt
│ │ └── service
│ │ └── InternService.kt
├── mypage
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── data
│ │ └── mypage
│ │ ├── datasource
│ │ └── MyPageDataSource.kt
│ │ ├── datasourceimpl
│ │ └── MyPageDataSourceImpl.kt
│ │ ├── di
│ │ ├── DataSourceModule.kt
│ │ ├── RepositoryModule.kt
│ │ └── ServiceModule.kt
│ │ ├── dto
│ │ ├── request
│ │ │ ├── AlarmStatusRequestDto.kt
│ │ │ └── MyPageProfileEditRequestDto.kt
│ │ └── response
│ │ │ └── MyPageResponseDto.kt
│ │ ├── mapper
│ │ ├── AlarmStatusMapper.kt
│ │ ├── MyPageMapper.kt
│ │ └── MyPageProfileEditMapper.kt
│ │ ├── repositoryimpl
│ │ └── MyPageRepositoryImpl.kt
│ │ └── service
│ │ └── MyPageService.kt
├── scrap
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── data
│ │ └── scrap
│ │ ├── datasource
│ │ └── ScrapDataSource.kt
│ │ ├── datasourceimpl
│ │ └── ScrapDataSourceImpl.kt
│ │ ├── di
│ │ ├── DataSourceModule.kt
│ │ ├── RepositoryModule.kt
│ │ └── ServiceModule.kt
│ │ ├── dto
│ │ └── request
│ │ │ └── ScrapColorRequestDto.kt
│ │ ├── repositoryimpl
│ │ └── ScrapRepositoryImpl.kt
│ │ └── service
│ │ └── ScrapService.kt
├── search
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── data
│ │ └── search
│ │ ├── datasource
│ │ └── SearchDataSource.kt
│ │ ├── datasourceimpl
│ │ └── SearchDataSourceImpl.kt
│ │ ├── di
│ │ ├── DataSourceModule.kt
│ │ ├── RepositoryModule.kt
│ │ └── ServiceModule.kt
│ │ ├── dto
│ │ ├── request
│ │ │ └── SearchRequestDto.kt
│ │ └── response
│ │ │ ├── SearchAnnouncementResponseDto.kt
│ │ │ ├── SearchBannersResponseDto.kt
│ │ │ └── SearchResultResponseDto.kt
│ │ ├── mapper
│ │ ├── SearchAnnouncementListMapper.kt
│ │ ├── SearchBannersMapper.kt
│ │ └── SearchResultMapper.kt
│ │ ├── pagingsource
│ │ └── SearchPagingSource.kt
│ │ ├── repositoryimpl
│ │ └── SearchRepositoryImpl.kt
│ │ └── service
│ │ └── SearchService.kt
├── tokenreissue
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── data
│ │ └── tokenreissue
│ │ ├── datasource
│ │ └── TokenReissueDataSource.kt
│ │ ├── datasourceimpl
│ │ └── TokenReissueDataSourceImpl.kt
│ │ ├── di
│ │ ├── DataSourceModule.kt
│ │ ├── RepositoryModule.kt
│ │ └── ServiceModule.kt
│ │ ├── dto
│ │ └── response
│ │ │ └── TokenReissueResponseDto.kt
│ │ ├── mapper
│ │ └── TokenReissueMapper.kt
│ │ ├── repositoryimpl
│ │ └── TokenReissueRepositoryImpl.kt
│ │ └── service
│ │ └── TokenReissueService.kt
├── update
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── data
│ │ └── update
│ │ ├── datasource
│ │ └── UpdateDataSource.kt
│ │ ├── di
│ │ └── RepositoryModule.kt
│ │ └── repositoryimpl
│ │ └── UpdateRepositoryImpl.kt
└── user
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ └── main
│ ├── AndroidManifest.xml
│ └── java
│ └── com
│ └── terning
│ └── data
│ └── user
│ ├── di
│ └── RepositoryModule.kt
│ └── repositoryimpl
│ └── UserRepositoryImpl.kt
├── domain
├── .gitignore
├── auth
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── domain
│ │ └── auth
│ │ ├── entity
│ │ ├── SignInRequest.kt
│ │ ├── SignInResponse.kt
│ │ ├── SignUpRequest.kt
│ │ └── SignUpResponse.kt
│ │ └── repository
│ │ └── AuthRepository.kt
├── calendar
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── domain
│ │ └── calendar
│ │ ├── entity
│ │ ├── CalendarScrap.kt
│ │ ├── CalendarScrapDetail.kt
│ │ └── CalendarScrapRequest.kt
│ │ └── repository
│ │ └── CalendarRepository.kt
├── filtering
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── domain
│ │ └── filtering
│ │ ├── entity
│ │ └── Filtering.kt
│ │ └── repository
│ │ └── FilteringRepository.kt
├── home
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── domain
│ │ └── home
│ │ ├── entity
│ │ ├── ChangeFilteringRequestModel.kt
│ │ ├── FcmToken.kt
│ │ ├── HomeFilteringInfo.kt
│ │ ├── HomeRecommendIntern.kt
│ │ ├── HomeRecommendedIntern.kt
│ │ └── HomeUpcomingIntern.kt
│ │ └── repository
│ │ └── HomeRepository.kt
├── intern
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── domain
│ │ └── intern
│ │ ├── entity
│ │ └── InternInfo.kt
│ │ └── repository
│ │ └── InternRepository.kt
├── mypage
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── domain
│ │ └── mypage
│ │ ├── entity
│ │ ├── AlarmStatus.kt
│ │ ├── MyPageProfile.kt
│ │ └── MyPageProfileEdit.kt
│ │ └── repository
│ │ └── MyPageRepository.kt
├── scrap
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── domain
│ │ └── scrap
│ │ ├── entity
│ │ └── CalendarScrapRequest.kt
│ │ └── repository
│ │ └── ScrapRepository.kt
├── search
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── domain
│ │ └── search
│ │ ├── entity
│ │ ├── SearchBanner.kt
│ │ ├── SearchPopularAnnouncement.kt
│ │ └── SearchResult.kt
│ │ └── repository
│ │ └── SearchRepository.kt
├── tokenreissue
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── domain
│ │ └── tokenreissue
│ │ ├── entity
│ │ └── TokenReissue.kt
│ │ └── repository
│ │ └── TokenReissueRepository.kt
├── update
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── domain
│ │ └── update
│ │ ├── entity
│ │ ├── UpdateMessage.kt
│ │ └── UpdateState.kt
│ │ ├── repository
│ │ └── UpdateRepository.kt
│ │ └── usecase
│ │ └── GetAppVersionUseCase.kt
└── user
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ └── main
│ └── java
│ └── com
│ └── terning
│ └── domain
│ └── user
│ └── repository
│ └── UserRepository.kt
├── feature
├── .gitignore
├── calendar
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── terning
│ │ │ └── feature
│ │ │ └── calendar
│ │ │ ├── calendar
│ │ │ ├── CalendarRoute.kt
│ │ │ ├── CalendarViewModel.kt
│ │ │ ├── component
│ │ │ │ ├── ScreenTransition.kt
│ │ │ │ ├── WeekDaysHeader.kt
│ │ │ │ ├── dialog
│ │ │ │ │ ├── CalendarScrapCancelDialog.kt
│ │ │ │ │ └── CalendarScrapPatchDialog.kt
│ │ │ │ ├── group
│ │ │ │ │ ├── CalendarDayGroup.kt
│ │ │ │ │ ├── CalendarMonthGroup.kt
│ │ │ │ │ ├── CalendarScrapGroup.kt
│ │ │ │ │ ├── CalendarScrapListGroup.kt
│ │ │ │ │ ├── CalendarScrapListItemGroup.kt
│ │ │ │ │ └── CalendarWeekGroup.kt
│ │ │ │ └── pager
│ │ │ │ │ ├── CalendarMonthPager.kt
│ │ │ │ │ └── CalendarWeekPager.kt
│ │ │ ├── model
│ │ │ │ ├── CalendarUiState.kt
│ │ │ │ ├── DayModel.kt
│ │ │ │ ├── MonthModel.kt
│ │ │ │ └── TerningCalendarModel.kt
│ │ │ ├── navigation
│ │ │ │ └── CalendarNavigation.kt
│ │ │ └── type
│ │ │ │ └── WeekDay.kt
│ │ │ ├── list
│ │ │ ├── CalendarListScreen.kt
│ │ │ ├── CalendarListSideEffect.kt
│ │ │ ├── CalendarListViewModel.kt
│ │ │ └── model
│ │ │ │ └── CalendarListUiState.kt
│ │ │ ├── month
│ │ │ ├── CalendarMonthScreen.kt
│ │ │ ├── CalendarMonthSideEffect.kt
│ │ │ ├── CalendarMonthViewModel.kt
│ │ │ └── model
│ │ │ │ └── CalendarMonthUiState.kt
│ │ │ └── week
│ │ │ ├── CalendarWeekScreen.kt
│ │ │ ├── CalendarWeekSideEffect.kt
│ │ │ ├── CalendarWeekViewModel.kt
│ │ │ └── model
│ │ │ └── CalendarWeekUiState.kt
│ │ └── res
│ │ ├── drawable
│ │ ├── ic_terning_calendar_empty.xml
│ │ └── ic_terning_launcher_background.xml
│ │ └── values
│ │ ├── strings.xml
│ │ └── themes.xml
├── dialog
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── terning
│ │ │ └── feature
│ │ │ └── dialog
│ │ │ ├── cancel
│ │ │ ├── ScrapCancelDialog.kt
│ │ │ ├── ScrapCancelSideEffect.kt
│ │ │ └── ScrapCancelViewModel.kt
│ │ │ └── detail
│ │ │ ├── ScrapDialog.kt
│ │ │ ├── ScrapDialogSideEffect.kt
│ │ │ ├── ScrapDialogViewModel.kt
│ │ │ ├── component
│ │ │ ├── ColorPalette.kt
│ │ │ ├── ScrapColorChangeButton.kt
│ │ │ └── ScrapInfoRow.kt
│ │ │ └── state
│ │ │ └── ScrapDialogUiState.kt
│ │ └── res
│ │ ├── drawable
│ │ ├── ic_color_check.xml
│ │ └── ic_terning_launcher_background.xml
│ │ ├── raw
│ │ └── terning_scrap_cancel.json
│ │ └── values
│ │ ├── strings.xml
│ │ └── themes.xml
├── filtering
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── terning
│ │ │ └── feature
│ │ │ └── filtering
│ │ │ ├── filteringone
│ │ │ ├── FilteringOneRoute.kt
│ │ │ ├── FilteringOneSideEffect.kt
│ │ │ ├── FilteringOneState.kt
│ │ │ ├── FilteringOneViewModel.kt
│ │ │ ├── component
│ │ │ │ └── StatusOneRadioGroup.kt
│ │ │ └── navigation
│ │ │ │ └── FilteringOneNavigation.kt
│ │ │ ├── filteringthree
│ │ │ ├── FilteringThreeRoute.kt
│ │ │ ├── FilteringThreeSideEffect.kt
│ │ │ ├── FilteringThreeState.kt
│ │ │ ├── FilteringThreeViewModel.kt
│ │ │ ├── component
│ │ │ │ └── FilteringYearMonthPicker.kt
│ │ │ └── navigation
│ │ │ │ └── FilteringThreeNavigation.kt
│ │ │ ├── filteringtwo
│ │ │ ├── FilteringTwoRoute.kt
│ │ │ ├── FilteringTwoSideEffect.kt
│ │ │ ├── FilteringTwoState.kt
│ │ │ ├── FilteringTwoViewModel.kt
│ │ │ ├── component
│ │ │ │ └── StatusTwoRadioGroup.kt
│ │ │ └── navigation
│ │ │ │ └── FilteringTwoNavigation.kt
│ │ │ ├── startfiltering
│ │ │ ├── StartFilteringRoute.kt
│ │ │ ├── StartFilteringState.kt
│ │ │ ├── StartFilteringViewModel.kt
│ │ │ └── navigation
│ │ │ │ └── StartFilteringNavigation.kt
│ │ │ └── starthome
│ │ │ ├── StartHomeRoute.kt
│ │ │ ├── StartHomeState.kt
│ │ │ ├── StartHomeViewModel.kt
│ │ │ └── navigation
│ │ │ └── StartHomeNavigation.kt
│ │ └── res
│ │ ├── drawable
│ │ ├── ic_filtering_status1.xml
│ │ ├── ic_filtering_status2.xml
│ │ ├── ic_filtering_status3.xml
│ │ └── ic_terning_launcher_background.xml
│ │ ├── raw
│ │ ├── terning_onboarding_start.json
│ │ └── terning_start_home.json
│ │ └── values
│ │ ├── strings.xml
│ │ └── themes.xml
├── home
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── terning
│ │ │ └── feature
│ │ │ └── home
│ │ │ ├── HomeRoute.kt
│ │ │ ├── HomeSideEffect.kt
│ │ │ ├── HomeState.kt
│ │ │ ├── HomeViewModel.kt
│ │ │ ├── component
│ │ │ ├── HomeFilteringScreen.kt
│ │ │ ├── HomeRecommendEmptyIntern.kt
│ │ │ ├── HomeSortingButton.kt
│ │ │ ├── HomeUpcomingEmptyFilter.kt
│ │ │ ├── HomeUpcomingEmptyIntern.kt
│ │ │ ├── HomeUpcomingInternScreen.kt
│ │ │ └── bottomsheet
│ │ │ │ ├── HomeFilteringBottomSheet.kt
│ │ │ │ ├── HomeYearMonthPicker.kt
│ │ │ │ ├── JobFilteringScreen.kt
│ │ │ │ └── PlanFilteringScreen.kt
│ │ │ ├── model
│ │ │ └── HomeDialogState.kt
│ │ │ └── navigation
│ │ │ └── HomeNavigation.kt
│ │ └── res
│ │ ├── drawable
│ │ ├── ic_home_bookmark_28.xml
│ │ ├── ic_home_empty_filtering.xml
│ │ ├── ic_home_filtering_28.xml
│ │ ├── ic_home_scrap_empty.png
│ │ ├── ic_terning_launcher_background.xml
│ │ ├── ic_terning_logo_typo.xml
│ │ └── ic_terning_no_filter.xml
│ │ └── values
│ │ ├── strings.xml
│ │ └── themes.xml
├── intern
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── terning
│ │ │ │ └── feature
│ │ │ │ └── intern
│ │ │ │ ├── InternRoute.kt
│ │ │ │ ├── InternSideEffect.kt
│ │ │ │ ├── InternViewModel.kt
│ │ │ │ ├── component
│ │ │ │ ├── InternBottomBar.kt
│ │ │ │ ├── InternCompanyInfo.kt
│ │ │ │ ├── InternInfoRow.kt
│ │ │ │ ├── InternPageTitle.kt
│ │ │ │ └── InternTitle.kt
│ │ │ │ ├── model
│ │ │ │ ├── InternScrapState.kt
│ │ │ │ └── InternUiState.kt
│ │ │ │ └── navigation
│ │ │ │ └── InternNavigation.kt
│ │ └── res
│ │ │ ├── drawable
│ │ │ ├── ic_scrap_false_24.xml
│ │ │ ├── ic_scrap_true_24.xml
│ │ │ ├── ic_share_32.xml
│ │ │ ├── ic_terning_launcher_background.xml
│ │ │ ├── ic_terning_logo_typo.xml
│ │ │ └── ic_view_count_14.xml
│ │ │ └── values
│ │ │ ├── strings.xml
│ │ │ └── themes.xml
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── terning
│ │ └── intern
│ │ └── InternViewModelTest.kt
├── main
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── terning
│ │ │ └── feature
│ │ │ └── main
│ │ │ ├── MainActivity.kt
│ │ │ ├── MainNavigator.kt
│ │ │ ├── MainScreen.kt
│ │ │ ├── MainTab.kt
│ │ │ ├── component
│ │ │ └── MainBottomBar.kt
│ │ │ └── navigator
│ │ │ ├── NavigatorProviderIntent.kt
│ │ │ └── di
│ │ │ └── NavigatorModule.kt
│ │ └── res
│ │ ├── drawable
│ │ ├── ic_nav_calendar.xml
│ │ ├── ic_nav_home.xml
│ │ ├── ic_nav_my_page.xml
│ │ └── ic_nav_search.xml
│ │ └── values
│ │ ├── strings.xml
│ │ └── themes.xml
├── mypage
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── terning
│ │ │ └── feature
│ │ │ └── mypage
│ │ │ ├── mypage
│ │ │ ├── MyPageRoute.kt
│ │ │ ├── MyPageSideEffect.kt
│ │ │ ├── MyPageState.kt
│ │ │ ├── MyPageViewModel.kt
│ │ │ ├── component
│ │ │ │ ├── MyPageAlarmDialog.kt
│ │ │ │ ├── MyPageItem.kt
│ │ │ │ ├── MyPageProfile.kt
│ │ │ │ ├── MyPageSection.kt
│ │ │ │ └── MyPageToggleButton.kt
│ │ │ ├── model
│ │ │ │ ├── AlarmInfo.kt
│ │ │ │ └── MyPageUiModel.kt
│ │ │ ├── navigation
│ │ │ │ └── MyPageNavigation.kt
│ │ │ └── util
│ │ │ │ └── MyPageDefaults.kt
│ │ │ └── profileedit
│ │ │ ├── ProfileEditRoute.kt
│ │ │ ├── ProfileEditSideEffect.kt
│ │ │ ├── ProfileEditState.kt
│ │ │ ├── ProfileEditViewModel.kt
│ │ │ └── navigation
│ │ │ └── ProfileEditNavigation.kt
│ │ └── res
│ │ ├── drawable
│ │ ├── ic_my_page_alarm.xml
│ │ ├── ic_my_page_divider.xml
│ │ ├── ic_my_page_go_detail.xml
│ │ ├── ic_my_page_go_edit.xml
│ │ ├── ic_my_page_line.xml
│ │ ├── ic_my_page_notice.xml
│ │ ├── ic_my_page_opinion.xml
│ │ ├── ic_my_page_personal.xml
│ │ ├── ic_my_page_service.xml
│ │ ├── ic_my_page_version.xml
│ │ └── ic_terning_launcher_background.xml
│ │ └── values
│ │ ├── strings.xml
│ │ └── themes.xml
├── onboarding
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── terning
│ │ │ └── feature
│ │ │ └── onboarding
│ │ │ ├── signin
│ │ │ ├── SignInRoute.kt
│ │ │ ├── SignInSideEffect.kt
│ │ │ ├── SignInViewModel.kt
│ │ │ ├── component
│ │ │ │ └── KakaoButton.kt
│ │ │ └── navigation
│ │ │ │ └── SignInNavigation.kt
│ │ │ └── signup
│ │ │ ├── SignUpRoute.kt
│ │ │ ├── SignUpSideEffect.kt
│ │ │ ├── SignUpState.kt
│ │ │ ├── SignUpViewModel.kt
│ │ │ └── navigation
│ │ │ └── SignUpNavigation.kt
│ │ └── res
│ │ ├── drawable
│ │ ├── ic_sign_up_profile.xml
│ │ ├── ic_signin_kakao.xml
│ │ └── ic_terning_launcher_background.xml
│ │ ├── raw
│ │ └── terning_sign_in.json
│ │ └── values
│ │ ├── strings.xml
│ │ └── themes.xml
├── search
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── terning
│ │ │ └── feature
│ │ │ └── search
│ │ │ ├── search
│ │ │ ├── SearchRoute.kt
│ │ │ ├── SearchSideEffect.kt
│ │ │ ├── SearchViewModel.kt
│ │ │ ├── component
│ │ │ │ ├── BannerSlider.kt
│ │ │ │ ├── DotsIndicator.kt
│ │ │ │ ├── InternListType.kt
│ │ │ │ ├── SearchIntern.kt
│ │ │ │ └── SearchInternList.kt
│ │ │ ├── model
│ │ │ │ ├── SearchBannerListState.kt
│ │ │ │ ├── SearchScrapsListState.kt
│ │ │ │ └── SearchViewsListState.kt
│ │ │ └── navigation
│ │ │ │ └── SearchNavigation.kt
│ │ │ └── searchprocess
│ │ │ ├── SearchProcessRoute.kt
│ │ │ ├── SearchProcessSideEffect.kt
│ │ │ ├── SearchProcessViewModel.kt
│ │ │ ├── models
│ │ │ ├── SearchDialogState.kt
│ │ │ ├── SearchProcessState.kt
│ │ │ └── SearchResultState.kt
│ │ │ └── navigation
│ │ │ └── SearchProcessNavigation.kt
│ │ └── res
│ │ ├── drawable
│ │ ├── ic_home_empty_filtering.xml
│ │ ├── ic_nav_search.xml
│ │ ├── ic_search_18.xml
│ │ ├── ic_search_empty.xml
│ │ ├── ic_terning_launcher_background.xml
│ │ ├── ic_terning_logo_typo.xml
│ │ ├── img_ad_1.png
│ │ ├── img_ad_2.png
│ │ └── img_ad_3.png
│ │ ├── raw
│ │ └── terning_banner_loading.json
│ │ ├── values
│ │ ├── strings.xml
│ │ └── themes.xml
│ │ └── xml
│ │ ├── backup_rules.xml
│ │ └── data_extraction_rules.xml
├── splash
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── terning
│ │ │ └── feature
│ │ │ └── splash
│ │ │ ├── SplashRoute.kt
│ │ │ ├── SplashSideEffect.kt
│ │ │ ├── SplashViewModel.kt
│ │ │ ├── component
│ │ │ └── TerningUpdateDialog.kt
│ │ │ └── navigation
│ │ │ └── SplashNavigation.kt
│ │ └── res
│ │ ├── drawable
│ │ └── ic_splash.xml
│ │ └── values
│ │ └── strings.xml
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── res
│ ├── drawable
│ ├── ic_empty_logo.xml
│ ├── ic_filtering_status1.xml
│ ├── ic_filtering_status2.xml
│ ├── ic_filtering_status3.xml
│ ├── ic_first_info_20.xml
│ ├── ic_home_bookmark_28.xml
│ ├── ic_home_empty_filtering.xml
│ ├── ic_home_filtering_28.xml
│ ├── ic_home_scrap_empty.png
│ ├── ic_intern_share_22.xml
│ ├── ic_my_page_divider.xml
│ ├── ic_my_page_go_detail.xml
│ ├── ic_my_page_go_edit.xml
│ ├── ic_my_page_line.xml
│ ├── ic_my_page_notice.xml
│ ├── ic_my_page_opinion.xml
│ ├── ic_my_page_personal.xml
│ ├── ic_my_page_service.xml
│ ├── ic_my_page_version.xml
│ ├── ic_nav_calendar.xml
│ ├── ic_nav_home.xml
│ ├── ic_nav_my_page.xml
│ ├── ic_nav_search.xml
│ ├── ic_scrap_false_24.xml
│ ├── ic_scrap_true_24.xml
│ ├── ic_search_18.xml
│ ├── ic_search_empty.xml
│ ├── ic_second_info_20.xml
│ ├── ic_sign_up_profile.xml
│ ├── ic_signin_kakao.xml
│ ├── ic_splash.xml
│ ├── ic_terning_calendar_empty.xml
│ ├── ic_terning_launcher_background.xml
│ ├── ic_terning_logo_typo.xml
│ ├── ic_terning_no_filter.xml
│ ├── ic_terning_onboarding.xml
│ ├── ic_terning_scrap_empty.xml
│ ├── ic_view_count_14.xml
│ ├── img_ad_1.png
│ ├── img_ad_2.png
│ ├── img_ad_3.png
│ └── img_start.png
│ ├── mipmap-anydpi-v26
│ ├── ic_terning_launcher.xml
│ └── ic_terning_launcher_round.xml
│ ├── mipmap-hdpi
│ ├── ic_terning_launcher.webp
│ ├── ic_terning_launcher_foreground.webp
│ └── ic_terning_launcher_round.webp
│ ├── mipmap-mdpi
│ ├── ic_terning_launcher.webp
│ ├── ic_terning_launcher_foreground.webp
│ └── ic_terning_launcher_round.webp
│ ├── mipmap-xhdpi
│ ├── ic_terning_launcher.webp
│ ├── ic_terning_launcher_foreground.webp
│ └── ic_terning_launcher_round.webp
│ ├── mipmap-xxhdpi
│ ├── ic_terning_launcher.webp
│ ├── ic_terning_launcher_foreground.webp
│ └── ic_terning_launcher_round.webp
│ ├── mipmap-xxxhdpi
│ ├── ic_terning_launcher.webp
│ ├── ic_terning_launcher_foreground.webp
│ └── ic_terning_launcher_round.webp
│ ├── values
│ ├── strings.xml
│ └── themes.xml
│ └── xml
│ ├── backup_rules.xml
│ └── data_extraction_rules.xml
├── gradle.properties
├── gradle
├── libs.versions.toml
├── projectDependencyGraph.gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── project.dot.png
└── settings.gradle.kts
/.github/ISSUE_TEMPLATE/terning-issue-template.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Terning issue template
3 | about: terning default issue template
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | ## 🚩 TO DO
11 | - [ ] task1
12 | - [ ] task2
13 | - [ ] task3
14 |
15 |
16 |
--------------------------------------------------------------------------------
/.github/pull_request_template.md:
--------------------------------------------------------------------------------
1 | - closed #issue number
2 |
3 | ## *⛳️ Work Description*
4 | - task1
5 | - task2
6 | - task3
7 |
8 | ## *📸 Screenshot*
9 |
10 |
11 |
12 | ## *📢 To Reviewers*
13 | -
14 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/app/src/debug/ic_terning_launcher-playstore.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/debug/ic_terning_launcher-playstore.png
--------------------------------------------------------------------------------
/app/src/debug/res/mipmap-anydpi-v26/ic_terning_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/debug/res/mipmap-anydpi-v26/ic_terning_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/debug/res/mipmap-hdpi/ic_terning_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/debug/res/mipmap-hdpi/ic_terning_launcher.webp
--------------------------------------------------------------------------------
/app/src/debug/res/mipmap-hdpi/ic_terning_launcher_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/debug/res/mipmap-hdpi/ic_terning_launcher_foreground.webp
--------------------------------------------------------------------------------
/app/src/debug/res/mipmap-hdpi/ic_terning_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/debug/res/mipmap-hdpi/ic_terning_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/debug/res/mipmap-mdpi/ic_terning_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/debug/res/mipmap-mdpi/ic_terning_launcher.webp
--------------------------------------------------------------------------------
/app/src/debug/res/mipmap-mdpi/ic_terning_launcher_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/debug/res/mipmap-mdpi/ic_terning_launcher_foreground.webp
--------------------------------------------------------------------------------
/app/src/debug/res/mipmap-mdpi/ic_terning_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/debug/res/mipmap-mdpi/ic_terning_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/debug/res/mipmap-xhdpi/ic_terning_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/debug/res/mipmap-xhdpi/ic_terning_launcher.webp
--------------------------------------------------------------------------------
/app/src/debug/res/mipmap-xhdpi/ic_terning_launcher_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/debug/res/mipmap-xhdpi/ic_terning_launcher_foreground.webp
--------------------------------------------------------------------------------
/app/src/debug/res/mipmap-xhdpi/ic_terning_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/debug/res/mipmap-xhdpi/ic_terning_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/debug/res/mipmap-xxhdpi/ic_terning_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/debug/res/mipmap-xxhdpi/ic_terning_launcher.webp
--------------------------------------------------------------------------------
/app/src/debug/res/mipmap-xxhdpi/ic_terning_launcher_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/debug/res/mipmap-xxhdpi/ic_terning_launcher_foreground.webp
--------------------------------------------------------------------------------
/app/src/debug/res/mipmap-xxhdpi/ic_terning_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/debug/res/mipmap-xxhdpi/ic_terning_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/debug/res/mipmap-xxxhdpi/ic_terning_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/debug/res/mipmap-xxxhdpi/ic_terning_launcher.webp
--------------------------------------------------------------------------------
/app/src/debug/res/mipmap-xxxhdpi/ic_terning_launcher_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/debug/res/mipmap-xxxhdpi/ic_terning_launcher_foreground.webp
--------------------------------------------------------------------------------
/app/src/debug/res/mipmap-xxxhdpi/ic_terning_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/debug/res/mipmap-xxxhdpi/ic_terning_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/debug/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 안드로터닝
4 |
--------------------------------------------------------------------------------
/app/src/release/res/mipmap-anydpi-v26/ic_terning_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/release/res/mipmap-anydpi-v26/ic_terning_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/release/res/mipmap-hdpi/ic_terning_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/release/res/mipmap-hdpi/ic_terning_launcher.webp
--------------------------------------------------------------------------------
/app/src/release/res/mipmap-hdpi/ic_terning_launcher_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/release/res/mipmap-hdpi/ic_terning_launcher_foreground.webp
--------------------------------------------------------------------------------
/app/src/release/res/mipmap-hdpi/ic_terning_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/release/res/mipmap-hdpi/ic_terning_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/release/res/mipmap-mdpi/ic_terning_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/release/res/mipmap-mdpi/ic_terning_launcher.webp
--------------------------------------------------------------------------------
/app/src/release/res/mipmap-mdpi/ic_terning_launcher_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/release/res/mipmap-mdpi/ic_terning_launcher_foreground.webp
--------------------------------------------------------------------------------
/app/src/release/res/mipmap-mdpi/ic_terning_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/release/res/mipmap-mdpi/ic_terning_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/release/res/mipmap-xhdpi/ic_terning_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/release/res/mipmap-xhdpi/ic_terning_launcher.webp
--------------------------------------------------------------------------------
/app/src/release/res/mipmap-xhdpi/ic_terning_launcher_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/release/res/mipmap-xhdpi/ic_terning_launcher_foreground.webp
--------------------------------------------------------------------------------
/app/src/release/res/mipmap-xhdpi/ic_terning_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/release/res/mipmap-xhdpi/ic_terning_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/release/res/mipmap-xxhdpi/ic_terning_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/release/res/mipmap-xxhdpi/ic_terning_launcher.webp
--------------------------------------------------------------------------------
/app/src/release/res/mipmap-xxhdpi/ic_terning_launcher_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/release/res/mipmap-xxhdpi/ic_terning_launcher_foreground.webp
--------------------------------------------------------------------------------
/app/src/release/res/mipmap-xxhdpi/ic_terning_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/release/res/mipmap-xxhdpi/ic_terning_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/release/res/mipmap-xxxhdpi/ic_terning_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/release/res/mipmap-xxxhdpi/ic_terning_launcher.webp
--------------------------------------------------------------------------------
/app/src/release/res/mipmap-xxxhdpi/ic_terning_launcher_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/release/res/mipmap-xxxhdpi/ic_terning_launcher_foreground.webp
--------------------------------------------------------------------------------
/app/src/release/res/mipmap-xxxhdpi/ic_terning_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/app/src/release/res/mipmap-xxxhdpi/ic_terning_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/release/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | terning
4 |
--------------------------------------------------------------------------------
/baselineprofile/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/baselineprofile/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/build-logic/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/build-logic/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | `kotlin-dsl`
3 | `kotlin-dsl-precompiled-script-plugins`
4 | }
5 |
6 | dependencies {
7 | implementation(libs.android.gradlePlugin)
8 | implementation(libs.kotlin.gradlePlugin)
9 | compileOnly(libs.compose.compiler.extension)
10 | }
11 |
12 | tasks.named("compileTestKotlin") {
13 | dependsOn("clean")
14 | }
15 |
16 | tasks.named("processTestResources") {
17 | dependsOn("compileTestKotlin")
18 | }
19 |
20 | tasks.named("testClasses") {
21 | dependsOn("processTestResources")
22 | }
--------------------------------------------------------------------------------
/build-logic/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
2 | @Suppress("UnstableApiUsage")
3 | dependencyResolutionManagement {
4 | repositories {
5 | google()
6 | mavenCentral()
7 | }
8 | versionCatalogs {
9 | create("libs") {
10 | from(files("../gradle/libs.versions.toml"))
11 | }
12 | }
13 | }
--------------------------------------------------------------------------------
/build-logic/src/main/java/com/terning/build_logic/convention/CoroutineAndroid.kt:
--------------------------------------------------------------------------------
1 | package com.terning.build_logic.convention
2 |
3 | import com.terning.build_logic.extension.libs
4 | import org.gradle.api.Project
5 | import org.gradle.kotlin.dsl.dependencies
6 |
7 | internal fun Project.configureCoroutineAndroid() {
8 | val libs = extensions.libs
9 | configureCoroutineKotlin()
10 | dependencies {
11 | "implementation"(libs.findLibrary("coroutines.android").get())
12 | }
13 | }
14 |
15 | internal fun Project.configureCoroutineKotlin() {
16 | val libs = extensions.libs
17 | dependencies {
18 | "implementation"(libs.findLibrary("coroutines.core").get())
19 | "testImplementation"(libs.findLibrary("coroutines.test").get())
20 | }
21 | }
--------------------------------------------------------------------------------
/build-logic/src/main/java/com/terning/build_logic/convention/HiltKotlin.kt:
--------------------------------------------------------------------------------
1 | package com.terning.build_logic.convention
2 |
3 | import com.terning.build_logic.extension.libs
4 | import org.gradle.api.Plugin
5 | import org.gradle.api.Project
6 | import org.gradle.kotlin.dsl.dependencies
7 |
8 | internal fun Project.configureHiltKotlin() {
9 | with(pluginManager) {
10 | apply("com.google.devtools.ksp")
11 | }
12 |
13 | val libs = extensions.libs
14 | dependencies {
15 | "implementation"(libs.findLibrary("hilt.core").get())
16 | "ksp"(libs.findLibrary("hilt.compiler").get())
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/build-logic/src/main/java/com/terning/build_logic/convention/SerializationAndroid.kt:
--------------------------------------------------------------------------------
1 | package com.terning.build_logic.convention
2 |
3 | import com.terning.build_logic.extension.libs
4 | import org.gradle.api.Plugin
5 | import org.gradle.api.Project
6 | import org.gradle.kotlin.dsl.dependencies
7 |
8 | internal fun Project.configureSerializationAndroid() {
9 | with(pluginManager) {
10 | apply("org.jetbrains.kotlin.plugin.serialization")
11 | }
12 |
13 | val libs = extensions.libs
14 | dependencies {
15 | add("implementation", libs.findLibrary("kotlinx.serialization.json").get())
16 | }
17 | }
--------------------------------------------------------------------------------
/build-logic/src/main/java/com/terning/build_logic/extension/NameSpaceExtension.kt:
--------------------------------------------------------------------------------
1 | package com.terning.build_logic.extension
2 |
3 | import com.android.build.gradle.BaseExtension
4 | import org.gradle.api.Project
5 |
6 | fun Project.setNamespace(name: String) {
7 | extensions.findByType(BaseExtension::class.java)?.apply {
8 | namespace = "com.terning.$name"
9 | }
10 | }
--------------------------------------------------------------------------------
/build-logic/src/main/java/terning.android.application.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.convention.configureHiltAndroid
2 | import com.terning.build_logic.convention.configureKotlinAndroid
3 |
4 | plugins {
5 | id("com.android.application")
6 | }
7 |
8 | configureKotlinAndroid()
9 | configureHiltAndroid()
--------------------------------------------------------------------------------
/build-logic/src/main/java/terning.android.compose.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.convention.configureComposeAndroid
2 |
3 | configureComposeAndroid()
--------------------------------------------------------------------------------
/build-logic/src/main/java/terning.android.data.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.convention.configureHiltAndroid
2 | import com.terning.build_logic.convention.configureSerializationAndroid
3 | import com.terning.build_logic.extension.libs
4 |
5 | plugins {
6 | id("terning.android.library")
7 | }
8 |
9 | android {
10 | packaging {
11 | resources {
12 | excludes.add("META-INF/**")
13 | }
14 | }
15 | }
16 |
17 | configureHiltAndroid()
18 | configureSerializationAndroid()
19 |
20 | dependencies {
21 | val libs = project.extensions.libs
22 |
23 | // modules
24 | implementation(project(":core:network"))
25 |
26 | // ThirdPartyDependencies
27 | implementation(libs.findLibrary("timber").get())
28 | implementation(libs.findBundle("retrofit").get())
29 | }
--------------------------------------------------------------------------------
/build-logic/src/main/java/terning.android.library.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.convention.configureCoroutineAndroid
2 | import com.terning.build_logic.convention.configureHiltAndroid
3 | import com.terning.build_logic.convention.configureKotlinAndroid
4 |
5 | plugins {
6 | id("com.android.library")
7 | }
8 |
9 | configureKotlinAndroid()
10 | configureCoroutineAndroid()
11 | configureHiltAndroid()
--------------------------------------------------------------------------------
/build-logic/src/main/java/terning.kotlin.library.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.convention.configureCoroutineKotlin
2 | import com.terning.build_logic.convention.configureKotlin
3 |
4 | plugins {
5 | kotlin("jvm")
6 | }
7 |
8 | kotlin {
9 | jvmToolchain(8)
10 | }
11 |
12 | configureKotlin()
--------------------------------------------------------------------------------
/core/analytics/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/analytics/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/core/analytics/src/main/java/com/terning/core/analytics/EventType.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.analytics
2 |
3 | enum class EventType(val prefix: String) {
4 | SIGNUP("signup"),
5 | SCREEN("screen"),
6 | CLICK("click"),
7 | SCROLL("scroll"),
8 | PUSH_NOTIFICATION("push_notification")
9 | }
10 |
--------------------------------------------------------------------------------
/core/designsystem/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/designsystem/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.extension.setNamespace
2 |
3 | plugins {
4 | alias(libs.plugins.terning.library)
5 | alias(libs.plugins.terning.compose)
6 | alias(libs.plugins.dokka)
7 | }
8 |
9 | android {
10 | setNamespace("core.designsystem")
11 | }
12 |
13 | tasks.dokkaHtml.configure {
14 | dokkaSourceSets {
15 | named("main") {
16 | includes.from("docs.md")
17 | noAndroidSdkLink.set(false)
18 | }
19 | }
20 | }
21 |
22 | dependencies {
23 | implementation(libs.timber)
24 | implementation(libs.lottie)
25 | implementation(libs.coil.compose)
26 | implementation(libs.coil.network.okhttp)
27 | implementation(libs.kakao.share)
28 | }
--------------------------------------------------------------------------------
/core/designsystem/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/java/com/terning/core/designsystem/component/topappbar/BackButtonTopAppBar.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.designsystem.component.topappbar
2 |
3 | import androidx.compose.runtime.Composable
4 | import androidx.compose.ui.Modifier
5 |
6 | @Composable
7 | fun BackButtonTopAppBar(
8 | modifier: Modifier = Modifier,
9 | title: String = "",
10 | onBackButtonClick: (() -> Unit),
11 | actions: List<@Composable () -> Unit> = emptyList(),
12 | ) {
13 | TerningBasicTopAppBar(
14 | title = title,
15 | showBackButton = true,
16 | modifier = modifier,
17 | onBackButtonClick = { onBackButtonClick() },
18 | actions = actions
19 | )
20 | }
--------------------------------------------------------------------------------
/core/designsystem/src/main/java/com/terning/core/designsystem/extension/CalendarExt.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.designsystem.extension
2 |
3 | import java.util.Calendar
4 |
5 | val Calendar.currentYear: Int get() = get(Calendar.YEAR)
6 |
7 | val Calendar.currentMonth: Int get() = get(Calendar.MONTH) + 1
--------------------------------------------------------------------------------
/core/designsystem/src/main/java/com/terning/core/designsystem/extension/Map.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.designsystem.extension
2 |
3 | fun List?.isListNotEmpty():Boolean = this.orEmpty().isNotEmpty()
4 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/java/com/terning/core/designsystem/extension/TextStyle.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.designsystem.extension
2 |
3 | import androidx.compose.runtime.Composable
4 | import androidx.compose.ui.platform.LocalDensity
5 | import androidx.compose.ui.text.TextStyle
6 | import androidx.compose.ui.unit.Dp
7 |
8 | @Composable
9 | fun TextStyle.getFixHeightByMaxLine(maxLine: Int): Dp = with(LocalDensity.current) {
10 | lineHeight.toDp() * maxLine
11 | }
12 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/java/com/terning/core/designsystem/state/UiState.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.designsystem.state
2 |
3 | sealed interface UiState {
4 | data object Empty : UiState
5 |
6 | data object Loading : UiState
7 |
8 | data class Success(
9 | val data: T,
10 | ) : UiState
11 |
12 | data class Failure(
13 | val msg: String,
14 | ) : UiState
15 | }
16 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/java/com/terning/core/designsystem/type/AlarmType.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.designsystem.type
2 |
3 | enum class AlarmType(val value: String) {
4 | ENABLED("ENABLED"),
5 | DISABLED("DISABLED")
6 | }
7 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/java/com/terning/core/designsystem/type/NotificationRedirect.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.designsystem.type
2 |
3 | enum class DeeplinkType(val path: String) {
4 | CALENDAR("calendar"),
5 | HOME("home"),
6 | SEARCH("search"),
7 | KAKAOLINK("kakaolink"),
8 | INTERN("intern");
9 |
10 | companion object {
11 | fun from(type: String?): DeeplinkType? =
12 | entries.firstOrNull { it.path.equals(type, ignoreCase = true) }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/java/com/terning/core/designsystem/type/SortBy.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.designsystem.type
2 |
3 | import androidx.annotation.StringRes
4 | import com.terning.core.designsystem.R
5 |
6 | enum class SortBy(
7 | @StringRes val sortBy: Int,
8 | val type: String,
9 | ) {
10 | EARLIEST(R.string.sort_by_earliest, "deadlineSoon"),
11 | SHORTEST(R.string.sort_by_shortest, "shortestDuration"),
12 | LONGEST(R.string.sort_by_longest, "longestDuration"),
13 | SCRAP(R.string.sort_by_scrap, "mostScrapped"),
14 | VIEW_COUNT(R.string.sort_by_view_count, "mostViewed"),
15 | }
16 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/java/com/terning/core/designsystem/type/WorkingPeriod.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.designsystem.type
2 |
3 | import androidx.annotation.StringRes
4 | import com.terning.core.designsystem.R
5 |
6 | enum class WorkingPeriod(
7 | val stringValue: String,
8 | @StringRes val stringResId: Int,
9 | ) {
10 | SHORT("short", R.string.change_filter_period_1),
11 | MIDDLE("middle", R.string.change_filter_period_2),
12 | LONG("long", R.string.change_filter_period_3);
13 |
14 | companion object {
15 | fun fromString(value: String?): WorkingPeriod = when (value) {
16 | "short" -> SHORT
17 | "middle" -> MIDDLE
18 | "long" -> LONG
19 | else -> SHORT
20 | }
21 | }
22 | }
--------------------------------------------------------------------------------
/core/designsystem/src/main/java/com/terning/core/designsystem/util/CalendarDefaults.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.designsystem.util
2 |
3 | import com.terning.core.designsystem.extension.currentMonth
4 | import com.terning.core.designsystem.extension.currentYear
5 | import java.util.Calendar
6 |
7 | object CalendarDefaults {
8 | const val START_YEAR = 2010
9 | val END_YEAR =
10 | if (Calendar.getInstance().currentMonth >= 10) Calendar.getInstance().currentYear + 1
11 | else Calendar.getInstance().currentYear
12 | const val START_MONTH = 1
13 | const val END_MONTH = 12
14 | }
15 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.designsystem.util
2 |
3 | import android.net.Uri
4 |
5 | object DeeplinkDefaults {
6 | private const val SCHEME: String = "terning"
7 | const val REDIRECT: String = "redirect"
8 | const val INTERN_ID: String = "internId"
9 |
10 | fun build(
11 | host: String,
12 | redirect: String? = null,
13 | internId: String? = null
14 | ): String {
15 | val uriBuilder = Uri.Builder()
16 | .scheme(SCHEME)
17 | .authority(host)
18 |
19 | redirect?.let { uriBuilder.appendQueryParameter(REDIRECT, it) }
20 | internId?.let { uriBuilder.appendQueryParameter(INTERN_ID, it) }
21 |
22 | return uriBuilder.build().toString()
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/java/com/terning/core/designsystem/util/NoRippleInteractionSource.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.designsystem.util
2 |
3 | import androidx.compose.foundation.interaction.Interaction
4 | import androidx.compose.foundation.interaction.MutableInteractionSource
5 | import kotlinx.coroutines.flow.Flow
6 | import kotlinx.coroutines.flow.emptyFlow
7 |
8 | object NoRippleInteractionSource : MutableInteractionSource {
9 |
10 | override val interactions: Flow = emptyFlow()
11 |
12 | override suspend fun emit(interaction: Interaction) {}
13 |
14 | override fun tryEmit(interaction: Interaction) = true
15 | }
--------------------------------------------------------------------------------
/core/designsystem/src/main/java/com/terning/core/designsystem/util/NoRippleTheme.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.designsystem.util
2 |
3 | import androidx.compose.material.ripple.RippleAlpha
4 | import androidx.compose.material.ripple.RippleTheme
5 | import androidx.compose.runtime.Composable
6 | import androidx.compose.ui.graphics.Color
7 |
8 | object NoRippleTheme : RippleTheme {
9 | @Composable
10 | override fun defaultColor() = Color.Unspecified
11 |
12 | @Composable
13 | override fun rippleAlpha(): RippleAlpha = RippleAlpha(
14 | draggedAlpha = 0.0f,
15 | focusedAlpha = 0.0f,
16 | hoveredAlpha = 0.0f,
17 | pressedAlpha = 0.0f
18 | )
19 | }
--------------------------------------------------------------------------------
/core/designsystem/src/main/java/com/terning/core/designsystem/util/Regex.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.designsystem.util
2 |
3 | import java.util.regex.Pattern
4 |
5 | private const val NAME_ERROR_PATTERN =
6 | "[!@#\$%^&*(),.?\":{}|<>\\[\\]\\\\/\\-=+~`\\p{S}\\p{P}]"
7 | val NAME_ERROR_REGEX: Pattern =
8 | Pattern.compile(NAME_ERROR_PATTERN)
9 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/res/drawable/ic_back.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
9 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/res/drawable/ic_bookmark_filled.xml:
--------------------------------------------------------------------------------
1 |
6 |
13 |
14 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/res/drawable/ic_bookmark_outlined.xml:
--------------------------------------------------------------------------------
1 |
6 |
13 |
14 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/res/drawable/ic_calendar_next.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/res/drawable/ic_calendar_previous.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
9 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/res/drawable/ic_color_check.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/res/drawable/ic_down_18.xml:
--------------------------------------------------------------------------------
1 |
6 |
13 |
14 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/res/drawable/ic_down_22.xml:
--------------------------------------------------------------------------------
1 |
6 |
10 |
11 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/res/drawable/ic_name_text_field_check.xml:
--------------------------------------------------------------------------------
1 |
6 |
11 |
18 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/res/drawable/ic_right.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
9 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/res/drawable/ic_selected_character.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
14 |
15 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/res/drawable/ic_sign_in_selected.xml:
--------------------------------------------------------------------------------
1 |
6 |
11 |
12 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/res/drawable/ic_terning_profile_default.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/res/drawable/ic_up_22.xml:
--------------------------------------------------------------------------------
1 |
6 |
10 |
11 |
--------------------------------------------------------------------------------
/core/designsystem/src/main/res/font/pretendard_light.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/core/designsystem/src/main/res/font/pretendard_light.otf
--------------------------------------------------------------------------------
/core/designsystem/src/main/res/font/pretendard_medium.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/core/designsystem/src/main/res/font/pretendard_medium.otf
--------------------------------------------------------------------------------
/core/designsystem/src/main/res/font/pretendard_regular.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/core/designsystem/src/main/res/font/pretendard_regular.otf
--------------------------------------------------------------------------------
/core/designsystem/src/main/res/font/pretendard_semibold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/core/designsystem/src/main/res/font/pretendard_semibold.otf
--------------------------------------------------------------------------------
/core/firebase/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/firebase/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.extension.setNamespace
2 |
3 | plugins {
4 | alias(libs.plugins.terning.library)
5 | }
6 |
7 | android {
8 | setNamespace("core.firebase")
9 | }
10 |
11 | dependencies {
12 | //core
13 | implementation(projects.core.navigator)
14 | implementation(projects.core.designsystem)
15 | implementation(projects.core.analytics)
16 |
17 | // domain
18 | implementation(projects.domain.user)
19 |
20 | // timber
21 | implementation(libs.timber)
22 |
23 | // firebase
24 | implementation(platform(libs.firebase.bom))
25 | implementation(libs.firebase.messaging)
26 | implementation(libs.firebase.config)
27 |
28 | // coil
29 | implementation(libs.coil.compose)
30 | }
--------------------------------------------------------------------------------
/core/firebase/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/core/firebase/consumer-rules.pro
--------------------------------------------------------------------------------
/core/firebase/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/core/firebase/src/main/java/com/terning/core/firebase/di/FcmTokenModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.firebase.di
2 |
3 | import com.terning.core.firebase.fcmtoken.FcmTokenProvider
4 | import com.terning.core.firebase.fcmtoken.FcmTokenProviderImpl
5 | import dagger.Module
6 | import dagger.Provides
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | object FcmTokenModule {
14 | @Provides
15 | @Singleton
16 | fun provideFcmTokenProviderImpl(): FcmTokenProvider = FcmTokenProviderImpl()
17 | }
18 |
--------------------------------------------------------------------------------
/core/firebase/src/main/java/com/terning/core/firebase/di/RemoteConfigModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.firebase.di
2 |
3 | import com.terning.core.firebase.remoteconfig.TerningRemoteConfig
4 | import dagger.Module
5 | import dagger.Provides
6 | import dagger.hilt.InstallIn
7 | import dagger.hilt.components.SingletonComponent
8 | import javax.inject.Singleton
9 |
10 | @Module
11 | @InstallIn(SingletonComponent::class)
12 | object RemoteConfigModule {
13 |
14 | @Singleton
15 | @Provides
16 | fun provideFirebaseRemoteConfig(): TerningRemoteConfig = TerningRemoteConfig()
17 | }
18 |
--------------------------------------------------------------------------------
/core/firebase/src/main/java/com/terning/core/firebase/fcmtoken/FcmTokenProvider.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.firebase.fcmtoken
2 |
3 | interface FcmTokenProvider {
4 | suspend fun fetchFcmToken(): String
5 | }
--------------------------------------------------------------------------------
/core/firebase/src/main/java/com/terning/core/firebase/remoteconfig/RemoteConfigKey.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.firebase.remoteconfig
2 |
3 | enum class RemoteConfigKey(
4 | val key: String
5 | ) {
6 | LATEST_APP_VERSION(key = "android_app_version"),
7 | MAJOR_UPDATE_TITLE(key = "android_major_update_title"),
8 | MAJOR_UPDATE_BODY(key = "android_major_update_body"),
9 | PATCH_UPDATE_TITLE(key = "android_patch_update_title"),
10 | PATCH_UPDATE_BODY(key = "android_patch_update_body");
11 | }
--------------------------------------------------------------------------------
/core/firebase/src/main/res/mipmap-hdpi/ic_terning_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/core/firebase/src/main/res/mipmap-hdpi/ic_terning_launcher.webp
--------------------------------------------------------------------------------
/core/firebase/src/main/res/mipmap-mdpi/ic_terning_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/core/firebase/src/main/res/mipmap-mdpi/ic_terning_launcher.webp
--------------------------------------------------------------------------------
/core/firebase/src/main/res/mipmap-xhdpi/ic_terning_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/core/firebase/src/main/res/mipmap-xhdpi/ic_terning_launcher.webp
--------------------------------------------------------------------------------
/core/firebase/src/main/res/mipmap-xxhdpi/ic_terning_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/core/firebase/src/main/res/mipmap-xxhdpi/ic_terning_launcher.webp
--------------------------------------------------------------------------------
/core/firebase/src/main/res/mipmap-xxxhdpi/ic_terning_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/core/firebase/src/main/res/mipmap-xxxhdpi/ic_terning_launcher.webp
--------------------------------------------------------------------------------
/core/local/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/local/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.extension.setNamespace
2 |
3 | plugins {
4 | alias(libs.plugins.terning.library)
5 | }
6 |
7 | android {
8 | setNamespace("core.local")
9 | }
--------------------------------------------------------------------------------
/core/local/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/core/local/src/main/java/com/terning/core/local/TerningDataStore.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.local
2 |
3 | interface TerningDataStore {
4 | var accessToken: String
5 | var refreshToken: String
6 | var fcmToken: String
7 | var userId: Long
8 | var alarmAvailable: Boolean
9 | var hasRequestedPermission: Boolean
10 | fun clearInfo()
11 | }
--------------------------------------------------------------------------------
/core/navigation/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/navigation/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.terning.kotlin)
3 | }
--------------------------------------------------------------------------------
/core/navigation/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/core/navigation/src/main/java/com/terning/core/navigation/MainTabRoute.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.navigation
2 |
3 | interface MainTabRoute : Route
--------------------------------------------------------------------------------
/core/navigation/src/main/java/com/terning/core/navigation/Route.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.navigation
2 |
3 | interface Route
--------------------------------------------------------------------------------
/core/navigator/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/navigator/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.extension.setNamespace
2 |
3 | plugins {
4 | alias(libs.plugins.terning.library)
5 | }
6 |
7 | android {
8 | setNamespace("core.navigator")
9 | }
--------------------------------------------------------------------------------
/core/navigator/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/core/navigator/src/main/java/com/terning/navigator/NavigatorProvider.kt:
--------------------------------------------------------------------------------
1 | package com.terning.navigator
2 |
3 | import android.content.Intent
4 |
5 | interface NavigatorProvider {
6 | fun getMainActivityIntent(
7 | deeplink: String?,
8 | ): Intent
9 | }
--------------------------------------------------------------------------------
/core/network/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/network/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/core/network/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/core/network/src/main/java/com/terning/core/network/BaseResponse.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.network
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 | @Serializable
7 | data class BaseResponse(
8 | @SerialName("status")
9 | val status: Int,
10 | @SerialName("message")
11 | val message: String,
12 | @SerialName("result")
13 | val result: T,
14 | )
15 |
--------------------------------------------------------------------------------
/core/network/src/main/java/com/terning/core/network/NonDataBaseResponse.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.network
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 | @Serializable
7 | data class NonDataBaseResponse(
8 | @SerialName("status")
9 | val status: Int,
10 | @SerialName("message")
11 | val message: String,
12 | )
13 |
--------------------------------------------------------------------------------
/core/network/src/main/java/com/terning/core/network/RetrofitExt.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.network
2 |
3 | fun String?.isJsonObject(): Boolean = this?.startsWith("{") == true && this.endsWith("}")
4 |
5 | fun String?.isJsonArray(): Boolean = this?.startsWith("[") == true && this.endsWith("]")
--------------------------------------------------------------------------------
/core/network/src/main/java/com/terning/core/network/qualifier/RetrofitQualifier.kt:
--------------------------------------------------------------------------------
1 | package com.terning.core.network.qualifier
2 |
3 | import javax.inject.Qualifier
4 |
5 | @Qualifier
6 | @Retention(AnnotationRetention.BINARY)
7 | annotation class JWT
8 |
9 | @Qualifier
10 | @Retention(AnnotationRetention.BINARY)
11 | annotation class REISSUE
--------------------------------------------------------------------------------
/core/testing/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/testing/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.extension.setNamespace
2 |
3 | plugins {
4 | alias(libs.plugins.terning.library)
5 | }
6 |
7 | android {
8 | setNamespace("testing")
9 | }
10 |
11 | dependencies {
12 | api(libs.kotlinx.coroutines.test)
13 | api(libs.hilt.android.testing)
14 | api(libs.mockito.kotlin)
15 | api(libs.coroutines.test)
16 |
17 | implementation(libs.androidx.test.rules)
18 | implementation(libs.hilt.android.testing)
19 |
20 | testImplementation(libs.bundles.androidx.compose.ui.test)
21 | }
--------------------------------------------------------------------------------
/core/testing/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/core/testing/src/main/java/com/terning/testing/util/MainDispatcherRule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.testing.util
2 |
3 | import kotlinx.coroutines.Dispatchers
4 | import kotlinx.coroutines.ExperimentalCoroutinesApi
5 | import kotlinx.coroutines.test.TestDispatcher
6 | import kotlinx.coroutines.test.UnconfinedTestDispatcher
7 | import kotlinx.coroutines.test.resetMain
8 | import kotlinx.coroutines.test.setMain
9 | import org.junit.rules.TestWatcher
10 | import org.junit.runner.Description
11 |
12 | @OptIn(ExperimentalCoroutinesApi::class)
13 | class MainDispatcherRule(
14 | private val testDispatcher: TestDispatcher = UnconfinedTestDispatcher(),
15 | ) : TestWatcher() {
16 | override fun starting(description: Description) = Dispatchers.setMain(testDispatcher)
17 |
18 | override fun finished(description: Description) = Dispatchers.resetMain()
19 | }
20 |
--------------------------------------------------------------------------------
/core/testing/src/test/java/com/terning/testing/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | package com.terning.testing
2 |
3 | import org.junit.Test
4 |
5 | import org.junit.Assert.*
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * See [testing documentation](http://d.android.com/tools/testing).
11 | */
12 | class ExampleUnitTest {
13 | @Test
14 | fun addition_isCorrect() {
15 | assertEquals(4, 2 + 2)
16 | }
17 | }
--------------------------------------------------------------------------------
/data/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/auth/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/auth/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.extension.setNamespace
2 |
3 | plugins {
4 | alias(libs.plugins.terning.data)
5 | }
6 |
7 | android {
8 | setNamespace("data.auth")
9 | }
10 |
11 | dependencies {
12 | // domain
13 | implementation(projects.domain.auth)
14 | }
--------------------------------------------------------------------------------
/data/auth/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/data/auth/src/main/java/com/terning/data/auth/datasource/AuthDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.auth.datasource
2 |
3 | import com.terning.core.network.BaseResponse
4 | import com.terning.data.auth.dto.request.SignInRequestDto
5 | import com.terning.data.auth.dto.request.SignUpRequestDto
6 | import com.terning.data.auth.dto.response.SignInResponseDto
7 | import com.terning.data.auth.dto.response.SignUpResponseDto
8 |
9 | interface AuthDataSource {
10 |
11 | suspend fun postSignIn(
12 | authorization: String,
13 | request: SignInRequestDto
14 | ): BaseResponse
15 |
16 | suspend fun postSignUp(
17 | authId: String,
18 | request: SignUpRequestDto
19 | ): BaseResponse
20 |
21 | }
--------------------------------------------------------------------------------
/data/auth/src/main/java/com/terning/data/auth/di/DataSourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.auth.di
2 |
3 | import com.terning.data.auth.datasource.AuthDataSource
4 | import com.terning.data.auth.datasourceimpl.AuthDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | abstract class DataSourceModule {
14 | @Binds
15 | @Singleton
16 | abstract fun bindAuthDataSource(authDataSourceImpl: AuthDataSourceImpl): AuthDataSource
17 | }
--------------------------------------------------------------------------------
/data/auth/src/main/java/com/terning/data/auth/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.auth.di
2 |
3 | import com.terning.data.auth.repositoryimpl.AuthRepositoryImpl
4 | import com.terning.domain.auth.repository.AuthRepository
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | abstract class RepositoryModule {
14 | @Binds
15 | @Singleton
16 | abstract fun bindAuthRepository(authRepositoryImpl: AuthRepositoryImpl): AuthRepository
17 | }
--------------------------------------------------------------------------------
/data/auth/src/main/java/com/terning/data/auth/di/ServiceModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.auth.di
2 |
3 | import com.terning.core.network.qualifier.JWT
4 | import com.terning.data.auth.service.AuthService
5 | import dagger.Module
6 | import dagger.Provides
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import retrofit2.Retrofit
10 | import javax.inject.Singleton
11 |
12 | @Module
13 | @InstallIn(SingletonComponent::class)
14 | object ServiceModule {
15 | @Provides
16 | @Singleton
17 | fun provideAuthService(@JWT retrofit: Retrofit): AuthService =
18 | retrofit.create(AuthService::class.java)
19 | }
--------------------------------------------------------------------------------
/data/auth/src/main/java/com/terning/data/auth/dto/request/SignInRequestDto.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.auth.dto.request
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 | @Serializable
7 | data class SignInRequestDto(
8 | @SerialName("authType")
9 | val authType: String
10 | )
--------------------------------------------------------------------------------
/data/auth/src/main/java/com/terning/data/auth/dto/request/SignUpRequestDto.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.auth.dto.request
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 | @Serializable
7 | data class SignUpRequestDto(
8 | @SerialName("name")
9 | val name: String,
10 | @SerialName("profileImage")
11 | val profileImage: String,
12 | @SerialName("authType")
13 | val authType: String,
14 | @SerialName("fcmToken")
15 | val fcmToken: String
16 | )
--------------------------------------------------------------------------------
/data/auth/src/main/java/com/terning/data/auth/dto/response/SignInResponseDto.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.auth.dto.response
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 | @Serializable
7 | data class SignInResponseDto(
8 | @SerialName("accessToken")
9 | val accessToken: String?,
10 | @SerialName("refreshToken")
11 | val refreshToken: String?,
12 | @SerialName("userId")
13 | val userId: Long?,
14 | @SerialName("authId")
15 | val authId: String,
16 | @SerialName("authType")
17 | val authType: String
18 | )
--------------------------------------------------------------------------------
/data/auth/src/main/java/com/terning/data/auth/dto/response/SignUpResponseDto.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.auth.dto.response
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 | @Serializable
7 | data class SignUpResponseDto(
8 | @SerialName("accessToken")
9 | val accessToken: String,
10 | @SerialName("refreshToken")
11 | val refreshToken: String,
12 | @SerialName("userId")
13 | val userId: Long,
14 | @SerialName("authType")
15 | val authType: String,
16 | )
--------------------------------------------------------------------------------
/data/auth/src/main/java/com/terning/data/auth/mapper/SignInRequestMapper.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.auth.mapper
2 |
3 | import com.terning.data.auth.dto.request.SignInRequestDto
4 | import com.terning.domain.auth.entity.SignInRequest
5 |
6 | fun SignInRequest.toSignInRequestDto(): SignInRequestDto =
7 | SignInRequestDto(authType = authType)
--------------------------------------------------------------------------------
/data/auth/src/main/java/com/terning/data/auth/mapper/SignInResponseMapper.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.auth.mapper
2 |
3 | import com.terning.data.auth.dto.response.SignInResponseDto
4 | import com.terning.domain.auth.entity.SignInResponse
5 |
6 | fun SignInResponseDto.toSignInResponse(): SignInResponse =
7 | SignInResponse(
8 | accessToken = accessToken,
9 | refreshToken = refreshToken,
10 | userId = userId,
11 | authId = authId,
12 | authType = authType,
13 | )
14 |
--------------------------------------------------------------------------------
/data/auth/src/main/java/com/terning/data/auth/mapper/SignUpRequestMapper.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.auth.mapper
2 |
3 | import com.terning.data.auth.dto.request.SignUpRequestDto
4 | import com.terning.domain.auth.entity.SignUpRequest
5 |
6 | fun SignUpRequest.toSignUpRequestDto(): SignUpRequestDto =
7 | SignUpRequestDto(
8 | name = name,
9 | profileImage = profileImage,
10 | authType = authType,
11 | fcmToken = fcmToken
12 | )
--------------------------------------------------------------------------------
/data/auth/src/main/java/com/terning/data/auth/mapper/SignUpResponseMapper.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.auth.mapper
2 |
3 | import com.terning.data.auth.dto.response.SignUpResponseDto
4 | import com.terning.domain.auth.entity.SignUpResponse
5 |
6 | fun SignUpResponseDto.toSignUpResponse(): SignUpResponse =
7 | SignUpResponse(
8 | accessToken = accessToken,
9 | refreshToken = refreshToken,
10 | userId = userId,
11 | authType = authType
12 | )
13 |
--------------------------------------------------------------------------------
/data/calendar/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/calendar/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.extension.setNamespace
2 |
3 | plugins {
4 | alias(libs.plugins.terning.data)
5 | }
6 |
7 | android {
8 | setNamespace("data.calendar")
9 | }
10 |
11 | dependencies {
12 | // domain
13 | implementation(projects.domain.calendar)
14 | }
--------------------------------------------------------------------------------
/data/calendar/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/data/calendar/src/main/java/com/terning/data/calendar/di/DataSourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.calendar.di
2 |
3 | import com.terning.data.calendar.datasource.CalendarDataSource
4 | import com.terning.data.calendar.datasourceimpl.CalendarDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 |
12 | @Module
13 | @InstallIn(SingletonComponent::class)
14 | abstract class DataSourceModule {
15 | @Binds
16 | @Singleton
17 | abstract fun bindCalendarDataSource(calendarDataSourceImpl: CalendarDataSourceImpl): CalendarDataSource
18 | }
--------------------------------------------------------------------------------
/data/calendar/src/main/java/com/terning/data/calendar/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.calendar.di
2 |
3 | import com.terning.data.calendar.repositoryimpl.CalendarRepositoryImpl
4 | import com.terning.domain.calendar.repository.CalendarRepository
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | abstract class RepositoryModule {
14 | @Binds
15 | @Singleton
16 | abstract fun calendarRepository(calendarRepositoryImpl: CalendarRepositoryImpl): CalendarRepository
17 | }
--------------------------------------------------------------------------------
/data/calendar/src/main/java/com/terning/data/calendar/di/ServiceModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.calendar.di
2 |
3 | import com.terning.core.network.qualifier.JWT
4 | import com.terning.data.calendar.service.CalendarService
5 | import dagger.Module
6 | import dagger.Provides
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import retrofit2.Retrofit
10 | import javax.inject.Singleton
11 |
12 | @Module
13 | @InstallIn(SingletonComponent::class)
14 | object ServiceModule {
15 | @Provides
16 | @Singleton
17 | fun provideCalendarService(@JWT retrofit: Retrofit): CalendarService =
18 | retrofit.create(CalendarService::class.java)
19 | }
--------------------------------------------------------------------------------
/data/calendar/src/main/java/com/terning/data/calendar/dto/request/CalendarDayListRequestDto.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.calendar.dto.request
2 |
3 | data class CalendarDayListRequestDto(
4 | val date: String
5 | )
--------------------------------------------------------------------------------
/data/calendar/src/main/java/com/terning/data/calendar/dto/request/CalendarMonthListRequestDto.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.calendar.dto.request
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 | @Serializable
7 | data class CalendarMonthListRequestDto(
8 | @SerialName("deadline")
9 | val year: Int,
10 | @SerialName("scraps")
11 | val month: Int
12 | )
13 |
14 |
--------------------------------------------------------------------------------
/data/calendar/src/main/java/com/terning/data/calendar/dto/request/CalendarMonthRequestDto.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.calendar.dto.request
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 | @Serializable
7 | data class CalendarMonthRequestDto(
8 | @SerialName("year")
9 | val year: Int,
10 | @SerialName("month")
11 | val month: Int
12 | )
13 |
--------------------------------------------------------------------------------
/data/calendar/src/main/java/com/terning/data/calendar/dto/response/CalendarMonthResponseDto.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.calendar.dto.response
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 | @Serializable
7 | data class CalendarMonthResponseDto(
8 | @SerialName("deadline")
9 | val deadline: String,
10 | @SerialName("scraps")
11 | val scraps: List
12 | ) {
13 | @Serializable
14 | data class Scrap(
15 | @SerialName("scrapId")
16 | val scrapId: Long,
17 | @SerialName("title")
18 | val title: String,
19 | @SerialName("color")
20 | val color: String
21 | )
22 | }
--------------------------------------------------------------------------------
/data/calendar/src/main/java/com/terning/data/calendar/mapper/CalendarScrapDetailMapper.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.calendar.mapper
2 |
3 | import com.terning.data.calendar.dto.response.CalendarDayListResponseDto
4 | import com.terning.domain.calendar.entity.CalendarScrapDetail
5 |
6 | fun CalendarDayListResponseDto.toCalendarScrapDetail() =
7 | CalendarScrapDetail(
8 | internshipAnnouncementId = internshipAnnouncementId,
9 | title = title,
10 | dDay = dDay,
11 | workingPeriod = workingPeriod,
12 | color = color,
13 | companyImage = companyImage,
14 | startYearMonth = startYearMonth,
15 | deadline = deadline,
16 | isScrapped = isScrapped
17 | )
18 |
--------------------------------------------------------------------------------
/data/calendar/src/main/java/com/terning/data/calendar/mapper/CalendarScrapMapper.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.calendar.mapper
2 |
3 | import com.terning.data.calendar.dto.response.CalendarMonthResponseDto
4 | import com.terning.domain.calendar.entity.CalendarScrap
5 |
6 | fun CalendarMonthResponseDto.toCalendarScrapList(): List = scraps.map { scrap ->
7 | CalendarScrap(
8 | scrapId = scrap.scrapId,
9 | title = scrap.title,
10 | color = scrap.color,
11 | deadLine = deadline,
12 | isScrapped = true
13 | )
14 | }
--------------------------------------------------------------------------------
/data/filtering/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/filtering/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.extension.setNamespace
2 |
3 | plugins {
4 | alias(libs.plugins.terning.data)
5 | }
6 |
7 | android {
8 | setNamespace("data.filtering")
9 | }
10 |
11 | dependencies {
12 | // domain
13 | implementation(projects.domain.filtering)
14 | }
--------------------------------------------------------------------------------
/data/filtering/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/data/filtering/src/main/java/com/terning/data/filtering/datasource/FilteringDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.filtering.datasource
2 |
3 | import com.terning.core.network.NonDataBaseResponse
4 | import com.terning.data.filtering.dto.request.FilteringRequestDto
5 |
6 | interface FilteringDataSource {
7 | suspend fun postFiltering(userId: Long, request: FilteringRequestDto): NonDataBaseResponse
8 | }
--------------------------------------------------------------------------------
/data/filtering/src/main/java/com/terning/data/filtering/datasourceimpl/FilteringDataSourceImpl.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.filtering.datasourceimpl
2 |
3 | import com.terning.core.network.NonDataBaseResponse
4 | import com.terning.data.filtering.dto.request.FilteringRequestDto
5 | import com.terning.data.filtering.service.FilteringService
6 | import javax.inject.Inject
7 |
8 | class FilteringDataSourceImpl @Inject constructor(
9 | private val filteringService: FilteringService
10 | ) : com.terning.data.filtering.datasource.FilteringDataSource {
11 | override suspend fun postFiltering(
12 | userId: Long,
13 | request: FilteringRequestDto
14 | ): NonDataBaseResponse =
15 | filteringService.postFilteringService(userId, request)
16 | }
--------------------------------------------------------------------------------
/data/filtering/src/main/java/com/terning/data/filtering/di/DataSourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.filtering.di
2 |
3 | import com.terning.data.filtering.datasource.FilteringDataSource
4 | import com.terning.data.filtering.datasourceimpl.FilteringDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | abstract class DataSourceModule {
14 | @Binds
15 | @Singleton
16 | abstract fun bindFilteringDataSource(filteringDataSourceImpl: FilteringDataSourceImpl): FilteringDataSource
17 | }
--------------------------------------------------------------------------------
/data/filtering/src/main/java/com/terning/data/filtering/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.filtering.di
2 |
3 | import com.terning.data.filtering.repositoryimpl.FilteringRepositoryImpl
4 | import com.terning.domain.filtering.repository.FilteringRepository
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | abstract class RepositoryModule {
14 | @Binds
15 | @Singleton
16 | abstract fun bindFilteringRepository(filteringRepositoryImpl: FilteringRepositoryImpl): FilteringRepository
17 | }
--------------------------------------------------------------------------------
/data/filtering/src/main/java/com/terning/data/filtering/di/ServiceModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.filtering.di
2 |
3 | import com.terning.core.network.qualifier.JWT
4 | import com.terning.data.filtering.service.FilteringService
5 | import dagger.Module
6 | import dagger.Provides
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import retrofit2.Retrofit
10 | import javax.inject.Singleton
11 |
12 | @Module
13 | @InstallIn(SingletonComponent::class)
14 | object ServiceModule {
15 | @Provides
16 | @Singleton
17 | fun provideFilteringService(@JWT retrofit: Retrofit): FilteringService =
18 | retrofit.create(FilteringService::class.java)
19 | }
20 |
--------------------------------------------------------------------------------
/data/filtering/src/main/java/com/terning/data/filtering/dto/request/FilteringRequestDto.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.filtering.dto.request
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 | @Serializable
7 | data class FilteringRequestDto(
8 | @SerialName("grade")
9 | val grade: String,
10 | @SerialName("workingPeriod")
11 | val workingPeriod: String,
12 | @SerialName("startYear")
13 | val startYear: Int,
14 | @SerialName("startMonth")
15 | val startMonth: Int
16 | )
--------------------------------------------------------------------------------
/data/filtering/src/main/java/com/terning/data/filtering/mapper/FilteringMapper.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.filtering.mapper
2 |
3 | import com.terning.data.filtering.dto.request.FilteringRequestDto
4 | import com.terning.domain.filtering.entity.Filtering
5 |
6 | fun Filtering.toFilteringRequestDto(): FilteringRequestDto =
7 | FilteringRequestDto(
8 | grade = grade,
9 | workingPeriod = workingPeriod,
10 | startYear = startYear,
11 | startMonth = startMonth
12 | )
--------------------------------------------------------------------------------
/data/filtering/src/main/java/com/terning/data/filtering/service/FilteringService.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.filtering.service
2 |
3 | import com.terning.core.network.NonDataBaseResponse
4 | import com.terning.data.filtering.dto.request.FilteringRequestDto
5 | import retrofit2.http.Body
6 | import retrofit2.http.Header
7 | import retrofit2.http.POST
8 |
9 | interface FilteringService {
10 | @POST("/api/v1/auth/sign-up/filter")
11 | suspend fun postFilteringService(
12 | @Header("User-Id") userId: Long,
13 | @Body request: FilteringRequestDto
14 | ): NonDataBaseResponse
15 | }
--------------------------------------------------------------------------------
/data/home/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/home/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.extension.setNamespace
2 |
3 | plugins {
4 | alias(libs.plugins.terning.data)
5 | }
6 |
7 | android {
8 | setNamespace("data.home")
9 | }
10 |
11 | dependencies {
12 | // domain
13 | implementation(projects.domain.home)
14 |
15 | //paging
16 | implementation(libs.paging.runtime)
17 | }
--------------------------------------------------------------------------------
/data/home/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/data/home/src/main/java/com/terning/data/home/di/DataSourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.home.di
2 |
3 | import com.terning.data.home.datasource.HomeDataSource
4 | import com.terning.data.home.datasourceimpl.HomeDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | abstract class DataSourceModule {
14 | @Binds
15 | @Singleton
16 | abstract fun bindHomeDataSource(homeDataSourceImpl: HomeDataSourceImpl): HomeDataSource
17 | }
--------------------------------------------------------------------------------
/data/home/src/main/java/com/terning/data/home/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.home.di
2 |
3 | import com.terning.data.home.repositoryimpl.HomeRepositoryImpl
4 | import com.terning.domain.home.repository.HomeRepository
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | abstract class RepositoryModule {
14 | @Binds
15 | @Singleton
16 | abstract fun bindHomeRepository(homeRepositoryImpl: HomeRepositoryImpl): HomeRepository
17 | }
--------------------------------------------------------------------------------
/data/home/src/main/java/com/terning/data/home/di/ServiceModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.home.di
2 |
3 | import com.terning.core.network.qualifier.JWT
4 | import com.terning.data.home.service.HomeService
5 | import dagger.Module
6 | import dagger.Provides
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import retrofit2.Retrofit
10 | import javax.inject.Singleton
11 |
12 | @Module
13 | @InstallIn(SingletonComponent::class)
14 | object ServiceModule {
15 | @Provides
16 | @Singleton
17 | fun provideHomeService(@JWT retrofit: Retrofit): HomeService =
18 | retrofit.create(HomeService::class.java)
19 | }
--------------------------------------------------------------------------------
/data/home/src/main/java/com/terning/data/home/dto/request/FcmTokenRequestDto.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.home.dto.request
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 | @Serializable
7 | data class FcmTokenRequestDto(
8 | @SerialName("fcmToken")
9 | val fcmToken: String
10 | )
--------------------------------------------------------------------------------
/data/home/src/main/java/com/terning/data/home/dto/response/HomeFilteringInfoResponseDto.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.home.dto.response
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 | @Serializable
7 | data class HomeFilteringInfoResponseDto(
8 | @SerialName("grade")
9 | val grade: String?,
10 | @SerialName("workingPeriod")
11 | val workingPeriod: String?,
12 | @SerialName("startYear")
13 | val startYear: Int?,
14 | @SerialName("startMonth")
15 | val startMonth: Int?,
16 | @SerialName("jobType")
17 | val jobType: String,
18 | )
19 |
--------------------------------------------------------------------------------
/data/home/src/main/java/com/terning/data/home/mapper/FcmTokenMapper.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.home.mapper
2 |
3 | import com.terning.data.home.dto.request.FcmTokenRequestDto
4 | import com.terning.domain.home.entity.FcmToken
5 |
6 | fun FcmToken.toRequestDto(): FcmTokenRequestDto =
7 | FcmTokenRequestDto(
8 | fcmToken = fcmToken
9 | )
--------------------------------------------------------------------------------
/data/home/src/main/java/com/terning/data/home/mapper/HomeFilteringInfoMapper.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.home.mapper
2 |
3 | import com.terning.data.home.dto.response.HomeFilteringInfoResponseDto
4 | import com.terning.domain.home.entity.HomeFilteringInfo
5 |
6 | fun HomeFilteringInfoResponseDto.toHomeFilteringInfo(): HomeFilteringInfo =
7 | HomeFilteringInfo(
8 | grade = this.grade,
9 | workingPeriod = this.workingPeriod,
10 | startYear = this.startYear,
11 | startMonth = this.startMonth,
12 | jobType = this.jobType,
13 | )
--------------------------------------------------------------------------------
/data/home/src/main/java/com/terning/data/home/mapper/HomeRecommendInternMapper.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.home.mapper
2 |
3 | import com.terning.data.home.dto.response.HomeRecommendInternResponseDto
4 | import com.terning.domain.home.entity.HomeRecommendedIntern
5 |
6 |
7 | fun HomeRecommendInternResponseDto.Result.toHomeRecommendedIntern(totalCount: Int): HomeRecommendedIntern =
8 | HomeRecommendedIntern(
9 | totalCount = totalCount,
10 | internshipAnnouncementId = this.internshipAnnouncementId,
11 | companyImage = this.companyImage,
12 | dDay = this.dDay,
13 | title = this.title,
14 | workingPeriod = this.workingPeriod,
15 | isScrapped = this.isScrapped,
16 | color = this.color,
17 | deadline = this.deadline,
18 | startYearMonth = this.startYearMonth,
19 | )
--------------------------------------------------------------------------------
/data/intern/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/intern/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.extension.setNamespace
2 |
3 | plugins {
4 | alias(libs.plugins.terning.data)
5 | }
6 |
7 | android {
8 | setNamespace("data.intern")
9 | }
10 |
11 | dependencies {
12 | // domain
13 | implementation(projects.domain.intern)
14 | }
--------------------------------------------------------------------------------
/data/intern/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/data/intern/src/main/java/com/terning/data/intern/datasource/InternDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.intern.datasource
2 |
3 | import com.terning.core.network.BaseResponse
4 | import com.terning.data.intern.dto.response.InternResponseDto
5 |
6 | interface InternDataSource {
7 | suspend fun getInternInfo(id: Long): BaseResponse
8 | }
--------------------------------------------------------------------------------
/data/intern/src/main/java/com/terning/data/intern/datasourceimpl/InternDataSourceImpl.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.intern.datasourceimpl
2 |
3 | import com.terning.core.network.BaseResponse
4 | import com.terning.data.intern.datasource.InternDataSource
5 | import com.terning.data.intern.dto.response.InternResponseDto
6 | import com.terning.data.intern.service.InternService
7 | import javax.inject.Inject
8 |
9 | class InternDataSourceImpl @Inject constructor(
10 | private val internService: InternService,
11 | ) : InternDataSource {
12 | override suspend fun getInternInfo(id: Long): BaseResponse =
13 | internService.getInternInfo(id)
14 | }
--------------------------------------------------------------------------------
/data/intern/src/main/java/com/terning/data/intern/di/DataSourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.intern.di
2 |
3 | import com.terning.data.intern.datasource.InternDataSource
4 | import com.terning.data.intern.datasourceimpl.InternDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | abstract class DataSourceModule {
14 | @Binds
15 | @Singleton
16 | abstract fun bindInternInfoSource(internalInfoDataSourceImpl: InternDataSourceImpl): InternDataSource
17 | }
--------------------------------------------------------------------------------
/data/intern/src/main/java/com/terning/data/intern/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.intern.di
2 |
3 | import com.terning.data.intern.repositoryimpl.InternRepositoryImpl
4 | import com.terning.domain.intern.repository.InternRepository
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | abstract class RepositoryModule {
14 | @Binds
15 | @Singleton
16 | abstract fun bindInternRepository(internRepositoryImpl: InternRepositoryImpl): InternRepository
17 |
18 | }
--------------------------------------------------------------------------------
/data/intern/src/main/java/com/terning/data/intern/di/ServiceModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.intern.di
2 |
3 | import com.terning.core.network.qualifier.JWT
4 | import com.terning.data.intern.service.InternService
5 | import dagger.Module
6 | import dagger.Provides
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import retrofit2.Retrofit
10 | import javax.inject.Singleton
11 |
12 | @Module
13 | @InstallIn(SingletonComponent::class)
14 | object ServiceModule {
15 | @Provides
16 | @Singleton
17 | fun providerInternService(@JWT retrofit: Retrofit): InternService =
18 | retrofit.create(InternService::class.java)
19 | }
--------------------------------------------------------------------------------
/data/intern/src/main/java/com/terning/data/intern/repositoryimpl/InternRepositoryImpl.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.intern.repositoryimpl
2 |
3 | import com.terning.data.intern.datasource.InternDataSource
4 | import com.terning.data.intern.mapper.toInternInfo
5 | import com.terning.domain.intern.entity.InternInfo
6 | import com.terning.domain.intern.repository.InternRepository
7 | import javax.inject.Inject
8 |
9 | class InternRepositoryImpl @Inject constructor(
10 | private val internDataSource: InternDataSource,
11 | ) : InternRepository {
12 | override suspend fun getInternInfo(id: Long): Result = runCatching {
13 | internDataSource.getInternInfo(id).result.toInternInfo()
14 | }
15 | }
--------------------------------------------------------------------------------
/data/intern/src/main/java/com/terning/data/intern/service/InternService.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.intern.service
2 |
3 | import com.terning.core.network.BaseResponse
4 | import com.terning.data.intern.dto.response.InternResponseDto
5 | import retrofit2.http.GET
6 | import retrofit2.http.Path
7 |
8 | interface InternService {
9 | @GET("api/v1/announcements/{internshipAnnouncementId}")
10 | suspend fun getInternInfo(
11 | @Path("internshipAnnouncementId") internshipAnnouncementId: Long,
12 | ): BaseResponse
13 | }
--------------------------------------------------------------------------------
/data/mypage/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/mypage/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.extension.setNamespace
2 |
3 | plugins {
4 | alias(libs.plugins.terning.data)
5 | }
6 |
7 | android {
8 | setNamespace("data.mypage")
9 | }
10 |
11 | dependencies {
12 | // domain
13 | implementation(projects.domain.mypage)
14 | }
--------------------------------------------------------------------------------
/data/mypage/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/data/mypage/src/main/java/com/terning/data/mypage/di/DataSourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.mypage.di
2 |
3 | import com.terning.data.mypage.datasource.MyPageDataSource
4 | import com.terning.data.mypage.datasourceimpl.MyPageDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | abstract class DataSourceModule {
14 | @Binds
15 | @Singleton
16 | abstract fun bindMyPageDataSource(myPageDataSourceImpl: MyPageDataSourceImpl): MyPageDataSource
17 | }
--------------------------------------------------------------------------------
/data/mypage/src/main/java/com/terning/data/mypage/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.mypage.di
2 |
3 | import com.terning.data.mypage.repositoryimpl.MyPageRepositoryImpl
4 | import com.terning.domain.mypage.repository.MyPageRepository
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | abstract class RepositoryModule {
14 | @Binds
15 | @Singleton
16 | abstract fun bindMyPageRepository(myPageRepositoryImpl: MyPageRepositoryImpl): MyPageRepository
17 | }
--------------------------------------------------------------------------------
/data/mypage/src/main/java/com/terning/data/mypage/di/ServiceModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.mypage.di
2 |
3 | import com.terning.core.network.qualifier.JWT
4 | import com.terning.data.mypage.service.MyPageService
5 | import dagger.Module
6 | import dagger.Provides
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import retrofit2.Retrofit
10 | import javax.inject.Singleton
11 |
12 | @Module
13 | @InstallIn(SingletonComponent::class)
14 | object ServiceModule {
15 | @Provides
16 | @Singleton
17 | fun provideMyPageService(@JWT retrofit: Retrofit): MyPageService =
18 | retrofit.create(MyPageService::class.java)
19 | }
--------------------------------------------------------------------------------
/data/mypage/src/main/java/com/terning/data/mypage/dto/request/AlarmStatusRequestDto.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.mypage.dto.request
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 | @Serializable
7 | data class AlarmStatusRequestDto(
8 | @SerialName("newStatus")
9 | val newStatus: String
10 | )
11 |
--------------------------------------------------------------------------------
/data/mypage/src/main/java/com/terning/data/mypage/dto/request/MyPageProfileEditRequestDto.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.mypage.dto.request
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 | @Serializable
7 | data class MyPageProfileEditRequestDto(
8 | @SerialName("name")
9 | val name: String,
10 | @SerialName("profileImage")
11 | val profileImage: String,
12 | )
--------------------------------------------------------------------------------
/data/mypage/src/main/java/com/terning/data/mypage/dto/response/MyPageResponseDto.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.mypage.dto.response
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 | @Serializable
7 | data class MyPageResponseDto(
8 | @SerialName("name")
9 | val name: String,
10 | @SerialName("profileImage")
11 | val profileImage: String,
12 | @SerialName("authType")
13 | val authType: String,
14 | @SerialName("pushStatus")
15 | val pushStatus: String
16 | )
17 |
--------------------------------------------------------------------------------
/data/mypage/src/main/java/com/terning/data/mypage/mapper/AlarmStatusMapper.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.mypage.mapper
2 |
3 | import com.terning.data.mypage.dto.request.AlarmStatusRequestDto
4 | import com.terning.domain.mypage.entity.AlarmStatus
5 |
6 | fun AlarmStatus.toAlarmStatusRequestDto(): AlarmStatusRequestDto =
7 | AlarmStatusRequestDto(
8 | newStatus = newStatus
9 | )
10 |
--------------------------------------------------------------------------------
/data/mypage/src/main/java/com/terning/data/mypage/mapper/MyPageMapper.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.mypage.mapper
2 |
3 | import com.terning.data.mypage.dto.response.MyPageResponseDto
4 | import com.terning.domain.mypage.entity.MyPageProfile
5 |
6 | fun MyPageResponseDto.toMyPageProfile() =
7 | MyPageProfile(
8 | name = name,
9 | profileImage = profileImage,
10 | authType = authType,
11 | alarmStatus = pushStatus
12 | )
13 |
--------------------------------------------------------------------------------
/data/mypage/src/main/java/com/terning/data/mypage/mapper/MyPageProfileEditMapper.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.mypage.mapper
2 |
3 | import com.terning.data.mypage.dto.request.MyPageProfileEditRequestDto
4 | import com.terning.domain.mypage.entity.MyPageProfileEdit
5 |
6 | fun MyPageProfileEdit.toMyPageProfileEditRequestDto(): MyPageProfileEditRequestDto =
7 | MyPageProfileEditRequestDto(
8 | name = name,
9 | profileImage = profileImage
10 | )
11 |
--------------------------------------------------------------------------------
/data/scrap/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/scrap/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.extension.setNamespace
2 |
3 | plugins {
4 | alias(libs.plugins.terning.data)
5 | }
6 |
7 | android {
8 | setNamespace("data.scarp")
9 | }
10 |
11 | dependencies {
12 | // domain
13 | implementation(projects.domain.scrap)
14 | }
--------------------------------------------------------------------------------
/data/scrap/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/data/scrap/src/main/java/com/terning/data/scrap/datasource/ScrapDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.scrap.datasource
2 |
3 | import com.terning.core.network.NonDataBaseResponse
4 | import com.terning.domain.scrap.entity.CalendarScrapRequest
5 |
6 | interface ScrapDataSource {
7 | suspend fun postScrap(
8 | calendarScrapRequest: CalendarScrapRequest,
9 | ): NonDataBaseResponse
10 |
11 | suspend fun deleteScrap(
12 | calendarScrapRequest: CalendarScrapRequest,
13 | ): NonDataBaseResponse
14 |
15 | suspend fun patchScrap(
16 | calendarScrapRequest: CalendarScrapRequest,
17 | ): NonDataBaseResponse
18 | }
--------------------------------------------------------------------------------
/data/scrap/src/main/java/com/terning/data/scrap/di/DataSourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.scrap.di
2 |
3 | import com.terning.data.scrap.datasource.ScrapDataSource
4 | import com.terning.data.scrap.datasourceimpl.ScrapDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | abstract class DataSourceModule {
14 | @Binds
15 | @Singleton
16 | abstract fun bindScrapDataSource(scrapDataSourceImpl: ScrapDataSourceImpl): ScrapDataSource
17 |
18 | }
--------------------------------------------------------------------------------
/data/scrap/src/main/java/com/terning/data/scrap/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.scrap.di
2 |
3 | import com.terning.data.scrap.repositoryimpl.ScrapRepositoryImpl
4 | import com.terning.domain.scrap.repository.ScrapRepository
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | abstract class RepositoryModule {
14 | @Binds
15 | @Singleton
16 | abstract fun bindScrapRepository(scrapRepositoryImpl: ScrapRepositoryImpl): ScrapRepository
17 |
18 | }
--------------------------------------------------------------------------------
/data/scrap/src/main/java/com/terning/data/scrap/di/ServiceModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.scrap.di
2 |
3 | import com.terning.core.network.qualifier.JWT
4 | import com.terning.data.scrap.service.ScrapService
5 | import dagger.Module
6 | import dagger.Provides
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import retrofit2.Retrofit
10 | import javax.inject.Singleton
11 |
12 | @Module
13 | @InstallIn(SingletonComponent::class)
14 | object ServiceModule {
15 | @Provides
16 | @Singleton
17 | fun provideScrapService(@JWT retrofit: Retrofit): ScrapService =
18 | retrofit.create(ScrapService::class.java)
19 | }
--------------------------------------------------------------------------------
/data/scrap/src/main/java/com/terning/data/scrap/dto/request/ScrapColorRequestDto.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.scrap.dto.request
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 | @Serializable
7 | data class ScrapColorRequestDto(
8 | @SerialName("color")
9 | val color: String? = null,
10 | )
--------------------------------------------------------------------------------
/data/search/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/search/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.extension.setNamespace
2 |
3 | plugins {
4 | alias(libs.plugins.terning.data)
5 | }
6 |
7 | android {
8 | setNamespace("data.search")
9 | }
10 |
11 | dependencies {
12 | // domain
13 | implementation(projects.domain.search)
14 |
15 | // paging
16 | implementation(libs.androidx.paging.common.android)
17 | }
--------------------------------------------------------------------------------
/data/search/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/data/search/src/main/java/com/terning/data/search/datasource/SearchDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.search.datasource
2 |
3 | import com.terning.core.network.BaseResponse
4 | import com.terning.data.search.dto.request.SearchRequestDto
5 | import com.terning.data.search.dto.response.SearchAnnouncementResponseDto
6 | import com.terning.data.search.dto.response.SearchBannersResponseDto
7 | import com.terning.data.search.dto.response.SearchResultResponseDto
8 |
9 | interface SearchDataSource {
10 | suspend fun getSearch(request: SearchRequestDto): BaseResponse
11 | suspend fun getSearchViews(): BaseResponse
12 | suspend fun getSearchScraps(): BaseResponse
13 | suspend fun getSearchBanners(): BaseResponse
14 | }
--------------------------------------------------------------------------------
/data/search/src/main/java/com/terning/data/search/di/DataSourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.search.di
2 |
3 | import com.terning.data.search.datasource.SearchDataSource
4 | import com.terning.data.search.datasourceimpl.SearchDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | abstract class DataSourceModule {
14 | @Binds
15 | @Singleton
16 | abstract fun bindSearchDataSource(searchDataSourceImpl: SearchDataSourceImpl):
17 | SearchDataSource
18 | }
--------------------------------------------------------------------------------
/data/search/src/main/java/com/terning/data/search/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.search.di
2 |
3 | import com.terning.data.search.repositoryimpl.SearchRepositoryImpl
4 | import com.terning.domain.search.repository.SearchRepository
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | abstract class RepositoryModule {
14 | @Binds
15 | @Singleton
16 | abstract fun bindSearchRepository(searchRepositoryImpl: SearchRepositoryImpl): SearchRepository
17 | }
--------------------------------------------------------------------------------
/data/search/src/main/java/com/terning/data/search/di/ServiceModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.search.di
2 |
3 | import com.terning.core.network.qualifier.JWT
4 | import com.terning.data.search.service.SearchService
5 | import dagger.Module
6 | import dagger.Provides
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import retrofit2.Retrofit
10 | import javax.inject.Singleton
11 |
12 | @Module
13 | @InstallIn(SingletonComponent::class)
14 | object ServiceModule {
15 | @Provides
16 | @Singleton
17 | fun provideSearchService(@JWT retrofit: Retrofit): SearchService =
18 | retrofit.create(SearchService::class.java)
19 | }
--------------------------------------------------------------------------------
/data/search/src/main/java/com/terning/data/search/dto/request/SearchRequestDto.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.search.dto.request
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 | @Serializable
7 | data class SearchRequestDto(
8 | @SerialName("keyword")
9 | val keyword: String,
10 | @SerialName("sortBy")
11 | val sortBy: String,
12 | @SerialName("page")
13 | val page: Int,
14 | )
--------------------------------------------------------------------------------
/data/search/src/main/java/com/terning/data/search/dto/response/SearchAnnouncementResponseDto.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.search.dto.response
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 | @Serializable
7 | data class SearchAnnouncementResponseDto(
8 | @SerialName("announcements")
9 | val announcements: List,
10 | ) {
11 | @Serializable
12 | data class ScrapsAnnouncementDto(
13 | @SerialName("internshipAnnouncementId")
14 | val internshipAnnouncementId: Long,
15 | @SerialName("companyImage")
16 | val companyImage: String,
17 | @SerialName("title")
18 | val title: String,
19 | )
20 | }
--------------------------------------------------------------------------------
/data/search/src/main/java/com/terning/data/search/dto/response/SearchBannersResponseDto.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.search.dto.response
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 | @Serializable
7 | data class SearchBannersResponseDto(
8 | @SerialName("banners")
9 | val banners: List,
10 | ) {
11 | @Serializable
12 | data class BannerDto(
13 | @SerialName("imageUrl")
14 | val imageUrl: String,
15 | @SerialName("link")
16 | val link: String,
17 | )
18 | }
--------------------------------------------------------------------------------
/data/search/src/main/java/com/terning/data/search/mapper/SearchAnnouncementListMapper.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.search.mapper
2 |
3 | import com.terning.data.search.dto.response.SearchAnnouncementResponseDto
4 | import com.terning.domain.search.entity.SearchPopularAnnouncement
5 |
6 | fun SearchAnnouncementResponseDto.toSearchPopularAnnouncementList(): List {
7 | return announcements.map {
8 | SearchPopularAnnouncement(
9 | announcementId = it.internshipAnnouncementId,
10 | companyImage = it.companyImage,
11 | title = it.title,
12 | )
13 | }
14 | }
--------------------------------------------------------------------------------
/data/search/src/main/java/com/terning/data/search/mapper/SearchBannersMapper.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.search.mapper
2 |
3 | import com.terning.data.search.dto.response.SearchBannersResponseDto
4 | import com.terning.domain.search.entity.SearchBanner
5 |
6 | fun SearchBannersResponseDto.toSearchBannerList(): List {
7 | return banners.map {
8 | SearchBanner(
9 | imageUrl = it.imageUrl,
10 | url = it.link,
11 | )
12 | }
13 | }
--------------------------------------------------------------------------------
/data/search/src/main/java/com/terning/data/search/mapper/SearchResultMapper.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.search.mapper
2 |
3 | import com.terning.data.search.dto.response.SearchResultResponseDto
4 | import com.terning.domain.search.entity.SearchResult
5 |
6 | fun SearchResultResponseDto.SearchAnnouncementDto.toSearchResultList(totalCount: Int): SearchResult =
7 | SearchResult(
8 | totalCount = totalCount,
9 | internshipAnnouncementId = this.internshipAnnouncementId,
10 | title = this.title,
11 | dDay = this.dDay,
12 | workingPeriod = this.workingPeriod,
13 | companyImage = this.companyImage,
14 | isScrapped = this.isScrapped,
15 | deadline = this.deadline,
16 | startYearMonth = this.startYearMonth,
17 | color = this.color,
18 | )
--------------------------------------------------------------------------------
/data/tokenreissue/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/tokenreissue/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.extension.setNamespace
2 |
3 | plugins {
4 | alias(libs.plugins.terning.data)
5 | }
6 |
7 | android {
8 | setNamespace("data.tokenreissue")
9 | }
10 |
11 | dependencies {
12 | //domain
13 | implementation(projects.domain.tokenreissue)
14 | }
--------------------------------------------------------------------------------
/data/tokenreissue/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/data/tokenreissue/src/main/java/com/terning/data/tokenreissue/datasource/TokenReissueDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.datasource
2 |
3 | import com.terning.core.network.BaseResponse
4 | import com.terning.data.tokenreissue.dto.response.TokenReissueResponseDto
5 |
6 | interface TokenReissueDataSource {
7 | suspend fun postReissueToken(
8 | authorization: String,
9 | ): BaseResponse
10 | }
--------------------------------------------------------------------------------
/data/tokenreissue/src/main/java/com/terning/data/tokenreissue/datasourceimpl/TokenReissueDataSourceImpl.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.datasourceimpl
2 |
3 | import com.terning.core.network.BaseResponse
4 | import com.terning.data.datasource.TokenReissueDataSource
5 | import com.terning.data.tokenreissue.dto.response.TokenReissueResponseDto
6 | import com.terning.data.tokenreissue.service.TokenReissueService
7 | import javax.inject.Inject
8 |
9 | class TokenReissueDataSourceImpl @Inject constructor(
10 | private val tokenReissueService: TokenReissueService
11 | ) : TokenReissueDataSource {
12 | override suspend fun postReissueToken(
13 | authorization: String
14 | ): BaseResponse =
15 | tokenReissueService.postReissueToken("Bearer $authorization")
16 | }
--------------------------------------------------------------------------------
/data/tokenreissue/src/main/java/com/terning/data/tokenreissue/di/DataSourceModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.tokenreissue.di
2 |
3 | import com.terning.data.datasource.TokenReissueDataSource
4 | import com.terning.data.datasourceimpl.TokenReissueDataSourceImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | abstract class DataSourceModule {
14 | @Binds
15 | @Singleton
16 | abstract fun bindTokenReissueDataSource(tokenReissueDataSourceImpl: TokenReissueDataSourceImpl): TokenReissueDataSource
17 | }
--------------------------------------------------------------------------------
/data/tokenreissue/src/main/java/com/terning/data/tokenreissue/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.tokenreissue.di
2 |
3 | import com.terning.data.tokenreissue.repositoryimpl.TokenReissueRepositoryImpl
4 | import com.terning.domain.tokenreissue.repository.TokenReissueRepository
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | abstract class RepositoryModule {
14 | @Binds
15 | @Singleton
16 | abstract fun bindTokenReissueRepository(tokenReissueRepositoryImpl: TokenReissueRepositoryImpl): TokenReissueRepository
17 | }
--------------------------------------------------------------------------------
/data/tokenreissue/src/main/java/com/terning/data/tokenreissue/di/ServiceModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.tokenreissue.di
2 |
3 | import com.terning.core.network.qualifier.REISSUE
4 | import com.terning.data.tokenreissue.service.TokenReissueService
5 | import dagger.Module
6 | import dagger.Provides
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import retrofit2.Retrofit
10 | import javax.inject.Singleton
11 |
12 | @Module
13 | @InstallIn(SingletonComponent::class)
14 | object ServiceModule {
15 | @Provides
16 | @Singleton
17 | fun provideTokenReissueService(@REISSUE retrofit: Retrofit): TokenReissueService =
18 | retrofit.create(TokenReissueService::class.java)
19 | }
--------------------------------------------------------------------------------
/data/tokenreissue/src/main/java/com/terning/data/tokenreissue/dto/response/TokenReissueResponseDto.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.tokenreissue.dto.response
2 |
3 | import kotlinx.serialization.SerialName
4 | import kotlinx.serialization.Serializable
5 |
6 | @Serializable
7 | data class TokenReissueResponseDto(
8 | @SerialName("accessToken")
9 | val accessToken: String
10 | )
--------------------------------------------------------------------------------
/data/tokenreissue/src/main/java/com/terning/data/tokenreissue/mapper/TokenReissueMapper.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.tokenreissue.mapper
2 |
3 | import com.terning.data.tokenreissue.dto.response.TokenReissueResponseDto
4 | import com.terning.domain.tokenreissue.entity.TokenReissue
5 |
6 | fun TokenReissueResponseDto.toTokenReissue(): TokenReissue =
7 | TokenReissue(accessToken = accessToken)
8 |
--------------------------------------------------------------------------------
/data/tokenreissue/src/main/java/com/terning/data/tokenreissue/service/TokenReissueService.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.tokenreissue.service
2 |
3 | import com.terning.core.network.BaseResponse
4 | import com.terning.data.tokenreissue.dto.response.TokenReissueResponseDto
5 | import retrofit2.http.Header
6 | import retrofit2.http.POST
7 |
8 | interface TokenReissueService {
9 | @POST("/api/v1/auth/token-reissue")
10 | suspend fun postReissueToken(
11 | @Header("Authorization") authorization: String,
12 | ): BaseResponse
13 | }
--------------------------------------------------------------------------------
/data/update/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/update/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.extension.setNamespace
2 |
3 | plugins {
4 | alias(libs.plugins.terning.data)
5 | }
6 |
7 | android {
8 | setNamespace("data.update")
9 | }
10 |
11 | dependencies {
12 | // core
13 | implementation(projects.core.firebase)
14 |
15 | // domain
16 | implementation(projects.domain.update)
17 |
18 | }
--------------------------------------------------------------------------------
/data/update/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/data/update/src/main/java/com/terning/data/update/datasource/UpdateDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.update.datasource
2 |
3 | import com.terning.core.firebase.remoteconfig.RemoteConfigKey
4 | import com.terning.core.firebase.remoteconfig.TerningRemoteConfig
5 | import javax.inject.Inject
6 |
7 | class UpdateDataSource @Inject constructor(
8 | private val remoteConfig: TerningRemoteConfig,
9 | ) {
10 | fun fetchLatestAppVersion(callback: (Map) -> Unit) =
11 | remoteConfig.addOnVersionFetchCompleteListener {
12 | callback(it)
13 | }
14 | }
--------------------------------------------------------------------------------
/data/update/src/main/java/com/terning/data/update/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.update.di
2 |
3 | import com.terning.data.update.repositoryimpl.UpdateRepositoryImpl
4 | import com.terning.domain.update.repository.UpdateRepository
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | abstract class RepositoryModule {
14 |
15 | @Binds
16 | @Singleton
17 | abstract fun bindsUpdateRepository(updateRepositoryImpl: UpdateRepositoryImpl): UpdateRepository
18 | }
--------------------------------------------------------------------------------
/data/user/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/user/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.terning.build_logic.extension.setNamespace
2 |
3 | plugins {
4 | alias(libs.plugins.terning.data)
5 | }
6 |
7 | android {
8 | setNamespace("data.user")
9 | }
10 |
11 | dependencies {
12 | // core
13 | implementation(projects.core.local)
14 | implementation(projects.core.firebase)
15 |
16 | //domain
17 | implementation(projects.domain.user)
18 | }
--------------------------------------------------------------------------------
/data/user/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/data/user/src/main/java/com/terning/data/user/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.terning.data.user.di
2 |
3 | import com.terning.data.user.repositoryimpl.UserRepositoryImpl
4 | import com.terning.domain.user.repository.UserRepository
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | abstract class RepositoryModule {
14 | @Binds
15 | @Singleton
16 | abstract fun bindUserRepository(userRepositoryImpl: UserRepositoryImpl): UserRepository
17 | }
--------------------------------------------------------------------------------
/domain/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/domain/auth/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/domain/auth/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.terning.kotlin)
3 | }
--------------------------------------------------------------------------------
/domain/auth/src/main/java/com/terning/domain/auth/entity/SignInRequest.kt:
--------------------------------------------------------------------------------
1 | package com.terning.domain.auth.entity
2 |
3 | data class SignInRequest(
4 | val authType: String
5 | )
--------------------------------------------------------------------------------
/domain/auth/src/main/java/com/terning/domain/auth/entity/SignInResponse.kt:
--------------------------------------------------------------------------------
1 | package com.terning.domain.auth.entity
2 |
3 | data class SignInResponse(
4 | val accessToken: String?,
5 | val refreshToken: String?,
6 | val userId: Long?,
7 | val authId: String,
8 | val authType: String,
9 | )
--------------------------------------------------------------------------------
/domain/auth/src/main/java/com/terning/domain/auth/entity/SignUpRequest.kt:
--------------------------------------------------------------------------------
1 | package com.terning.domain.auth.entity
2 |
3 | data class SignUpRequest (
4 | val name : String,
5 | val profileImage : String,
6 | val authType : String,
7 | val fcmToken: String
8 | )
--------------------------------------------------------------------------------
/domain/auth/src/main/java/com/terning/domain/auth/entity/SignUpResponse.kt:
--------------------------------------------------------------------------------
1 | package com.terning.domain.auth.entity
2 |
3 | data class SignUpResponse(
4 | val accessToken: String,
5 | val refreshToken: String,
6 | val userId: Long,
7 | val authType: String
8 | )
--------------------------------------------------------------------------------
/domain/auth/src/main/java/com/terning/domain/auth/repository/AuthRepository.kt:
--------------------------------------------------------------------------------
1 | package com.terning.domain.auth.repository
2 |
3 | import com.terning.domain.auth.entity.SignInRequest
4 | import com.terning.domain.auth.entity.SignInResponse
5 | import com.terning.domain.auth.entity.SignUpRequest
6 | import com.terning.domain.auth.entity.SignUpResponse
7 |
8 | interface AuthRepository {
9 |
10 | suspend fun signIn(
11 | authorization: String,
12 | request: SignInRequest
13 | ): Result
14 |
15 | suspend fun signUp(
16 | authId: String,
17 | request: SignUpRequest
18 | ): Result
19 |
20 | }
--------------------------------------------------------------------------------
/domain/calendar/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/domain/calendar/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.terning.kotlin)
3 | }
--------------------------------------------------------------------------------
/domain/calendar/src/main/java/com/terning/domain/calendar/entity/CalendarScrap.kt:
--------------------------------------------------------------------------------
1 | package com.terning.domain.calendar.entity
2 |
3 | data class CalendarScrap(
4 | val scrapId: Long,
5 | val title: String,
6 | val deadLine: String,
7 | val color: String,
8 | val isScrapped: Boolean
9 | )
--------------------------------------------------------------------------------
/domain/calendar/src/main/java/com/terning/domain/calendar/entity/CalendarScrapDetail.kt:
--------------------------------------------------------------------------------
1 | package com.terning.domain.calendar.entity
2 |
3 | data class CalendarScrapDetail(
4 | val internshipAnnouncementId: Long,
5 | val title: String,
6 | val dDay: String,
7 | val workingPeriod: String,
8 | val deadline: String,
9 | val color: String,
10 | val companyImage: String,
11 | val startYearMonth: String,
12 | val isScrapped: Boolean
13 | )
14 |
--------------------------------------------------------------------------------
/domain/calendar/src/main/java/com/terning/domain/calendar/entity/CalendarScrapRequest.kt:
--------------------------------------------------------------------------------
1 | package com.terning.domain.calendar.entity
2 |
3 | data class CalendarScrapRequest(
4 | val id: Long,
5 | val color: String? = "red",
6 | )
--------------------------------------------------------------------------------
/domain/calendar/src/main/java/com/terning/domain/calendar/repository/CalendarRepository.kt:
--------------------------------------------------------------------------------
1 | package com.terning.domain.calendar.repository
2 |
3 | import com.terning.domain.calendar.entity.CalendarScrap
4 | import com.terning.domain.calendar.entity.CalendarScrapDetail
5 | import java.time.LocalDate
6 |
7 | interface CalendarRepository{
8 | suspend fun getScrapMonth(year: Int, month: Int): Result