├── .github ├── ISSUE_TEMPLATE │ └── feature_request.md ├── PULL_REQUEST_TEMPLATE.md └── workflows │ ├── android-cd.yml │ └── android-ci.yml ├── .gitignore ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle.kts ├── google-services.json.gpg ├── proguard-rules.pro ├── release │ └── app-release.aab └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── msg │ │ └── gcms │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── ic_main-playstore.png │ ├── java │ │ └── com │ │ │ └── msg │ │ │ └── gcms │ │ │ ├── data │ │ │ ├── local │ │ │ │ ├── dao │ │ │ │ │ ├── .gitkeep │ │ │ │ │ └── ClubDao.kt │ │ │ │ ├── database │ │ │ │ │ └── GCMSDataBase.kt │ │ │ │ ├── datasource │ │ │ │ │ ├── LocalDataSource.kt │ │ │ │ │ ├── LocalDataSourceImpl.kt │ │ │ │ │ └── club │ │ │ │ │ │ ├── ClubLocalDataSource.kt │ │ │ │ │ │ └── ClubLocalDataSourceImpl.kt │ │ │ │ ├── datastorage │ │ │ │ │ ├── AuthDataStorage.kt │ │ │ │ │ └── AuthDataStorageImpl.kt │ │ │ │ └── entity │ │ │ │ │ └── ClubEntity.kt │ │ │ ├── remote │ │ │ │ ├── datasource │ │ │ │ │ ├── applicant │ │ │ │ │ │ ├── ApplicantDataSource.kt │ │ │ │ │ │ └── ApplicantDataSourceImpl.kt │ │ │ │ │ ├── attend │ │ │ │ │ │ ├── AttendDataSource.kt │ │ │ │ │ │ └── AttendDataSourceImpl.kt │ │ │ │ │ ├── auth │ │ │ │ │ │ ├── AuthDataSource.kt │ │ │ │ │ │ └── AuthDataSourceImpl.kt │ │ │ │ │ ├── club │ │ │ │ │ │ ├── ClubDataSource.kt │ │ │ │ │ │ └── ClubDataSourceImpl.kt │ │ │ │ │ ├── club_member │ │ │ │ │ │ ├── ClubMemberDataSource.kt │ │ │ │ │ │ └── ClubMemberDataSourceImpl.kt │ │ │ │ │ ├── image │ │ │ │ │ │ ├── ImageDataSource.kt │ │ │ │ │ │ └── ImageDataSourceImpl.kt │ │ │ │ │ └── user │ │ │ │ │ │ ├── UserDataSource.kt │ │ │ │ │ │ └── UserDataSourceImpl.kt │ │ │ │ ├── dto │ │ │ │ │ ├── applicant │ │ │ │ │ │ ├── club_apply_accept │ │ │ │ │ │ │ └── ClubApplyAcceptRequest.kt │ │ │ │ │ │ ├── club_apply_reject │ │ │ │ │ │ │ └── ClubApplyRejectRequest.kt │ │ │ │ │ │ └── get_applicant_list │ │ │ │ │ │ │ ├── ApplicantListResponse.kt │ │ │ │ │ │ │ └── GetApplicantListResponse.kt │ │ │ │ │ ├── attend │ │ │ │ │ │ ├── request │ │ │ │ │ │ │ ├── PatchAttendStatusCollectivelyRequest.kt │ │ │ │ │ │ │ ├── PatchAttendStatusRequest.kt │ │ │ │ │ │ │ └── PostAttendListRequest.kt │ │ │ │ │ │ └── response │ │ │ │ │ │ │ └── GetClubAttendListResponse.kt │ │ │ │ │ ├── auth │ │ │ │ │ │ ├── request │ │ │ │ │ │ │ ├── RefreshRequest.kt │ │ │ │ │ │ │ └── SignInRequest.kt │ │ │ │ │ │ └── response │ │ │ │ │ │ │ └── SignInResponse.kt │ │ │ │ │ ├── club │ │ │ │ │ │ ├── create_club │ │ │ │ │ │ │ └── CreateClubRequest.kt │ │ │ │ │ │ ├── get_club_detail │ │ │ │ │ │ │ ├── ClubDetailResponse.kt │ │ │ │ │ │ │ └── ClubMemberResponse.kt │ │ │ │ │ │ ├── get_club_list │ │ │ │ │ │ │ └── GetClubListResponse.kt │ │ │ │ │ │ └── modify_club_info │ │ │ │ │ │ │ └── ModifyClubInfoRequest.kt │ │ │ │ │ ├── club_member │ │ │ │ │ │ ├── delegation_of_manager │ │ │ │ │ │ │ └── DelegationOfManagerRequest.kt │ │ │ │ │ │ ├── get_club_member │ │ │ │ │ │ │ ├── GetClubMemberResponse.kt │ │ │ │ │ │ │ └── MemberResponse.kt │ │ │ │ │ │ └── member_expelled │ │ │ │ │ │ │ └── MemberExpelledRequest.kt │ │ │ │ │ ├── image │ │ │ │ │ │ └── ImageResponse.kt │ │ │ │ │ └── user │ │ │ │ │ │ ├── get_my_profile │ │ │ │ │ │ ├── GetMyProfileResponse.kt │ │ │ │ │ │ └── ProfileClubResponse.kt │ │ │ │ │ │ ├── get_profile_image │ │ │ │ │ │ └── GetProfileImageResponse.kt │ │ │ │ │ │ ├── modify_profile_image │ │ │ │ │ │ └── ModifyProfileImageRequest.kt │ │ │ │ │ │ ├── response │ │ │ │ │ │ └── AftersData.kt │ │ │ │ │ │ └── search_user │ │ │ │ │ │ └── GetSearchUserResponse.kt │ │ │ │ ├── network │ │ │ │ │ ├── LoginInterceptor.kt │ │ │ │ │ └── api │ │ │ │ │ │ ├── ApplicantAPI.kt │ │ │ │ │ │ ├── AttendAPI.kt │ │ │ │ │ │ ├── AuthAPI.kt │ │ │ │ │ │ ├── ClubAPI.kt │ │ │ │ │ │ ├── ClubMemberAPI.kt │ │ │ │ │ │ ├── ImageAPI.kt │ │ │ │ │ │ └── UserAPI.kt │ │ │ │ └── util │ │ │ │ │ └── GCMSApiHandler.kt │ │ │ └── repository │ │ │ │ ├── ApplicantRepositoryImpl.kt │ │ │ │ ├── AttendRepositoryImpl.kt │ │ │ │ ├── AuthRepositoryImpl.kt │ │ │ │ ├── ClubMemberRepositoryImpl.kt │ │ │ │ ├── ClubRepositoryImpl.kt │ │ │ │ ├── ImageRepositoryImpl.kt │ │ │ │ └── UserRepositoryImpl.kt │ │ │ ├── di │ │ │ ├── GCMSApplication.kt │ │ │ └── module │ │ │ │ ├── LocalDataSourceModule.kt │ │ │ │ ├── LocalModule.kt │ │ │ │ ├── NetworkModule.kt │ │ │ │ ├── RemoteDataSourceModule.kt │ │ │ │ ├── RepositoryModule.kt │ │ │ │ └── StorageModule.kt │ │ │ ├── domain │ │ │ ├── data │ │ │ │ ├── applicant │ │ │ │ │ ├── clubApplyAccept │ │ │ │ │ │ └── ClubApplyAcceptData.kt │ │ │ │ │ ├── club_apply_reject │ │ │ │ │ │ └── ClubApplyRejectData.kt │ │ │ │ │ └── get_applicant_list │ │ │ │ │ │ ├── ApplicantListData.kt │ │ │ │ │ │ └── GetApplicantListData.kt │ │ │ │ ├── attend │ │ │ │ │ ├── GetClubAttendListResponseData.kt │ │ │ │ │ ├── PatchAttendStatusCollectivelyRequestData.kt │ │ │ │ │ ├── PatchAttendStatusRequestData.kt │ │ │ │ │ └── PostAttendListRequestData.kt │ │ │ │ ├── auth │ │ │ │ │ ├── SignInRequestData.kt │ │ │ │ │ └── SignInResponseData.kt │ │ │ │ ├── club │ │ │ │ │ ├── create_club │ │ │ │ │ │ └── CreateClubData.kt │ │ │ │ │ ├── get_club_detail │ │ │ │ │ │ ├── ClubDetailData.kt │ │ │ │ │ │ └── ClubMemberData.kt │ │ │ │ │ ├── get_club_list │ │ │ │ │ │ └── GetClubListData.kt │ │ │ │ │ └── modify_club_info │ │ │ │ │ │ └── ModifyClubInfoData.kt │ │ │ │ ├── club_member │ │ │ │ │ ├── delegation_of_manager │ │ │ │ │ │ └── DelegationOfManagerData.kt │ │ │ │ │ ├── get_club_member │ │ │ │ │ │ ├── GetClubMemberData.kt │ │ │ │ │ │ └── MemberData.kt │ │ │ │ │ └── member_expelled │ │ │ │ │ │ └── MemberExpelledData.kt │ │ │ │ ├── image │ │ │ │ │ └── ImageData.kt │ │ │ │ └── user │ │ │ │ │ ├── get_my_profile │ │ │ │ │ ├── GetMyProfileData.kt │ │ │ │ │ └── ProfileClubData.kt │ │ │ │ │ ├── get_profile_image │ │ │ │ │ └── GetProfileImageData.kt │ │ │ │ │ ├── modify_profile_image │ │ │ │ │ └── ModifyProfileImageData.kt │ │ │ │ │ └── search_user │ │ │ │ │ └── GetSearchUserData.kt │ │ │ ├── exception │ │ │ │ ├── HttpException.kt │ │ │ │ ├── NeedLoginException.kt │ │ │ │ └── NetworkException.kt │ │ │ ├── repository │ │ │ │ ├── ApplicantRepository.kt │ │ │ │ ├── AttendRepository.kt │ │ │ │ ├── AuthRepository.kt │ │ │ │ ├── ClubMemberRepository.kt │ │ │ │ ├── ClubRepository.kt │ │ │ │ ├── ImageRepository.kt │ │ │ │ └── UserRepository.kt │ │ │ └── usecase │ │ │ │ ├── applicant │ │ │ │ ├── ApplicantAcceptUseCase.kt │ │ │ │ ├── ApplicantRejectUseCase.kt │ │ │ │ ├── GetApplicantUseCase.kt │ │ │ │ ├── PostClubApplyUseCase.kt │ │ │ │ └── PostClubCancelUseCase.kt │ │ │ │ ├── attend │ │ │ │ ├── GetClubAttendListUseCase.kt │ │ │ │ ├── PatchAttendStatusCollectivelyUseCase.kt │ │ │ │ ├── PatchAttendStatusUseCase.kt │ │ │ │ └── PostAttendListUseCase.kt │ │ │ │ ├── auth │ │ │ │ ├── CheckLoginStatusUseCase.kt │ │ │ │ ├── LogoutUseCase.kt │ │ │ │ ├── SaveTokenInfoUseCase.kt │ │ │ │ └── SignInUseCase.kt │ │ │ │ ├── club │ │ │ │ ├── ClubDeleteUseCase.kt │ │ │ │ ├── EditClubInfoUseCase.kt │ │ │ │ ├── GetClubListUseCase.kt │ │ │ │ ├── GetDetailUseCase.kt │ │ │ │ ├── PostCreateClubUseCase.kt │ │ │ │ ├── PutClubCloseUseCase.kt │ │ │ │ └── PutClubOpenUseCase.kt │ │ │ │ ├── club_member │ │ │ │ ├── GetMemberUseCase.kt │ │ │ │ ├── MandateUseCase.kt │ │ │ │ └── UserKickUseCase.kt │ │ │ │ ├── image │ │ │ │ └── ImageUseCase.kt │ │ │ │ └── user │ │ │ │ ├── DeleteUserUseCase.kt │ │ │ │ ├── EditProfileUseCase.kt │ │ │ │ ├── ExitUseCase.kt │ │ │ │ ├── GetProfileImageUseCase.kt │ │ │ │ ├── GetSearchUserUseCase.kt │ │ │ │ └── GetUserInfoUseCase.kt │ │ │ ├── presentation │ │ │ ├── adapter │ │ │ │ ├── activity_photo │ │ │ │ │ ├── ActivityPhotoType.kt │ │ │ │ │ └── ActivityPhotosAdapter.kt │ │ │ │ ├── add_member │ │ │ │ │ ├── AddMemberAdapter.kt │ │ │ │ │ └── AddMemberType.kt │ │ │ │ ├── applicant │ │ │ │ │ └── ApplicantAdapter.kt │ │ │ │ ├── club_list │ │ │ │ │ └── ClubListAdapter.kt │ │ │ │ ├── club_member │ │ │ │ │ └── ClubMemberAdapter.kt │ │ │ │ ├── detail_member │ │ │ │ │ └── DetailMemberAdapter.kt │ │ │ │ ├── detail_photo │ │ │ │ │ ├── DetailPhotoAdapter.kt │ │ │ │ │ └── PromotionPicType.kt │ │ │ │ ├── detail_side_bar │ │ │ │ │ ├── DetailPageSideBar.kt │ │ │ │ │ └── DetailSideBarAdapter.kt │ │ │ │ ├── editorial_club │ │ │ │ │ ├── ClubType.kt │ │ │ │ │ └── EditorialClubAdapter.kt │ │ │ │ ├── member │ │ │ │ │ └── MemberAdapter.kt │ │ │ │ └── user_search │ │ │ │ │ └── UserSearchAdapter.kt │ │ │ ├── base │ │ │ │ ├── .gitkeep │ │ │ │ ├── BaseActivity.kt │ │ │ │ ├── BaseDialog.kt │ │ │ │ ├── BaseFragment.kt │ │ │ │ ├── BaseModal.kt │ │ │ │ ├── BaseViewModel.kt │ │ │ │ └── LottieFragment.kt │ │ │ ├── extenstion │ │ │ │ └── Extension.kt │ │ │ ├── service │ │ │ │ └── GCMSMessagingService.kt │ │ │ ├── utils │ │ │ │ ├── ChangeScreenEvent.kt │ │ │ │ ├── Event.kt │ │ │ │ ├── FileUtil.kt │ │ │ │ ├── ItemDecorator.kt │ │ │ │ ├── KeyboardEvent.kt │ │ │ │ └── ShimmerEvent.kt │ │ │ ├── view │ │ │ │ ├── club │ │ │ │ │ ├── ClubFragment.kt │ │ │ │ │ └── detail │ │ │ │ │ │ └── DetailFragment.kt │ │ │ │ ├── clubmaker │ │ │ │ │ ├── MakeClubActivity.kt │ │ │ │ │ ├── club_detail │ │ │ │ │ │ └── MakeClubDetailFragment.kt │ │ │ │ │ ├── club_introduce │ │ │ │ │ │ └── ClubIntroduceFragment.kt │ │ │ │ │ ├── club_type │ │ │ │ │ │ └── ClubTypeFragment.kt │ │ │ │ │ ├── make_result │ │ │ │ │ │ └── MakeClubResultFragment.kt │ │ │ │ │ └── search_student │ │ │ │ │ │ └── StudentSearchFragment.kt │ │ │ │ ├── editclub │ │ │ │ │ ├── EditClubActivity.kt │ │ │ │ │ ├── EditClubFragment.kt │ │ │ │ │ └── EditSearchFragment.kt │ │ │ │ ├── intro │ │ │ │ │ └── IntroActivity.kt │ │ │ │ ├── main │ │ │ │ │ └── MainActivity.kt │ │ │ │ ├── member_manage │ │ │ │ │ └── MemberManageActivity.kt │ │ │ │ ├── profile │ │ │ │ │ ├── ProfileActivity.kt │ │ │ │ │ ├── ProfileClubFragment.kt │ │ │ │ │ └── ProfileNoClubFragment.kt │ │ │ │ ├── splash │ │ │ │ │ └── SplashActivity.kt │ │ │ │ └── withdrawal │ │ │ │ │ ├── WithdrawalActivity.kt │ │ │ │ │ └── WithdrawalDialog.kt │ │ │ └── viewmodel │ │ │ │ ├── AuthViewModel.kt │ │ │ │ ├── ClubDetailViewModel.kt │ │ │ │ ├── ClubViewModel.kt │ │ │ │ ├── EditViewModel.kt │ │ │ │ ├── MainViewModel.kt │ │ │ │ ├── MakeClubViewModel.kt │ │ │ │ ├── MemberManageViewModel.kt │ │ │ │ ├── ProfileViewModel.kt │ │ │ │ ├── SplashViewModel.kt │ │ │ │ ├── WithdrawalViewModel.kt │ │ │ │ └── util │ │ │ │ ├── ErrorHandling.kt │ │ │ │ └── Event.kt │ │ │ └── util │ │ │ ├── Extension.kt │ │ │ └── VersionChecker.kt │ └── res │ │ ├── anim │ │ ├── enter_anim.xml │ │ ├── exit_anim.xml │ │ └── no_anim.xml │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── bg_add_member.xml │ │ ├── bg_after_school.xml │ │ ├── bg_approve_btn.xml │ │ ├── bg_banner_placeholder.xml │ │ ├── bg_check_btn.xml │ │ ├── bg_club_img.xml │ │ ├── bg_club_txt.xml │ │ ├── bg_detail_club.xml │ │ ├── bg_detail_club_link.xml │ │ ├── bg_dialog.xml │ │ ├── bg_dialog_cancel.xml │ │ ├── bg_dialog_left.xml │ │ ├── bg_dialog_ok.xml │ │ ├── bg_dialog_right.xml │ │ ├── bg_exeption_dialog_btn.xml │ │ ├── bg_find_club_btn.xml │ │ ├── bg_make_club_et.xml │ │ ├── bg_make_free_btn.xml │ │ ├── bg_make_major_btn.xml │ │ ├── bg_make_personal_btn.xml │ │ ├── bg_member_black_btn.xml │ │ ├── bg_period_btn.xml │ │ ├── bg_period_btn_check.xml │ │ ├── bg_period_btn_color.xml │ │ ├── bg_profile_img.xml │ │ ├── bg_profile_list.xml │ │ ├── bg_profile_nothing_list.xml │ │ ├── bg_shimmer_user_profile.xml │ │ ├── bg_sign_btn.xml │ │ ├── bg_splash.xml │ │ ├── bg_summary_club_txt.xml │ │ ├── bg_user_profile.xml │ │ ├── bg_withdrawal_active_btn.xml │ │ ├── bg_withdrawal_btn.xml │ │ ├── bg_withdrawal_gradient.xml │ │ ├── bg_withdrawal_sleep_btn.xml │ │ ├── bg_withdrawal_warning.xml │ │ ├── google_icon.xml │ │ ├── ic__google_icon.xml │ │ ├── ic_activity_photo.xml │ │ ├── ic_add_club.xml │ │ ├── ic_attend_absent.xml │ │ ├── ic_attend_check.xml │ │ ├── ic_attend_late.xml │ │ ├── ic_attend_sick.xml │ │ ├── ic_back_btn.xml │ │ ├── ic_banner_placeholder.xml │ │ ├── ic_check_box.xml │ │ ├── ic_check_btn.xml │ │ ├── ic_check_icon.xml │ │ ├── ic_checked_btn.xml │ │ ├── ic_close_button.xml │ │ ├── ic_club_delete.xml │ │ ├── ic_default_profile.xml │ │ ├── ic_delete_btn.xml │ │ ├── ic_edit.xml │ │ ├── ic_email.xml │ │ ├── ic_email_check_failure.xml │ │ ├── ic_email_check_textinput.xml │ │ ├── ic_error.xml │ │ ├── ic_free_bg.xml │ │ ├── ic_free_person.xml │ │ ├── ic_free_text_activate.xml │ │ ├── ic_free_text_close.xml │ │ ├── ic_group_17655.xml │ │ ├── ic_illust.xml │ │ ├── ic_launcher_background.xml │ │ ├── ic_logout_btn.xml │ │ ├── ic_logout_option.xml │ │ ├── ic_main_foreground.xml │ │ ├── ic_major_bg.xml │ │ ├── ic_major_person.xml │ │ ├── ic_major_text_activate.xml │ │ ├── ic_major_text_close.xml │ │ ├── ic_msg_logo.xml │ │ ├── ic_no_club.xml │ │ ├── ic_person_two.xml │ │ ├── ic_personal_bg.xml │ │ ├── ic_personal_person.xml │ │ ├── ic_personal_text_activate.xml │ │ ├── ic_personal_text_close.xml │ │ ├── ic_profile.xml │ │ ├── ic_rectangle_661.xml │ │ ├── ic_rectangle_662.xml │ │ ├── ic_rectangle_941.xml │ │ ├── ic_rectangle_946.xml │ │ ├── ic_search_icon.xml │ │ ├── ic_selected_check_btn.xml │ │ ├── ic_server_error.xml │ │ ├── ic_side_btn.xml │ │ ├── ic_splash_line.xml │ │ ├── ic_splash_logo.xml │ │ ├── ic_splash_text.xml │ │ ├── ic_teacher_img.xml │ │ ├── ic_unknown.xml │ │ ├── ic_withdrawal_btn.xml │ │ ├── ic_withdrawal_gcms.xml │ │ ├── ic_withdrawal_point.xml │ │ ├── selector_nav_bg.xml │ │ ├── selector_nav_color.xml │ │ ├── selector_nav_text_free.xml │ │ ├── selector_nav_text_major.xml │ │ ├── selector_nav_text_personal.xml │ │ ├── selector_withdrawal_btn.xml │ │ └── selector_withdrawal_check_btn.xml │ │ ├── font │ │ ├── notosans.ttf │ │ └── roboto.ttf │ │ ├── layout │ │ ├── activity_attend.xml │ │ ├── activity_edit_club.xml │ │ ├── activity_intro.xml │ │ ├── activity_main.xml │ │ ├── activity_make_club.xml │ │ ├── activity_member_management.xml │ │ ├── activity_profile.xml │ │ ├── activity_splash.xml │ │ ├── activity_withdrawal.xml │ │ ├── attend_dialog.xml │ │ ├── detail_dialog.xml │ │ ├── detail_toolbar.xml │ │ ├── dialog_period.xml │ │ ├── error_exeption_dialog.xml │ │ ├── fragment_club.xml │ │ ├── fragment_club_introduce.xml │ │ ├── fragment_club_type.xml │ │ ├── fragment_detail.xml │ │ ├── fragment_edit_club.xml │ │ ├── fragment_edit_search.xml │ │ ├── fragment_make_club_detail.xml │ │ ├── fragment_make_club_result.xml │ │ ├── fragment_profile_club.xml │ │ ├── fragment_profile_no_club.xml │ │ ├── fragment_student_search.xml │ │ ├── header_layout.xml │ │ ├── intro_progress_lottie.xml │ │ ├── item_my_club.xml │ │ ├── list_add_member.xml │ │ ├── list_after_school.xml │ │ ├── list_applicant.xml │ │ ├── list_club_editorial.xml │ │ ├── list_club_member.xml │ │ ├── list_club_picture.xml │ │ ├── list_club_summary.xml │ │ ├── list_detail_club_promotion.xml │ │ ├── list_detail_sidebar.xml │ │ ├── list_member.xml │ │ ├── list_member_attend.xml │ │ ├── list_search_member.xml │ │ ├── logout_dialog.xml │ │ ├── progress_bar.xml │ │ ├── shimmer_banner.xml │ │ ├── shimmer_club.xml │ │ ├── shimmer_detail_info.xml │ │ ├── shimmer_member.xml │ │ ├── shimmer_profile.xml │ │ └── shimmer_promotion.xml │ │ ├── menu │ │ ├── bottom_navigation_menu.xml │ │ ├── head_detail_menu.xml │ │ └── member_detail_menu.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ ├── ic_launcher_round.xml │ │ ├── ic_main.xml │ │ └── ic_main_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.webp │ │ ├── ic_launcher_round.webp │ │ ├── ic_main.png │ │ ├── ic_main_foreground.png │ │ └── ic_main_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.webp │ │ ├── ic_launcher_round.webp │ │ ├── ic_main.png │ │ ├── ic_main_foreground.png │ │ └── ic_main_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.webp │ │ ├── ic_launcher_round.webp │ │ ├── ic_main.png │ │ ├── ic_main_foreground.png │ │ └── ic_main_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.webp │ │ ├── ic_launcher_round.webp │ │ ├── ic_main.png │ │ ├── ic_main_foreground.png │ │ └── ic_main_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.webp │ │ ├── ic_launcher_round.webp │ │ ├── ic_main.png │ │ ├── ic_main_foreground.png │ │ └── ic_main_round.png │ │ ├── navigation │ │ ├── bottom_nav_graph.xml │ │ ├── club_maker_graph.xml │ │ └── edit_club_graph.xml │ │ ├── raw │ │ ├── progress_lottie.json │ │ └── whale_lottie.json │ │ ├── values-night │ │ └── themes.xml │ │ ├── values-w820dp │ │ └── dimens.xml │ │ ├── values │ │ ├── .gitignore │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── ic_main_background.xml │ │ ├── strings.xml │ │ └── themes.xml │ │ └── xml │ │ └── activity_profile_xml_constraintlayout_scene.xml │ └── test │ └── java │ └── com │ └── msg │ └── gcms │ └── ExampleUnitTest.kt ├── build.gradle.kts ├── buildSrc ├── build.gradle.kts └── src │ └── main │ └── java │ ├── Dependency.kt │ └── Versions.kt ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle.kts /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | ### Summary 11 | - 내용을 적어주세요 12 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ## PR 정보 2 | 내용을 적어주세요. 3 | 4 | ## 작업 결과 5 | - 내용을 적어주세요. -------------------------------------------------------------------------------- /.github/workflows/android-ci.yml: -------------------------------------------------------------------------------- 1 | name: Android CI 2 | 3 | on: 4 | pull_request: 5 | branches: [ "develop" ] 6 | 7 | jobs: 8 | build: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v3 12 | with: 13 | fetch-depth: 0 14 | 15 | - name: Setup JDK 11 16 | uses: actions/setup-java@v3 17 | with: 18 | distribution: "zulu" 19 | java-version: 11 20 | 21 | - name: Setup Android SDK 22 | uses: android-actions/setup-android@v2 23 | 24 | - name: Grant execute permission for gradlew 25 | run: chmod +x gradlew 26 | 27 | - name: Cache Gradle Packages 28 | uses: actions/cache@v2 29 | with: 30 | path: | 31 | ~/.gradle/caches 32 | ~/.gradle/wrapper 33 | key: ${{runner.os}}-gradle-${{hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', '**/buildSrc/**/*.kt')}} 34 | restore-keys: | 35 | ${{runner.os}}-gradle- 36 | 37 | - name: Create LOCAL_PROPERTIES 38 | run: echo '${{ secrets.LOCAL_PROPERTIES }}' > ./local.properties 39 | 40 | - name: Create GOOGLE_SERVICES 41 | run: echo '${{ secrets.GOOGLE_SERVICES }}' > ./app/google-services.json 42 | 43 | - name: Run ktlint 44 | run: ./gradlew ktlintCheck 45 | 46 | - name: Run Lint 47 | run: ./gradlew lint 48 | 49 | - name: Build with Gradle 50 | run: ./gradlew build 51 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | 5 | .idea/* 6 | !.idea/codeStyles/* 7 | !.idea/codeStyles/Project.xml 8 | !.idea/codeStyles/codeStyleConfig.xml 9 | 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | /buildSrc/build 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 GSM-MSG 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | google-services.json 3 | 4 | -------------------------------------------------------------------------------- /app/google-services.json.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/google-services.json.gpg -------------------------------------------------------------------------------- /app/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.kts. 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 22 | 23 | -keep class com.msg.gcms.data.** {*;} 24 | -keep interface com.msg.gcms.data.** {*;} 25 | 26 | -keep class com.msg.gcms.domain.** {*;} 27 | -keep interface com.msg.gcms.domain.** {*;} -------------------------------------------------------------------------------- /app/release/app-release.aab: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/release/app-release.aab -------------------------------------------------------------------------------- /app/src/androidTest/java/com/msg/gcms/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4 4 | import androidx.test.platform.app.InstrumentationRegistry 5 | import org.junit.Assert.assertEquals 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | /** 10 | * Instrumented test, which will execute on an Android device. 11 | * 12 | * See [testing documentation](http://d.android.com/tools/testing). 13 | */ 14 | @RunWith(AndroidJUnit4::class) 15 | class ExampleInstrumentedTest { 16 | @Test 17 | fun useAppContext() { 18 | // Context of the app under test. 19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 20 | assertEquals("com.msg.msg_gcms", appContext.packageName) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/ic_main-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/ic_main-playstore.png -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/local/dao/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/java/com/msg/gcms/data/local/dao/.gitkeep -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/local/dao/ClubDao.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.local.dao 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Insert 5 | import androidx.room.OnConflictStrategy 6 | import androidx.room.Query 7 | import androidx.room.Transaction 8 | import com.msg.gcms.data.local.entity.ClubEntity 9 | 10 | @Dao 11 | interface ClubDao { 12 | 13 | @Query("SELECT * FROM club WHERE type = :type") 14 | suspend fun getClubList(type: String): List 15 | 16 | @Query("DELETE FROM club WHERE type = :type") 17 | fun deleteClubData(type: String) 18 | 19 | @Insert(onConflict = OnConflictStrategy.REPLACE) 20 | fun insertAllClubData(clubData: List) 21 | 22 | @Transaction 23 | suspend fun deleteAndInsertData(type: String, clubData: List) { 24 | deleteClubData(type = type) 25 | insertAllClubData(clubData = clubData) 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/local/database/GCMSDataBase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.local.database 2 | 3 | import androidx.room.Database 4 | import androidx.room.RoomDatabase 5 | import com.msg.gcms.data.local.dao.ClubDao 6 | import com.msg.gcms.data.local.entity.ClubEntity 7 | 8 | @Database( 9 | entities = [ 10 | ClubEntity::class 11 | ], 12 | version = 2, 13 | exportSchema = false 14 | ) 15 | abstract class GCMSDataBase: RoomDatabase() { 16 | abstract fun clubDao(): ClubDao 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/local/datasource/LocalDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.local.datasource 2 | 3 | interface LocalDataSource { 4 | suspend fun getAccessToken(): String 5 | 6 | suspend fun getRefreshToken(): String 7 | 8 | suspend fun getAccessExp(): String 9 | 10 | suspend fun getRefreshExp(): String 11 | 12 | suspend fun getFcmToken(): String 13 | 14 | suspend fun saveTokenInfo( 15 | accessToken: String, 16 | refreshToken: String, 17 | accessExp: String, 18 | refreshExp: String, 19 | fcmToken: String 20 | ) 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/local/datasource/LocalDataSourceImpl.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.local.datasource 2 | 3 | import com.msg.gcms.data.local.datastorage.AuthDataStorage 4 | import javax.inject.Inject 5 | 6 | class LocalDataSourceImpl @Inject constructor( 7 | private val authDataStorage: AuthDataStorage 8 | ) : LocalDataSource { 9 | override suspend fun getAccessToken(): String = authDataStorage.getAccessToken() 10 | 11 | override suspend fun getRefreshToken(): String = authDataStorage.getRefreshToken() 12 | 13 | override suspend fun getAccessExp(): String = authDataStorage.getAccessExpiredAt() 14 | 15 | override suspend fun getRefreshExp(): String = authDataStorage.getRefreshExpiredAt() 16 | 17 | override suspend fun getFcmToken(): String = authDataStorage.getFcmToken() 18 | 19 | override suspend fun saveTokenInfo( 20 | accessToken: String, 21 | refreshToken: String, 22 | accessExp: String, 23 | refreshExp: String, 24 | fcmToken: String 25 | ) { 26 | authDataStorage.run { 27 | setAccessToken(accessToken) 28 | setRefreshToken(refreshToken) 29 | setAccessExpiredAt(accessExp) 30 | setRefreshExpiredAt(refreshExp) 31 | setFcmToken(fcmToken) 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/local/datasource/club/ClubLocalDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.local.datasource.club 2 | 3 | import com.msg.gcms.data.local.entity.ClubEntity 4 | 5 | interface ClubLocalDataSource { 6 | 7 | suspend fun getClubData(type: String): List 8 | 9 | fun insertClubData(clubData: List) 10 | 11 | fun deleteClubData(type: String) 12 | 13 | suspend fun deleteAndInsertClubData(type: String, clubData: List) 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/local/datasource/club/ClubLocalDataSourceImpl.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.local.datasource.club 2 | 3 | import com.msg.gcms.data.local.dao.ClubDao 4 | import com.msg.gcms.data.local.entity.ClubEntity 5 | import javax.inject.Inject 6 | 7 | class ClubLocalDataSourceImpl @Inject constructor( 8 | private val clubDao: ClubDao 9 | ) : ClubLocalDataSource { 10 | override suspend fun getClubData(type: String): List { 11 | return clubDao.getClubList(type = type) 12 | } 13 | 14 | override fun insertClubData(clubData: List) { 15 | return clubDao.insertAllClubData(clubData = clubData) 16 | } 17 | 18 | override fun deleteClubData(type: String) { 19 | return clubDao.deleteClubData(type = type) 20 | } 21 | 22 | override suspend fun deleteAndInsertClubData(type: String, clubData: List) { 23 | return clubDao.deleteAndInsertData(type = type, clubData = clubData) 24 | } 25 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/local/datastorage/AuthDataStorage.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.local.datastorage 2 | 3 | interface AuthDataStorage { 4 | fun setAccessToken(accessToken: String) 5 | 6 | fun getAccessToken(): String 7 | 8 | fun setRefreshToken(refreshToken: String) 9 | 10 | fun getRefreshToken(): String 11 | 12 | fun setAccessExpiredAt(accessExp: String) 13 | 14 | fun getAccessExpiredAt(): String 15 | 16 | fun setRefreshExpiredAt(refreshExp: String) 17 | 18 | fun getRefreshExpiredAt(): String 19 | 20 | fun setFcmToken(fcmToken: String) 21 | 22 | fun getFcmToken(): String 23 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/local/entity/ClubEntity.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.local.entity 2 | 3 | import androidx.room.ColumnInfo 4 | import androidx.room.Entity 5 | import androidx.room.PrimaryKey 6 | 7 | @Entity(tableName = "club") 8 | data class ClubEntity( 9 | @PrimaryKey 10 | val clubId: Long, 11 | @ColumnInfo(name = "type") 12 | val type: String, 13 | @ColumnInfo(name = "name") 14 | val name: String, 15 | @ColumnInfo(name = "bannerImg") 16 | val bannerImg: String, 17 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/datasource/applicant/ApplicantDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.datasource.applicant 2 | 3 | import com.msg.gcms.data.remote.dto.applicant.get_applicant_list.GetApplicantListResponse 4 | import com.msg.gcms.data.remote.dto.applicant.club_apply_accept.ClubApplyAcceptRequest 5 | import com.msg.gcms.data.remote.dto.applicant.club_apply_reject.ClubApplyRejectRequest 6 | 7 | interface ApplicantDataSource { 8 | suspend fun getApplicantList(clubId: Long): GetApplicantListResponse 9 | 10 | suspend fun postClubApply(clubId: Long) 11 | 12 | suspend fun deleteClubApply(clubId: Long) 13 | 14 | suspend fun postApplicantAccept(clubId: Long, body: ClubApplyAcceptRequest) 15 | 16 | suspend fun postApplicantReject(clubId: Long, body: ClubApplyRejectRequest) 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/datasource/attend/AttendDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.datasource.attend 2 | 3 | import com.msg.gcms.data.remote.dto.attend.request.PatchAttendStatusCollectivelyRequest 4 | import com.msg.gcms.data.remote.dto.attend.request.PatchAttendStatusRequest 5 | import com.msg.gcms.data.remote.dto.attend.request.PostAttendListRequest 6 | import com.msg.gcms.data.remote.dto.attend.response.GetClubAttendListResponse 7 | import kotlinx.coroutines.flow.Flow 8 | import java.time.LocalDate 9 | 10 | interface AttendDataSource { 11 | suspend fun getClubAttendList(clubId: Long, date: LocalDate, period: String): Flow 12 | suspend fun postAttendList(body: PostAttendListRequest): Flow 13 | suspend fun patchAttendStatus(body: PatchAttendStatusRequest): Flow 14 | suspend fun patchAttendStatusCollectively(body: PatchAttendStatusCollectivelyRequest): Flow 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/datasource/auth/AuthDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.datasource.auth 2 | 3 | import com.msg.gcms.data.remote.dto.auth.request.RefreshRequest 4 | import com.msg.gcms.data.remote.dto.auth.request.SignInRequest 5 | import com.msg.gcms.data.remote.dto.auth.response.SignInResponse 6 | 7 | interface AuthDataSource { 8 | suspend fun postRegistration(body: SignInRequest): SignInResponse 9 | 10 | suspend fun logout() 11 | 12 | suspend fun refreshToken(header: String, body: RefreshRequest): SignInResponse 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/datasource/auth/AuthDataSourceImpl.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.datasource.auth 2 | 3 | import com.msg.gcms.data.remote.dto.auth.request.RefreshRequest 4 | import com.msg.gcms.data.remote.dto.auth.request.SignInRequest 5 | import com.msg.gcms.data.remote.dto.auth.response.SignInResponse 6 | import com.msg.gcms.data.remote.network.api.AuthAPI 7 | import com.msg.gcms.data.remote.util.GCMSApiHandler 8 | import javax.inject.Inject 9 | 10 | class AuthDataSourceImpl @Inject constructor( 11 | private val service: AuthAPI 12 | ) : AuthDataSource { 13 | override suspend fun postRegistration(body: SignInRequest): SignInResponse = 14 | GCMSApiHandler() 15 | .httpRequest { service.postSignIn(body = body) } 16 | .sendRequest() 17 | 18 | override suspend fun logout() = 19 | GCMSApiHandler() 20 | .httpRequest { service.logout() } 21 | .sendRequest() 22 | 23 | override suspend fun refreshToken(header: String, body: RefreshRequest): SignInResponse = 24 | GCMSApiHandler() 25 | .httpRequest { service.refreshToken(header = header, body = body) } 26 | .sendRequest() 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/datasource/club/ClubDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.datasource.club 2 | 3 | import com.msg.gcms.data.remote.dto.club.create_club.CreateClubRequest 4 | import com.msg.gcms.data.remote.dto.club.get_club_detail.ClubDetailResponse 5 | import com.msg.gcms.data.remote.dto.club.get_club_list.GetClubListResponse 6 | import com.msg.gcms.data.remote.dto.club.modify_club_info.ModifyClubInfoRequest 7 | 8 | interface ClubDataSource { 9 | suspend fun getClubList(type: String): List 10 | 11 | suspend fun getDetail(clubId: Long): ClubDetailResponse 12 | 13 | suspend fun postCreateClub( 14 | body: CreateClubRequest 15 | ) 16 | 17 | suspend fun putChangeClub( 18 | body: ModifyClubInfoRequest, 19 | clubId: Long 20 | ) 21 | 22 | suspend fun exitClub( 23 | clubId: Long 24 | ) 25 | 26 | suspend fun deleteClub( 27 | clubId: Long 28 | ) 29 | 30 | suspend fun putClubOpen( 31 | clubId: Long 32 | ) 33 | 34 | suspend fun putClubClose( 35 | clubId: Long 36 | ) 37 | 38 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/datasource/club_member/ClubMemberDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.datasource.club_member 2 | 3 | import com.msg.gcms.data.remote.dto.club_member.delegation_of_manager.DelegationOfManagerRequest 4 | import com.msg.gcms.data.remote.dto.club_member.get_club_member.GetClubMemberResponse 5 | import com.msg.gcms.data.remote.dto.club_member.member_expelled.MemberExpelledRequest 6 | 7 | interface ClubMemberDataSource { 8 | suspend fun getMemberList(clubId: Long): GetClubMemberResponse 9 | 10 | suspend fun deleteMemberExpel(clubId: Long, body: MemberExpelledRequest) 11 | 12 | suspend fun putDelegationOfRepresentation(clubId: Long, body: DelegationOfManagerRequest) 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/datasource/club_member/ClubMemberDataSourceImpl.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.datasource.club_member 2 | 3 | import com.msg.gcms.data.remote.dto.club_member.delegation_of_manager.DelegationOfManagerRequest 4 | import com.msg.gcms.data.remote.dto.club_member.get_club_member.GetClubMemberResponse 5 | import com.msg.gcms.data.remote.dto.club_member.member_expelled.MemberExpelledRequest 6 | import com.msg.gcms.data.remote.network.api.ClubMemberAPI 7 | import com.msg.gcms.data.remote.util.GCMSApiHandler 8 | import javax.inject.Inject 9 | 10 | class ClubMemberDataSourceImpl @Inject constructor( 11 | private val service: ClubMemberAPI 12 | ) : ClubMemberDataSource { 13 | override suspend fun getMemberList(clubId: Long): GetClubMemberResponse { 14 | return GCMSApiHandler() 15 | .httpRequest { service.getMemberList(clubId = clubId) } 16 | .sendRequest() 17 | } 18 | 19 | override suspend fun deleteMemberExpel( 20 | clubId: Long, 21 | body: MemberExpelledRequest 22 | ) { 23 | return GCMSApiHandler() 24 | .httpRequest { service.deleteMemberExpel(clubId = clubId, body = body) } 25 | .sendRequest() 26 | } 27 | 28 | override suspend fun putDelegationOfRepresentation( 29 | clubId: Long, 30 | body: DelegationOfManagerRequest 31 | ) { 32 | return GCMSApiHandler() 33 | .httpRequest { service.putDelegationOfRepresentation(clubId = clubId, body = body) } 34 | .sendRequest() 35 | } 36 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/datasource/image/ImageDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.datasource.image 2 | 3 | import com.msg.gcms.data.remote.dto.image.ImageResponse 4 | import okhttp3.MultipartBody 5 | 6 | interface ImageDataSource { 7 | suspend fun postImage(image : List): ImageResponse 8 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/datasource/image/ImageDataSourceImpl.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.datasource.image 2 | 3 | import com.msg.gcms.data.remote.dto.image.ImageResponse 4 | import com.msg.gcms.data.remote.network.api.ImageAPI 5 | import com.msg.gcms.data.remote.util.GCMSApiHandler 6 | import okhttp3.MultipartBody 7 | import javax.inject.Inject 8 | 9 | class ImageDataSourceImpl @Inject constructor( 10 | val service: ImageAPI 11 | ) : ImageDataSource { 12 | override suspend fun postImage(image: List): ImageResponse { 13 | return GCMSApiHandler() 14 | .httpRequest { service.postImage(file = image) } 15 | .sendRequest() 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/datasource/user/UserDataSource.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.datasource.user 2 | 3 | import com.msg.gcms.data.remote.dto.user.get_my_profile.GetMyProfileResponse 4 | import com.msg.gcms.data.remote.dto.user.get_profile_image.GetProfileImageResponse 5 | import com.msg.gcms.data.remote.dto.user.modify_profile_image.ModifyProfileImageRequest 6 | import com.msg.gcms.data.remote.dto.user.search_user.GetSearchUserResponse 7 | 8 | interface UserDataSource { 9 | suspend fun getUserInfo(): GetMyProfileResponse 10 | 11 | suspend fun putProfile(body: ModifyProfileImageRequest) 12 | 13 | suspend fun getProfileImage(): GetProfileImageResponse 14 | 15 | suspend fun getUserSearch(QueryString: Map): List 16 | 17 | suspend fun deleteUser() 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/applicant/club_apply_accept/ClubApplyAcceptRequest.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.applicant.club_apply_accept 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import java.util.UUID 5 | 6 | data class ClubApplyAcceptRequest( 7 | @SerializedName("uuid") 8 | val uuid: UUID 9 | ) 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/applicant/club_apply_reject/ClubApplyRejectRequest.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.applicant.club_apply_reject 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import java.util.UUID 5 | 6 | data class ClubApplyRejectRequest( 7 | @SerializedName("uuid") 8 | val uuid: UUID 9 | ) 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/applicant/get_applicant_list/ApplicantListResponse.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.applicant.get_applicant_list 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.msg.gcms.domain.data.applicant.get_applicant_list.ApplicantListData 5 | import java.util.UUID 6 | 7 | data class ApplicantListResponse( 8 | @SerializedName("uuid") 9 | val uuid: UUID, 10 | @SerializedName("email") 11 | val email: String, 12 | @SerializedName("name") 13 | val name: String, 14 | @SerializedName("grade") 15 | val grade: Int, 16 | @SerializedName("classNum") 17 | val classNum: Int, 18 | @SerializedName("number") 19 | val number: Int, 20 | @SerializedName("profileImg") 21 | val profileImg: String? 22 | ) 23 | 24 | fun ApplicantListResponse.toApplicantListData(): ApplicantListData { 25 | return ApplicantListData( 26 | uuid = uuid, 27 | email = email, 28 | name = name, 29 | grade = grade, 30 | classNum = classNum, 31 | number = number, 32 | profileImg = profileImg 33 | ) 34 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/applicant/get_applicant_list/GetApplicantListResponse.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.applicant.get_applicant_list 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.msg.gcms.domain.data.applicant.get_applicant_list.GetApplicantListData 5 | 6 | data class GetApplicantListResponse( 7 | @SerializedName("scope") 8 | val userScope: String, 9 | @SerializedName("applicantList") 10 | val applicantList: List 11 | ) 12 | 13 | fun GetApplicantListResponse.toApplicantListData(): GetApplicantListData { 14 | return GetApplicantListData( 15 | applicantList = applicantList.map { it.toApplicantListData() }, 16 | userScope = userScope 17 | ) 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/attend/request/PatchAttendStatusCollectivelyRequest.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.attend.request 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class PatchAttendStatusCollectivelyRequest( 6 | @SerializedName("attendanceIds") 7 | val attendanceIds: List, 8 | @SerializedName("attendanceStatus") 9 | val attendanceStatus: String 10 | ) 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/attend/request/PatchAttendStatusRequest.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.attend.request 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class PatchAttendStatusRequest( 6 | @SerializedName("attendanceId") 7 | val attendanceId: Long, 8 | @SerializedName("attendanceStatus") 9 | val attendanceStatus: String 10 | ) 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/attend/request/PostAttendListRequest.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.attend.request 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import java.time.LocalDate 5 | 6 | data class PostAttendListRequest( 7 | @SerializedName("name") 8 | val name: String, 9 | @SerializedName("date") 10 | val date: LocalDate, 11 | @SerializedName("periods") 12 | val periods: List 13 | ) 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/auth/request/RefreshRequest.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.auth.request 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import okhttp3.MediaType.Companion.toMediaTypeOrNull 5 | import okhttp3.RequestBody 6 | import okhttp3.RequestBody.Companion.toRequestBody 7 | import org.json.JSONObject 8 | 9 | data class RefreshRequest( 10 | @SerializedName("token") 11 | val token: String 12 | ) 13 | 14 | fun RefreshRequest.toRequestBody(): RequestBody { 15 | return JSONObject().apply { 16 | put("token", this@toRequestBody.token) 17 | }.toString().toRequestBody("application/json".toMediaTypeOrNull()) 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/auth/request/SignInRequest.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.auth.request 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class SignInRequest( 6 | @SerializedName("code") 7 | val code: String, 8 | @SerializedName("token") 9 | val token: String, 10 | ) 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/auth/response/SignInResponse.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.auth.response 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.msg.gcms.domain.data.auth.SignInResponseData 5 | 6 | data class SignInResponse( 7 | @SerializedName("accessToken") 8 | val accessToken: String, 9 | @SerializedName("refreshToken") 10 | val refreshToken: String, 11 | @SerializedName("accessExp") 12 | val accessExp: String, 13 | @SerializedName("refreshExp") 14 | val refreshExp: String 15 | ) 16 | 17 | fun SignInResponse.toSignInData(): SignInResponseData { 18 | return SignInResponseData( 19 | accessToken = accessToken, 20 | refreshToken = refreshToken, 21 | accessExp = accessExp, 22 | refreshExp = refreshExp 23 | ) 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/club/create_club/CreateClubRequest.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.club.create_club 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import java.util.UUID 5 | 6 | data class CreateClubRequest( 7 | @SerializedName("type") 8 | val type: String, 9 | @SerializedName("name") 10 | val title: String, 11 | @SerializedName("content") 12 | val description: String, 13 | @SerializedName("bannerImg") 14 | val bannerUrl:String, 15 | @SerializedName("contact") 16 | val contact: String, 17 | @SerializedName("notionLink") 18 | val notionLink: String, 19 | @SerializedName("teacher") 20 | val teacher: String?, 21 | @SerializedName("activityImgs") 22 | val activityUrls: List?, 23 | @SerializedName("member") 24 | val member: List?, 25 | ) 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/club/get_club_detail/ClubDetailResponse.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.club.get_club_detail 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.msg.gcms.domain.data.club.get_club_detail.ClubDetailData 5 | 6 | data class ClubDetailResponse( 7 | @SerializedName("id") 8 | val id: Long, 9 | @SerializedName("type") 10 | val type: String, 11 | @SerializedName("bannerImg") 12 | val bannerImg: String, 13 | @SerializedName("name") 14 | val name: String, 15 | @SerializedName("content") 16 | val content: String, 17 | @SerializedName("contact") 18 | val contact: String, 19 | @SerializedName("teacher") 20 | val teacher: String, 21 | @SerializedName("isOpened") 22 | val isOpened: Boolean, 23 | @SerializedName("notionLink") 24 | val notionLink: String, 25 | @SerializedName("activityImgs") 26 | val activityImgs: List, 27 | @SerializedName("head") 28 | val head: ClubMemberResponse, 29 | @SerializedName("member") 30 | val member: List, 31 | @SerializedName("scope") 32 | val scope: String, 33 | @SerializedName("isApplied") 34 | val isApplied: Boolean 35 | ) 36 | 37 | fun ClubDetailResponse.toClubDetailData(): ClubDetailData { 38 | return ClubDetailData( 39 | activityImgs = activityImgs, 40 | bannerImg = bannerImg, 41 | contact = contact, 42 | content = content, 43 | head = head.toClubMemberData(), 44 | id = id, 45 | isApplied = isApplied, 46 | isOpened = isOpened, 47 | member = member.map { it.toClubMemberData() }, 48 | name = name, 49 | notionLink = notionLink, 50 | scope = scope, 51 | teacher = teacher, 52 | type = type 53 | ) 54 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/club/get_club_detail/ClubMemberResponse.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.club.get_club_detail 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.msg.gcms.domain.data.club.get_club_detail.ClubMemberData 5 | import java.util.UUID 6 | 7 | data class ClubMemberResponse( 8 | @SerializedName("uuid") 9 | val uuid: UUID, 10 | @SerializedName("email") 11 | val email: String, 12 | @SerializedName("name") 13 | val name: String, 14 | @SerializedName("grade") 15 | val grade: Int, 16 | @SerializedName("class") 17 | val `class`: Int, 18 | @SerializedName("num") 19 | val num: Int, 20 | @SerializedName("profileImg") 21 | val userImg: String?, 22 | ) 23 | 24 | fun ClubMemberResponse.toClubMemberData(): ClubMemberData { 25 | return ClubMemberData( 26 | uuid = uuid, 27 | email = email, 28 | `class` = `class`, 29 | grade = grade, 30 | name = name, 31 | num = num, 32 | userImg = userImg 33 | ) 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/club/get_club_list/GetClubListResponse.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.club.get_club_list 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.msg.gcms.domain.data.club.get_club_list.GetClubListData 5 | 6 | data class GetClubListResponse( 7 | @SerializedName("id") 8 | val id: Long, 9 | @SerializedName("type") 10 | val type: String, 11 | @SerializedName("name") 12 | val title: String, 13 | @SerializedName("bannerImg") 14 | val bannerUrl: String 15 | ) 16 | 17 | fun GetClubListResponse.toClubListData(): GetClubListData { 18 | return GetClubListData( 19 | id = id, 20 | bannerUrl = bannerUrl, 21 | title = title, 22 | type = type 23 | ) 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/club/modify_club_info/ModifyClubInfoRequest.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.club.modify_club_info 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import java.util.UUID 5 | 6 | data class ModifyClubInfoRequest( 7 | @SerializedName("type") 8 | val type: String, 9 | @SerializedName("name") 10 | val title: String, 11 | @SerializedName("content") 12 | val description: String, 13 | @SerializedName("bannerImg") 14 | val bannerUrl: String, 15 | @SerializedName("contact") 16 | val contact: String, 17 | @SerializedName("notionLink") 18 | val notionLink: String?, 19 | @SerializedName("teacher") 20 | val teacher: String?, 21 | @SerializedName("activityImgs") 22 | val activityImgs: List, 23 | @SerializedName("member") 24 | val member: List 25 | 26 | ) 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/club_member/delegation_of_manager/DelegationOfManagerRequest.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.club_member.delegation_of_manager 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import java.util.UUID 5 | 6 | data class DelegationOfManagerRequest( 7 | @SerializedName("uuid") 8 | val uuid: UUID 9 | ) 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/club_member/get_club_member/GetClubMemberResponse.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.club_member.get_club_member 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.msg.gcms.domain.data.club_member.get_club_member.GetClubMemberData 5 | 6 | data class GetClubMemberResponse( 7 | @SerializedName("scope") 8 | val userScope: String, 9 | @SerializedName("clubMember") 10 | val requestUser: List 11 | ) 12 | 13 | fun GetClubMemberResponse.toClubMemberData(): GetClubMemberData { 14 | return GetClubMemberData( 15 | userScope = userScope, 16 | requestUser = requestUser.map { 17 | it.toMemberData() 18 | } 19 | ) 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/club_member/get_club_member/MemberResponse.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.club_member.get_club_member 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.msg.gcms.domain.data.club_member.get_club_member.MemberData 5 | import java.util.UUID 6 | 7 | data class MemberResponse( 8 | @SerializedName("uuid") 9 | val uuid: UUID, 10 | @SerializedName("email") 11 | val email: String, 12 | @SerializedName("name") 13 | val name: String, 14 | @SerializedName("grade") 15 | val grade: Int, 16 | @SerializedName("classNum") 17 | val `class`: Int, 18 | @SerializedName("number") 19 | val num: Int, 20 | @SerializedName("profileImg") 21 | val userImg: String?, 22 | @SerializedName("scope") 23 | val scope: String 24 | ) 25 | 26 | fun MemberResponse.toMemberData(): MemberData{ 27 | return MemberData( 28 | uuid = uuid, 29 | email = email, 30 | name = name, 31 | grade = grade, 32 | `class` = `class`, 33 | num = num, 34 | userImg = userImg, 35 | scope = scope 36 | ) 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/club_member/member_expelled/MemberExpelledRequest.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.club_member.member_expelled 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import java.util.UUID 5 | 6 | data class MemberExpelledRequest( 7 | @SerializedName("uuid") 8 | val uuid: UUID 9 | ) 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/image/ImageResponse.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.image 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.msg.gcms.domain.data.image.ImageData 5 | 6 | data class ImageResponse( 7 | @SerializedName("images") 8 | val images: List 9 | ) 10 | 11 | fun ImageResponse.toImageData(): ImageData { 12 | return ImageData(images = images) 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/user/get_my_profile/GetMyProfileResponse.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.user.get_my_profile 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.msg.gcms.domain.data.user.get_my_profile.GetMyProfileData 5 | import java.util.UUID 6 | 7 | data class GetMyProfileResponse( 8 | @SerializedName("uuid") 9 | val uuid: UUID, 10 | @SerializedName("email") 11 | val email: String, 12 | @SerializedName("name") 13 | val name: String, 14 | @SerializedName("grade") 15 | val grade: Int, 16 | @SerializedName("classNum") 17 | val classNum: Int, 18 | @SerializedName("number") 19 | val number: Int, 20 | @SerializedName("profileImg") 21 | val profileImg: String?, 22 | @SerializedName("clubs") 23 | val clubs: List 24 | ) 25 | 26 | fun GetMyProfileResponse.toGetMyProfileData(): GetMyProfileData { 27 | return GetMyProfileData( 28 | classNum = classNum, 29 | clubs = clubs.map { it.toProfileClubData() }, 30 | email = email, 31 | grade = grade, 32 | name = name, 33 | number = number, 34 | profileImg = profileImg, 35 | uuid = uuid 36 | ) 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/user/get_my_profile/ProfileClubResponse.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.user.get_my_profile 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.msg.gcms.domain.data.user.get_my_profile.ProfileClubData 5 | 6 | data class ProfileClubResponse( 7 | @SerializedName("id") 8 | val id: Long, 9 | @SerializedName("type") 10 | val type: String, 11 | @SerializedName("bannerImg") 12 | val bannerImg: String, 13 | @SerializedName("name") 14 | val title: String 15 | ) 16 | 17 | fun ProfileClubResponse.toProfileClubData(): ProfileClubData { 18 | return ProfileClubData( 19 | id = id, 20 | type = type, 21 | bannerImg = bannerImg, 22 | title = title 23 | ) 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/user/get_profile_image/GetProfileImageResponse.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.user.get_profile_image 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.msg.gcms.domain.data.user.get_profile_image.GetProfileImageData 5 | 6 | data class GetProfileImageResponse( 7 | @SerializedName("profileImg") 8 | val profileImg: String?, 9 | ) 10 | 11 | fun GetProfileImageResponse.toGetProfileImageData(): GetProfileImageData { 12 | return GetProfileImageData( 13 | profileImg = profileImg 14 | ) 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/user/modify_profile_image/ModifyProfileImageRequest.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.user.modify_profile_image 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class ModifyProfileImageRequest( 6 | @SerializedName("profileImg") 7 | val url: String 8 | ) 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/user/response/AftersData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.user.response 2 | 3 | data class AftersData( 4 | val id: Int, 5 | val title: String, 6 | val week: String, 7 | val grade: Int, 8 | val personnel: Int, 9 | val maxPersonnel: Int, 10 | val isApplied: Int 11 | ) 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/dto/user/search_user/GetSearchUserResponse.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.dto.user.search_user 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.msg.gcms.domain.data.user.search_user.GetSearchUserData 5 | import java.util.UUID 6 | 7 | data class GetSearchUserResponse( 8 | @SerializedName("uuid") 9 | val uuid: UUID, 10 | @SerializedName("email") 11 | val email: String, 12 | @SerializedName("name") 13 | val name: String, 14 | @SerializedName("grade") 15 | val grade: Int, 16 | @SerializedName("classNum") 17 | val classNum: Int, 18 | @SerializedName("number") 19 | val number: Int, 20 | @SerializedName("profileImg") 21 | val profileImg: String? 22 | ) 23 | 24 | fun GetSearchUserResponse.toGetSearchUserData(): GetSearchUserData { 25 | return GetSearchUserData( 26 | classNum = classNum, 27 | email = email, 28 | grade = grade, 29 | name = name, 30 | number = number, 31 | profileImg = profileImg, 32 | uuid = uuid 33 | ) 34 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/network/api/ApplicantAPI.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.network.api 2 | 3 | import com.msg.gcms.data.remote.dto.applicant.get_applicant_list.GetApplicantListResponse 4 | import com.msg.gcms.data.remote.dto.applicant.club_apply_accept.ClubApplyAcceptRequest 5 | import com.msg.gcms.data.remote.dto.applicant.club_apply_reject.ClubApplyRejectRequest 6 | import retrofit2.http.Body 7 | import retrofit2.http.DELETE 8 | import retrofit2.http.GET 9 | import retrofit2.http.POST 10 | import retrofit2.http.Path 11 | 12 | interface ApplicantAPI { 13 | 14 | @GET("applicant/{club_id}") 15 | suspend fun getApplicantList( 16 | @Path("club_id") clubId: Long 17 | ): GetApplicantListResponse 18 | 19 | @POST("applicant/{club_id}") 20 | suspend fun postClubApply( 21 | @Path("club_id") clubId: Long 22 | ) 23 | 24 | @DELETE("applicant/{club_id}") 25 | suspend fun deleteClubApply( 26 | @Path("club_id") clubId: Long 27 | ) 28 | 29 | @POST("applicant/{club_id}/accept") 30 | suspend fun postApplicantAccept( 31 | @Path("club_id") clubId: Long, 32 | @Body body: ClubApplyAcceptRequest 33 | ) 34 | 35 | @POST("applicant/{club_id}/reject") 36 | suspend fun postApplicantReject( 37 | @Path("club_id") clubId: Long, 38 | @Body body: ClubApplyRejectRequest 39 | ) 40 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/network/api/AttendAPI.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.network.api 2 | 3 | import com.msg.gcms.data.remote.dto.attend.request.PatchAttendStatusCollectivelyRequest 4 | import com.msg.gcms.data.remote.dto.attend.request.PatchAttendStatusRequest 5 | import com.msg.gcms.data.remote.dto.attend.request.PostAttendListRequest 6 | import com.msg.gcms.data.remote.dto.attend.response.GetClubAttendListResponse 7 | import retrofit2.http.Body 8 | import retrofit2.http.GET 9 | import retrofit2.http.PATCH 10 | import retrofit2.http.POST 11 | import retrofit2.http.Path 12 | import retrofit2.http.Query 13 | import java.time.LocalDate 14 | import java.time.LocalTime 15 | 16 | interface AttendAPI { 17 | 18 | @GET("attend/{club_id}") 19 | suspend fun getAttendList( 20 | @Path("club_id") clubId: Long, 21 | @Query("date") date: LocalDate, 22 | @Query("period") period: String 23 | ): GetClubAttendListResponse 24 | 25 | @POST("attend/{club_id}/club") 26 | suspend fun postAttendList( 27 | @Body body: PostAttendListRequest 28 | ) 29 | 30 | @PATCH("attend") 31 | suspend fun patchAttendStatus( 32 | @Body body: PatchAttendStatusRequest 33 | ) 34 | 35 | @PATCH("attend/batch") 36 | suspend fun patchAttendStatusCollectively( 37 | @Body body: PatchAttendStatusCollectivelyRequest 38 | ) 39 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/network/api/AuthAPI.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.network.api 2 | 3 | import com.msg.gcms.data.remote.dto.auth.request.RefreshRequest 4 | import com.msg.gcms.data.remote.dto.auth.request.SignInRequest 5 | import com.msg.gcms.data.remote.dto.auth.response.SignInResponse 6 | import retrofit2.Response 7 | import retrofit2.http.Body 8 | import retrofit2.http.DELETE 9 | import retrofit2.http.Header 10 | import retrofit2.http.PATCH 11 | import retrofit2.http.POST 12 | 13 | interface AuthAPI { 14 | 15 | @POST("auth") 16 | suspend fun postSignIn( 17 | @Body body: SignInRequest 18 | ): SignInResponse 19 | 20 | @DELETE("auth") 21 | suspend fun logout(): Response 22 | 23 | @PATCH("auth") 24 | suspend fun refreshToken( 25 | @Header("Refresh-Token") header: String, 26 | @Body body: RefreshRequest 27 | ): SignInResponse 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/network/api/ClubAPI.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.network.api 2 | 3 | import com.msg.gcms.data.remote.dto.club.create_club.CreateClubRequest 4 | import com.msg.gcms.data.remote.dto.club.get_club_detail.ClubDetailResponse 5 | import com.msg.gcms.data.remote.dto.club.get_club_list.GetClubListResponse 6 | import com.msg.gcms.data.remote.dto.club.modify_club_info.ModifyClubInfoRequest 7 | import retrofit2.Response 8 | import retrofit2.http.Body 9 | import retrofit2.http.DELETE 10 | import retrofit2.http.GET 11 | import retrofit2.http.PATCH 12 | import retrofit2.http.POST 13 | import retrofit2.http.Path 14 | import retrofit2.http.Query 15 | 16 | interface ClubAPI { 17 | 18 | @GET("club") 19 | suspend fun getClubList( 20 | @Query("type") type: String 21 | ): List 22 | 23 | @GET("club/{club_id}") 24 | suspend fun getDetail( 25 | @Path("club_id") clubId: Long, 26 | ): ClubDetailResponse 27 | 28 | @POST("club") 29 | suspend fun postCreateClub( 30 | @Body body: CreateClubRequest 31 | ) 32 | 33 | @PATCH("club/{club_id}") 34 | suspend fun putChangeClub( 35 | @Path("club_id") clubId: Long, 36 | @Body body: ModifyClubInfoRequest 37 | ): Response 38 | 39 | @PATCH("club/{club_id}/open") 40 | suspend fun putClubOpen( 41 | @Path("club_id") clubId: Long, 42 | ): Response 43 | 44 | @PATCH("club/{club_id}/close") 45 | suspend fun putClubClose( 46 | @Path("club_id") clubId: Long 47 | ): Response 48 | 49 | @DELETE("club/{club_id}/exit") 50 | suspend fun exitClub( 51 | @Path("club_id") clubId: Long 52 | ) 53 | 54 | @DELETE("club/{club_id}") 55 | suspend fun deleteClub( 56 | @Path("club_id") clubId: Long 57 | ): Response 58 | 59 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/network/api/ClubMemberAPI.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.network.api 2 | 3 | import com.msg.gcms.data.remote.dto.club_member.delegation_of_manager.DelegationOfManagerRequest 4 | import com.msg.gcms.data.remote.dto.club_member.get_club_member.GetClubMemberResponse 5 | import com.msg.gcms.data.remote.dto.club_member.member_expelled.MemberExpelledRequest 6 | import retrofit2.Response 7 | import retrofit2.http.Body 8 | import retrofit2.http.GET 9 | import retrofit2.http.PATCH 10 | import retrofit2.http.POST 11 | import retrofit2.http.Path 12 | 13 | interface ClubMemberAPI { 14 | 15 | @GET("club-member/{club_id}") 16 | suspend fun getMemberList( 17 | @Path("club_id") clubId: Long 18 | ): GetClubMemberResponse 19 | 20 | @POST("club-member/{club_id}") 21 | suspend fun deleteMemberExpel( 22 | @Path("club_id") clubId: Long, 23 | @Body body: MemberExpelledRequest 24 | ): Response 25 | 26 | @PATCH("club-member/{club_id}") 27 | suspend fun putDelegationOfRepresentation( 28 | @Path("club_id") clubId: Long, 29 | @Body body: DelegationOfManagerRequest 30 | ): Response 31 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/network/api/ImageAPI.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.network.api 2 | 3 | import com.msg.gcms.data.remote.dto.image.ImageResponse 4 | import okhttp3.MultipartBody 5 | import retrofit2.http.Multipart 6 | import retrofit2.http.POST 7 | import retrofit2.http.Part 8 | 9 | interface ImageAPI { 10 | @Multipart 11 | @POST("image") 12 | suspend fun postImage( 13 | @Part file: List 14 | ): ImageResponse 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/remote/network/api/UserAPI.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.remote.network.api 2 | 3 | import com.msg.gcms.data.remote.dto.user.get_my_profile.GetMyProfileResponse 4 | import com.msg.gcms.data.remote.dto.user.get_profile_image.GetProfileImageResponse 5 | import com.msg.gcms.data.remote.dto.user.modify_profile_image.ModifyProfileImageRequest 6 | import com.msg.gcms.data.remote.dto.user.search_user.GetSearchUserResponse 7 | import retrofit2.Response 8 | import retrofit2.http.Body 9 | import retrofit2.http.DELETE 10 | import retrofit2.http.GET 11 | import retrofit2.http.PATCH 12 | import retrofit2.http.QueryMap 13 | 14 | interface UserAPI { 15 | @GET("user") 16 | suspend fun getUserInfo(): GetMyProfileResponse 17 | 18 | @GET("user/search") 19 | suspend fun getUserSearch( 20 | @QueryMap QueryString: Map 21 | ): List 22 | 23 | @GET("user/profile") 24 | suspend fun getUserProfileImage(): GetProfileImageResponse 25 | 26 | @PATCH("user") 27 | suspend fun putProfile( 28 | @Body body: ModifyProfileImageRequest 29 | ): Response 30 | 31 | @DELETE("user") 32 | suspend fun deleteUser(): Response 33 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/repository/ApplicantRepositoryImpl.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.repository 2 | 3 | import com.msg.gcms.data.remote.datasource.applicant.ApplicantDataSource 4 | import com.msg.gcms.data.remote.dto.applicant.club_apply_accept.ClubApplyAcceptRequest 5 | import com.msg.gcms.data.remote.dto.applicant.club_apply_reject.ClubApplyRejectRequest 6 | import com.msg.gcms.data.remote.dto.applicant.get_applicant_list.toApplicantListData 7 | import com.msg.gcms.domain.data.applicant.clubApplyAccept.ClubApplyAcceptData 8 | import com.msg.gcms.domain.data.applicant.club_apply_reject.ClubApplyRejectData 9 | import com.msg.gcms.domain.data.applicant.get_applicant_list.GetApplicantListData 10 | import com.msg.gcms.domain.repository.ApplicantRepository 11 | import javax.inject.Inject 12 | 13 | class ApplicantRepositoryImpl @Inject constructor( 14 | private val dataSource: ApplicantDataSource 15 | ): ApplicantRepository { 16 | override suspend fun getApplicantList(clubId: Long): GetApplicantListData { 17 | return dataSource.getApplicantList(clubId = clubId).toApplicantListData() 18 | } 19 | 20 | override suspend fun postClubApply(clubId: Long) { 21 | return dataSource.postClubApply(clubId = clubId) 22 | } 23 | 24 | override suspend fun deleteClubApply(clubId: Long) { 25 | return dataSource.deleteClubApply(clubId = clubId) 26 | } 27 | 28 | override suspend fun postApplicantAccept(clubId: Long, body: ClubApplyAcceptData) { 29 | return dataSource.postApplicantAccept(clubId = clubId, body = ClubApplyAcceptRequest(uuid = body.uuid)) 30 | } 31 | 32 | override suspend fun postApplicantReject(clubId: Long, body: ClubApplyRejectData) { 33 | return dataSource.postApplicantReject(clubId = clubId, body = ClubApplyRejectRequest(uuid = body.uuid)) 34 | } 35 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/repository/ClubMemberRepositoryImpl.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.repository 2 | 3 | import com.msg.gcms.data.remote.datasource.club_member.ClubMemberDataSource 4 | import com.msg.gcms.data.remote.dto.club_member.delegation_of_manager.DelegationOfManagerRequest 5 | import com.msg.gcms.data.remote.dto.club_member.get_club_member.toClubMemberData 6 | import com.msg.gcms.data.remote.dto.club_member.member_expelled.MemberExpelledRequest 7 | import com.msg.gcms.domain.data.club_member.delegation_of_manager.DelegationOfManagerData 8 | import com.msg.gcms.domain.data.club_member.get_club_member.GetClubMemberData 9 | import com.msg.gcms.domain.data.club_member.member_expelled.MemberExpelledData 10 | import com.msg.gcms.domain.repository.ClubMemberRepository 11 | import javax.inject.Inject 12 | 13 | class ClubMemberRepositoryImpl @Inject constructor( 14 | private val datasource: ClubMemberDataSource 15 | ) : ClubMemberRepository { 16 | override suspend fun getMemberList(clubId: Long): GetClubMemberData { 17 | return datasource.getMemberList(clubId = clubId).toClubMemberData() 18 | } 19 | 20 | override suspend fun deleteMemberExpel( 21 | clubId: Long, 22 | body: MemberExpelledData 23 | ) { 24 | return datasource.deleteMemberExpel( 25 | clubId = clubId, 26 | body = MemberExpelledRequest(uuid = body.uuid) 27 | ) 28 | } 29 | 30 | override suspend fun putDelegationOfRepresentation( 31 | clubId: Long, 32 | body: DelegationOfManagerData 33 | ) { 34 | return datasource.putDelegationOfRepresentation( 35 | clubId = clubId, 36 | body = DelegationOfManagerRequest(uuid = body.uuid) 37 | ) 38 | } 39 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/repository/ImageRepositoryImpl.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.repository 2 | 3 | import com.msg.gcms.data.remote.datasource.image.ImageDataSource 4 | import com.msg.gcms.data.remote.dto.image.toImageData 5 | import com.msg.gcms.domain.data.image.ImageData 6 | import com.msg.gcms.domain.repository.ImageRepository 7 | import okhttp3.MultipartBody 8 | import javax.inject.Inject 9 | 10 | class ImageRepositoryImpl @Inject constructor( 11 | private val datasource: ImageDataSource 12 | ) : ImageRepository { 13 | override suspend fun postImage(image: List): ImageData { 14 | return datasource.postImage(image = image).toImageData() 15 | } 16 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/data/repository/UserRepositoryImpl.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.data.repository 2 | 3 | import com.msg.gcms.data.remote.datasource.user.UserDataSource 4 | import com.msg.gcms.data.remote.dto.user.get_my_profile.toGetMyProfileData 5 | import com.msg.gcms.data.remote.dto.user.get_profile_image.toGetProfileImageData 6 | import com.msg.gcms.data.remote.dto.user.modify_profile_image.ModifyProfileImageRequest 7 | import com.msg.gcms.data.remote.dto.user.search_user.toGetSearchUserData 8 | import com.msg.gcms.domain.data.user.get_my_profile.GetMyProfileData 9 | import com.msg.gcms.domain.data.user.get_profile_image.GetProfileImageData 10 | import com.msg.gcms.domain.data.user.modify_profile_image.ModifyProfileImageData 11 | import com.msg.gcms.domain.data.user.search_user.GetSearchUserData 12 | import com.msg.gcms.domain.repository.UserRepository 13 | import javax.inject.Inject 14 | 15 | class UserRepositoryImpl @Inject constructor( 16 | private val dataSource: UserDataSource 17 | ) : UserRepository { 18 | override suspend fun getUserInfo(): GetMyProfileData { 19 | return dataSource.getUserInfo().toGetMyProfileData() 20 | } 21 | 22 | override suspend fun putProfile( 23 | body: ModifyProfileImageData 24 | ) { 25 | return dataSource.putProfile(ModifyProfileImageRequest(url = body.url)) 26 | } 27 | 28 | override suspend fun getUserSearch(QueryString: Map): List { 29 | return dataSource.getUserSearch(QueryString) 30 | .map { it.toGetSearchUserData() } 31 | } 32 | 33 | override suspend fun getProfileImage(): GetProfileImageData { 34 | return dataSource.getProfileImage().toGetProfileImageData() 35 | } 36 | 37 | override suspend fun deleteUser() { 38 | return dataSource.deleteUser() 39 | } 40 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/di/GCMSApplication.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.di 2 | 3 | import android.app.Application 4 | import dagger.hilt.android.HiltAndroidApp 5 | 6 | @HiltAndroidApp 7 | class GCMSApplication : Application() 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/di/module/LocalDataSourceModule.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.di.module 2 | 3 | import com.msg.gcms.data.local.datasource.LocalDataSource 4 | import com.msg.gcms.data.local.datasource.LocalDataSourceImpl 5 | import com.msg.gcms.data.local.datasource.club.ClubLocalDataSource 6 | import com.msg.gcms.data.local.datasource.club.ClubLocalDataSourceImpl 7 | import dagger.Binds 8 | import dagger.Module 9 | import dagger.hilt.InstallIn 10 | import dagger.hilt.components.SingletonComponent 11 | import javax.inject.Singleton 12 | 13 | @Module 14 | @InstallIn(SingletonComponent::class) 15 | abstract class LocalDataSourceModule { 16 | 17 | @Binds 18 | abstract fun provideLocalDataSource( 19 | localDataSourceImpl: LocalDataSourceImpl 20 | ): LocalDataSource 21 | 22 | @Singleton 23 | @Binds 24 | abstract fun provideClubLocalDataSource( 25 | clubLocalDataSourceImpl: ClubLocalDataSourceImpl 26 | ): ClubLocalDataSource 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/di/module/LocalModule.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.di.module 2 | 3 | import android.content.Context 4 | import androidx.room.Room 5 | import com.msg.gcms.data.local.dao.ClubDao 6 | import com.msg.gcms.data.local.database.GCMSDataBase 7 | import dagger.Module 8 | import dagger.Provides 9 | import dagger.hilt.InstallIn 10 | import dagger.hilt.android.qualifiers.ApplicationContext 11 | import dagger.hilt.components.SingletonComponent 12 | import javax.inject.Singleton 13 | 14 | @Module 15 | @InstallIn(SingletonComponent::class) 16 | object LocalModule { 17 | 18 | @Provides 19 | @Singleton 20 | fun provideGCMSDatabase( 21 | @ApplicationContext context: Context 22 | ): GCMSDataBase = Room 23 | .databaseBuilder( 24 | context, 25 | GCMSDataBase::class.java, 26 | "gcms_database" 27 | ) 28 | .fallbackToDestructiveMigration() 29 | .build() 30 | 31 | @Provides 32 | @Singleton 33 | fun provideClubDao( 34 | gcmsDataBase: GCMSDataBase 35 | ): ClubDao = gcmsDataBase.clubDao() 36 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/di/module/StorageModule.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.di.module 2 | 3 | import com.msg.gcms.data.local.datastorage.AuthDataStorage 4 | import com.msg.gcms.data.local.datastorage.AuthDataStorageImpl 5 | import dagger.Binds 6 | import dagger.Module 7 | import dagger.hilt.InstallIn 8 | import dagger.hilt.components.SingletonComponent 9 | 10 | @Module 11 | @InstallIn(SingletonComponent::class) 12 | abstract class StorageModule { 13 | @Binds 14 | abstract fun provideAuthDataStorage( 15 | authDataStorageImpl: AuthDataStorageImpl 16 | ): AuthDataStorage 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/applicant/clubApplyAccept/ClubApplyAcceptData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.applicant.clubApplyAccept 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import java.util.UUID 5 | 6 | data class ClubApplyAcceptData( 7 | @SerializedName("uuid") 8 | val uuid: UUID 9 | ) 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/applicant/club_apply_reject/ClubApplyRejectData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.applicant.club_apply_reject 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import java.util.UUID 5 | 6 | data class ClubApplyRejectData( 7 | @SerializedName("uuid") 8 | val uuid: UUID 9 | ) 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/applicant/get_applicant_list/ApplicantListData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.applicant.get_applicant_list 2 | 3 | import java.util.UUID 4 | 5 | data class ApplicantListData( 6 | val uuid: UUID, 7 | val email: String, 8 | val name: String, 9 | val grade: Int, 10 | val classNum: Int, 11 | val number: Int, 12 | val profileImg: String? 13 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/applicant/get_applicant_list/GetApplicantListData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.applicant.get_applicant_list 2 | 3 | data class GetApplicantListData( 4 | val userScope: String, 5 | val applicantList: List 6 | ) 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/attend/GetClubAttendListResponseData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.attend 2 | 3 | import java.time.LocalDate 4 | import java.time.LocalTime 5 | import java.util.UUID 6 | 7 | data class GetClubAttendListResponseData( 8 | val date: LocalDate, 9 | val period: LocalTime, 10 | val users: List 11 | ) { 12 | data class User( 13 | val id: UUID, 14 | val attendanceId: Long, 15 | val name: String, 16 | val grade: Int, 17 | val classNum: Int, 18 | val number: Int, 19 | val attendanceStatus: String 20 | ) 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/attend/PatchAttendStatusCollectivelyRequestData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.attend 2 | 3 | data class PatchAttendStatusCollectivelyRequestData( 4 | val attendanceIds: List, 5 | val attendanceStatus: String 6 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/attend/PatchAttendStatusRequestData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.attend 2 | 3 | data class PatchAttendStatusRequestData( 4 | val attendanceId: Long, 5 | val attendanceStatus: String 6 | ) 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/attend/PostAttendListRequestData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.attend 2 | 3 | import java.time.LocalDate 4 | 5 | data class PostAttendListRequestData( 6 | val name: String, 7 | val date: LocalDate, 8 | val periods: List 9 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/auth/SignInRequestData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.auth 2 | 3 | data class SignInRequestData( 4 | val code: String, 5 | val token: String 6 | ) 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/auth/SignInResponseData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.auth 2 | 3 | data class SignInResponseData( 4 | val accessToken: String, 5 | val refreshToken: String, 6 | val accessExp: String, 7 | val refreshExp: String 8 | ) 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/club/create_club/CreateClubData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.club.create_club 2 | 3 | import java.util.UUID 4 | 5 | data class CreateClubData( 6 | val type: String, 7 | val title: String, 8 | val description: String, 9 | val bannerUrl:String, 10 | val contact: String, 11 | val notionLink: String, 12 | val teacher: String?, 13 | val activityUrls: List?, 14 | val member: List?, 15 | ) 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/club/get_club_detail/ClubDetailData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.club.get_club_detail 2 | 3 | data class ClubDetailData( 4 | val id: Long, 5 | val type: String, 6 | val bannerImg: String, 7 | val name: String, 8 | val content: String, 9 | val contact: String, 10 | val teacher: String, 11 | val isOpened: Boolean, 12 | val notionLink: String, 13 | val activityImgs: List, 14 | val head: ClubMemberData, 15 | val member: List, 16 | val scope: String, 17 | val isApplied: Boolean 18 | ) 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/club/get_club_detail/ClubMemberData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.club.get_club_detail 2 | 3 | import java.util.UUID 4 | 5 | data class ClubMemberData( 6 | val uuid: UUID, 7 | val email: String, 8 | val name: String, 9 | val grade: Int, 10 | val `class`: Int, 11 | val num: Int, 12 | val userImg: String?, 13 | ) 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/club/get_club_list/GetClubListData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.club.get_club_list 2 | 3 | data class GetClubListData( 4 | val id: Long, 5 | val type: String, 6 | val title: String, 7 | val bannerUrl: String 8 | ) 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/club/modify_club_info/ModifyClubInfoData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.club.modify_club_info 2 | 3 | import java.util.UUID 4 | 5 | data class ModifyClubInfoData( 6 | val type: String, 7 | val title: String, 8 | val description: String, 9 | val bannerUrl: String, 10 | val contact: String, 11 | val notionLink: String?, 12 | val teacher: String?, 13 | val activityImgs: List, 14 | val member: List 15 | ) 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/club_member/delegation_of_manager/DelegationOfManagerData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.club_member.delegation_of_manager 2 | 3 | import java.util.UUID 4 | 5 | data class DelegationOfManagerData( 6 | val uuid: UUID 7 | ) 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/club_member/get_club_member/GetClubMemberData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.club_member.get_club_member 2 | 3 | data class GetClubMemberData( 4 | val userScope: String, 5 | val requestUser: List 6 | ) 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/club_member/get_club_member/MemberData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.club_member.get_club_member 2 | 3 | import java.util.UUID 4 | 5 | data class MemberData( 6 | val uuid: UUID, 7 | val email: String, 8 | val name: String, 9 | val grade: Int, 10 | val `class`: Int, 11 | val num: Int, 12 | val userImg: String?, 13 | val scope: String 14 | ) 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/club_member/member_expelled/MemberExpelledData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.club_member.member_expelled 2 | 3 | import java.util.UUID 4 | 5 | data class MemberExpelledData( 6 | val uuid: UUID 7 | ) 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/image/ImageData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.image 2 | 3 | data class ImageData( 4 | val images: List 5 | ) 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/user/get_my_profile/GetMyProfileData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.user.get_my_profile 2 | 3 | import java.util.UUID 4 | 5 | data class GetMyProfileData( 6 | val uuid: UUID, 7 | val email: String, 8 | val name: String, 9 | val grade: Int, 10 | val classNum: Int, 11 | val number: Int, 12 | val profileImg: String?, 13 | val clubs: List 14 | ) 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/user/get_my_profile/ProfileClubData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.user.get_my_profile 2 | 3 | data class ProfileClubData( 4 | val id: Long, 5 | val type: String, 6 | val bannerImg: String, 7 | val title: String 8 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/user/get_profile_image/GetProfileImageData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.user.get_profile_image 2 | 3 | data class GetProfileImageData( 4 | val profileImg: String? 5 | ) 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/user/modify_profile_image/ModifyProfileImageData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.user.modify_profile_image 2 | 3 | data class ModifyProfileImageData( 4 | val url: String 5 | ) 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/data/user/search_user/GetSearchUserData.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.data.user.search_user 2 | 3 | import java.util.UUID 4 | 5 | data class GetSearchUserData( 6 | val uuid: UUID, 7 | val email: String, 8 | val name: String, 9 | val grade: Int, 10 | val classNum: Int, 11 | val number: Int, 12 | val profileImg: String? 13 | ) 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/exception/HttpException.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.exception 2 | 3 | /** 4 | * 요청이 올바르지 않은 경우 5 | * Http Status 가 400번일 때 사용 6 | * */ 7 | class BadRequestException( 8 | override val message: String? 9 | ) : RuntimeException() 10 | 11 | 12 | /** 13 | * 비인증 되었을 경우 -> 인증을 해야함 14 | * Http Status 가 401번일 때 사용 15 | */ 16 | class UnauthorizedException( 17 | override val message: String? 18 | ) : RuntimeException() 19 | 20 | 21 | /** 22 | * 권한이 없는 경우 23 | * Http Status 가 403번일 때 사용 24 | */ 25 | class ForBiddenException( 26 | override val message: String? 27 | ) : RuntimeException() 28 | 29 | 30 | /** 31 | * 요청 받은 리소스를 찾을 수 없는 경우 32 | * Http Status 가 404번일 때 사용 33 | */ 34 | class NotFoundException( 35 | override val message: String? 36 | ) : RuntimeException() 37 | 38 | 39 | /** 40 | * 에이전트가 정해준 규격에 맞는게 없을 경우 41 | * Http Status 가 406번일 때 사용 42 | */ 43 | class NotAcceptableException( 44 | override val message: String? 45 | ) : RuntimeException() 46 | 47 | /** 48 | * 요청이 너무 오래 걸리는 경우 49 | * Http Status가 408번 일 때 사용 50 | */ 51 | class TimeOutException( 52 | override val message: String? 53 | ) : RuntimeException() 54 | 55 | 56 | /** 57 | * 권한이 없을 경우 58 | * Http Status 가 409일 때 사용 59 | * */ 60 | class ConflictException( 61 | override val message: String? 62 | ) : RuntimeException() 63 | 64 | 65 | /** 66 | * 서버에러가 발생하는 경우 67 | * Http Status 가 50X일 때 사용 68 | */ 69 | class ServerException( 70 | override val message: String? 71 | ) : RuntimeException() 72 | 73 | 74 | /** 75 | * 예상하지 못한 에러가 발생하는 경우 76 | */ 77 | class OtherHttpException( 78 | val code: Int, 79 | override val message: String? 80 | ) : RuntimeException() 81 | 82 | 83 | class UnKnownException( 84 | override val message: String? 85 | ) : RuntimeException() 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/exception/NeedLoginException.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.exception 2 | 3 | import java.io.IOException 4 | 5 | class NeedLoginException: IOException() { 6 | override val message: String 7 | get() = "토큰이 만료되었습니다. 다시 로그인 해주세요" 8 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/exception/NetworkException.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.exception 2 | 3 | /** 4 | * 인터넷이 없을 경우 발생하는 RuntimeException 5 | */ 6 | class NoInternetException : RuntimeException() { 7 | override val message: String 8 | get() = "네트워크가 불안정합니다. 데이터나 와이파이 연결 상태를 확인해주세요." 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/repository/ApplicantRepository.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.repository 2 | 3 | import com.msg.gcms.domain.data.applicant.clubApplyAccept.ClubApplyAcceptData 4 | import com.msg.gcms.domain.data.applicant.club_apply_reject.ClubApplyRejectData 5 | import com.msg.gcms.domain.data.applicant.get_applicant_list.GetApplicantListData 6 | 7 | interface ApplicantRepository { 8 | suspend fun getApplicantList(clubId: Long): GetApplicantListData 9 | 10 | suspend fun postClubApply(clubId: Long) 11 | 12 | suspend fun postApplicantAccept(clubId: Long, body: ClubApplyAcceptData) 13 | 14 | suspend fun postApplicantReject(clubId: Long, body: ClubApplyRejectData) 15 | 16 | suspend fun deleteClubApply(clubId: Long) 17 | 18 | 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/repository/AttendRepository.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.repository 2 | 3 | import com.msg.gcms.domain.data.attend.GetClubAttendListResponseData 4 | import com.msg.gcms.domain.data.attend.PatchAttendStatusCollectivelyRequestData 5 | import com.msg.gcms.domain.data.attend.PatchAttendStatusRequestData 6 | import com.msg.gcms.domain.data.attend.PostAttendListRequestData 7 | import kotlinx.coroutines.flow.Flow 8 | import java.time.LocalDate 9 | 10 | interface AttendRepository { 11 | suspend fun getClubAttendList(clubId: Long, date: LocalDate, period: String): Flow 12 | suspend fun postAttendList(body: PostAttendListRequestData): Flow 13 | suspend fun patchAttendStatus(body: PatchAttendStatusRequestData): Flow 14 | suspend fun patchAttendStatusCollectively(body: PatchAttendStatusCollectivelyRequestData): Flow 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/repository/AuthRepository.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.repository 2 | 3 | import com.msg.gcms.domain.data.auth.SignInRequestData 4 | import com.msg.gcms.domain.data.auth.SignInResponseData 5 | 6 | interface AuthRepository { 7 | suspend fun postRegistration( 8 | body: SignInRequestData 9 | ): SignInResponseData 10 | 11 | suspend fun logout() 12 | 13 | suspend fun checkLoginStatus() 14 | 15 | suspend fun saveTokenInfo( 16 | accessToken: String, 17 | refreshToken: String, 18 | accessExp: String, 19 | refreshExp: String, 20 | fcmToken: String 21 | ) 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/repository/ClubMemberRepository.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.repository 2 | 3 | import com.msg.gcms.domain.data.club_member.delegation_of_manager.DelegationOfManagerData 4 | import com.msg.gcms.domain.data.club_member.get_club_member.GetClubMemberData 5 | import com.msg.gcms.domain.data.club_member.member_expelled.MemberExpelledData 6 | 7 | interface ClubMemberRepository { 8 | suspend fun getMemberList(clubId: Long): GetClubMemberData 9 | 10 | suspend fun deleteMemberExpel(clubId: Long, body: MemberExpelledData) 11 | 12 | suspend fun putDelegationOfRepresentation(clubId: Long, body: DelegationOfManagerData) 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/repository/ClubRepository.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.repository 2 | 3 | import Macaroni 4 | import com.msg.gcms.domain.data.club.create_club.CreateClubData 5 | import com.msg.gcms.domain.data.club.get_club_detail.ClubDetailData 6 | import com.msg.gcms.domain.data.club.get_club_list.GetClubListData 7 | import com.msg.gcms.domain.data.club.modify_club_info.ModifyClubInfoData 8 | 9 | interface ClubRepository { 10 | suspend fun getClubList(type: String): Macaroni> 11 | 12 | suspend fun getDetail(clubId: Long): ClubDetailData 13 | 14 | suspend fun postCreateClub( 15 | body: CreateClubData 16 | ) 17 | 18 | suspend fun putChangeClub( 19 | body: ModifyClubInfoData, 20 | clubId: Long 21 | ) 22 | 23 | suspend fun putClubOpen( 24 | clubId: Long 25 | ) 26 | 27 | suspend fun putClubClose( 28 | clubId: Long 29 | ) 30 | 31 | suspend fun exitClub( 32 | clubId: Long 33 | ) 34 | 35 | suspend fun deleteClub( 36 | clubId: Long 37 | ) 38 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/repository/ImageRepository.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.repository 2 | 3 | import com.msg.gcms.domain.data.image.ImageData 4 | import okhttp3.MultipartBody 5 | 6 | interface ImageRepository { 7 | suspend fun postImage( 8 | image: List 9 | ): ImageData 10 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/repository/UserRepository.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.repository 2 | 3 | import com.msg.gcms.domain.data.user.get_my_profile.GetMyProfileData 4 | import com.msg.gcms.domain.data.user.get_profile_image.GetProfileImageData 5 | import com.msg.gcms.domain.data.user.modify_profile_image.ModifyProfileImageData 6 | import com.msg.gcms.domain.data.user.search_user.GetSearchUserData 7 | 8 | interface UserRepository { 9 | suspend fun getUserInfo(): GetMyProfileData 10 | 11 | suspend fun putProfile(body: ModifyProfileImageData) 12 | 13 | suspend fun getUserSearch(QueryString: Map): List 14 | 15 | suspend fun getProfileImage(): GetProfileImageData 16 | 17 | suspend fun deleteUser() 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/applicant/ApplicantAcceptUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.applicant 2 | 3 | import com.msg.gcms.domain.data.applicant.clubApplyAccept.ClubApplyAcceptData 4 | import com.msg.gcms.domain.repository.ApplicantRepository 5 | import javax.inject.Inject 6 | 7 | class ApplicantAcceptUseCase @Inject constructor( 8 | private val repository: ApplicantRepository 9 | ) { 10 | suspend operator fun invoke(clubId: Long, body: ClubApplyAcceptData) = kotlin.runCatching { 11 | repository.postApplicantAccept(clubId = clubId, body = body) 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/applicant/ApplicantRejectUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.applicant 2 | 3 | import com.msg.gcms.domain.data.applicant.club_apply_reject.ClubApplyRejectData 4 | import com.msg.gcms.domain.repository.ApplicantRepository 5 | import javax.inject.Inject 6 | 7 | class ApplicantRejectUseCase @Inject constructor( 8 | private val repository: ApplicantRepository 9 | ) { 10 | suspend operator fun invoke(clubId: Long, body: ClubApplyRejectData) = kotlin.runCatching { 11 | repository.postApplicantReject(clubId = clubId, body = body) 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/applicant/GetApplicantUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.applicant 2 | 3 | import com.msg.gcms.domain.repository.ApplicantRepository 4 | import javax.inject.Inject 5 | 6 | class GetApplicantUseCase @Inject constructor( 7 | private val repository: ApplicantRepository 8 | ) { 9 | suspend operator fun invoke(clubId: Long) = kotlin.runCatching { 10 | repository.getApplicantList(clubId = clubId) 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/applicant/PostClubApplyUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.applicant 2 | 3 | import com.msg.gcms.domain.repository.ApplicantRepository 4 | import javax.inject.Inject 5 | 6 | class PostClubApplyUseCase @Inject constructor( 7 | private val repository: ApplicantRepository 8 | ) { 9 | suspend operator fun invoke(clubId: Long) = kotlin.runCatching { 10 | repository.postClubApply(clubId = clubId) 11 | } 12 | 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/applicant/PostClubCancelUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.applicant 2 | 3 | import com.msg.gcms.domain.repository.ApplicantRepository 4 | import javax.inject.Inject 5 | 6 | class PostClubCancelUseCase @Inject constructor( 7 | private val repository: ApplicantRepository 8 | ) { 9 | suspend operator fun invoke(clubId: Long) = kotlin.runCatching { 10 | repository.deleteClubApply(clubId = clubId) 11 | } 12 | 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/attend/GetClubAttendListUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.attend 2 | 3 | import com.msg.gcms.domain.repository.AttendRepository 4 | import java.time.LocalDate 5 | import javax.inject.Inject 6 | 7 | class GetClubAttendListUseCase @Inject constructor( 8 | private val attendRepository: AttendRepository 9 | ) { 10 | suspend operator fun invoke(clubId: Long, date: LocalDate, period: String) = runCatching { 11 | attendRepository.getClubAttendList( 12 | clubId = clubId, 13 | date = date, 14 | period = period 15 | ) 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/attend/PatchAttendStatusCollectivelyUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.attend 2 | 3 | import com.msg.gcms.domain.data.attend.PatchAttendStatusCollectivelyRequestData 4 | import com.msg.gcms.domain.repository.AttendRepository 5 | import javax.inject.Inject 6 | 7 | class PatchAttendStatusCollectivelyUseCase @Inject constructor( 8 | private val attendRepository: AttendRepository 9 | ) { 10 | suspend operator fun invoke(body: PatchAttendStatusCollectivelyRequestData) = runCatching { 11 | attendRepository.patchAttendStatusCollectively(body = body) 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/attend/PatchAttendStatusUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.attend 2 | 3 | import com.msg.gcms.domain.data.attend.PatchAttendStatusRequestData 4 | import com.msg.gcms.domain.repository.AttendRepository 5 | import javax.inject.Inject 6 | 7 | class PatchAttendStatusUseCase @Inject constructor( 8 | private val attendRepository: AttendRepository 9 | ) { 10 | suspend operator fun invoke(body: PatchAttendStatusRequestData) = runCatching { 11 | attendRepository.patchAttendStatus(body = body) 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/attend/PostAttendListUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.attend 2 | 3 | import com.msg.gcms.domain.data.attend.PostAttendListRequestData 4 | import com.msg.gcms.domain.repository.AttendRepository 5 | import javax.inject.Inject 6 | 7 | class PostAttendListUseCase @Inject constructor( 8 | private val attendRepository: AttendRepository 9 | ) { 10 | suspend fun invoke(body: PostAttendListRequestData) = runCatching { 11 | attendRepository.postAttendList( 12 | body = body 13 | ) 14 | } 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/auth/CheckLoginStatusUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.auth 2 | 3 | import com.msg.gcms.domain.repository.AuthRepository 4 | import javax.inject.Inject 5 | 6 | class CheckLoginStatusUseCase @Inject constructor( 7 | private val authRepository: AuthRepository 8 | ) { 9 | suspend operator fun invoke() = kotlin.runCatching { 10 | authRepository.checkLoginStatus() 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/auth/LogoutUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.auth 2 | 3 | import com.msg.gcms.domain.repository.AuthRepository 4 | import javax.inject.Inject 5 | 6 | class LogoutUseCase @Inject constructor( 7 | private val authRepository: AuthRepository 8 | ) { 9 | suspend operator fun invoke() = kotlin.runCatching { 10 | authRepository.logout() 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/auth/SaveTokenInfoUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.auth 2 | 3 | import com.msg.gcms.domain.repository.AuthRepository 4 | import javax.inject.Inject 5 | 6 | class SaveTokenInfoUseCase @Inject constructor( 7 | private val authRepository: AuthRepository 8 | ) { 9 | suspend operator fun invoke( 10 | accessToken: String = "", 11 | refreshToken: String = "", 12 | accessExp: String = "", 13 | refreshExp: String = "", 14 | fcmToken: String = "" 15 | ) = 16 | kotlin.runCatching { 17 | authRepository.saveTokenInfo(accessToken, refreshToken, accessExp, refreshExp, fcmToken) 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/auth/SignInUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.auth 2 | 3 | import com.msg.gcms.domain.data.auth.SignInRequestData 4 | import com.msg.gcms.domain.repository.AuthRepository 5 | import javax.inject.Inject 6 | 7 | class SignInUseCase @Inject constructor( 8 | private val authRepository: AuthRepository 9 | ) { 10 | suspend operator fun invoke(body: SignInRequestData) = kotlin.runCatching { 11 | authRepository.postRegistration(body) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/club/ClubDeleteUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.club 2 | 3 | import com.msg.gcms.domain.repository.ClubRepository 4 | import javax.inject.Inject 5 | 6 | class ClubDeleteUseCase @Inject constructor( 7 | private val repository: ClubRepository 8 | ) { 9 | suspend operator fun invoke(clubId: Long) = kotlin.runCatching { 10 | repository.deleteClub(clubId) 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/club/EditClubInfoUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.club 2 | 3 | import com.msg.gcms.domain.data.club.modify_club_info.ModifyClubInfoData 4 | import com.msg.gcms.domain.repository.ClubRepository 5 | import javax.inject.Inject 6 | 7 | class EditClubInfoUseCase @Inject constructor( 8 | private val repository: ClubRepository 9 | ) { 10 | suspend operator fun invoke(body: ModifyClubInfoData, clubId: Long) = kotlin.runCatching { 11 | repository.putChangeClub(body, clubId) 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/club/GetClubListUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.club 2 | 3 | import com.msg.gcms.domain.repository.ClubRepository 4 | import javax.inject.Inject 5 | 6 | class GetClubListUseCase @Inject constructor( 7 | private val repository: ClubRepository 8 | ) { 9 | suspend operator fun invoke(type: String) = kotlin.runCatching { 10 | repository.getClubList(type) 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/club/GetDetailUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.club 2 | 3 | import com.msg.gcms.domain.repository.ClubRepository 4 | import javax.inject.Inject 5 | 6 | class GetDetailUseCase @Inject constructor( 7 | private val repository : ClubRepository 8 | ) { 9 | suspend operator fun invoke(clubId: Long) = kotlin.runCatching { 10 | repository.getDetail(clubId = clubId) 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/club/PostCreateClubUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.club 2 | 3 | import com.msg.gcms.domain.data.club.create_club.CreateClubData 4 | import com.msg.gcms.domain.repository.ClubRepository 5 | import javax.inject.Inject 6 | 7 | class PostCreateClubUseCase @Inject constructor( 8 | private val repository: ClubRepository 9 | ) { 10 | suspend operator fun invoke(body: CreateClubData) = kotlin.runCatching { 11 | repository.postCreateClub(body = body) 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/club/PutClubCloseUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.club 2 | 3 | import com.msg.gcms.domain.repository.ClubRepository 4 | import javax.inject.Inject 5 | 6 | class PutClubCloseUseCase @Inject constructor( 7 | private val repository: ClubRepository 8 | ){ 9 | suspend operator fun invoke(clubId: Long) = kotlin.runCatching { 10 | repository.putClubClose(clubId = clubId) 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/club/PutClubOpenUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.club 2 | 3 | import com.msg.gcms.domain.repository.ClubRepository 4 | import javax.inject.Inject 5 | 6 | class PutClubOpenUseCase @Inject constructor( 7 | private val repository: ClubRepository 8 | ) { 9 | suspend operator fun invoke(clubId: Long) = kotlin.runCatching { 10 | repository.putClubOpen(clubId = clubId) 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/club_member/GetMemberUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.club_member 2 | 3 | import com.msg.gcms.domain.repository.ClubMemberRepository 4 | import javax.inject.Inject 5 | 6 | class GetMemberUseCase @Inject constructor( 7 | private val repository: ClubMemberRepository 8 | ) { 9 | suspend operator fun invoke(clubId: Long) = kotlin.runCatching { 10 | repository.getMemberList(clubId = clubId) 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/club_member/MandateUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.club_member 2 | 3 | import com.msg.gcms.domain.data.club_member.delegation_of_manager.DelegationOfManagerData 4 | import com.msg.gcms.domain.repository.ClubMemberRepository 5 | import javax.inject.Inject 6 | 7 | class MandateUseCase @Inject constructor( 8 | private val repository: ClubMemberRepository 9 | ) { 10 | suspend operator fun invoke(clubId: Long, body: DelegationOfManagerData) = kotlin.runCatching { 11 | repository.putDelegationOfRepresentation(clubId = clubId, body = body) 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/club_member/UserKickUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.club_member 2 | 3 | import com.msg.gcms.domain.data.club_member.member_expelled.MemberExpelledData 4 | import com.msg.gcms.domain.repository.ClubMemberRepository 5 | import javax.inject.Inject 6 | 7 | class UserKickUseCase @Inject constructor( 8 | private val repository: ClubMemberRepository 9 | ) { 10 | suspend operator fun invoke(clubId: Long, body: MemberExpelledData) = kotlin.runCatching { 11 | repository.deleteMemberExpel(clubId = clubId, body = body) 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/image/ImageUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.image 2 | 3 | import com.msg.gcms.domain.repository.ImageRepository 4 | import okhttp3.MultipartBody 5 | import javax.inject.Inject 6 | 7 | class ImageUseCase @Inject constructor( 8 | private val imageRepository: ImageRepository 9 | ) { 10 | suspend operator fun invoke(image: List) = kotlin.runCatching { 11 | imageRepository.postImage(image = image) 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/user/DeleteUserUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.user 2 | 3 | import com.msg.gcms.domain.repository.UserRepository 4 | import javax.inject.Inject 5 | 6 | class DeleteUserUseCase @Inject constructor( 7 | private val repository: UserRepository 8 | ) { 9 | suspend operator fun invoke() = kotlin.runCatching { 10 | repository.deleteUser() 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/user/EditProfileUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.user 2 | 3 | import com.msg.gcms.domain.data.user.modify_profile_image.ModifyProfileImageData 4 | import com.msg.gcms.domain.repository.UserRepository 5 | import javax.inject.Inject 6 | 7 | class EditProfileUseCase @Inject constructor( 8 | private val repository: UserRepository 9 | ) { 10 | suspend operator fun invoke(img: ModifyProfileImageData) = kotlin.runCatching { 11 | repository.putProfile(img) 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/user/ExitUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.user 2 | 3 | import com.msg.gcms.domain.repository.ClubRepository 4 | import javax.inject.Inject 5 | 6 | class ExitUseCase @Inject constructor( 7 | private val repository: ClubRepository 8 | ) { 9 | suspend operator fun invoke(clubId: Long) = kotlin.runCatching { 10 | repository.exitClub(clubId = clubId) 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/user/GetProfileImageUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.user 2 | 3 | import com.msg.gcms.domain.repository.UserRepository 4 | import javax.inject.Inject 5 | 6 | class GetProfileImageUseCase @Inject constructor( 7 | private val repository: UserRepository 8 | ) { 9 | suspend operator fun invoke() = kotlin.runCatching { 10 | repository.getProfileImage() 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/user/GetSearchUserUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.user 2 | 3 | import com.msg.gcms.domain.repository.UserRepository 4 | import javax.inject.Inject 5 | 6 | class GetSearchUserUseCase @Inject constructor( 7 | private val userRepository : UserRepository 8 | ) { 9 | suspend operator fun invoke(userSearch : Map) = kotlin.runCatching { 10 | userRepository.getUserSearch(userSearch) 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/domain/usecase/user/GetUserInfoUseCase.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.domain.usecase.user 2 | 3 | import com.msg.gcms.domain.repository.UserRepository 4 | import javax.inject.Inject 5 | 6 | class GetUserInfoUseCase @Inject constructor( 7 | private val userRepository: UserRepository 8 | ) { 9 | suspend operator fun invoke() = kotlin.runCatching { 10 | userRepository.getUserInfo() 11 | } 12 | 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/adapter/activity_photo/ActivityPhotoType.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.adapter.activity_photo 2 | 3 | import android.graphics.Bitmap 4 | 5 | data class ActivityPhotoType( 6 | var activityPhoto: Bitmap 7 | ) 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/adapter/add_member/AddMemberType.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.adapter.add_member 2 | 3 | import java.util.UUID 4 | 5 | data class AddMemberType( 6 | val uuid: UUID?, 7 | val userName: String, 8 | val userImg: String? 9 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/adapter/detail_photo/PromotionPicType.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.adapter.detail_photo 2 | 3 | data class PromotionPicType( 4 | var promotionUrl: String 5 | ) 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/adapter/detail_side_bar/DetailPageSideBar.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.adapter.detail_side_bar 2 | 3 | data class DetailPageSideBar( 4 | val title: String, 5 | val icon: Int 6 | ) 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/adapter/detail_side_bar/DetailSideBarAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.adapter.detail_side_bar 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.recyclerview.widget.RecyclerView 6 | import com.msg.gcms.databinding.ListDetailSidebarBinding 7 | 8 | class DetailSideBarAdapter(private val list: List) : 9 | RecyclerView.Adapter() { 10 | class SideBarViewHolder( 11 | private val binding: ListDetailSidebarBinding, 12 | listener: OnItemClickListener 13 | ) : RecyclerView.ViewHolder(binding.root) { 14 | fun bind(item: DetailPageSideBar) { 15 | binding.titleTv.text = item.title 16 | binding.iconIv.setImageResource(item.icon) 17 | } 18 | } 19 | 20 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SideBarViewHolder { 21 | val binding = 22 | ListDetailSidebarBinding.inflate(LayoutInflater.from(parent.context), parent, false) 23 | val viewHolder = SideBarViewHolder(binding, itemClickListener) 24 | return viewHolder 25 | } 26 | 27 | override fun onBindViewHolder(holder: SideBarViewHolder, position: Int) { 28 | holder.bind(list[position]) 29 | holder.itemView.setOnClickListener { 30 | itemClickListener.onClick(position) 31 | } 32 | } 33 | 34 | override fun getItemCount(): Int = list.size 35 | 36 | interface OnItemClickListener { 37 | fun onClick(position: Int) 38 | } 39 | 40 | fun setItemOnClickListener(onItemClickListener: OnItemClickListener) { 41 | this.itemClickListener = onItemClickListener 42 | } 43 | 44 | private lateinit var itemClickListener: OnItemClickListener 45 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/adapter/editorial_club/ClubType.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.adapter.editorial_club 2 | 3 | 4 | data class ClubType ( 5 | val id: Long, 6 | val type: String, 7 | val bannerImg: String, 8 | val title: String 9 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/base/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/java/com/msg/gcms/presentation/base/.gitkeep -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/base/BaseActivity.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.base 2 | 3 | import android.os.Bundle 4 | import android.widget.Toast 5 | import androidx.annotation.LayoutRes 6 | import androidx.appcompat.app.AppCompatActivity 7 | import androidx.databinding.DataBindingUtil 8 | import androidx.databinding.ViewDataBinding 9 | 10 | abstract class BaseActivity( 11 | @LayoutRes private val layoutResId: Int 12 | ) : AppCompatActivity() { 13 | 14 | protected lateinit var binding: T 15 | 16 | override fun onCreate(savedInstanceState: Bundle?) { 17 | super.onCreate(savedInstanceState) 18 | binding = DataBindingUtil.setContentView(this, layoutResId) 19 | binding.lifecycleOwner = this 20 | viewSetting() 21 | observeEvent() 22 | } 23 | 24 | abstract fun viewSetting() 25 | 26 | abstract fun observeEvent() 27 | 28 | protected fun shortToast(msg: String) { 29 | Toast.makeText(this, msg, Toast.LENGTH_SHORT).show() 30 | } 31 | 32 | protected fun longToast(msg: String) { 33 | Toast.makeText(this, msg, Toast.LENGTH_LONG).show() 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/base/BaseDialog.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.base 2 | 3 | import android.app.AlertDialog 4 | import android.content.Context 5 | import android.graphics.Color 6 | import android.graphics.drawable.ColorDrawable 7 | import android.os.Bundle 8 | import com.msg.gcms.databinding.DetailDialogBinding 9 | 10 | class BaseDialog(val title: String, val msg: String, context: Context) : AlertDialog(context) { 11 | 12 | lateinit var dialogBinding: DetailDialogBinding 13 | 14 | override fun onCreate(savedInstanceState: Bundle?) { 15 | super.onCreate(savedInstanceState) 16 | dialogBinding = DetailDialogBinding.inflate(layoutInflater) 17 | setContentView(dialogBinding.root) 18 | viewSet() 19 | } 20 | 21 | private fun viewSet() = with(dialogBinding) { 22 | setCancelable(true) 23 | window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) 24 | cancel.setOnClickListener { 25 | dismiss() 26 | } 27 | dialogTitle.text = title 28 | dialogMsg.text = msg 29 | } 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/base/BaseFragment.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.base 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import android.widget.Toast 8 | import androidx.annotation.LayoutRes 9 | import androidx.databinding.DataBindingUtil 10 | import androidx.databinding.ViewDataBinding 11 | import androidx.fragment.app.Fragment 12 | 13 | abstract class BaseFragment(@LayoutRes private val LayoutResId: Int) : Fragment() { 14 | val binding get() = _binding!! 15 | private var _binding: B? = null 16 | 17 | override fun onCreate(savedInstanceState: Bundle?) { 18 | super.onCreate(savedInstanceState) 19 | observeEvent() 20 | } 21 | 22 | override fun onCreateView( 23 | inflater: LayoutInflater, 24 | container: ViewGroup?, 25 | savedInstanceState: Bundle? 26 | ): View? { 27 | _binding = DataBindingUtil.inflate(inflater, LayoutResId, container, false) 28 | initView() 29 | return binding.root 30 | } 31 | 32 | abstract fun initView() 33 | 34 | abstract fun observeEvent() 35 | 36 | protected fun shortToast(msg: String) { 37 | Toast.makeText(context, msg, Toast.LENGTH_SHORT).show() 38 | } 39 | 40 | protected fun longToast(msg: String) { 41 | Toast.makeText(context, msg, Toast.LENGTH_LONG).show() 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/base/BaseModal.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.base 2 | 3 | import android.app.AlertDialog 4 | import android.content.Context 5 | import android.graphics.Color 6 | import android.graphics.drawable.ColorDrawable 7 | import android.os.Bundle 8 | import com.msg.gcms.databinding.ErrorExeptionDialogBinding 9 | 10 | class BaseModal(val title: String, val msg: String, context: Context) : AlertDialog(context) { 11 | 12 | lateinit var dialogBinding: ErrorExeptionDialogBinding 13 | 14 | override fun onCreate(savedInstanceState: Bundle?) { 15 | super.onCreate(savedInstanceState) 16 | dialogBinding = ErrorExeptionDialogBinding.inflate(layoutInflater) 17 | setContentView(dialogBinding.root) 18 | viewSet() 19 | } 20 | 21 | private fun viewSet() = with(dialogBinding) { 22 | setCancelable(true) 23 | window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) 24 | ok.setOnClickListener { 25 | dismiss() 26 | } 27 | dialogTitle.text = title 28 | dialogMsg.text = msg 29 | } 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/base/BaseViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.base 2 | 3 | import androidx.lifecycle.ViewModel 4 | import java.util.logging.ErrorManager 5 | import javax.inject.Inject 6 | 7 | abstract class BaseViewModel : ViewModel() { 8 | @Inject 9 | lateinit var errorManager: ErrorManager 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/base/LottieFragment.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.base 2 | 3 | import android.graphics.Color 4 | import android.graphics.drawable.ColorDrawable 5 | import android.os.Bundle 6 | import android.util.Log 7 | import android.view.LayoutInflater 8 | import android.view.View 9 | import android.view.ViewGroup 10 | import android.view.Window 11 | import androidx.fragment.app.DialogFragment 12 | import androidx.fragment.app.FragmentManager 13 | 14 | class LottieFragment(private val layoutId: Int) : DialogFragment() { 15 | override fun onCreateView( 16 | inflater: LayoutInflater, 17 | container: ViewGroup?, 18 | savedInstanceState: Bundle? 19 | ): View? { 20 | dialog?.requestWindowFeature(Window.FEATURE_NO_TITLE) 21 | dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) 22 | isCancelable = false 23 | return inflater.inflate(layoutId, container, false) 24 | } 25 | 26 | override fun show(manager: FragmentManager, tag: String?) { 27 | try { 28 | val ft = manager.beginTransaction() 29 | ft.add(this, tag) 30 | ft.commitAllowingStateLoss() 31 | } catch (e: Exception) { 32 | Log.d("Lottie", "error : $e") 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/utils/ChangeScreenEvent.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.utils 2 | 3 | import android.app.Activity 4 | import android.content.Intent 5 | import androidx.fragment.app.Fragment 6 | import androidx.fragment.app.FragmentActivity 7 | import com.msg.gcms.R 8 | 9 | fun enterActivity( 10 | activity: FragmentActivity, 11 | destination: Activity, 12 | isCurrentFinish: Boolean = false 13 | ) { 14 | activity.startActivity(Intent(activity, destination::class.java)) 15 | activity.overridePendingTransition(R.anim.enter_anim, R.anim.no_anim) 16 | if (isCurrentFinish) { 17 | activity.finish() 18 | } 19 | } 20 | 21 | fun exitActivity(activity: FragmentActivity) { 22 | activity.finish() 23 | activity.overridePendingTransition(R.anim.no_anim, R.anim.exit_anim) 24 | } 25 | 26 | fun enterFragment(activity: FragmentActivity, fragmentContainer: Int, destination: Fragment) { 27 | activity.supportFragmentManager.beginTransaction() 28 | .setCustomAnimations(R.anim.enter_anim, R.anim.no_anim) 29 | .replace(fragmentContainer, destination).commit() 30 | } 31 | 32 | fun exitFragment(activity: FragmentActivity, fragmentContainer: Int, destination: Fragment) { 33 | activity.supportFragmentManager.beginTransaction() 34 | .setCustomAnimations(R.anim.no_anim, R.anim.exit_anim) 35 | .replace(fragmentContainer, destination).commit() 36 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/utils/Event.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.utils 2 | 3 | import androidx.lifecycle.Observer 4 | 5 | open class Event(private val content: T) { 6 | var hasBeenHandled = false 7 | private set 8 | 9 | fun getContentIfNotHandled(): T? { 10 | return if (hasBeenHandled) { 11 | // 이벤트가 이미 처리 되었다면 Null 반환 12 | null 13 | } else { 14 | // 이벤트가 아직 처리되지 않았다면 이벤트를 처리했다고 표시한 후에 content 반환 15 | hasBeenHandled = true 16 | content 17 | } 18 | } 19 | 20 | // 이벤트 처리 여부와 상관없이 값을 반환 21 | fun peekContent(): T = content 22 | } 23 | 24 | class EventObserver (private val onEventUnHandledContent: (T) -> Unit) : Observer> { 25 | override fun onChanged(event: Event?) { 26 | event?.getContentIfNotHandled()?.let { value -> 27 | onEventUnHandledContent(value) 28 | } 29 | } 30 | } 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/utils/ItemDecorator.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.utils 2 | 3 | import android.graphics.Rect 4 | import android.view.View 5 | import androidx.recyclerview.widget.RecyclerView 6 | 7 | class ItemDecorator(private val padding: Int, private val case: String) : RecyclerView.ItemDecoration() { 8 | override fun getItemOffsets( 9 | outRect: Rect, 10 | view: View, 11 | parent: RecyclerView, 12 | state: RecyclerView.State 13 | ) { 14 | super.getItemOffsets(outRect, view, parent, state) 15 | 16 | val position = parent.getChildAdapterPosition(view) 17 | val count = state.itemCount 18 | 19 | when(case) { 20 | "HORIZONTAL" -> outRect.right = padding 21 | 22 | "VERTICAL" -> outRect.bottom = padding 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/utils/KeyboardEvent.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.utils 2 | 3 | import android.app.Activity 4 | import android.widget.EditText 5 | import androidx.core.view.WindowInsetsCompat 6 | import androidx.core.view.WindowInsetsControllerCompat 7 | 8 | fun keyboardHide(context: Activity, vararg viewList: EditText) { 9 | viewList.forEach { view -> 10 | view.clearFocus() 11 | } 12 | val window = context.window 13 | WindowInsetsControllerCompat(window, window.decorView).hide(WindowInsetsCompat.Type.ime()) 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/utils/ShimmerEvent.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.utils 2 | 3 | import androidx.core.view.isVisible 4 | import com.facebook.shimmer.ShimmerFrameLayout 5 | 6 | fun ShimmerFrameLayout.start() { 7 | startShimmer() 8 | isVisible = true 9 | } 10 | 11 | fun ShimmerFrameLayout.stop() { 12 | stopShimmer() 13 | isVisible = false 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/view/clubmaker/MakeClubActivity.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.view.clubmaker 2 | 3 | import android.content.pm.PackageManager 4 | import androidx.activity.viewModels 5 | import com.google.android.material.snackbar.Snackbar 6 | import com.msg.gcms.R 7 | import com.msg.gcms.databinding.ActivityMakeClubBinding 8 | import com.msg.gcms.presentation.base.BaseActivity 9 | import com.msg.gcms.presentation.viewmodel.MakeClubViewModel 10 | import dagger.hilt.android.AndroidEntryPoint 11 | 12 | @AndroidEntryPoint 13 | class MakeClubActivity : BaseActivity(R.layout.activity_make_club) { 14 | 15 | private val makeClubViewModel by viewModels() 16 | 17 | override fun viewSetting() { 18 | binding.activity = this 19 | } 20 | 21 | override fun observeEvent() { 22 | } 23 | 24 | override fun onRequestPermissionsResult( 25 | requestCode: Int, 26 | permissions: Array, 27 | grantResults: IntArray 28 | ) { 29 | super.onRequestPermissionsResult(requestCode, permissions, grantResults) 30 | when(requestCode) { 31 | 1 -> { 32 | if(grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 33 | Snackbar.make(binding.root, "갤러리 접근 권한에 동의되었습니다.", Snackbar.LENGTH_SHORT).show() 34 | }else { 35 | Snackbar.make(binding.root, "권한에 동의하지 않을 경우 이용할 수 없습니다.", Snackbar.LENGTH_SHORT).show() 36 | } 37 | } 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/view/editclub/EditClubActivity.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.view.editclub 2 | 3 | import androidx.activity.viewModels 4 | import com.msg.gcms.R 5 | import com.msg.gcms.databinding.ActivityEditClubBinding 6 | import com.msg.gcms.presentation.base.BaseActivity 7 | import com.msg.gcms.presentation.viewmodel.EditViewModel 8 | import dagger.hilt.android.AndroidEntryPoint 9 | 10 | @AndroidEntryPoint 11 | class EditClubActivity: BaseActivity(R.layout.activity_edit_club) { 12 | 13 | private val editViewModel by viewModels() 14 | 15 | override fun viewSetting() { 16 | binding.activity = this 17 | getClubType() 18 | } 19 | 20 | override fun observeEvent() { 21 | } 22 | 23 | private fun getClubType() { 24 | val clubId = intent.getLongExtra("clubId", 0) 25 | getClubInfo(clubId) 26 | } 27 | 28 | private fun getClubInfo(clubId: Long) { 29 | editViewModel.getClubInfo(clubId) 30 | } 31 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/view/profile/ProfileNoClubFragment.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.view.profile 2 | 3 | import com.msg.gcms.R 4 | import com.msg.gcms.databinding.FragmentProfileNoClubBinding 5 | import com.msg.gcms.presentation.base.BaseFragment 6 | 7 | class ProfileNoClubFragment: BaseFragment(R.layout.fragment_profile_no_club) { 8 | override fun initView() { 9 | } 10 | 11 | override fun observeEvent() { 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/viewmodel/SplashViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.viewmodel 2 | 3 | import android.content.Context 4 | import android.widget.Toast 5 | import androidx.lifecycle.LiveData 6 | import androidx.lifecycle.MutableLiveData 7 | import androidx.lifecycle.ViewModel 8 | import androidx.lifecycle.viewModelScope 9 | import com.msg.gcms.domain.usecase.auth.CheckLoginStatusUseCase 10 | import com.msg.gcms.domain.usecase.auth.SaveTokenInfoUseCase 11 | import com.msg.gcms.presentation.viewmodel.util.Event 12 | import com.msg.gcms.presentation.viewmodel.util.errorHandling 13 | import dagger.hilt.android.lifecycle.HiltViewModel 14 | import kotlinx.coroutines.launch 15 | import javax.inject.Inject 16 | 17 | @HiltViewModel 18 | class SplashViewModel @Inject constructor( 19 | private val checkLoginStatusUseCase: CheckLoginStatusUseCase, 20 | private val saveTokenInfoUseCase: SaveTokenInfoUseCase 21 | ) : ViewModel() { 22 | private val _isLogin = MutableLiveData() 23 | val isLogin: LiveData get() = _isLogin 24 | 25 | fun checkIsLogin(context: Context) = viewModelScope.launch { 26 | checkLoginStatusUseCase().onSuccess { 27 | _isLogin.value = Event.Success 28 | }.onFailure { 29 | _isLogin.value = it.errorHandling { saveTokenInfoUseCase() } 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/viewmodel/WithdrawalViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.viewmodel 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import androidx.lifecycle.viewModelScope 7 | import com.msg.gcms.domain.usecase.auth.SaveTokenInfoUseCase 8 | import com.msg.gcms.domain.usecase.user.DeleteUserUseCase 9 | import com.msg.gcms.presentation.viewmodel.util.Event 10 | import com.msg.gcms.presentation.viewmodel.util.errorHandling 11 | import dagger.hilt.android.lifecycle.HiltViewModel 12 | import kotlinx.coroutines.launch 13 | import javax.inject.Inject 14 | 15 | @HiltViewModel 16 | class WithdrawalViewModel @Inject constructor( 17 | private val deleteUserUseCase: DeleteUserUseCase, 18 | private val saveTokenInfoUseCase: SaveTokenInfoUseCase 19 | ) : ViewModel() { 20 | 21 | private val _isApproved = MutableLiveData() 22 | val isApproved: LiveData get() = _isApproved 23 | 24 | private val _withDrawalRequest = MutableLiveData() 25 | val withDrawalRequest: LiveData get() = _withDrawalRequest 26 | 27 | fun changeIsApproved(isCheck: Boolean) { 28 | _isApproved.value = isCheck 29 | } 30 | 31 | fun withdrawal() = viewModelScope.launch { 32 | deleteUserUseCase() 33 | .onSuccess { 34 | _withDrawalRequest.value = Event.Success 35 | saveTokenInfoUseCase() 36 | }.onFailure { 37 | _withDrawalRequest.value = 38 | it.errorHandling(unauthorizedAction = { saveTokenInfoUseCase() }) 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/presentation/viewmodel/util/Event.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.presentation.viewmodel.util 2 | 3 | sealed class Event ( 4 | ) { 5 | 6 | object Loading: Event() 7 | 8 | /** 9 | * 성공 10 | */ 11 | object Success: Event() 12 | 13 | /** 14 | * 400번 요청이 올바르지 않은 경우 15 | */ 16 | object BadRequest: Event() 17 | 18 | /** 19 | * 401번 비인증 요청 20 | */ 21 | object Unauthorized: Event() 22 | 23 | /** 24 | * 403번 권한이 없음 25 | */ 26 | object ForBidden: Event() 27 | 28 | /** 29 | * 404 찾을 수 없는 경우 30 | */ 31 | object NotFound: Event() 32 | 33 | /** 34 | * 406 맞는 규격이 없는 경우 35 | */ 36 | object NotAcceptable: Event() 37 | 38 | /** 39 | * 408 요청이 너무 오래 걸리는 경우 40 | */ 41 | object TimeOut: Event() 42 | 43 | /** 44 | * 409 권한이 없을 때 45 | */ 46 | object Conflict: Event() 47 | 48 | /** 49 | * 50X 서버에러 50 | */ 51 | object Server: Event() 52 | 53 | /** 54 | * 예상치 못한 에러 55 | */ 56 | object UnKnown: Event() 57 | 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/com/msg/gcms/util/Extension.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms.util 2 | 3 | import android.content.Context 4 | import android.util.TypedValue 5 | 6 | fun String.removeDot(): String { 7 | return this.replace("^\"|\"$".toRegex(), "") 8 | } 9 | 10 | fun Float.toDp(context: Context): Int = 11 | TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this, context.resources.displayMetrics) 12 | .toInt() -------------------------------------------------------------------------------- /app/src/main/res/anim/enter_anim.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/anim/exit_anim.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/anim/no_anim.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_add_member.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_after_school.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_approve_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_banner_placeholder.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_check_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_club_img.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_club_txt.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_detail_club.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_detail_club_link.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_dialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_dialog_cancel.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_dialog_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_dialog_ok.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_dialog_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_exeption_dialog_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_find_club_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_make_club_et.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_make_free_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 13 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_make_major_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 13 | 14 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_make_personal_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 12 | 13 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_member_black_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_period_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_period_btn_check.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_period_btn_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_profile_img.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_profile_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_shimmer_user_profile.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_sign_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_splash.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_summary_club_txt.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_user_profile.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_withdrawal_active_btn.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_withdrawal_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_withdrawal_gradient.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_withdrawal_sleep_btn.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_withdrawal_warning.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/google_icon.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_activity_photo.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add_club.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_attend_absent.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 9 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_attend_check.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 9 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_attend_late.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_attend_sick.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_back_btn.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_banner_placeholder.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check_box.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check_btn.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check_icon.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_checked_btn.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_close_button.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_club_delete.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_default_profile.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 9 | 12 | 15 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_delete_btn.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_edit.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_email.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_email_check_failure.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_email_check_textinput.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_error.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_free_bg.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_logout_btn.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_logout_option.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_major_bg.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_person_two.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_personal_bg.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_profile.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 16 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_rectangle_661.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_rectangle_662.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_rectangle_941.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_rectangle_946.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search_icon.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_selected_check_btn.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_side_btn.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_splash_line.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_teacher_img.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_withdrawal_btn.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_withdrawal_point.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_nav_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_nav_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_nav_text_free.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_nav_text_major.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_nav_text_personal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_withdrawal_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_withdrawal_check_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/font/notosans.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/font/notosans.ttf -------------------------------------------------------------------------------- /app/src/main/res/font/roboto.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/font/roboto.ttf -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_edit_club.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | 16 | 17 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_make_club.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 11 | 12 | 13 | 18 | 19 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/layout/detail_toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_profile_no_club.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 9 | 10 | 11 | 15 | 16 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/header_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/intro_progress_lottie.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_my_club.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 18 | 19 | 27 | 28 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/res/layout/list_club_editorial.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 16 | 17 | 21 | 22 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/layout/list_club_member.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 13 | 14 | 21 | 22 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/list_club_picture.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 11 | 12 | 13 | 17 | 18 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/list_club_summary.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 10 | 16 | 17 | 21 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/layout/list_detail_club_promotion.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | 13 | 19 | 20 | 26 | 27 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/layout/progress_bar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 16 | 17 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/layout/shimmer_banner.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/shimmer_member.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 13 | 14 | 21 | 22 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/menu/bottom_navigation_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/menu/head_detail_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 12 | 13 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/menu/member_detail_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_main_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-hdpi/ic_main.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_main_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-hdpi/ic_main_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_main_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-hdpi/ic_main_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-mdpi/ic_main.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_main_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-mdpi/ic_main_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_main_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-mdpi/ic_main_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-xhdpi/ic_main.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_main_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-xhdpi/ic_main_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_main_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-xhdpi/ic_main_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-xxhdpi/ic_main.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_main_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-xxhdpi/ic_main_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_main_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-xxhdpi/ic_main_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-xxxhdpi/ic_main.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_main_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-xxxhdpi/ic_main_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_main_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/mipmap-xxxhdpi/ic_main_round.png -------------------------------------------------------------------------------- /app/src/main/res/navigation/bottom_nav_graph.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 16 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/navigation/edit_club_graph.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 16 | 17 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 240dp 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/app/src/main/res/values/.gitignore -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 100dp 4 | 260dp 5 | -------------------------------------------------------------------------------- /app/src/main/res/values/ic_main_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #000000 4 | -------------------------------------------------------------------------------- /app/src/test/java/com/msg/gcms/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.msg.gcms 2 | 3 | import org.junit.Assert.assertEquals 4 | import org.junit.Test 5 | 6 | /** 7 | * Example local unit test, which will execute on the development machine (host). 8 | * 9 | * See [testing documentation](http://d.android.com/tools/testing). 10 | */ 11 | class ExampleUnitTest { 12 | @Test 13 | fun addition_isCorrect() { 14 | assertEquals(2 + 2, 4) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /build.gradle.kts: -------------------------------------------------------------------------------- 1 | buildscript { 2 | dependencies { 3 | classpath(Dependency.GradlePlugin.GRADLE_HILT) 4 | classpath(Dependency.GradlePlugin.GOOGLE_PLUGIN) 5 | } 6 | } 7 | 8 | plugins { 9 | id(Dependency.GradlePlugin.KTLINT_PLUGIN) version Versions.KTLINT_PLUGIN 10 | id(Dependency.GradlePlugin.ANDROID_APPLICATION_PLUGIN) version Versions.GRADLE_ANDROID apply false 11 | id(Dependency.GradlePlugin.ANDROID_LIBRARY_PLUGIN) version Versions.GRADLE_ANDROID apply false 12 | id(Dependency.GradlePlugin.KOTLIN_ANDROID_PLUGIN) version Versions.GRADLE_KOTLIN apply false 13 | } 14 | -------------------------------------------------------------------------------- /buildSrc/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | `kotlin-dsl` 3 | } 4 | 5 | repositories { 6 | mavenCentral() 7 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app"s APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Kotlin code style for this project: "official" or "obsolete": 19 | kotlin.code.style=official 20 | # Enables namespacing of each library's R class so that its R class includes only the 21 | # resources declared in the library itself and none from the library's dependencies, 22 | # thereby reducing the size of the R class for that library 23 | android.nonTransitiveRClass=true -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GSM-MSG/GCMS-Android/11da719df1f53226546724206b92cf9c90eb0893/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Wed Feb 01 18:33:58 JST 2023 2 | distributionBase=GRADLE_USER_HOME 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | gradlePluginPortal() 4 | google() 5 | mavenCentral() 6 | } 7 | } 8 | dependencyResolutionManagement { 9 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 10 | repositories { 11 | google() 12 | mavenCentral() 13 | maven { url = uri("https://jitpack.io") } 14 | } 15 | } 16 | rootProject.name = "MSG-GCMS" 17 | include(":app") 18 | --------------------------------------------------------------------------------