├── .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>> 9 | suspend fun getScrapMonthList(year: Int, month: Int): Result>> 10 | suspend fun getScrapDayList(currentDate: LocalDate): Result> 11 | } -------------------------------------------------------------------------------- /domain/filtering/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /domain/filtering/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | alias(libs.plugins.terning.kotlin) 3 | } -------------------------------------------------------------------------------- /domain/filtering/src/main/java/com/terning/domain/filtering/entity/Filtering.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.filtering.entity 2 | 3 | data class Filtering( 4 | val grade: String, 5 | val workingPeriod: String, 6 | val startYear: Int, 7 | val startMonth: Int 8 | ) -------------------------------------------------------------------------------- /domain/filtering/src/main/java/com/terning/domain/filtering/repository/FilteringRepository.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.filtering.repository 2 | 3 | import com.terning.domain.filtering.entity.Filtering 4 | 5 | interface FilteringRepository { 6 | suspend fun postFiltering( 7 | userId: Long, 8 | request: Filtering 9 | ): Result 10 | } -------------------------------------------------------------------------------- /domain/home/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /domain/home/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | alias(libs.plugins.terning.kotlin) 3 | } 4 | 5 | dependencies { 6 | implementation(libs.paging.common) 7 | implementation(libs.coroutines.core) 8 | implementation(libs.coroutines.test) 9 | } -------------------------------------------------------------------------------- /domain/home/src/main/java/com/terning/domain/home/entity/ChangeFilteringRequestModel.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.home.entity 2 | 3 | data class ChangeFilteringRequestModel( 4 | val grade: String?, 5 | val workingPeriod: String?, 6 | val startYear: Int?, 7 | val startMonth: Int?, 8 | val jobType: String, 9 | ) 10 | -------------------------------------------------------------------------------- /domain/home/src/main/java/com/terning/domain/home/entity/FcmToken.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.home.entity 2 | 3 | data class FcmToken( 4 | val fcmToken: String 5 | ) -------------------------------------------------------------------------------- /domain/home/src/main/java/com/terning/domain/home/entity/HomeFilteringInfo.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.home.entity 2 | 3 | data class HomeFilteringInfo( 4 | val grade: String?, 5 | val workingPeriod: String?, 6 | val startYear: Int?, 7 | val startMonth: Int?, 8 | val jobType: String, 9 | ) 10 | -------------------------------------------------------------------------------- /domain/home/src/main/java/com/terning/domain/home/entity/HomeRecommendIntern.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.home.entity 2 | 3 | data class HomeRecommendIntern( 4 | val totalCount: Int, 5 | val homeRecommendInternDetail: List 6 | ) { 7 | data class HomeRecommendInternDetail( 8 | val internshipAnnouncementId: Long, 9 | val companyImage: String, 10 | val dDay: String, 11 | val title: String, 12 | val workingPeriod: String, 13 | val isScrapped: Boolean, 14 | val color: String?, 15 | val deadline: String, 16 | val startYearMonth: String, 17 | ) 18 | } 19 | -------------------------------------------------------------------------------- /domain/home/src/main/java/com/terning/domain/home/entity/HomeRecommendedIntern.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.home.entity 2 | 3 | data class HomeRecommendedIntern( 4 | val totalCount: Int, 5 | val internshipAnnouncementId: Long, 6 | val companyImage: String, 7 | val dDay: String, 8 | val title: String, 9 | val workingPeriod: String, 10 | val isScrapped: Boolean, 11 | val color: String?, 12 | val deadline: String, 13 | val startYearMonth: String, 14 | ) -------------------------------------------------------------------------------- /domain/home/src/main/java/com/terning/domain/home/entity/HomeUpcomingIntern.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.home.entity 2 | 3 | data class HomeUpcomingIntern( 4 | val hasScrapped: Boolean, 5 | val homeUpcomingInternDetail: List 6 | ) { 7 | data class HomeUpcomingInternDetail( 8 | val internshipAnnouncementId: Long, 9 | val companyImage: String, 10 | val title: String, 11 | val dDay: String, 12 | val deadline: String, 13 | val workingPeriod: String, 14 | val isScrapped: Boolean, 15 | val color: String, 16 | val startYearMonth: String, 17 | val companyInfo: String, 18 | ) 19 | } 20 | -------------------------------------------------------------------------------- /domain/intern/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /domain/intern/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | alias(libs.plugins.terning.kotlin) 3 | } -------------------------------------------------------------------------------- /domain/intern/src/main/java/com/terning/domain/intern/repository/InternRepository.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.intern.repository 2 | 3 | import com.terning.domain.intern.entity.InternInfo 4 | 5 | interface InternRepository { 6 | suspend fun getInternInfo(id: Long): Result 7 | } -------------------------------------------------------------------------------- /domain/mypage/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /domain/mypage/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | alias(libs.plugins.terning.kotlin) 3 | } -------------------------------------------------------------------------------- /domain/mypage/src/main/java/com/terning/domain/mypage/entity/AlarmStatus.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.mypage.entity 2 | 3 | data class AlarmStatus( 4 | val newStatus: String 5 | ) 6 | -------------------------------------------------------------------------------- /domain/mypage/src/main/java/com/terning/domain/mypage/entity/MyPageProfile.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.mypage.entity 2 | 3 | data class MyPageProfile( 4 | val name: String, 5 | val profileImage: String, 6 | val authType: String, 7 | val alarmStatus: String 8 | ) 9 | -------------------------------------------------------------------------------- /domain/mypage/src/main/java/com/terning/domain/mypage/entity/MyPageProfileEdit.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.mypage.entity 2 | 3 | data class MyPageProfileEdit( 4 | val name: String, 5 | val profileImage: String 6 | ) -------------------------------------------------------------------------------- /domain/mypage/src/main/java/com/terning/domain/mypage/repository/MyPageRepository.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.mypage.repository 2 | 3 | import com.terning.domain.mypage.entity.AlarmStatus 4 | import com.terning.domain.mypage.entity.MyPageProfile 5 | import com.terning.domain.mypage.entity.MyPageProfileEdit 6 | 7 | interface MyPageRepository { 8 | suspend fun postLogout(): Result 9 | 10 | suspend fun deleteQuit(): Result 11 | 12 | suspend fun getProfile(): Result 13 | 14 | suspend fun editProfile( 15 | request: MyPageProfileEdit 16 | ): Result 17 | 18 | suspend fun updateAlarmState( 19 | request: AlarmStatus 20 | ): Result 21 | } 22 | -------------------------------------------------------------------------------- /domain/scrap/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /domain/scrap/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | alias(libs.plugins.terning.kotlin) 3 | } -------------------------------------------------------------------------------- /domain/scrap/src/main/java/com/terning/domain/scrap/entity/CalendarScrapRequest.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.scrap.entity 2 | 3 | data class CalendarScrapRequest( 4 | val id: Long, 5 | val color: String? = "red", 6 | ) -------------------------------------------------------------------------------- /domain/scrap/src/main/java/com/terning/domain/scrap/repository/ScrapRepository.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.scrap.repository 2 | 3 | import com.terning.domain.scrap.entity.CalendarScrapRequest 4 | 5 | interface ScrapRepository { 6 | suspend fun postScrap(calendarScrapRequest: CalendarScrapRequest): Result 7 | suspend fun deleteScrap(calendarScrapRequest: CalendarScrapRequest): Result 8 | suspend fun patchScrap(calendarScrapRequest: CalendarScrapRequest): Result 9 | } -------------------------------------------------------------------------------- /domain/search/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /domain/search/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | alias(libs.plugins.terning.kotlin) 3 | } 4 | 5 | dependencies { 6 | implementation(libs.paging.common) 7 | } -------------------------------------------------------------------------------- /domain/search/src/main/java/com/terning/domain/search/entity/SearchBanner.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.search.entity 2 | 3 | data class SearchBanner( 4 | val imageUrl: String, 5 | val url: String, 6 | ) 7 | -------------------------------------------------------------------------------- /domain/search/src/main/java/com/terning/domain/search/entity/SearchPopularAnnouncement.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.search.entity 2 | 3 | data class SearchPopularAnnouncement( 4 | val title: String, 5 | val companyImage: String, 6 | val announcementId: Long, 7 | ) -------------------------------------------------------------------------------- /domain/search/src/main/java/com/terning/domain/search/entity/SearchResult.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.search.entity 2 | 3 | data class SearchResult( 4 | val totalCount: Int, 5 | val internshipAnnouncementId: Long, 6 | val title: String, 7 | val dDay: String, 8 | val workingPeriod: String, 9 | val companyImage: String, 10 | val isScrapped: Boolean, 11 | val deadline: String, 12 | val startYearMonth: String, 13 | val color: String?, 14 | ) 15 | -------------------------------------------------------------------------------- /domain/search/src/main/java/com/terning/domain/search/repository/SearchRepository.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.search.repository 2 | 3 | import androidx.paging.PagingData 4 | import com.terning.domain.search.entity.SearchBanner 5 | import com.terning.domain.search.entity.SearchPopularAnnouncement 6 | import com.terning.domain.search.entity.SearchResult 7 | import kotlinx.coroutines.flow.Flow 8 | 9 | interface SearchRepository { 10 | 11 | fun getSearchList( 12 | query: String, 13 | sortBy: String, 14 | ): Flow> 15 | 16 | suspend fun getSearchViewsList(): Result> 17 | suspend fun getSearchScrapsList(): Result> 18 | suspend fun getSearchBannersList(): Result> 19 | } -------------------------------------------------------------------------------- /domain/tokenreissue/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /domain/tokenreissue/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | alias(libs.plugins.terning.kotlin) 3 | } -------------------------------------------------------------------------------- /domain/tokenreissue/src/main/java/com/terning/domain/tokenreissue/entity/TokenReissue.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.tokenreissue.entity 2 | 3 | data class TokenReissue ( 4 | val accessToken : String 5 | ) -------------------------------------------------------------------------------- /domain/tokenreissue/src/main/java/com/terning/domain/tokenreissue/repository/TokenReissueRepository.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.tokenreissue.repository 2 | 3 | import com.terning.domain.tokenreissue.entity.TokenReissue 4 | 5 | interface TokenReissueRepository { 6 | suspend fun postReissueToken( 7 | authorization: String, 8 | ): Result 9 | } -------------------------------------------------------------------------------- /domain/update/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /domain/update/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | alias(libs.plugins.terning.kotlin) 3 | } 4 | 5 | dependencies { 6 | implementation(libs.semver) 7 | implementation(libs.javax.inject) 8 | } -------------------------------------------------------------------------------- /domain/update/src/main/java/com/terning/domain/update/entity/UpdateMessage.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.update.entity 2 | 3 | data class UpdateMessage( 4 | val version: String, 5 | val majorUpdateTitle: String, 6 | val majorUpdateBody: String, 7 | val patchUpdateTitle: String, 8 | val patchUpdateBody: String, 9 | ) 10 | -------------------------------------------------------------------------------- /domain/update/src/main/java/com/terning/domain/update/entity/UpdateState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.update.entity 2 | 3 | sealed class UpdateState { 4 | data object InitialState : UpdateState() 5 | data object NoUpdateAvailable : UpdateState() 6 | data class MajorUpdateAvailable(val title: String, val content: String) : UpdateState() 7 | data class PatchUpdateAvailable(val title: String, val content: String) : UpdateState() 8 | } -------------------------------------------------------------------------------- /domain/update/src/main/java/com/terning/domain/update/repository/UpdateRepository.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.update.repository 2 | 3 | import com.terning.domain.update.entity.UpdateMessage 4 | 5 | interface UpdateRepository { 6 | suspend fun fetchLatestAppVersion(callback: (message: UpdateMessage) -> Unit) 7 | } -------------------------------------------------------------------------------- /domain/user/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /domain/user/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | alias(libs.plugins.terning.kotlin) 3 | } -------------------------------------------------------------------------------- /domain/user/src/main/java/com/terning/domain/user/repository/UserRepository.kt: -------------------------------------------------------------------------------- 1 | package com.terning.domain.user.repository 2 | 3 | interface UserRepository { 4 | fun getAccessToken(): String 5 | 6 | fun setAccessToken(accessToken: String) 7 | 8 | fun getRefreshToken(): String 9 | 10 | fun setRefreshToken(refreshToken: String) 11 | 12 | fun getFcmToken(): String 13 | 14 | suspend fun fetchAndSetFcmToken(): Result 15 | 16 | fun getUserId(): Long 17 | 18 | fun setUserId(userId: Long) 19 | 20 | fun getAlarmAvailable(): Boolean 21 | 22 | fun setAlarmAvailable(availability: Boolean) 23 | 24 | fun setPermissionRequested(requested: Boolean) 25 | 26 | fun getPermissionRequested(): Boolean 27 | 28 | fun clearInfo() 29 | } 30 | -------------------------------------------------------------------------------- /feature/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature/calendar/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature/calendar/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import com.terning.build_logic.extension.setNamespace 2 | 3 | plugins { 4 | alias(libs.plugins.terning.feature) 5 | } 6 | 7 | android { 8 | setNamespace("feature.calendar") 9 | } 10 | 11 | dependencies { 12 | //domain 13 | implementation(projects.domain.calendar) 14 | 15 | // feature 16 | implementation(projects.feature.dialog) 17 | } -------------------------------------------------------------------------------- /feature/calendar/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature/calendar/src/main/java/com/terning/feature/calendar/calendar/model/CalendarUiState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.calendar.calendar.model 2 | 3 | data class CalendarUiState( 4 | val selectedDate: DayModel = DayModel(), 5 | val calendarModel: TerningCalendarModel = TerningCalendarModel(), 6 | val isListEnabled: Boolean = false, 7 | val isWeekEnabled: Boolean = false, 8 | ) -------------------------------------------------------------------------------- /feature/calendar/src/main/java/com/terning/feature/calendar/calendar/model/DayModel.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.calendar.calendar.model 2 | 3 | import androidx.compose.runtime.Immutable 4 | import java.time.LocalDate 5 | import java.time.format.DateTimeFormatter 6 | 7 | /** 8 | * 달력의 하루를 나타내는 데이터클래스 모델 9 | * 10 | * @param date 날짜 11 | * @param weekIndex 속한 주의 인덱스 12 | * @param isOutDate 이번 월에 포함되지 않는 날인지에 대한 불리언 값 13 | */ 14 | 15 | @Immutable 16 | data class DayModel( 17 | val date: LocalDate = LocalDate.now(), 18 | val weekIndex: Int = 0, 19 | val isOutDate: Boolean = false 20 | ) { 21 | fun isToday(): Boolean = date == LocalDate.now() 22 | 23 | fun getScrapMapKey(): String { 24 | val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") 25 | return date.format(formatter) 26 | } 27 | } -------------------------------------------------------------------------------- /feature/calendar/src/main/java/com/terning/feature/calendar/calendar/type/WeekDay.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.calendar.calendar.type 2 | 3 | enum class WeekDay( 4 | val nameInKorean: String, 5 | ) { 6 | SUNDAY(nameInKorean = "일"), 7 | MONDAY(nameInKorean = "월"), 8 | TUESDAY(nameInKorean = "화"), 9 | WEDNESDAY(nameInKorean = "수"), 10 | THURSDAY(nameInKorean = "목"), 11 | FRIDAY(nameInKorean = "금"), 12 | SATURDAY(nameInKorean = "토"); 13 | 14 | companion object { 15 | fun isSunday(weekDay: WeekDay): Boolean { 16 | return weekDay == SUNDAY 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /feature/calendar/src/main/java/com/terning/feature/calendar/list/CalendarListSideEffect.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.calendar.list 2 | 3 | import androidx.annotation.StringRes 4 | 5 | sealed class CalendarListSideEffect { 6 | data class ShowToast(@StringRes val message: Int) : CalendarListSideEffect() 7 | } -------------------------------------------------------------------------------- /feature/calendar/src/main/java/com/terning/feature/calendar/list/model/CalendarListUiState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.calendar.list.model 2 | 3 | import com.terning.core.designsystem.state.UiState 4 | import com.terning.domain.calendar.entity.CalendarScrapDetail 5 | import java.time.LocalDate 6 | 7 | data class CalendarListUiState( 8 | val loadState: UiState>> = UiState.Loading, 9 | val currentDate: LocalDate = LocalDate.now(), 10 | val scrapCancelDialogVisibility: Boolean = false, 11 | val scrapDetailDialogVisibility: Boolean = false, 12 | val internshipAnnouncementId: Long? = null, 13 | val internshipModel: CalendarScrapDetail? = null 14 | ) -------------------------------------------------------------------------------- /feature/calendar/src/main/java/com/terning/feature/calendar/month/CalendarMonthSideEffect.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.calendar.month 2 | 3 | import androidx.annotation.StringRes 4 | 5 | sealed class CalendarMonthSideEffect { 6 | data class ShowToast(@StringRes val message: Int) : CalendarMonthSideEffect() 7 | } -------------------------------------------------------------------------------- /feature/calendar/src/main/java/com/terning/feature/calendar/month/model/CalendarMonthUiState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.calendar.month.model 2 | 3 | import com.terning.core.designsystem.state.UiState 4 | import com.terning.domain.calendar.entity.CalendarScrap 5 | 6 | data class CalendarMonthUiState( 7 | val loadState: UiState>> = UiState.Loading 8 | ) -------------------------------------------------------------------------------- /feature/calendar/src/main/java/com/terning/feature/calendar/week/CalendarWeekSideEffect.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.calendar.week 2 | 3 | import androidx.annotation.StringRes 4 | 5 | sealed class CalendarWeekSideEffect { 6 | data class ShowToast(@StringRes val message: Int) : CalendarWeekSideEffect() 7 | } -------------------------------------------------------------------------------- /feature/calendar/src/main/java/com/terning/feature/calendar/week/model/CalendarWeekUiState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.calendar.week.model 2 | 3 | import com.terning.core.designsystem.state.UiState 4 | import com.terning.domain.calendar.entity.CalendarScrapDetail 5 | 6 | data class CalendarWeekUiState( 7 | val loadState: UiState> = UiState.Loading, 8 | val scrapCancelDialogVisibility: Boolean = false, 9 | val scrapDetailDialogVisibility: Boolean = false, 10 | val internshipAnnouncementId: Long? = null, 11 | val internshipModel: CalendarScrapDetail? = null 12 | ) -------------------------------------------------------------------------------- /feature/calendar/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /feature/dialog/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature/dialog/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import com.terning.build_logic.extension.setNamespace 2 | 3 | plugins { 4 | alias(libs.plugins.terning.feature) 5 | } 6 | 7 | android { 8 | setNamespace("featrue.dialog") 9 | } 10 | 11 | dependencies { 12 | // domain 13 | implementation(projects.domain.scrap) 14 | } -------------------------------------------------------------------------------- /feature/dialog/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature/dialog/src/main/java/com/terning/feature/dialog/cancel/ScrapCancelSideEffect.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.dialog.cancel 2 | 3 | import androidx.annotation.StringRes 4 | 5 | sealed class ScrapCancelSideEffect{ 6 | data class ShowToast(@StringRes val message: Int): ScrapCancelSideEffect() 7 | data object DismissDialog : ScrapCancelSideEffect() 8 | } -------------------------------------------------------------------------------- /feature/dialog/src/main/java/com/terning/feature/dialog/detail/ScrapDialogSideEffect.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.dialog.detail 2 | 3 | import androidx.annotation.StringRes 4 | 5 | sealed class ScrapDialogSideEffect{ 6 | data class ShowToast(@StringRes val message: Int): ScrapDialogSideEffect() 7 | data object DismissDialog : ScrapDialogSideEffect() 8 | data object ScrappedAnnouncement : ScrapDialogSideEffect() 9 | data object PatchedScrap: ScrapDialogSideEffect() 10 | data object NavigateToDetail : ScrapDialogSideEffect() 11 | } -------------------------------------------------------------------------------- /feature/dialog/src/main/java/com/terning/feature/dialog/detail/state/ScrapDialogUiState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.dialog.detail.state 2 | 3 | import com.terning.core.designsystem.type.ColorType 4 | 5 | data class ScrapDialogUiState( 6 | val initialColorType: ColorType = ColorType.RED, 7 | val selectedColorType: ColorType = ColorType.RED, 8 | val isColorChanged: Boolean = false, 9 | ) -------------------------------------------------------------------------------- /feature/dialog/src/main/res/drawable/ic_color_check.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /feature/dialog/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /feature/filtering/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature/filtering/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import com.terning.build_logic.extension.setNamespace 2 | 3 | plugins { 4 | alias(libs.plugins.terning.feature) 5 | } 6 | 7 | android { 8 | setNamespace("feature.filtering") 9 | } 10 | 11 | dependencies { 12 | // domain 13 | implementation(projects.domain.filtering) 14 | implementation(projects.domain.user) 15 | } -------------------------------------------------------------------------------- /feature/filtering/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature/filtering/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneSideEffect.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.filtering.filteringone 2 | 3 | sealed class FilteringOneSideEffect { 4 | data object NavigateUp : FilteringOneSideEffect() 5 | data class NavigateToFilteringTwo(val grade: String) : FilteringOneSideEffect() 6 | } -------------------------------------------------------------------------------- /feature/filtering/src/main/java/com/terning/feature/filtering/filteringone/FilteringOneState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.filtering.filteringone 2 | 3 | data class FilteringOneState( 4 | val isButtonValid: Boolean = false, 5 | val grade: String = "" 6 | ) -------------------------------------------------------------------------------- /feature/filtering/src/main/java/com/terning/feature/filtering/filteringthree/FilteringThreeSideEffect.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.filtering.filteringthree 2 | 3 | import androidx.annotation.StringRes 4 | 5 | sealed class FilteringThreeSideEffect { 6 | data object NavigateToStartHome : FilteringThreeSideEffect() 7 | data class ShowToast(@StringRes val message: Int) : FilteringThreeSideEffect() 8 | data object NavigateUp : FilteringThreeSideEffect() 9 | } -------------------------------------------------------------------------------- /feature/filtering/src/main/java/com/terning/feature/filtering/filteringthree/FilteringThreeState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.filtering.filteringthree 2 | 3 | data class FilteringThreeState( 4 | val grade: String = "", 5 | val workingPeriod: String = "", 6 | val startYear: Int = -1, 7 | val startMonth: Int = -1 8 | ) -------------------------------------------------------------------------------- /feature/filtering/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoSideEffect.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.filtering.filteringtwo 2 | 3 | sealed class FilteringTwoSideEffect { 4 | data object NavigateUp : FilteringTwoSideEffect() 5 | data class NavigateToFilteringThree(val grade: String, val workingPeriod: String) : 6 | FilteringTwoSideEffect() 7 | } -------------------------------------------------------------------------------- /feature/filtering/src/main/java/com/terning/feature/filtering/filteringtwo/FilteringTwoState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.filtering.filteringtwo 2 | 3 | data class FilteringTwoState( 4 | val isButtonValid: Boolean = false, 5 | val workingPeriod: String = "" 6 | ) -------------------------------------------------------------------------------- /feature/filtering/src/main/java/com/terning/feature/filtering/startfiltering/StartFilteringState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.filtering.startfiltering 2 | 3 | data class StartFilteringState( 4 | val isButtonVisible: Boolean = false 5 | ) -------------------------------------------------------------------------------- /feature/filtering/src/main/java/com/terning/feature/filtering/startfiltering/StartFilteringViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.filtering.startfiltering 2 | 3 | import androidx.lifecycle.ViewModel 4 | import kotlinx.coroutines.flow.MutableStateFlow 5 | import kotlinx.coroutines.flow.StateFlow 6 | import kotlinx.coroutines.flow.asStateFlow 7 | 8 | class StartFilteringViewModel : ViewModel() { 9 | 10 | private val _state: MutableStateFlow = 11 | MutableStateFlow(StartFilteringState()) 12 | val state: StateFlow get() = _state.asStateFlow() 13 | 14 | fun updateButtonState() { 15 | _state.value = _state.value.copy(isButtonVisible = true) 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /feature/filtering/src/main/java/com/terning/feature/filtering/starthome/StartHomeState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.filtering.starthome 2 | 3 | data class StartHomeState( 4 | val isButtonVisible: Boolean = false 5 | ) -------------------------------------------------------------------------------- /feature/filtering/src/main/java/com/terning/feature/filtering/starthome/StartHomeViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.filtering.starthome 2 | 3 | import androidx.lifecycle.ViewModel 4 | import kotlinx.coroutines.flow.MutableStateFlow 5 | import kotlinx.coroutines.flow.StateFlow 6 | import kotlinx.coroutines.flow.asStateFlow 7 | 8 | class StartHomeViewModel : ViewModel() { 9 | private val _state: MutableStateFlow = 10 | MutableStateFlow(StartHomeState()) 11 | val state: StateFlow get() = _state.asStateFlow() 12 | 13 | fun updateButtonState() { 14 | _state.value = _state.value.copy(isButtonVisible = true) 15 | } 16 | } -------------------------------------------------------------------------------- /feature/filtering/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /feature/home/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature/home/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import com.terning.build_logic.extension.configureComposeMetrics 2 | import com.terning.build_logic.extension.setNamespace 3 | 4 | plugins { 5 | alias(libs.plugins.terning.feature) 6 | } 7 | 8 | android { 9 | setNamespace("feature.home") 10 | } 11 | 12 | dependencies { 13 | // domain 14 | implementation(projects.domain.home) 15 | implementation(projects.domain.mypage) 16 | implementation(projects.domain.user) 17 | 18 | // feature 19 | implementation(projects.feature.dialog) 20 | 21 | // paging 22 | implementation(libs.paging.runtime) 23 | implementation(libs.paging.compose) 24 | 25 | // permission 26 | implementation(libs.permissions) 27 | } -------------------------------------------------------------------------------- /feature/home/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature/home/src/main/java/com/terning/feature/home/HomeSideEffect.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.home 2 | 3 | import androidx.annotation.StringRes 4 | 5 | sealed class HomeSideEffect { 6 | data class ShowToast(@StringRes val message: Int) : HomeSideEffect() 7 | data object NavigateToCalendar : HomeSideEffect() 8 | data class NavigateToIntern(val announcementId: Long) : HomeSideEffect() 9 | } -------------------------------------------------------------------------------- /feature/home/src/main/java/com/terning/feature/home/model/HomeDialogState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.home.model 2 | 3 | import androidx.compose.ui.graphics.Color 4 | import com.terning.core.designsystem.theme.CalRed 5 | 6 | data class HomeDialogState( 7 | val isColorChange: Boolean = false, 8 | val isPaletteOpen: Boolean = false, 9 | val selectedColor: Color = CalRed, 10 | val isScrapDialogVisible: Boolean = false, 11 | val isScrappedState: Boolean = false, 12 | val isToday: Boolean = false, 13 | ) -------------------------------------------------------------------------------- /feature/home/src/main/res/drawable/ic_home_scrap_empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/home/src/main/res/drawable/ic_home_scrap_empty.png -------------------------------------------------------------------------------- /feature/home/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /feature/intern/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature/intern/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import com.terning.build_logic.extension.setNamespace 2 | 3 | plugins { 4 | alias(libs.plugins.terning.feature) 5 | } 6 | 7 | android { 8 | setNamespace("feature.intern") 9 | } 10 | 11 | dependencies { 12 | // domain 13 | implementation(projects.domain.intern) 14 | 15 | // feature 16 | implementation(projects.feature.dialog) 17 | 18 | testImplementation(projects.core.testing) 19 | } -------------------------------------------------------------------------------- /feature/intern/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature/intern/src/main/java/com/terning/feature/intern/InternSideEffect.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.intern 2 | 3 | import androidx.annotation.StringRes 4 | 5 | sealed class InternSideEffect { 6 | data class Toast(@StringRes val message: Int) : 7 | InternSideEffect() 8 | } -------------------------------------------------------------------------------- /feature/intern/src/main/java/com/terning/feature/intern/model/InternScrapState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.intern.model 2 | 3 | import com.terning.core.designsystem.state.UiState 4 | 5 | data class InternScrapState( 6 | val isScrap: UiState = UiState.Loading, 7 | ) -------------------------------------------------------------------------------- /feature/intern/src/main/java/com/terning/feature/intern/model/InternUiState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.intern.model 2 | 3 | import androidx.compose.ui.graphics.Color 4 | import com.terning.core.designsystem.state.UiState 5 | import com.terning.core.designsystem.theme.CalRed 6 | import com.terning.domain.intern.entity.InternInfo 7 | 8 | data class InternUiState( 9 | val loadState: UiState = UiState.Loading, 10 | val isColorChange: Boolean = false, 11 | val selectedColor: Color = CalRed, 12 | val scrapCancelDialogVisibility: Boolean = false, 13 | val internDialogVisibility: Boolean = false, 14 | val isScrappedState: Boolean = false, 15 | val showWeb: Boolean = false, 16 | val internshipModel: InternInfo? = null, 17 | ) -------------------------------------------------------------------------------- /feature/intern/src/main/res/drawable/ic_scrap_false_24.xml: -------------------------------------------------------------------------------- 1 | 6 | 13 | 14 | -------------------------------------------------------------------------------- /feature/intern/src/main/res/drawable/ic_scrap_true_24.xml: -------------------------------------------------------------------------------- 1 | 6 | 13 | 14 | -------------------------------------------------------------------------------- /feature/intern/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /feature/main/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature/main/src/main/java/com/terning/feature/main/navigator/NavigatorProviderIntent.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.main.navigator 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import com.terning.feature.main.MainActivity 6 | import com.terning.navigator.NavigatorProvider 7 | import dagger.hilt.android.qualifiers.ApplicationContext 8 | import javax.inject.Inject 9 | 10 | class NavigatorProviderIntent @Inject constructor( 11 | @ApplicationContext private val context: Context, 12 | ) : NavigatorProvider { 13 | override fun getMainActivityIntent(deeplink: String?): Intent = 14 | MainActivity.getIntent(context = context) 15 | } -------------------------------------------------------------------------------- /feature/main/src/main/java/com/terning/feature/main/navigator/di/NavigatorModule.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.main.navigator.di 2 | 3 | import com.terning.feature.main.navigator.NavigatorProviderIntent 4 | import com.terning.navigator.NavigatorProvider 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 | interface NavigatorModule { 14 | @Binds 15 | @Singleton 16 | fun bindNavigatorIntent(navigatorProviderIntent: NavigatorProviderIntent): NavigatorProvider 17 | } 18 | -------------------------------------------------------------------------------- /feature/main/src/main/res/drawable/ic_nav_home.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /feature/main/src/main/res/drawable/ic_nav_my_page.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /feature/main/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 캘린더 7 | 탐색 8 | 마이 9 | 10 | terning 11 | 12 | 13 | -------------------------------------------------------------------------------- /feature/main/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /feature/mypage/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature/mypage/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import com.terning.build_logic.extension.setNamespace 2 | 3 | plugins { 4 | alias(libs.plugins.terning.feature) 5 | } 6 | 7 | android { 8 | setNamespace("feature.mypage") 9 | 10 | defaultConfig { 11 | buildConfigField("String", "VERSION_NAME", "\"${libs.versions.versionName.get()}\"") 12 | } 13 | buildFeatures { 14 | buildConfig = true 15 | } 16 | } 17 | 18 | dependencies { 19 | // domain 20 | implementation(projects.domain.mypage) 21 | implementation(projects.domain.user) 22 | 23 | // kakao 24 | implementation(libs.kakao.user) 25 | 26 | // permission 27 | implementation(libs.permissions) 28 | } -------------------------------------------------------------------------------- /feature/mypage/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature/mypage/src/main/java/com/terning/feature/mypage/mypage/MyPageSideEffect.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.mypage.mypage 2 | 3 | import androidx.annotation.StringRes 4 | 5 | sealed class MyPageSideEffect { 6 | data object NavigateToProfileEdit : MyPageSideEffect() 7 | data object NavigateToNoticeWebView : MyPageSideEffect() 8 | data object NavigateToOpinionWebView : MyPageSideEffect() 9 | data object NavigateToServiceWebView : MyPageSideEffect() 10 | data object NavigateToPersonalWebView : MyPageSideEffect() 11 | data class ShowToast(@StringRes val message: Int) : MyPageSideEffect() 12 | data object RestartApp : MyPageSideEffect() 13 | } -------------------------------------------------------------------------------- /feature/mypage/src/main/java/com/terning/feature/mypage/mypage/MyPageState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.mypage.mypage 2 | 3 | import com.terning.core.designsystem.state.UiState 4 | import com.terning.core.designsystem.type.AlarmType.DISABLED 5 | 6 | data class MyPageState( 7 | val isGetSuccess: UiState = UiState.Loading, 8 | val name: String = "", 9 | val profileImage: String = "", 10 | val authType: String = "", 11 | val showNotice: Boolean = false, 12 | val showOpinion: Boolean = false, 13 | val showService: Boolean = false, 14 | val showPersonal: Boolean = false, 15 | val showLogoutBottomSheet: Boolean = false, 16 | val showQuitBottomSheet: Boolean = false, 17 | val showAlarmDialog: Boolean = false, 18 | val alarmStatus: String = DISABLED.value, 19 | ) 20 | -------------------------------------------------------------------------------- /feature/mypage/src/main/java/com/terning/feature/mypage/mypage/model/AlarmInfo.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.mypage.mypage.model 2 | 3 | internal data class AlarmInfo( 4 | val id: String, 5 | val isAlarmAvailable: Boolean 6 | ) -------------------------------------------------------------------------------- /feature/mypage/src/main/java/com/terning/feature/mypage/mypage/model/MyPageUiModel.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.mypage.mypage.model 2 | 3 | import androidx.compose.runtime.Composable 4 | import androidx.compose.runtime.Immutable 5 | import androidx.compose.runtime.Stable 6 | 7 | @Stable 8 | internal sealed interface MyPageUiModel { 9 | @Immutable 10 | data class Header( 11 | val text: Int 12 | ) : MyPageUiModel 13 | 14 | @Immutable 15 | data class MyPageItem( 16 | val leadingIcon: Int, 17 | val text: Int, 18 | val onItemClick: () -> Unit = {}, 19 | val trailingContent: @Composable () -> Unit = {}, 20 | ) : MyPageUiModel 21 | 22 | @Immutable 23 | data object HorizontalDivider : MyPageUiModel 24 | } -------------------------------------------------------------------------------- /feature/mypage/src/main/java/com/terning/feature/mypage/mypage/util/MyPageDefaults.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.mypage.mypage.util 2 | 3 | object MyPageDefaults { 4 | const val NOTICE_URL = 5 | "https://abundant-quiver-13f.notion.site/Android-49b3cc2390ee4dc389e25a5097736944" 6 | const val OPINION_URL = "https://forms.gle/AaLpVptfg6cATYWa7" 7 | const val SERVICE_URL = 8 | "https://abundant-quiver-13f.notion.site/69109213e7db4873be6b9600f2f5163a?pvs=4" 9 | const val PERSONAL_URL = 10 | "https://abundant-quiver-13f.notion.site/130cf1915fe7471e9aaf29cab306be3b?pvs=4" 11 | } -------------------------------------------------------------------------------- /feature/mypage/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditSideEffect.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.mypage.profileedit 2 | 3 | import androidx.annotation.StringRes 4 | 5 | sealed class ProfileEditSideEffect { 6 | data object NavigateUp : ProfileEditSideEffect() 7 | data class ShowToast(@StringRes val message: Int) : ProfileEditSideEffect() 8 | } -------------------------------------------------------------------------------- /feature/mypage/src/main/java/com/terning/feature/mypage/profileedit/ProfileEditState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.mypage.profileedit 2 | 3 | data class ProfileEditState( 4 | val name: String = "", 5 | val initialName: String = "", 6 | val profile: String = "", 7 | val initialProfile: String = "", 8 | val initialView: Boolean = true, 9 | val isModified: Boolean = false, 10 | val isNameChangedOnce: Boolean = false, 11 | val isProfileChangedButNameSame: Boolean = false, 12 | val isButtonValid: Boolean = false, 13 | val authType: String = "", 14 | val showBottomSheet: Boolean = false 15 | ) -------------------------------------------------------------------------------- /feature/mypage/src/main/res/drawable/ic_my_page_divider.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /feature/mypage/src/main/res/drawable/ic_my_page_go_detail.xml: -------------------------------------------------------------------------------- 1 | 6 | 13 | 14 | -------------------------------------------------------------------------------- /feature/mypage/src/main/res/drawable/ic_my_page_go_edit.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /feature/mypage/src/main/res/drawable/ic_my_page_line.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /feature/mypage/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /feature/onboarding/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature/onboarding/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import com.terning.build_logic.extension.setNamespace 2 | 3 | plugins { 4 | alias(libs.plugins.terning.feature) 5 | } 6 | 7 | android { 8 | setNamespace("feature.onboarding") 9 | } 10 | 11 | dependencies { 12 | // domain 13 | implementation(projects.domain.auth) 14 | implementation(projects.domain.user) 15 | 16 | // kakao 17 | implementation(libs.kakao.user) 18 | } -------------------------------------------------------------------------------- /feature/onboarding/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature/onboarding/src/main/java/com/terning/feature/onboarding/signin/SignInSideEffect.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.onboarding.signin 2 | 3 | import androidx.annotation.StringRes 4 | 5 | sealed class SignInSideEffect { 6 | data object NavigateToHome : SignInSideEffect() 7 | data class NavigateSignUp(val authId: String) : SignInSideEffect() 8 | data class ShowToast(@StringRes val message: Int) : SignInSideEffect() 9 | data object StartKakaoTalkLogin : SignInSideEffect() 10 | data object StartKakaoWebLogin : SignInSideEffect() 11 | data class SignInFailure(val error: Throwable) : SignInSideEffect() 12 | } -------------------------------------------------------------------------------- /feature/onboarding/src/main/java/com/terning/feature/onboarding/signup/SignUpSideEffect.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.onboarding.signup 2 | 3 | import androidx.annotation.StringRes 4 | 5 | sealed class SignUpSideEffect { 6 | data object NavigateToStartFiltering : SignUpSideEffect() 7 | data class ShowToast(@StringRes val message: Int) : SignUpSideEffect() 8 | } -------------------------------------------------------------------------------- /feature/onboarding/src/main/java/com/terning/feature/onboarding/signup/SignUpState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.onboarding.signup 2 | 3 | data class SignUpState( 4 | val name: String = "", 5 | val profileImage: String = "basic", 6 | val isButtonValid: Boolean = false, 7 | val authId: String = "", 8 | val showBottomSheet: Boolean = false 9 | ) -------------------------------------------------------------------------------- /feature/onboarding/src/main/res/drawable/ic_sign_up_profile.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /feature/onboarding/src/main/res/drawable/ic_signin_kakao.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 9 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /feature/onboarding/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | terning 4 | 5 | 6 | 카카오로 로그인하기 7 | 카카오톡 로그인에 실패했습니다 8 | 로그인을 취소하였습니다 9 | 10 | 11 | 반가워요!\n닉네임을 알려주세요 12 | 프로필 이미지 13 | 프로필 버튼 14 | 닉네임 15 | 닉네임을 입력해 주세요 16 | 다음으로 17 | 18 | 19 | -------------------------------------------------------------------------------- /feature/onboarding/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /feature/search/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature/search/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import com.terning.build_logic.extension.setNamespace 2 | 3 | plugins { 4 | alias(libs.plugins.terning.feature) 5 | } 6 | 7 | android { 8 | setNamespace("feature.search") 9 | } 10 | 11 | dependencies { 12 | // domain 13 | implementation(projects.domain.search) 14 | 15 | // feature 16 | implementation(projects.feature.dialog) 17 | 18 | // paging 19 | implementation(libs.paging.runtime) 20 | implementation(libs.paging.compose) 21 | } -------------------------------------------------------------------------------- /feature/search/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature/search/src/main/java/com/terning/feature/search/search/SearchSideEffect.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.search.search 2 | 3 | import androidx.annotation.StringRes 4 | 5 | sealed class SearchSideEffect { 6 | data class ShowToast(@StringRes val message: Int) : SearchSideEffect() 7 | } -------------------------------------------------------------------------------- /feature/search/src/main/java/com/terning/feature/search/search/component/InternListType.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.search.search.component 2 | 3 | enum class InternListType(val type: String) { 4 | VIEW("view"), 5 | SCRAP("scrap"); 6 | } 7 | -------------------------------------------------------------------------------- /feature/search/src/main/java/com/terning/feature/search/search/model/SearchBannerListState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.search.search.model 2 | 3 | import com.terning.core.designsystem.state.UiState 4 | import com.terning.domain.search.entity.SearchBanner 5 | 6 | data class SearchBannerListState( 7 | var searchBannersList: UiState> = UiState.Loading, 8 | ) -------------------------------------------------------------------------------- /feature/search/src/main/java/com/terning/feature/search/search/model/SearchScrapsListState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.search.search.model 2 | 3 | import com.terning.core.designsystem.state.UiState 4 | import com.terning.domain.search.entity.SearchPopularAnnouncement 5 | 6 | data class SearchScrapsListState( 7 | var searchScrapsList: UiState> = UiState.Loading, 8 | ) 9 | -------------------------------------------------------------------------------- /feature/search/src/main/java/com/terning/feature/search/search/model/SearchViewsListState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.search.search.model 2 | 3 | import com.terning.core.designsystem.state.UiState 4 | import com.terning.domain.search.entity.SearchPopularAnnouncement 5 | 6 | data class SearchViewsListState( 7 | var searchViewsList: UiState> = UiState.Loading, 8 | ) -------------------------------------------------------------------------------- /feature/search/src/main/java/com/terning/feature/search/searchprocess/SearchProcessSideEffect.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.search.searchprocess 2 | 3 | import androidx.annotation.StringRes 4 | 5 | sealed class SearchProcessSideEffect { 6 | data class ShowToast(@StringRes val message: Int) : SearchProcessSideEffect() 7 | data class ScrapUpdate(val keyword: String) : SearchProcessSideEffect() 8 | data class NavigateIntern(val internshipAnnouncementId: Long) : SearchProcessSideEffect() 9 | } -------------------------------------------------------------------------------- /feature/search/src/main/java/com/terning/feature/search/searchprocess/models/SearchDialogState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.search.searchprocess.models 2 | 3 | import androidx.compose.ui.graphics.Color 4 | import com.terning.core.designsystem.theme.CalRed 5 | 6 | data class SearchDialogState( 7 | val selectedColor: Color = CalRed, 8 | val isScrapDialogVisible: Boolean = false, 9 | val scrapped: Boolean = false, 10 | val isScrappedState: Boolean = false, 11 | ) -------------------------------------------------------------------------------- /feature/search/src/main/java/com/terning/feature/search/searchprocess/models/SearchResultState.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.search.searchprocess.models 2 | 3 | import com.terning.core.designsystem.state.UiState 4 | import com.terning.domain.search.entity.SearchResult 5 | 6 | data class SearchResultState( 7 | var searchListState: UiState> = UiState.Loading, 8 | ) -------------------------------------------------------------------------------- /feature/search/src/main/res/drawable/ic_search_18.xml: -------------------------------------------------------------------------------- 1 | 6 | 13 | 14 | -------------------------------------------------------------------------------- /feature/search/src/main/res/drawable/img_ad_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/search/src/main/res/drawable/img_ad_1.png -------------------------------------------------------------------------------- /feature/search/src/main/res/drawable/img_ad_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/search/src/main/res/drawable/img_ad_2.png -------------------------------------------------------------------------------- /feature/search/src/main/res/drawable/img_ad_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/search/src/main/res/drawable/img_ad_3.png -------------------------------------------------------------------------------- /feature/search/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /feature/search/src/main/res/xml/backup_rules.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 13 | -------------------------------------------------------------------------------- /feature/search/src/main/res/xml/data_extraction_rules.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 12 | 13 | 19 | -------------------------------------------------------------------------------- /feature/splash/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature/splash/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import com.terning.build_logic.extension.setNamespace 2 | 3 | plugins { 4 | alias(libs.plugins.terning.feature) 5 | } 6 | 7 | android { 8 | setNamespace("feature.splash") 9 | } 10 | 11 | dependencies { 12 | // core 13 | implementation(projects.core.designsystem) 14 | 15 | // domain 16 | implementation(projects.domain.update) 17 | implementation(projects.domain.user) 18 | 19 | implementation(libs.semver) 20 | } -------------------------------------------------------------------------------- /feature/splash/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature/splash/src/main/java/com/terning/feature/splash/SplashSideEffect.kt: -------------------------------------------------------------------------------- 1 | package com.terning.feature.splash 2 | 3 | sealed class SplashSideEffect { 4 | data class HasAccessToken(val hasAccessToken: Boolean) : SplashSideEffect() 5 | } 6 | -------------------------------------------------------------------------------- /feature/splash/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 새로운 버전 업데이트 안내 5 | 최적의 서비스 사용 환경을 위해\n최신 버전으로 업데이트 해주세요! 6 | 다음에 하기 7 | 업데이트 하기 8 | 업데이트 하러 가기 9 | -------------------------------------------------------------------------------- /feature/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature/src/main/res/drawable/ic_home_scrap_empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/src/main/res/drawable/ic_home_scrap_empty.png -------------------------------------------------------------------------------- /feature/src/main/res/drawable/ic_my_page_divider.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /feature/src/main/res/drawable/ic_my_page_go_detail.xml: -------------------------------------------------------------------------------- 1 | 6 | 13 | 14 | -------------------------------------------------------------------------------- /feature/src/main/res/drawable/ic_my_page_go_edit.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /feature/src/main/res/drawable/ic_my_page_line.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /feature/src/main/res/drawable/ic_nav_home.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /feature/src/main/res/drawable/ic_nav_my_page.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /feature/src/main/res/drawable/ic_scrap_false_24.xml: -------------------------------------------------------------------------------- 1 | 6 | 13 | 14 | -------------------------------------------------------------------------------- /feature/src/main/res/drawable/ic_scrap_true_24.xml: -------------------------------------------------------------------------------- 1 | 6 | 13 | 14 | -------------------------------------------------------------------------------- /feature/src/main/res/drawable/ic_search_18.xml: -------------------------------------------------------------------------------- 1 | 6 | 13 | 14 | -------------------------------------------------------------------------------- /feature/src/main/res/drawable/ic_sign_up_profile.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /feature/src/main/res/drawable/ic_signin_kakao.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 9 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /feature/src/main/res/drawable/img_ad_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/src/main/res/drawable/img_ad_1.png -------------------------------------------------------------------------------- /feature/src/main/res/drawable/img_ad_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/src/main/res/drawable/img_ad_2.png -------------------------------------------------------------------------------- /feature/src/main/res/drawable/img_ad_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/src/main/res/drawable/img_ad_3.png -------------------------------------------------------------------------------- /feature/src/main/res/drawable/img_start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/src/main/res/drawable/img_start.png -------------------------------------------------------------------------------- /feature/src/main/res/mipmap-anydpi-v26/ic_terning_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /feature/src/main/res/mipmap-anydpi-v26/ic_terning_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /feature/src/main/res/mipmap-hdpi/ic_terning_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/src/main/res/mipmap-hdpi/ic_terning_launcher.webp -------------------------------------------------------------------------------- /feature/src/main/res/mipmap-hdpi/ic_terning_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/src/main/res/mipmap-hdpi/ic_terning_launcher_foreground.webp -------------------------------------------------------------------------------- /feature/src/main/res/mipmap-hdpi/ic_terning_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/src/main/res/mipmap-hdpi/ic_terning_launcher_round.webp -------------------------------------------------------------------------------- /feature/src/main/res/mipmap-mdpi/ic_terning_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/src/main/res/mipmap-mdpi/ic_terning_launcher.webp -------------------------------------------------------------------------------- /feature/src/main/res/mipmap-mdpi/ic_terning_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/src/main/res/mipmap-mdpi/ic_terning_launcher_foreground.webp -------------------------------------------------------------------------------- /feature/src/main/res/mipmap-mdpi/ic_terning_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/src/main/res/mipmap-mdpi/ic_terning_launcher_round.webp -------------------------------------------------------------------------------- /feature/src/main/res/mipmap-xhdpi/ic_terning_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/src/main/res/mipmap-xhdpi/ic_terning_launcher.webp -------------------------------------------------------------------------------- /feature/src/main/res/mipmap-xhdpi/ic_terning_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/src/main/res/mipmap-xhdpi/ic_terning_launcher_foreground.webp -------------------------------------------------------------------------------- /feature/src/main/res/mipmap-xhdpi/ic_terning_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/src/main/res/mipmap-xhdpi/ic_terning_launcher_round.webp -------------------------------------------------------------------------------- /feature/src/main/res/mipmap-xxhdpi/ic_terning_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/src/main/res/mipmap-xxhdpi/ic_terning_launcher.webp -------------------------------------------------------------------------------- /feature/src/main/res/mipmap-xxhdpi/ic_terning_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/src/main/res/mipmap-xxhdpi/ic_terning_launcher_foreground.webp -------------------------------------------------------------------------------- /feature/src/main/res/mipmap-xxhdpi/ic_terning_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/src/main/res/mipmap-xxhdpi/ic_terning_launcher_round.webp -------------------------------------------------------------------------------- /feature/src/main/res/mipmap-xxxhdpi/ic_terning_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/src/main/res/mipmap-xxxhdpi/ic_terning_launcher.webp -------------------------------------------------------------------------------- /feature/src/main/res/mipmap-xxxhdpi/ic_terning_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/src/main/res/mipmap-xxxhdpi/ic_terning_launcher_foreground.webp -------------------------------------------------------------------------------- /feature/src/main/res/mipmap-xxxhdpi/ic_terning_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/feature/src/main/res/mipmap-xxxhdpi/ic_terning_launcher_round.webp -------------------------------------------------------------------------------- /feature/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /feature/src/main/res/xml/backup_rules.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 13 | -------------------------------------------------------------------------------- /feature/src/main/res/xml/data_extraction_rules.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 12 | 13 | 19 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Wed Jun 26 04:08:36 KST 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /project.dot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/teamterning/Terning-Android/6e952351edb09645a5c500fbe62f07f5286711c4/project.dot.png --------------------------------------------------------------------------------