├── backend ├── README.md ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── woowacourse │ │ │ │ └── moamoa │ │ │ │ ├── study │ │ │ │ ├── domain │ │ │ │ │ ├── MemberRole.java │ │ │ │ │ ├── RecruitStatus.java │ │ │ │ │ ├── exception │ │ │ │ │ │ ├── InvalidPeriodException.java │ │ │ │ │ │ └── NotParticipatedMemberException.java │ │ │ │ │ ├── repository │ │ │ │ │ │ ├── JpaStudyRepository.java │ │ │ │ │ │ └── StudyRepository.java │ │ │ │ │ ├── StudyStatus.java │ │ │ │ │ └── AttachedTag.java │ │ │ │ ├── service │ │ │ │ │ ├── exception │ │ │ │ │ │ ├── FailureParticipationException.java │ │ │ │ │ │ ├── InvalidUpdatingException.java │ │ │ │ │ │ ├── FailureKickOutException.java │ │ │ │ │ │ ├── OwnerCanNotLeaveException.java │ │ │ │ │ │ └── StudyNotFoundException.java │ │ │ │ │ └── response │ │ │ │ │ │ ├── MyRoleResponse.java │ │ │ │ │ │ ├── MyStudiesResponse.java │ │ │ │ │ │ └── StudyResponse.java │ │ │ │ ├── query │ │ │ │ │ └── data │ │ │ │ │ │ ├── StudySummaryData.java │ │ │ │ │ │ ├── StudyOwnerAndTagsData.java │ │ │ │ │ │ ├── MyStudySummaryData.java │ │ │ │ │ │ └── StudyDetailsData.java │ │ │ │ └── schedule │ │ │ │ │ └── AutoCloseEnrollmentTask.java │ │ │ │ ├── tag │ │ │ │ ├── domain │ │ │ │ │ ├── CategoryName.java │ │ │ │ │ └── Category.java │ │ │ │ ├── exception │ │ │ │ │ └── TagNotExistException.java │ │ │ │ ├── query │ │ │ │ │ ├── response │ │ │ │ │ │ ├── CategoryData.java │ │ │ │ │ │ ├── TagData.java │ │ │ │ │ │ └── TagSummaryData.java │ │ │ │ │ └── request │ │ │ │ │ │ └── CategoryIdRequest.java │ │ │ │ ├── service │ │ │ │ │ ├── response │ │ │ │ │ │ └── TagsResponse.java │ │ │ │ │ └── SearchingTagService.java │ │ │ │ └── controller │ │ │ │ │ └── converter │ │ │ │ │ └── CategoryIdConverter.java │ │ │ │ ├── common │ │ │ │ ├── exception │ │ │ │ │ ├── NotFoundException.java │ │ │ │ │ ├── BadRequestException.java │ │ │ │ │ ├── InvalidFormatException.java │ │ │ │ │ └── UnauthorizedException.java │ │ │ │ ├── config │ │ │ │ │ ├── JpaAuditingConfig.java │ │ │ │ │ └── SchedulerConfig.java │ │ │ │ ├── utils │ │ │ │ │ └── DateTimeSystem.java │ │ │ │ ├── advice │ │ │ │ │ └── response │ │ │ │ │ │ └── ErrorResponse.java │ │ │ │ └── entity │ │ │ │ │ ├── BaseEntity.java │ │ │ │ │ └── ReadOnlyCollectionPersister.java │ │ │ │ ├── auth │ │ │ │ ├── service │ │ │ │ │ ├── response │ │ │ │ │ │ ├── TokenResponse.java │ │ │ │ │ │ └── AccessTokenResponse.java │ │ │ │ │ ├── oauthclient │ │ │ │ │ │ ├── OAuthClient.java │ │ │ │ │ │ └── response │ │ │ │ │ │ │ └── GithubProfileResponse.java │ │ │ │ │ └── request │ │ │ │ │ │ └── AccessTokenRequest.java │ │ │ │ ├── exception │ │ │ │ │ ├── TokenExpirationException.java │ │ │ │ │ └── TokenNotFoundException.java │ │ │ │ ├── config │ │ │ │ │ └── AuthenticatedMemberId.java │ │ │ │ ├── infrastructure │ │ │ │ │ └── TokenProvider.java │ │ │ │ └── controller │ │ │ │ │ └── interceptor │ │ │ │ │ └── PathRequestMatcher.java │ │ │ │ ├── member │ │ │ │ ├── domain │ │ │ │ │ └── repository │ │ │ │ │ │ ├── JpaMemberRepository.java │ │ │ │ │ │ └── MemberRepository.java │ │ │ │ ├── service │ │ │ │ │ ├── exception │ │ │ │ │ │ ├── MemberNotFoundException.java │ │ │ │ │ │ └── NotParticipatedMemberException.java │ │ │ │ │ └── response │ │ │ │ │ │ └── MemberResponse.java │ │ │ │ ├── query │ │ │ │ │ └── data │ │ │ │ │ │ ├── MemberData.java │ │ │ │ │ │ ├── OwnerData.java │ │ │ │ │ │ └── ParticipatingMemberData.java │ │ │ │ └── controller │ │ │ │ │ └── MemberController.java │ │ │ │ ├── comment │ │ │ │ ├── domain │ │ │ │ │ ├── repository │ │ │ │ │ │ ├── JpaCommentRepository.java │ │ │ │ │ │ └── CommentRepository.java │ │ │ │ │ ├── Author.java │ │ │ │ │ └── AssociatedCommunity.java │ │ │ │ ├── service │ │ │ │ │ ├── exception │ │ │ │ │ │ ├── CommentNotFoundException.java │ │ │ │ │ │ ├── UnEditingCommentException.java │ │ │ │ │ │ └── UnWrittenCommentException.java │ │ │ │ │ ├── request │ │ │ │ │ │ ├── EditingCommentRequest.java │ │ │ │ │ │ └── CommentRequest.java │ │ │ │ │ └── response │ │ │ │ │ │ ├── AuthorResponse.java │ │ │ │ │ │ ├── CommentResponse.java │ │ │ │ │ │ └── CommentsResponse.java │ │ │ │ └── query │ │ │ │ │ └── data │ │ │ │ │ └── CommentData.java │ │ │ │ ├── studyroom │ │ │ │ ├── domain │ │ │ │ │ ├── article │ │ │ │ │ │ └── repository │ │ │ │ │ │ │ ├── ArticleRepository.java │ │ │ │ │ │ │ └── TempArticleRepository.java │ │ │ │ │ ├── link │ │ │ │ │ │ └── repository │ │ │ │ │ │ │ └── LinkArticleRepository.java │ │ │ │ │ ├── studyroom │ │ │ │ │ │ └── repository │ │ │ │ │ │ │ ├── StudyRoomRepository.java │ │ │ │ │ │ │ └── JpaStudyRoomRepository.java │ │ │ │ │ ├── review │ │ │ │ │ │ ├── repository │ │ │ │ │ │ │ ├── JpaReviewRepository.java │ │ │ │ │ │ │ └── ReviewRepository.java │ │ │ │ │ │ ├── Reviewer.java │ │ │ │ │ │ └── AssociatedStudy.java │ │ │ │ │ ├── exception │ │ │ │ │ │ ├── UnwritableException.java │ │ │ │ │ │ └── UneditableException.java │ │ │ │ │ └── Accessor.java │ │ │ │ ├── service │ │ │ │ │ ├── exception │ │ │ │ │ │ ├── ReviewNotFoundException.java │ │ │ │ │ │ ├── ArticleNotFoundException.java │ │ │ │ │ │ ├── UnViewableException.java │ │ │ │ │ │ └── TempArticleNotFoundException.java │ │ │ │ │ ├── request │ │ │ │ │ │ ├── ReviewRequest.java │ │ │ │ │ │ ├── SizeRequest.java │ │ │ │ │ │ ├── LinkArticleRequest.java │ │ │ │ │ │ └── ArticleRequest.java │ │ │ │ │ └── response │ │ │ │ │ │ ├── CreatedArticleIdResponse.java │ │ │ │ │ │ ├── temp │ │ │ │ │ │ ├── CreatedTempArticleIdResponse.java │ │ │ │ │ │ └── StudyResponse.java │ │ │ │ │ │ ├── AuthorResponse.java │ │ │ │ │ │ ├── WriterResponse.java │ │ │ │ │ │ ├── ArticleSummariesResponse.java │ │ │ │ │ │ ├── LinksResponse.java │ │ │ │ │ │ ├── ArticleResponse.java │ │ │ │ │ │ ├── ReviewResponse.java │ │ │ │ │ │ └── ReviewsResponse.java │ │ │ │ ├── query │ │ │ │ │ └── data │ │ │ │ │ │ ├── StudyData.java │ │ │ │ │ │ ├── ReviewData.java │ │ │ │ │ │ ├── LinkArticleData.java │ │ │ │ │ │ ├── TempArticleData.java │ │ │ │ │ │ └── ArticleData.java │ │ │ │ └── controller │ │ │ │ │ └── converter │ │ │ │ │ ├── SizeRequestConverter.java │ │ │ │ │ └── ArticleTypeConverter.java │ │ │ │ ├── alarm │ │ │ │ ├── SlackUserProfile.java │ │ │ │ ├── request │ │ │ │ │ └── SlackMessageRequest.java │ │ │ │ ├── response │ │ │ │ │ ├── SlackUsersResponse.java │ │ │ │ │ └── SlackUserResponse.java │ │ │ │ └── AsyncConfig.java │ │ │ │ └── MoamoaApplication.java │ │ └── resources │ │ │ └── application.yml │ └── test │ │ ├── java │ │ └── com │ │ │ └── woowacourse │ │ │ ├── concurrent │ │ │ └── HttpRequestExecutor.java │ │ │ ├── acceptance │ │ │ ├── document │ │ │ │ ├── Document.java │ │ │ │ └── StudyDocument.java │ │ │ ├── TestConfig.java │ │ │ ├── test │ │ │ │ └── cors │ │ │ │ │ └── CorsAcceptanceTest.java │ │ │ ├── steps │ │ │ │ └── SetRequiredDataToCreatingStudySteps.java │ │ │ └── fixture │ │ │ │ └── TagFixtures.java │ │ │ └── moamoa │ │ │ ├── fixtures │ │ │ └── TagFixtures.java │ │ │ ├── auth │ │ │ └── config │ │ │ │ └── AuthenticationExtractorTest.java │ │ │ └── study │ │ │ └── webmvc │ │ │ └── UnauthorizedMyStudyWebMvcTest.java │ │ └── resources │ │ └── application.yml └── .gitignore ├── .gitattributes ├── frontend ├── .storybook │ └── preview-body.html ├── src │ ├── utils │ │ ├── noop.ts │ │ ├── hasOwnProperty.ts │ │ ├── getRandomInt.ts │ │ ├── index.ts │ │ ├── nLineEllipsis.ts │ │ ├── isThemeFontSize.ts │ │ └── arrayOfAll.ts │ ├── assets │ │ └── images │ │ │ ├── logo.png │ │ │ ├── rocket-cursor.png │ │ │ ├── no-image-found.png │ │ │ ├── sth-went-wrong.png │ │ │ ├── moamoa-site-image.png │ │ │ └── rocket-cursor-pointer.png │ ├── mocks │ │ ├── browser.ts │ │ ├── handlers │ │ │ ├── tagHandlers.ts │ │ │ └── memberHandlers.ts │ │ └── links.json │ ├── layout │ │ ├── index.ts │ │ ├── header │ │ │ ├── Header.stories.tsx │ │ │ └── components │ │ │ │ ├── logo-link │ │ │ │ └── LogoLink.stories.tsx │ │ │ │ ├── search-bar │ │ │ │ └── SearchBar.stories.tsx │ │ │ │ └── nav-button │ │ │ │ └── NavButton.stories.tsx │ │ ├── footer │ │ │ ├── Footer.stories.tsx │ │ │ └── Footer.tsx │ │ └── main │ │ │ └── Main.tsx │ ├── components │ │ ├── @shared │ │ │ ├── letter-counter │ │ │ │ ├── useLetterCount.tsx │ │ │ │ ├── LetterCounter.stories.tsx │ │ │ │ └── LetterCounter.tsx │ │ │ ├── center │ │ │ │ └── Center.tsx │ │ │ ├── icons │ │ │ │ ├── plus-icon │ │ │ │ │ ├── PlusIcon.stories.tsx │ │ │ │ │ └── PlusIcon.tsx │ │ │ │ ├── crown-icon │ │ │ │ │ ├── CrownIcon.stories.tsx │ │ │ │ │ └── CrownIcon.tsx │ │ │ │ ├── login-icon │ │ │ │ │ ├── LoginIcon.stories.tsx │ │ │ │ │ └── LoginIcon.tsx │ │ │ │ ├── folder-icon │ │ │ │ │ ├── FolderIcon.stories.tsx │ │ │ │ │ └── FolderIcon.tsx │ │ │ │ ├── logout-icon │ │ │ │ │ ├── LogoutIcon.stories.tsx │ │ │ │ │ └── LogoutIcon.tsx │ │ │ │ ├── pencil-icon │ │ │ │ │ ├── PencilIcon.stories.tsx │ │ │ │ │ └── PencilIcon.tsx │ │ │ │ ├── search-icon │ │ │ │ │ ├── SearchIcon.stories.tsx │ │ │ │ │ └── SearchIcon.tsx │ │ │ │ ├── bookmark-icon │ │ │ │ │ ├── BookmarkIcon.stories.tsx │ │ │ │ │ └── BookmarkIcon.tsx │ │ │ │ ├── trashcan-icon │ │ │ │ │ ├── TrashcanIcon.stories.tsx │ │ │ │ │ └── TrashcanIcon.tsx │ │ │ │ ├── down-arrow-icon │ │ │ │ │ ├── DownArrowIcon.stories.tsx │ │ │ │ │ └── DownArrowIcon.tsx │ │ │ │ ├── kebab-menu-icon │ │ │ │ │ ├── KebabMenuIcon.stories.tsx │ │ │ │ │ └── KebabMenuIcon.tsx │ │ │ │ ├── meatball-menu-icon │ │ │ │ │ ├── MeatballMenukIcon.stories.tsx │ │ │ │ │ └── MeatballMenuIcon.tsx │ │ │ │ ├── right-up-arrow-icon │ │ │ │ │ ├── RightUpArrowIcon.stories.tsx │ │ │ │ │ └── RightUpArrowIcon.tsx │ │ │ │ ├── left-direction-icon │ │ │ │ │ ├── LeftDirectionIcon.stories.tsx │ │ │ │ │ └── LeftDirectionIcon.tsx │ │ │ │ ├── right-direction-icon │ │ │ │ │ ├── RightDirectionIcon.stories.tsx │ │ │ │ │ └── RightDirectionIcon.tsx │ │ │ │ └── x-mark-icon │ │ │ │ │ ├── XMarkIcon.stories.tsx │ │ │ │ │ └── XMarkIcon.tsx │ │ │ ├── form │ │ │ │ └── Form.tsx │ │ │ ├── chip │ │ │ │ └── Chip.stories.tsx │ │ │ ├── page-title │ │ │ │ ├── PageTitle.stories.tsx │ │ │ │ └── PageTitle.tsx │ │ │ ├── meta-box │ │ │ │ └── MetaBox.stories.tsx │ │ │ ├── route-with-condition │ │ │ │ └── RouteWithCondition.tsx │ │ │ ├── section-title │ │ │ │ ├── SectionTitle.stories.tsx │ │ │ │ └── SectionTitle.tsx │ │ │ ├── flex │ │ │ │ └── Flex.stories.tsx │ │ │ ├── checkbox │ │ │ │ └── Checkbox.stories.tsx │ │ │ ├── input │ │ │ │ └── Input.stories.tsx │ │ │ ├── divider │ │ │ │ └── Divider.stories.tsx │ │ │ ├── button │ │ │ │ ├── box-button │ │ │ │ │ └── BoxButton.stories.tsx │ │ │ │ ├── text-button │ │ │ │ │ └── TextButton.stories.tsx │ │ │ │ ├── icon-button │ │ │ │ │ └── IconButton.stories.tsx │ │ │ │ ├── linked-button │ │ │ │ │ └── LinkedButton.tsx │ │ │ │ ├── toggle-button │ │ │ │ │ └── ToggleButton.stories.tsx │ │ │ │ └── index.tsx │ │ │ ├── textarea │ │ │ │ └── Textarea.stories.tsx │ │ │ ├── avatar │ │ │ │ └── Avatar.stories.tsx │ │ │ ├── image │ │ │ │ └── Image.stories.tsx │ │ │ ├── page-wrapper │ │ │ │ └── PageWrapper.tsx │ │ │ ├── list-item │ │ │ │ └── ListItem.stories.tsx │ │ │ ├── label │ │ │ │ └── Label.tsx │ │ │ ├── user-info-item │ │ │ │ └── UserInfoItem.stories.tsx │ │ │ ├── multi-tag-select │ │ │ │ └── MultiTagSelect.stories.tsx │ │ │ ├── markdown-render │ │ │ │ └── MarkdownRender.tsx │ │ │ └── button-group │ │ │ │ └── ButtonGroup.stories.tsx │ │ └── study-chip │ │ │ ├── StudyChip.tsx │ │ │ └── StudyChip.stories.tsx │ ├── custom-types │ │ ├── theme.d.ts │ │ └── common.d.ts │ ├── pages │ │ ├── study-room-page │ │ │ ├── tabs │ │ │ │ ├── community-tab-panel │ │ │ │ │ └── CommunityTabPanel.tsx │ │ │ │ ├── link-room-tab-panel │ │ │ │ │ ├── LinkRoomTabPanel.stories.tsx │ │ │ │ │ └── components │ │ │ │ │ │ ├── user-description │ │ │ │ │ │ ├── UserDescription.tsx │ │ │ │ │ │ └── UserDescription.stories.tsx │ │ │ │ │ │ ├── link-item │ │ │ │ │ │ └── LinkItem.stories.tsx │ │ │ │ │ │ ├── link-form │ │ │ │ │ │ └── LinkForm.stories.tsx │ │ │ │ │ │ ├── link-preview │ │ │ │ │ │ └── LinkPreview.stories.tsx │ │ │ │ │ │ └── link-edit-form │ │ │ │ │ │ └── LinkEditForm.stories.tsx │ │ │ │ └── review-tab-panel │ │ │ │ │ └── components │ │ │ │ │ ├── reivew-form │ │ │ │ │ └── ReviewForm.stories.tsx │ │ │ │ │ └── review-comment │ │ │ │ │ └── ReviewComment.stories.tsx │ │ │ └── components │ │ │ │ └── tab-button │ │ │ │ ├── TabButton.tsx │ │ │ │ └── TabButton.stories.tsx │ │ ├── error-page │ │ │ ├── hooks │ │ │ │ └── useErrorPage.ts │ │ │ ├── ErrorPage.stories.tsx │ │ │ └── ErrorPage.tsx │ │ ├── login-redirect-page │ │ │ └── LoginRedirectPage.tsx │ │ ├── index.ts │ │ ├── detail-page │ │ │ └── components │ │ │ │ ├── more-button │ │ │ │ ├── MoreButton.tsx │ │ │ │ └── MoreButton.stories.tsx │ │ │ │ ├── study-member-card │ │ │ │ └── StudyMemberCard.stories.tsx │ │ │ │ ├── study-float-box │ │ │ │ └── StudyFloatBox.stories.tsx │ │ │ │ ├── study-wide-float-box │ │ │ │ └── StudyWideFloatBox.stories.tsx │ │ │ │ └── study-review-card │ │ │ │ └── StudyReviewCard.stories.tsx │ │ ├── main-page │ │ │ └── components │ │ │ │ ├── create-new-study-button │ │ │ │ ├── CreateNewStudyButton.stories.tsx │ │ │ │ └── CreateNewStudyButton.tsx │ │ │ │ ├── filter-slide-button │ │ │ │ ├── FilterSlideButton.stories.tsx │ │ │ │ └── FilterSlideButton.tsx │ │ │ │ ├── filter-button │ │ │ │ └── FilterButton.stories.tsx │ │ │ │ └── study-card │ │ │ │ └── StudyCard.stories.tsx │ │ ├── study-page │ │ │ ├── components │ │ │ │ ├── description-tab │ │ │ │ │ └── DescriptionTab.stories.tsx │ │ │ │ └── publish │ │ │ │ │ └── Publish.tsx │ │ │ └── layout │ │ │ │ └── Layout.tsx │ │ └── my-study-page │ │ │ ├── components │ │ │ └── my-study-card │ │ │ │ └── MyStudyCard.stories.tsx │ │ │ └── hooks │ │ │ └── useMyStudyPage.ts │ ├── hooks │ │ ├── usePositiveNumberInput.ts │ │ ├── useAuth.ts │ │ ├── useUserInfo.ts │ │ └── useUserRole.ts │ ├── api │ │ ├── my-studies │ │ │ ├── typeChecker.ts │ │ │ └── index.ts │ │ ├── tags │ │ │ └── index.ts │ │ ├── links │ │ │ └── typeChecker.ts │ │ ├── reviews │ │ │ └── typeChecker.ts │ │ ├── link-preview │ │ │ └── typeChecker.ts │ │ ├── review │ │ │ └── typeChecker.ts │ │ └── link │ │ │ └── typeChecker.ts │ └── context │ │ ├── search │ │ └── SearchProvider.tsx │ │ ├── userInfo │ │ └── UserInfoProvider.tsx │ │ └── login │ │ └── LoginProvider.tsx ├── static │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── 6.jpg │ ├── 7.jpg │ ├── 8.jpg │ ├── 9.jpg │ ├── 10.jpg │ ├── 11.jpg │ ├── 12.jpg │ ├── 13.jpg │ ├── 14.jpg │ ├── 15.jpg │ ├── 16.jpg │ ├── 17.jpg │ ├── 18.jpg │ ├── 19.jpg │ ├── 20.jpg │ ├── 21.jpg │ ├── 22.jpg │ ├── 23.jpg │ ├── 24.jpg │ ├── 25.jpg │ ├── 26.jpg │ ├── 27.jpg │ ├── 28.jpg │ ├── Pretendard-Light.woff2 │ ├── Pretendard-Regular.woff2 │ ├── Pretendard-SemiBold.woff2 │ └── Pretendard-ExtraBold.woff2 ├── public │ ├── favicon.png │ └── index.html ├── env │ ├── .env.local │ ├── .env.prod │ └── .env.dev ├── .vscode │ └── settings.json ├── .gitignore ├── cypress │ ├── fixtures │ │ └── example.json │ ├── support │ │ ├── component-index.html │ │ └── e2e.ts │ └── tsconfig.json ├── cypress.config.ts ├── .babelrc.json ├── README.md └── webpack │ ├── webpack.prod.js │ ├── webpack.dev.js │ └── webpack.local.js └── .github ├── pull_request_template.md ├── ISSUE_TEMPLATE └── issue_feature_template.md └── workflows ├── devploy-frontend-prod.yml └── frontend.yml /backend/README.md: -------------------------------------------------------------------------------- 1 | # MOAMOA 2 | 3 | hello. 4 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | frontend/**/*.json linguist-generated 2 | -------------------------------------------------------------------------------- /backend/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'moamoa' 2 | -------------------------------------------------------------------------------- /frontend/.storybook/preview-body.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /frontend/src/utils/noop.ts: -------------------------------------------------------------------------------- 1 | const noop = (): undefined => undefined; 2 | 3 | export default noop; 4 | -------------------------------------------------------------------------------- /frontend/static/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/1.jpg -------------------------------------------------------------------------------- /frontend/static/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/2.jpg -------------------------------------------------------------------------------- /frontend/static/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/3.jpg -------------------------------------------------------------------------------- /frontend/static/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/4.jpg -------------------------------------------------------------------------------- /frontend/static/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/5.jpg -------------------------------------------------------------------------------- /frontend/static/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/6.jpg -------------------------------------------------------------------------------- /frontend/static/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/7.jpg -------------------------------------------------------------------------------- /frontend/static/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/8.jpg -------------------------------------------------------------------------------- /frontend/static/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/9.jpg -------------------------------------------------------------------------------- /frontend/static/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/10.jpg -------------------------------------------------------------------------------- /frontend/static/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/11.jpg -------------------------------------------------------------------------------- /frontend/static/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/12.jpg -------------------------------------------------------------------------------- /frontend/static/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/13.jpg -------------------------------------------------------------------------------- /frontend/static/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/14.jpg -------------------------------------------------------------------------------- /frontend/static/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/15.jpg -------------------------------------------------------------------------------- /frontend/static/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/16.jpg -------------------------------------------------------------------------------- /frontend/static/17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/17.jpg -------------------------------------------------------------------------------- /frontend/static/18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/18.jpg -------------------------------------------------------------------------------- /frontend/static/19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/19.jpg -------------------------------------------------------------------------------- /frontend/static/20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/20.jpg -------------------------------------------------------------------------------- /frontend/static/21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/21.jpg -------------------------------------------------------------------------------- /frontend/static/22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/22.jpg -------------------------------------------------------------------------------- /frontend/static/23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/23.jpg -------------------------------------------------------------------------------- /frontend/static/24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/24.jpg -------------------------------------------------------------------------------- /frontend/static/25.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/25.jpg -------------------------------------------------------------------------------- /frontend/static/26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/26.jpg -------------------------------------------------------------------------------- /frontend/static/27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/27.jpg -------------------------------------------------------------------------------- /frontend/static/28.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/28.jpg -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | 2 | ## 요약 3 | 4 | ## 세부사항 5 | 6 | close 7 | -------------------------------------------------------------------------------- /frontend/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/public/favicon.png -------------------------------------------------------------------------------- /frontend/env/.env.local: -------------------------------------------------------------------------------- 1 | API_URL="" 2 | CLIENT_ID="cb83d95cd5644436b090" 3 | LINK_PREVIEW_API_URL="https://api.og.moamoa.space" 4 | -------------------------------------------------------------------------------- /frontend/src/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/src/assets/images/logo.png -------------------------------------------------------------------------------- /frontend/static/Pretendard-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/Pretendard-Light.woff2 -------------------------------------------------------------------------------- /backend/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/backend/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /frontend/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.preferences.importModuleSpecifier": "non-relative", 3 | "editor.formatOnSave": true 4 | } 5 | -------------------------------------------------------------------------------- /frontend/static/Pretendard-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/Pretendard-Regular.woff2 -------------------------------------------------------------------------------- /frontend/static/Pretendard-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/Pretendard-SemiBold.woff2 -------------------------------------------------------------------------------- /frontend/env/.env.prod: -------------------------------------------------------------------------------- 1 | API_URL="https://api.moamoa.space" 2 | CLIENT_ID="cf7c0528216f765c83c0" 3 | LINK_PREVIEW_API_URL="https://api.og.moamoa.space" 4 | -------------------------------------------------------------------------------- /frontend/src/assets/images/rocket-cursor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/src/assets/images/rocket-cursor.png -------------------------------------------------------------------------------- /frontend/static/Pretendard-ExtraBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/static/Pretendard-ExtraBold.woff2 -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | .cache 4 | dist 5 | 6 | storybook-static/ 7 | 8 | cypress/screenshots/ 9 | cypress/videos/ 10 | -------------------------------------------------------------------------------- /frontend/env/.env.dev: -------------------------------------------------------------------------------- 1 | API_URL="https://api.dev.moamoa.space" 2 | CLIENT_ID="cb83d95cd5644436b090" 3 | LINK_PREVIEW_API_URL="https://api.og.moamoa.space" 4 | -------------------------------------------------------------------------------- /frontend/src/assets/images/no-image-found.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/src/assets/images/no-image-found.png -------------------------------------------------------------------------------- /frontend/src/assets/images/sth-went-wrong.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/src/assets/images/sth-went-wrong.png -------------------------------------------------------------------------------- /frontend/src/assets/images/moamoa-site-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/src/assets/images/moamoa-site-image.png -------------------------------------------------------------------------------- /frontend/src/assets/images/rocket-cursor-pointer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woowacourse-teams/2022-moamoa/HEAD/frontend/src/assets/images/rocket-cursor-pointer.png -------------------------------------------------------------------------------- /frontend/src/mocks/browser.ts: -------------------------------------------------------------------------------- 1 | import { setupWorker } from 'msw'; 2 | 3 | import { handlers } from '@mocks/handlers/handlers'; 4 | 5 | export const worker = setupWorker(...handlers); 6 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/study/domain/MemberRole.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.study.domain; 2 | 3 | public enum MemberRole { 4 | 5 | MEMBER, NON_MEMBER, OWNER 6 | } 7 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/tag/domain/CategoryName.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.tag.domain; 2 | 3 | public enum CategoryName { 4 | 5 | GENERATION, AREA, SUBJECT 6 | } 7 | -------------------------------------------------------------------------------- /frontend/cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } 6 | -------------------------------------------------------------------------------- /frontend/src/layout/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Footer } from '@layout/footer/Footer'; 2 | export { default as Header } from '@layout/header/Header'; 3 | export { default as Main } from '@layout/main/Main'; 4 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/study/domain/RecruitStatus.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.study.domain; 2 | 3 | public enum RecruitStatus { 4 | 5 | RECRUITMENT_START, RECRUITMENT_END 6 | } 7 | -------------------------------------------------------------------------------- /frontend/src/utils/hasOwnProperty.ts: -------------------------------------------------------------------------------- 1 | export const hasOwnProperty = ( 2 | obj: ObjectType, 3 | prop: KeyType, 4 | ): obj is ObjectType & Record => obj.hasOwnProperty(prop); 5 | -------------------------------------------------------------------------------- /frontend/src/utils/getRandomInt.ts: -------------------------------------------------------------------------------- 1 | const getRandomInt = (min: number, max: number) => { 2 | min = Math.ceil(min); 3 | max = Math.floor(max); 4 | return Math.floor(Math.random() * (max - min + 1)) + min; 5 | }; 6 | 7 | export default getRandomInt; 8 | -------------------------------------------------------------------------------- /backend/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /backend/src/test/java/com/woowacourse/concurrent/HttpRequestExecutor.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.concurrent; 2 | 3 | import org.springframework.http.HttpStatus; 4 | 5 | @FunctionalInterface 6 | interface HttpRequestExecutor { 7 | 8 | HttpStatus execute(); 9 | } 10 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/issue_feature_template.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: issue_feature_template 3 | about: 기능 이슈 관련 템플릿 4 | title: "[기능]" 5 | labels: feature 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## 요약 11 | 12 | ## 세부 설명 13 | 14 | -------------------------------------------------------------------------------- /frontend/src/mocks/handlers/tagHandlers.ts: -------------------------------------------------------------------------------- 1 | import { rest } from 'msw'; 2 | 3 | import tagsJSON from '@mocks/tags.json'; 4 | 5 | export const tagHandlers = [ 6 | rest.get('/api/tags', (req, res, ctx) => { 7 | return res(ctx.status(200), ctx.json(tagsJSON)); 8 | }), 9 | ]; 10 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/tag/exception/TagNotExistException.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.tag.exception; 2 | 3 | public class TagNotExistException extends RuntimeException { 4 | 5 | public TagNotExistException() { 6 | super("필터가 존재하지 않습니다."); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/common/exception/NotFoundException.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.common.exception; 2 | 3 | public class NotFoundException extends RuntimeException { 4 | 5 | public NotFoundException(final String message) { 6 | super(message); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/common/exception/BadRequestException.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.common.exception; 2 | 3 | public class BadRequestException extends RuntimeException { 4 | 5 | public BadRequestException(final String message) { 6 | super(message); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/common/exception/InvalidFormatException.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.common.exception; 2 | 3 | public class InvalidFormatException extends IllegalArgumentException { 4 | 5 | public InvalidFormatException() { 6 | super("잘못된 요청 정보입니다."); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/common/exception/UnauthorizedException.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.common.exception; 2 | 3 | public class UnauthorizedException extends RuntimeException { 4 | 5 | public UnauthorizedException(final String message) { 6 | super(message); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/study/domain/exception/InvalidPeriodException.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.study.domain.exception; 2 | 3 | public class InvalidPeriodException extends RuntimeException { 4 | 5 | public InvalidPeriodException() { 6 | super("잘못된 기간 설정입니다."); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /frontend/src/components/@shared/letter-counter/useLetterCount.tsx: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | 3 | const useLetterCount = (maxCount: number, initialCount = 0) => { 4 | const [count, setCount] = useState(initialCount); 5 | return { count, setCount, maxCount }; 6 | }; 7 | 8 | export default useLetterCount; 9 | -------------------------------------------------------------------------------- /frontend/src/custom-types/theme.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-empty-interface */ 2 | // import문과 declare의 충돌로 나머지 declare문은 common.d.ts에 작성했다 3 | import { theme } from '@styles/theme'; 4 | 5 | type ThemeConfig = typeof theme; 6 | declare module '@emotion/react' { 7 | export interface Theme extends ThemeConfig {} 8 | } 9 | -------------------------------------------------------------------------------- /frontend/src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export { default as getRandomInt } from '@utils/getRandomInt'; 2 | export { default as noop } from '@utils/noop'; 3 | export * from '@utils/dates'; 4 | export * from '@utils/typeChecker'; 5 | export { default as checkType } from '@utils/typeChecker'; 6 | export { default as arrayOfAll } from '@utils/arrayOfAll'; 7 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/auth/service/response/TokenResponse.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.auth.service.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | @AllArgsConstructor 7 | @Getter 8 | public class TokenResponse { 9 | 10 | private final String accessToken; 11 | } 12 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/study/service/exception/FailureParticipationException.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.study.service.exception; 2 | 3 | public class FailureParticipationException extends RuntimeException { 4 | 5 | public FailureParticipationException() { 6 | super("스터디 가입이 불가능합니다."); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /frontend/src/utils/nLineEllipsis.ts: -------------------------------------------------------------------------------- 1 | import { css } from '@emotion/react'; 2 | 3 | export const nLineEllipsis = (numOfLine: number) => css` 4 | display: -webkit-box; 5 | overflow: clip; 6 | text-overflow: ellipsis; 7 | -webkit-box-orient: vertical; 8 | -webkit-line-clamp: ${numOfLine}; 9 | 10 | word-break: break-all; 11 | `; 12 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/auth/service/oauthclient/OAuthClient.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.auth.service.oauthclient; 2 | 3 | import com.woowacourse.moamoa.auth.service.oauthclient.response.GithubProfileResponse; 4 | 5 | public interface OAuthClient { 6 | 7 | GithubProfileResponse getProfile(final String code); 8 | } 9 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/tag/query/response/CategoryData.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.tag.query.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | @AllArgsConstructor 7 | @Getter 8 | public class CategoryData { 9 | 10 | private final Long id; 11 | private final String name; 12 | } 13 | -------------------------------------------------------------------------------- /frontend/src/components/@shared/center/Center.tsx: -------------------------------------------------------------------------------- 1 | import Flex from '@shared/flex/Flex'; 2 | 3 | type CenterProps = { 4 | children?: React.ReactNode; 5 | }; 6 | 7 | const Center: React.FC = ({ children }) => ( 8 | 9 | {children} 10 | 11 | ); 12 | 13 | export default Center; 14 | -------------------------------------------------------------------------------- /frontend/src/components/study-chip/StudyChip.tsx: -------------------------------------------------------------------------------- 1 | import Chip from '@shared/chip/Chip'; 2 | 3 | export type StudyChipProps = { 4 | isOpen: boolean; 5 | }; 6 | 7 | const StudyChip = ({ isOpen }: StudyChipProps) => { 8 | return isOpen ? 모집중 : 모집완료; 9 | }; 10 | 11 | export default StudyChip; 12 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/study/domain/repository/JpaStudyRepository.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.study.domain.repository; 2 | 3 | import com.woowacourse.moamoa.study.domain.Study; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | interface JpaStudyRepository extends JpaRepository, StudyRepository { 7 | } 8 | -------------------------------------------------------------------------------- /frontend/src/layout/header/Header.stories.tsx: -------------------------------------------------------------------------------- 1 | import { type Story } from '@storybook/react'; 2 | 3 | import Header from '@layout/header/Header'; 4 | 5 | export default { 6 | title: 'Layout/Header', 7 | component: Header, 8 | }; 9 | 10 | const Template: Story = () =>
; 11 | 12 | export const Default = Template.bind({}); 13 | Default.args = {}; 14 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/member/domain/repository/JpaMemberRepository.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.member.domain.repository; 2 | 3 | import com.woowacourse.moamoa.member.domain.Member; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | interface JpaMemberRepository extends JpaRepository, MemberRepository { 7 | } 8 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/common/config/JpaAuditingConfig.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.common.config; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | import org.springframework.data.jpa.repository.config.EnableJpaAuditing; 5 | 6 | @Configuration 7 | @EnableJpaAuditing 8 | public class JpaAuditingConfig { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/common/utils/DateTimeSystem.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.common.utils; 2 | 3 | import java.time.LocalDateTime; 4 | import org.springframework.stereotype.Component; 5 | 6 | @Component 7 | public class DateTimeSystem { 8 | 9 | public LocalDateTime now() { 10 | return LocalDateTime.now(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /frontend/src/custom-types/common.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.jpg'; 2 | declare module '*.jpeg'; 3 | declare module '*.png'; 4 | declare module '*.json'; 5 | 6 | declare namespace NodeJS { 7 | export type ProcessEnv = { 8 | API_URL: string; 9 | CLIENT_ID: string; 10 | LINK_PREVIEW_API_URL: string; 11 | NODE_ENV: 'development' | 'production'; 12 | }; 13 | } 14 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/comment/domain/repository/JpaCommentRepository.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.comment.domain.repository; 2 | 3 | import com.woowacourse.moamoa.comment.domain.Comment; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | interface JpaCommentRepository extends JpaRepository, CommentRepository { 7 | } 8 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/repository/ArticleRepository.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.studyroom.domain.article.repository; 2 | 3 | import com.woowacourse.moamoa.studyroom.domain.article.Article; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface ArticleRepository extends JpaRepository { 7 | } 8 | -------------------------------------------------------------------------------- /frontend/cypress/support/component-index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Components App 8 | 9 | 10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/auth/exception/TokenExpirationException.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.auth.exception; 2 | 3 | import com.woowacourse.moamoa.common.exception.UnauthorizedException; 4 | 5 | public class TokenExpirationException extends UnauthorizedException { 6 | 7 | public TokenExpirationException() { 8 | super("만료된 토큰입니다."); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/auth/exception/TokenNotFoundException.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.auth.exception; 2 | 3 | import com.woowacourse.moamoa.common.exception.UnauthorizedException; 4 | 5 | public class TokenNotFoundException extends UnauthorizedException { 6 | 7 | public TokenNotFoundException() { 8 | super("토큰이 존재하지 않습니다."); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/auth/service/response/AccessTokenResponse.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.auth.service.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | @AllArgsConstructor 7 | @Getter 8 | public class AccessTokenResponse { 9 | 10 | private final String accessToken; 11 | private final long expiredTime; 12 | } 13 | -------------------------------------------------------------------------------- /frontend/cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'cypress'; 2 | 3 | import webpackConfig from './webpack/webpack.local'; 4 | 5 | export default defineConfig({ 6 | e2e: { 7 | baseUrl: 'http://localhost:3000', 8 | }, 9 | component: { 10 | devServer: { 11 | framework: 'react', 12 | bundler: 'webpack', 13 | webpackConfig, 14 | }, 15 | }, 16 | }); 17 | -------------------------------------------------------------------------------- /frontend/src/pages/study-room-page/tabs/community-tab-panel/CommunityTabPanel.tsx: -------------------------------------------------------------------------------- 1 | import { Outlet } from 'react-router-dom'; 2 | 3 | import PageWrapper from '@shared/page-wrapper/PageWrapper'; 4 | 5 | const CommunityTabPanel: React.FC = () => { 6 | return ( 7 | 8 | 9 | 10 | ); 11 | }; 12 | 13 | export default CommunityTabPanel; 14 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/link/repository/LinkArticleRepository.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.studyroom.domain.link.repository; 2 | 3 | import com.woowacourse.moamoa.studyroom.domain.link.LinkArticle; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface LinkArticleRepository extends JpaRepository { 7 | } 8 | -------------------------------------------------------------------------------- /frontend/src/components/@shared/icons/plus-icon/PlusIcon.stories.tsx: -------------------------------------------------------------------------------- 1 | import { type Story } from '@storybook/react'; 2 | 3 | import { PlusIcon } from '@shared/icons'; 4 | 5 | export default { 6 | title: 'Materials/Icons/PlusIcon', 7 | component: PlusIcon, 8 | }; 9 | 10 | const Template: Story = () => ; 11 | 12 | export const Default = Template.bind({}); 13 | Default.args = {}; 14 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/studyroom/repository/StudyRoomRepository.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.studyroom.domain.studyroom.repository; 2 | 3 | import com.woowacourse.moamoa.studyroom.domain.studyroom.StudyRoom; 4 | import java.util.Optional; 5 | 6 | public interface StudyRoomRepository { 7 | 8 | Optional findByStudyId(Long studyId); 9 | } 10 | -------------------------------------------------------------------------------- /frontend/src/components/@shared/icons/crown-icon/CrownIcon.stories.tsx: -------------------------------------------------------------------------------- 1 | import { type Story } from '@storybook/react'; 2 | 3 | import { CrownIcon } from '@shared/icons'; 4 | 5 | export default { 6 | title: 'Materials/Icons/CrownIcon', 7 | component: CrownIcon, 8 | }; 9 | 10 | const Template: Story = () => ; 11 | 12 | export const Default = Template.bind({}); 13 | Default.args = {}; 14 | -------------------------------------------------------------------------------- /frontend/src/components/@shared/icons/login-icon/LoginIcon.stories.tsx: -------------------------------------------------------------------------------- 1 | import { type Story } from '@storybook/react'; 2 | 3 | import { LoginIcon } from '@shared/icons'; 4 | 5 | export default { 6 | title: 'Materials/Icons/LoginIcon', 7 | component: LoginIcon, 8 | }; 9 | 10 | const Template: Story = () => ; 11 | 12 | export const Default = Template.bind({}); 13 | Default.args = {}; 14 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/member/service/exception/MemberNotFoundException.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.member.service.exception; 2 | 3 | import com.woowacourse.moamoa.common.exception.NotFoundException; 4 | 5 | public class MemberNotFoundException extends NotFoundException { 6 | 7 | public MemberNotFoundException() { 8 | super("회원을 찾을 수 없습니다."); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/article/repository/TempArticleRepository.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.studyroom.domain.article.repository; 2 | 3 | import com.woowacourse.moamoa.studyroom.domain.article.TempArticle; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface TempArticleRepository extends JpaRepository { 7 | } 8 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/studyroom/domain/review/repository/JpaReviewRepository.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.studyroom.domain.review.repository; 2 | 3 | import com.woowacourse.moamoa.studyroom.domain.review.Review; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface JpaReviewRepository extends JpaRepository, ReviewRepository { 7 | } 8 | -------------------------------------------------------------------------------- /frontend/src/components/@shared/form/Form.tsx: -------------------------------------------------------------------------------- 1 | import { noop } from '@utils'; 2 | 3 | export type FormProps = { 4 | children: React.ReactNode; 5 | onSubmit?: React.FormEventHandler; 6 | }; 7 | 8 | const Form: React.FC = ({ children, onSubmit: handleSubmit = noop }) => { 9 | return
{children}
; 10 | }; 11 | 12 | export default Form; 13 | -------------------------------------------------------------------------------- /frontend/src/utils/isThemeFontSize.ts: -------------------------------------------------------------------------------- 1 | import { hasOwnProperty } from '@utils/hasOwnProperty'; 2 | import { isString } from '@utils/typeChecker'; 3 | 4 | import { type ThemeFontSize, theme } from '@styles/theme'; 5 | 6 | const isThemeFontSize = (fontSize: unknown): fontSize is ThemeFontSize => 7 | isString(fontSize) && hasOwnProperty(theme.fontSize, fontSize); 8 | 9 | export default isThemeFontSize; 10 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/comment/service/exception/CommentNotFoundException.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.comment.service.exception; 2 | 3 | import com.woowacourse.moamoa.common.exception.NotFoundException; 4 | 5 | public class CommentNotFoundException extends NotFoundException { 6 | 7 | public CommentNotFoundException() { 8 | super("댓글을 찾을 수 없습니다."); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/study/service/exception/InvalidUpdatingException.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.study.service.exception; 2 | 3 | import com.woowacourse.moamoa.common.exception.BadRequestException; 4 | 5 | public class InvalidUpdatingException extends BadRequestException { 6 | 7 | public InvalidUpdatingException() { 8 | super("스터디 수정이 불가능합니다."); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /backend/src/main/java/com/woowacourse/moamoa/studyroom/service/exception/ReviewNotFoundException.java: -------------------------------------------------------------------------------- 1 | package com.woowacourse.moamoa.studyroom.service.exception; 2 | 3 | import com.woowacourse.moamoa.common.exception.NotFoundException; 4 | 5 | public class ReviewNotFoundException extends NotFoundException { 6 | 7 | public ReviewNotFoundException() { 8 | super("후기를 찾을 수 없습니다."); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /frontend/src/components/@shared/icons/folder-icon/FolderIcon.stories.tsx: -------------------------------------------------------------------------------- 1 | import { type Story } from '@storybook/react'; 2 | 3 | import { FolderIcon } from '@shared/icons'; 4 | 5 | export default { 6 | title: 'Materials/Icons/FolderIcon', 7 | component: FolderIcon, 8 | }; 9 | 10 | const Template: Story = () => ; 11 | 12 | export const Default = Template.bind({}); 13 | Default.args = {}; 14 | -------------------------------------------------------------------------------- /frontend/src/components/@shared/icons/logout-icon/LogoutIcon.stories.tsx: -------------------------------------------------------------------------------- 1 | import { type Story } from '@storybook/react'; 2 | 3 | import { LogoutIcon } from '@shared/icons'; 4 | 5 | export default { 6 | title: 'Materials/Icons/LogoutIcon', 7 | component: LogoutIcon, 8 | }; 9 | 10 | const Template: Story = () => ; 11 | 12 | export const Default = Template.bind({}); 13 | Default.args = {}; 14 | -------------------------------------------------------------------------------- /frontend/src/components/@shared/icons/pencil-icon/PencilIcon.stories.tsx: -------------------------------------------------------------------------------- 1 | import { type Story } from '@storybook/react'; 2 | 3 | import { PencilIcon } from '@shared/icons'; 4 | 5 | export default { 6 | title: 'Materials/Icons/PencilIcon', 7 | component: PencilIcon, 8 | }; 9 | 10 | const Template: Story = () => ; 11 | 12 | export const Default = Template.bind({}); 13 | Default.args = {}; 14 | -------------------------------------------------------------------------------- /frontend/src/components/@shared/icons/search-icon/SearchIcon.stories.tsx: -------------------------------------------------------------------------------- 1 | import { type Story } from '@storybook/react'; 2 | 3 | import { SearchIcon } from '@shared/icons'; 4 | 5 | export default { 6 | title: 'Materials/Icons/SearchIcon', 7 | component: SearchIcon, 8 | }; 9 | 10 | const Template: Story = () => ; 11 | 12 | export const Default = Template.bind({}); 13 | Default.args = {}; 14 | -------------------------------------------------------------------------------- /frontend/src/layout/footer/Footer.stories.tsx: -------------------------------------------------------------------------------- 1 | import { type Story } from '@storybook/react'; 2 | 3 | import Footer, { type FooterProps } from '@layout/footer/Footer'; 4 | 5 | export default { 6 | title: 'Layout/Footer', 7 | component: Footer, 8 | }; 9 | 10 | const Template: Story = props =>