gitextract_eag9zh7a/ ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug-template.md │ │ └── feature-template.md │ ├── PULL_REQUEST_TEMPLATE.md │ └── workflows/ │ ├── backend-cd.yml │ ├── backend-ci.yml │ └── frontend-ci.yml ├── .gitignore ├── .gitmodules ├── LICENSE ├── README.md ├── backend/ │ ├── .gitignore │ ├── build.gradle │ ├── gradle/ │ │ └── wrapper/ │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ └── src/ │ ├── docs/ │ │ └── asciidoc/ │ │ ├── auth.adoc │ │ ├── category.adoc │ │ ├── external-calendar.adoc │ │ ├── index.adoc │ │ ├── member.adoc │ │ ├── schedule.adoc │ │ └── subscription.adoc │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── allog/ │ │ │ └── dallog/ │ │ │ ├── DallogApplication.java │ │ │ ├── auth/ │ │ │ │ ├── application/ │ │ │ │ │ ├── AuthService.java │ │ │ │ │ ├── AuthTokenCreator.java │ │ │ │ │ ├── JwtTokenProvider.java │ │ │ │ │ ├── OAuthClient.java │ │ │ │ │ ├── OAuthUri.java │ │ │ │ │ ├── TokenCreator.java │ │ │ │ │ └── TokenProvider.java │ │ │ │ ├── domain/ │ │ │ │ │ ├── AuthToken.java │ │ │ │ │ ├── InMemoryAuthTokenRepository.java │ │ │ │ │ ├── OAuthToken.java │ │ │ │ │ ├── OAuthTokenRepository.java │ │ │ │ │ └── TokenRepository.java │ │ │ │ ├── dto/ │ │ │ │ │ ├── LoginMember.java │ │ │ │ │ ├── OAuthMember.java │ │ │ │ │ ├── request/ │ │ │ │ │ │ ├── TokenRenewalRequest.java │ │ │ │ │ │ └── TokenRequest.java │ │ │ │ │ └── response/ │ │ │ │ │ ├── AccessAndRefreshTokenResponse.java │ │ │ │ │ ├── AccessTokenResponse.java │ │ │ │ │ ├── OAuthAccessTokenResponse.java │ │ │ │ │ └── OAuthUriResponse.java │ │ │ │ ├── event/ │ │ │ │ │ └── MemberSavedEvent.java │ │ │ │ ├── exception/ │ │ │ │ │ ├── EmptyAuthorizationHeaderException.java │ │ │ │ │ ├── InvalidTokenException.java │ │ │ │ │ ├── NoPermissionException.java │ │ │ │ │ ├── NoSuchOAuthTokenException.java │ │ │ │ │ └── NoSuchTokenException.java │ │ │ │ └── presentation/ │ │ │ │ ├── AuthController.java │ │ │ │ ├── AuthenticationPrincipal.java │ │ │ │ ├── AuthenticationPrincipalArgumentResolver.java │ │ │ │ └── AuthorizationExtractor.java │ │ │ ├── category/ │ │ │ │ ├── application/ │ │ │ │ │ ├── CategoryService.java │ │ │ │ │ └── ExternalCategoryDetailService.java │ │ │ │ ├── domain/ │ │ │ │ │ ├── Category.java │ │ │ │ │ ├── CategoryRepository.java │ │ │ │ │ ├── CategoryType.java │ │ │ │ │ ├── ExternalCategoryDetail.java │ │ │ │ │ └── ExternalCategoryDetailRepository.java │ │ │ │ ├── dto/ │ │ │ │ │ ├── request/ │ │ │ │ │ │ ├── CategoryCreateRequest.java │ │ │ │ │ │ ├── CategoryUpdateRequest.java │ │ │ │ │ │ └── ExternalCategoryCreateRequest.java │ │ │ │ │ └── response/ │ │ │ │ │ ├── CategoriesResponse.java │ │ │ │ │ ├── CategoryDetailResponse.java │ │ │ │ │ └── CategoryResponse.java │ │ │ │ ├── exception/ │ │ │ │ │ ├── ExistExternalCategoryException.java │ │ │ │ │ ├── InvalidCategoryException.java │ │ │ │ │ ├── NoSuchCategoryException.java │ │ │ │ │ └── NoSuchExternalCategoryDetailException.java │ │ │ │ └── presentaion/ │ │ │ │ └── CategoryController.java │ │ │ ├── categoryrole/ │ │ │ │ ├── application/ │ │ │ │ │ └── CategoryRoleService.java │ │ │ │ ├── domain/ │ │ │ │ │ ├── CategoryAuthority.java │ │ │ │ │ ├── CategoryRole.java │ │ │ │ │ ├── CategoryRoleRepository.java │ │ │ │ │ └── CategoryRoleType.java │ │ │ │ ├── dto/ │ │ │ │ │ ├── request/ │ │ │ │ │ │ └── CategoryRoleUpdateRequest.java │ │ │ │ │ └── response/ │ │ │ │ │ ├── MemberWithRoleTypeResponse.java │ │ │ │ │ └── SubscribersResponse.java │ │ │ │ └── exception/ │ │ │ │ ├── ManagingCategoryLimitExcessException.java │ │ │ │ ├── NoCategoryAuthorityException.java │ │ │ │ ├── NoSuchCategoryRoleException.java │ │ │ │ └── NotAbleToChangeRoleException.java │ │ │ ├── externalcalendar/ │ │ │ │ ├── application/ │ │ │ │ │ ├── ExternalCalendarClient.java │ │ │ │ │ └── ExternalCalendarService.java │ │ │ │ ├── dto/ │ │ │ │ │ ├── ExternalCalendar.java │ │ │ │ │ └── ExternalCalendarsResponse.java │ │ │ │ └── presentation/ │ │ │ │ └── ExternalCalendarController.java │ │ │ ├── global/ │ │ │ │ ├── config/ │ │ │ │ │ ├── JpaConfig.java │ │ │ │ │ ├── PropertiesConfig.java │ │ │ │ │ ├── WebConfig.java │ │ │ │ │ ├── cache/ │ │ │ │ │ │ ├── CacheConfig.java │ │ │ │ │ │ └── ExpiringConcurrentMapCache.java │ │ │ │ │ ├── properties/ │ │ │ │ │ │ └── GoogleProperties.java │ │ │ │ │ └── replication/ │ │ │ │ │ ├── DataSourceConfiguration.java │ │ │ │ │ ├── DataSourceKey.java │ │ │ │ │ ├── RandomReplicaKeys.java │ │ │ │ │ └── RoutingDataSource.java │ │ │ │ ├── entity/ │ │ │ │ │ └── BaseEntity.java │ │ │ │ └── error/ │ │ │ │ ├── ControllerAdvice.java │ │ │ │ └── dto/ │ │ │ │ ├── ErrorReportRequest.java │ │ │ │ └── ErrorResponse.java │ │ │ ├── infrastructure/ │ │ │ │ ├── log/ │ │ │ │ │ ├── DiscordAppender.java │ │ │ │ │ └── dto/ │ │ │ │ │ ├── DiscordWebhookRequest.java │ │ │ │ │ ├── Embed.java │ │ │ │ │ └── Field.java │ │ │ │ └── oauth/ │ │ │ │ ├── client/ │ │ │ │ │ ├── GoogleExternalCalendarClient.java │ │ │ │ │ └── GoogleOAuthClient.java │ │ │ │ ├── dto/ │ │ │ │ │ ├── GoogleCalendarEventResponse.java │ │ │ │ │ ├── GoogleCalendarEventsResponse.java │ │ │ │ │ ├── GoogleCalendarListResponse.java │ │ │ │ │ ├── GoogleCalendarResponse.java │ │ │ │ │ ├── GoogleDateFormat.java │ │ │ │ │ ├── GoogleTokenResponse.java │ │ │ │ │ └── UserInfo.java │ │ │ │ ├── exception/ │ │ │ │ │ └── OAuthException.java │ │ │ │ └── uri/ │ │ │ │ ├── DevGoogleOAuthUri.java │ │ │ │ └── GoogleOAuthUri.java │ │ │ ├── member/ │ │ │ │ ├── application/ │ │ │ │ │ └── MemberService.java │ │ │ │ ├── domain/ │ │ │ │ │ ├── Member.java │ │ │ │ │ ├── MemberRepository.java │ │ │ │ │ └── SocialType.java │ │ │ │ ├── dto/ │ │ │ │ │ ├── request/ │ │ │ │ │ │ └── MemberUpdateRequest.java │ │ │ │ │ └── response/ │ │ │ │ │ └── MemberResponse.java │ │ │ │ ├── exception/ │ │ │ │ │ ├── InvalidMemberException.java │ │ │ │ │ └── NoSuchMemberException.java │ │ │ │ └── presentation/ │ │ │ │ └── MemberController.java │ │ │ ├── schedule/ │ │ │ │ ├── application/ │ │ │ │ │ ├── CheckedSchedulesFinder.java │ │ │ │ │ └── ScheduleService.java │ │ │ │ ├── domain/ │ │ │ │ │ ├── IntegrationSchedule.java │ │ │ │ │ ├── IntegrationScheduleComparator.java │ │ │ │ │ ├── IntegrationSchedules.java │ │ │ │ │ ├── Period.java │ │ │ │ │ ├── Schedule.java │ │ │ │ │ ├── ScheduleRepository.java │ │ │ │ │ ├── ScheduleType.java │ │ │ │ │ ├── TypedSchedules.java │ │ │ │ │ └── scheduler/ │ │ │ │ │ └── Scheduler.java │ │ │ │ ├── dto/ │ │ │ │ │ ├── MaterialToFindSchedules.java │ │ │ │ │ ├── request/ │ │ │ │ │ │ ├── DateRangeRequest.java │ │ │ │ │ │ ├── ScheduleCreateRequest.java │ │ │ │ │ │ └── ScheduleUpdateRequest.java │ │ │ │ │ └── response/ │ │ │ │ │ ├── IntegrationScheduleResponse.java │ │ │ │ │ ├── IntegrationScheduleResponses.java │ │ │ │ │ └── ScheduleResponse.java │ │ │ │ ├── exception/ │ │ │ │ │ ├── InvalidScheduleException.java │ │ │ │ │ └── NoSuchScheduleException.java │ │ │ │ └── presentation/ │ │ │ │ └── ScheduleController.java │ │ │ └── subscription/ │ │ │ ├── application/ │ │ │ │ ├── ColorPicker.java │ │ │ │ ├── RandomColorPicker.java │ │ │ │ └── SubscriptionService.java │ │ │ ├── domain/ │ │ │ │ ├── Color.java │ │ │ │ ├── Subscription.java │ │ │ │ ├── SubscriptionRepository.java │ │ │ │ └── Subscriptions.java │ │ │ ├── dto/ │ │ │ │ ├── request/ │ │ │ │ │ └── SubscriptionUpdateRequest.java │ │ │ │ └── response/ │ │ │ │ ├── SubscriptionResponse.java │ │ │ │ └── SubscriptionsResponse.java │ │ │ ├── exception/ │ │ │ │ ├── ExistSubscriptionException.java │ │ │ │ ├── InvalidSubscriptionException.java │ │ │ │ ├── NoSuchSubscriptionException.java │ │ │ │ └── NotAbleToUnsubscribeException.java │ │ │ └── presentation/ │ │ │ └── SubscriptionController.java │ │ └── resources/ │ │ ├── application-test.yml │ │ ├── db/ │ │ │ └── prod/ │ │ │ └── schema.sql │ │ └── logback-spring.xml │ └── test/ │ ├── java/ │ │ └── com/ │ │ └── allog/ │ │ └── dallog/ │ │ ├── acceptance/ │ │ │ ├── AcceptanceTest.java │ │ │ ├── AuthAcceptanceTest.java │ │ │ ├── CategoryAcceptanceTest.java │ │ │ ├── ExternalCalendarAcceptanceTest.java │ │ │ ├── MemberAcceptanceTest.java │ │ │ ├── ScheduleAcceptanceTest.java │ │ │ ├── SubscriptionAcceptanceTest.java │ │ │ └── fixtures/ │ │ │ ├── AuthAcceptanceFixtures.java │ │ │ ├── CategoryAcceptanceFixtures.java │ │ │ ├── CommonAcceptanceFixtures.java │ │ │ ├── MemberAcceptanceFixtures.java │ │ │ ├── ScheduleAcceptanceFixtures.java │ │ │ └── SubscriptionAcceptanceFixtures.java │ │ ├── auth/ │ │ │ ├── application/ │ │ │ │ ├── AuthServiceTest.java │ │ │ │ ├── AuthTokenCreatorTest.java │ │ │ │ ├── JwtTokenProviderTest.java │ │ │ │ └── StubTokenProvider.java │ │ │ ├── domain/ │ │ │ │ ├── AuthTokenTest.java │ │ │ │ ├── InMemoryAuthTokenRepositoryTest.java │ │ │ │ ├── OAuthTokenRepositoryTest.java │ │ │ │ └── OAuthTokenTest.java │ │ │ └── presentation/ │ │ │ └── AuthControllerTest.java │ │ ├── category/ │ │ │ ├── application/ │ │ │ │ ├── CategoryServiceTest.java │ │ │ │ └── ExternalCategoryDetailServiceTest.java │ │ │ ├── domain/ │ │ │ │ ├── CategoryRepositoryTest.java │ │ │ │ ├── CategoryTest.java │ │ │ │ ├── CategoryTypeTest.java │ │ │ │ └── ExternalCategoryDetailRepositoryTest.java │ │ │ └── presentation/ │ │ │ └── CategoryControllerTest.java │ │ ├── categoryrole/ │ │ │ ├── application/ │ │ │ │ └── CategoryRoleServiceTest.java │ │ │ └── domain/ │ │ │ ├── CategoryRoleRepositoryTest.java │ │ │ ├── CategoryRoleTest.java │ │ │ └── CategoryRoleTypeTest.java │ │ ├── common/ │ │ │ ├── Constants.java │ │ │ ├── DatabaseCleaner.java │ │ │ ├── annotation/ │ │ │ │ ├── ControllerTest.java │ │ │ │ ├── RepositoryTest.java │ │ │ │ └── ServiceTest.java │ │ │ ├── builder/ │ │ │ │ ├── BuilderSupporter.java │ │ │ │ └── GivenBuilder.java │ │ │ ├── config/ │ │ │ │ ├── ExternalApiConfig.java │ │ │ │ └── TokenConfig.java │ │ │ └── fixtures/ │ │ │ ├── AuthFixtures.java │ │ │ ├── CategoryFixtures.java │ │ │ ├── ExternalCalendarFixtures.java │ │ │ ├── ExternalCategoryFixtures.java │ │ │ ├── IntegrationScheduleFixtures.java │ │ │ ├── MemberFixtures.java │ │ │ ├── OAuthFixtures.java │ │ │ ├── OAuthTokenFixtures.java │ │ │ ├── ScheduleFixtures.java │ │ │ └── SubscriptionFixtures.java │ │ ├── externalcalendar/ │ │ │ ├── application/ │ │ │ │ └── ExternalCalendarServiceTest.java │ │ │ └── presentation/ │ │ │ └── ExternalCalendarControllerTest.java │ │ ├── infrastructure/ │ │ │ └── oauth/ │ │ │ ├── client/ │ │ │ │ ├── StubExternalCalendarClient.java │ │ │ │ └── StubOAuthClient.java │ │ │ └── uri/ │ │ │ └── StubOAuthUri.java │ │ ├── member/ │ │ │ ├── application/ │ │ │ │ └── MemberServiceTest.java │ │ │ ├── domain/ │ │ │ │ ├── MemberRepositoryTest.java │ │ │ │ └── MemberTest.java │ │ │ └── presentation/ │ │ │ └── MemberControllerTest.java │ │ ├── schedule/ │ │ │ ├── application/ │ │ │ │ ├── CheckedSchedulesFinderTest.java │ │ │ │ └── ScheduleServiceTest.java │ │ │ ├── domain/ │ │ │ │ ├── IntegrationScheduleTest.java │ │ │ │ ├── IntegrationSchedulesTest.java │ │ │ │ ├── PeriodTest.java │ │ │ │ ├── ScheduleRepositoryTest.java │ │ │ │ ├── ScheduleTest.java │ │ │ │ └── scheduler/ │ │ │ │ └── SchedulerTest.java │ │ │ └── presentation/ │ │ │ └── ScheduleControllerTest.java │ │ └── subscription/ │ │ ├── application/ │ │ │ └── SubscriptionServiceTest.java │ │ ├── domain/ │ │ │ ├── ColorTest.java │ │ │ ├── SubscriptionRepositoryTest.java │ │ │ ├── SubscriptionTest.java │ │ │ └── SubscriptionsTest.java │ │ └── presentation/ │ │ └── SubscriptionControllerTest.java │ └── resources/ │ └── application.yml ├── frontend/ │ ├── .eslintrc.json │ ├── .gitignore │ ├── .prettierrc.json │ ├── .storybook/ │ │ ├── main.js │ │ ├── preview-body.html │ │ └── preview.js │ ├── babel.config.js │ ├── jest.config.js │ ├── package.json │ ├── setupFile.js │ ├── src/ │ │ ├── @types/ │ │ │ ├── calendar.ts │ │ │ ├── category.ts │ │ │ ├── custom.d.ts │ │ │ ├── emotion.d.ts │ │ │ ├── googleCalendar.ts │ │ │ ├── index.ts │ │ │ ├── profile.ts │ │ │ ├── schedule.ts │ │ │ ├── subscription.ts │ │ │ └── util.ts │ │ ├── App.tsx │ │ ├── api/ │ │ │ ├── category.ts │ │ │ ├── googleCalendar.ts │ │ │ ├── index.ts │ │ │ ├── login.ts │ │ │ ├── profile.ts │ │ │ ├── schedule.ts │ │ │ └── subscription.ts │ │ ├── components/ │ │ │ ├── @common/ │ │ │ │ ├── Button/ │ │ │ │ │ ├── Button.stories.tsx │ │ │ │ │ ├── Button.styles.ts │ │ │ │ │ ├── Button.test.tsx │ │ │ │ │ └── Button.tsx │ │ │ │ ├── ErrorBoundary/ │ │ │ │ │ └── ErrorBoundary.tsx │ │ │ │ ├── Fieldset/ │ │ │ │ │ ├── Fieldset.stories.tsx │ │ │ │ │ ├── Fieldset.styles.ts │ │ │ │ │ ├── Fieldset.test.tsx │ │ │ │ │ └── Fieldset.tsx │ │ │ │ ├── ModalPortal/ │ │ │ │ │ ├── ModalPortal.styles.ts │ │ │ │ │ └── ModalPortal.tsx │ │ │ │ ├── PageLayout/ │ │ │ │ │ ├── PageLayout.styles.ts │ │ │ │ │ └── PageLayout.tsx │ │ │ │ ├── Responsive/ │ │ │ │ │ ├── Responsive.styles.ts │ │ │ │ │ └── Responsive.tsx │ │ │ │ ├── Select/ │ │ │ │ │ ├── Select.styles.ts │ │ │ │ │ └── Select.tsx │ │ │ │ ├── Skeleton/ │ │ │ │ │ ├── Skeleton.stories.tsx │ │ │ │ │ ├── Skeleton.styles.ts │ │ │ │ │ └── Skeleton.tsx │ │ │ │ └── Spinner/ │ │ │ │ ├── Spinner.stories.tsx │ │ │ │ ├── Spinner.styles.ts │ │ │ │ └── Spinner.tsx │ │ │ ├── AdminCategoryManageModal/ │ │ │ │ ├── AdminCategoryManageModal.styles.ts │ │ │ │ └── AdminCategoryManageModal.tsx │ │ │ ├── AdminItem/ │ │ │ │ ├── AdminItem.styles.ts │ │ │ │ └── AdminItem.tsx │ │ │ ├── Calendar/ │ │ │ │ ├── Calendar.fallback.tsx │ │ │ │ ├── Calendar.styles.ts │ │ │ │ └── Calendar.tsx │ │ │ ├── CategoryAddModal/ │ │ │ │ ├── CategoryAddModal.stories.tsx │ │ │ │ ├── CategoryAddModal.styles.ts │ │ │ │ └── CategoryAddModal.tsx │ │ │ ├── CategoryControl/ │ │ │ │ ├── CategoryControl.tsx │ │ │ │ └── CategoryCotrol.styles.ts │ │ │ ├── CategoryList/ │ │ │ │ ├── CategoryList.fallback.stories.tsx │ │ │ │ ├── CategoryList.fallback.tsx │ │ │ │ ├── CategoryList.stories.tsx │ │ │ │ ├── CategoryList.styles.ts │ │ │ │ └── CategoryList.tsx │ │ │ ├── CategoryModifyModal/ │ │ │ │ ├── CategoryModifyModal.styles.ts │ │ │ │ └── CategoryModifyModal.tsx │ │ │ ├── DateCell/ │ │ │ │ ├── DateCell.styles.ts │ │ │ │ └── DateCell.tsx │ │ │ ├── Footer/ │ │ │ │ ├── Footer.styles.ts │ │ │ │ └── Footer.tsx │ │ │ ├── GoogleCategoryManageModal/ │ │ │ │ ├── GoogleCategoryManageModal.styles.ts │ │ │ │ └── GoogleCategoryManageModal.tsx │ │ │ ├── GoogleImportModal/ │ │ │ │ ├── GoogleImportModal.styles.ts │ │ │ │ └── GoogleImportModal.tsx │ │ │ ├── MoreScheduleModal/ │ │ │ │ ├── MoreScheduleModal.styles.ts │ │ │ │ └── MoreScheduleModal.tsx │ │ │ ├── NavBar/ │ │ │ │ ├── NavBar.stories.tsx │ │ │ │ ├── NavBar.styles.ts │ │ │ │ └── NavBar.tsx │ │ │ ├── Profile/ │ │ │ │ ├── Profile.fallback.stories.tsx │ │ │ │ ├── Profile.fallback.tsx │ │ │ │ ├── Profile.styles.ts │ │ │ │ └── Profile.tsx │ │ │ ├── ProtectRoute/ │ │ │ │ └── ProtectRoute.tsx │ │ │ ├── Schedule/ │ │ │ │ ├── Schedule.styles.ts │ │ │ │ └── Schedule.tsx │ │ │ ├── ScheduleAddButton/ │ │ │ │ ├── ScheduleAddButton.stories.tsx │ │ │ │ ├── ScheduleAddButton.styles.ts │ │ │ │ └── ScheduleAddButton.tsx │ │ │ ├── ScheduleAddModal/ │ │ │ │ ├── ScheduleAddModal.stories.tsx │ │ │ │ ├── ScheduleAddModal.styles.ts │ │ │ │ └── ScheduleAddModal.tsx │ │ │ ├── ScheduleModal/ │ │ │ │ ├── ScheduleModal.styles.ts │ │ │ │ └── ScheduleModal.tsx │ │ │ ├── ScheduleModifyModal/ │ │ │ │ ├── ScheduleModifyModal.styles.ts │ │ │ │ └── ScheduleModifyModal.tsx │ │ │ ├── SideAdminList/ │ │ │ │ ├── SideAdminList.styles.ts │ │ │ │ └── SideAdminList.tsx │ │ │ ├── SideBar/ │ │ │ │ ├── SideBar.fallback.stories.tsx │ │ │ │ ├── SideBar.fallback.tsx │ │ │ │ ├── SideBar.styles.ts │ │ │ │ └── SideBar.tsx │ │ │ ├── SideBarButton/ │ │ │ │ ├── SideBarButton.styles.ts │ │ │ │ └── SideBarButton.tsx │ │ │ ├── SideGoogleList/ │ │ │ │ ├── SideGoogleList.styles.ts │ │ │ │ └── SideGoogleList.tsx │ │ │ ├── SideItem/ │ │ │ │ ├── SideItem.styles.ts │ │ │ │ └── SideItem.tsx │ │ │ ├── SideSubscribedList/ │ │ │ │ ├── SideSubscribedList.styles.ts │ │ │ │ └── SideSubscribedList.tsx │ │ │ ├── SnackBar/ │ │ │ │ ├── SnackBar.styles.ts │ │ │ │ └── SnackBar.tsx │ │ │ ├── SubscribedCategoryItem/ │ │ │ │ ├── SubscribedCategoryItem.styles.ts │ │ │ │ └── SubscribedCategoryItem.tsx │ │ │ ├── SubscriberItem/ │ │ │ │ ├── SubscriberItem.styles.ts │ │ │ │ └── SubscriberItem.tsx │ │ │ ├── SubscriptionModifyModal/ │ │ │ │ ├── SubscriptionModifyModal.styles.ts │ │ │ │ └── SubscriptionModifyModal.tsx │ │ │ ├── UnsubscribedCategoryItem/ │ │ │ │ ├── UnsubscribedCategoryItem.styles.ts │ │ │ │ └── UnsubscribedCategoryItem.tsx │ │ │ └── WithdrawalModal/ │ │ │ ├── WithdrawalModal.stories.tsx │ │ │ ├── WithdrawalModal.styles.ts │ │ │ └── WithdrawalModal.tsx │ │ ├── constants/ │ │ │ ├── api.ts │ │ │ ├── category.ts │ │ │ ├── date.ts │ │ │ ├── index.ts │ │ │ ├── message.ts │ │ │ ├── schedule.ts │ │ │ ├── style.ts │ │ │ └── validate.ts │ │ ├── domains/ │ │ │ └── schedule.ts │ │ ├── hooks/ │ │ │ ├── @queries/ │ │ │ │ ├── category.ts │ │ │ │ ├── googleCalendar.ts │ │ │ │ ├── login.ts │ │ │ │ ├── profile.ts │ │ │ │ ├── schedule.ts │ │ │ │ └── subscription.ts │ │ │ ├── useCalendar.ts │ │ │ ├── useControlledInput.ts │ │ │ ├── useHoverCategoryItem.ts │ │ │ ├── useIntersect.ts │ │ │ ├── useModalPosition.ts │ │ │ ├── useRootFontSize.ts │ │ │ ├── useSnackBar.ts │ │ │ ├── useToggle.ts │ │ │ ├── useUserValue.ts │ │ │ ├── useValidateCategory.ts │ │ │ └── useValidateSchedule.ts │ │ ├── index.html │ │ ├── index.tsx │ │ ├── pages/ │ │ │ ├── AuthPage/ │ │ │ │ └── AuthPage.tsx │ │ │ ├── CalendarPage/ │ │ │ │ ├── CalendarPage.styles.ts │ │ │ │ └── CalendarPage.tsx │ │ │ ├── CategoryPage/ │ │ │ │ ├── CategoryPage.styles.ts │ │ │ │ └── CategoryPage.tsx │ │ │ ├── ErrorPage/ │ │ │ │ ├── ErrorPage.styles.ts │ │ │ │ └── ErrorPage.tsx │ │ │ ├── NotFoundPage/ │ │ │ │ ├── NotFoundPage.styles.ts │ │ │ │ └── NotFoundPage.tsx │ │ │ ├── PrivacyPolicyPage/ │ │ │ │ ├── PrivacyPolicyPage.styles.ts │ │ │ │ └── PrivacyPolicyPage.tsx │ │ │ └── StartPage/ │ │ │ ├── StartPage.styles.ts │ │ │ └── StartPage.tsx │ │ ├── recoil/ │ │ │ ├── atoms/ │ │ │ │ └── index.ts │ │ │ └── selectors/ │ │ │ └── index.ts │ │ ├── styles/ │ │ │ ├── GlobalStyle.tsx │ │ │ └── theme.ts │ │ ├── utils/ │ │ │ ├── date.ts │ │ │ ├── index.ts │ │ │ └── storage.ts │ │ └── validation/ │ │ └── index.ts │ ├── tsconfig.json │ └── webpack.config.js └── jenkins/ ├── backend-dev.jenkinsfile ├── backend-prod.jenkinsfile ├── frontend-dev.jenkinsfile └── frontend-prod.jenkinsfile