├── .deploy ├── deploy_dev.sh ├── deploy_prod.sh ├── dev_dockerfile └── prod_dockerfile ├── .github ├── ISSUE_TEMPLATE │ ├── feature.md │ └── fix.md ├── pull_request_template.md └── workflows │ ├── CD-dev.yml │ ├── CD-prod.yml │ ├── CI-dev.yml │ └── CI-prod.yml ├── .gitignore ├── README.md ├── build.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src ├── docs └── asciidoc │ ├── AlarmHistory-API.adoc │ ├── Auth-API.adoc │ ├── Block-API.adoc │ ├── Board-API.adoc │ ├── BoardComment_API.adoc │ ├── Fire-API.adoc │ ├── Image-API.adoc │ ├── Mission-API.adoc │ ├── MissionArchive-API.adoc │ ├── MissionArchiveComment_API.adoc │ ├── MissionBoard-API.adoc │ ├── MissionGatherBoard-API.adoc │ ├── Mypage-API.adoc │ ├── Overview.adoc │ ├── Report-API.adoc │ ├── Team-API.adoc │ ├── TeamScore-API.adoc │ └── api.adoc ├── main ├── java │ └── com │ │ └── moing │ │ └── backend │ │ ├── BackendApplication.java │ │ ├── domain │ │ ├── alarm │ │ │ └── application │ │ │ │ ├── MultiAlarmEventUseCase.java │ │ │ │ └── SingleAlarmEventUseCase.java │ │ ├── auth │ │ │ ├── application │ │ │ │ ├── dto │ │ │ │ │ ├── request │ │ │ │ │ │ ├── SignInRequest.java │ │ │ │ │ │ ├── SignUpRequest.java │ │ │ │ │ │ └── TestRequest.java │ │ │ │ │ └── response │ │ │ │ │ │ ├── CheckNicknameResponse.java │ │ │ │ │ │ ├── GoogleUserResponse.java │ │ │ │ │ │ ├── KakaoAccessTokenResponse.java │ │ │ │ │ │ ├── KakaoUserResponse.java │ │ │ │ │ │ ├── ReissueTokenResponse.java │ │ │ │ │ │ └── SignInResponse.java │ │ │ │ └── service │ │ │ │ │ ├── CheckNicknameUseCase.java │ │ │ │ │ ├── MemberAuthUseCase.java │ │ │ │ │ ├── ReissueTokenUseCase.java │ │ │ │ │ ├── SignInProvider.java │ │ │ │ │ ├── SignInUseCase.java │ │ │ │ │ ├── SignUpUseCase.java │ │ │ │ │ ├── WithdrawProvider.java │ │ │ │ │ ├── apple │ │ │ │ │ ├── AppleSignInUseCase.java │ │ │ │ │ ├── AppleTokenUseCase.java │ │ │ │ │ ├── AppleWithdrawUseCase.java │ │ │ │ │ └── utils │ │ │ │ │ │ ├── AppleClient.java │ │ │ │ │ │ ├── AppleToken.java │ │ │ │ │ │ └── Keys.java │ │ │ │ │ ├── google │ │ │ │ │ ├── GoogleSignInUseCase.java │ │ │ │ │ ├── GoogleTokenUseCase.java │ │ │ │ │ ├── GoogleWithdrawUseCase.java │ │ │ │ │ └── utils │ │ │ │ │ │ └── GoogleClient.java │ │ │ │ │ └── kakao │ │ │ │ │ ├── KakaoSignInUseCase.java │ │ │ │ │ ├── KakaoTokenUseCase.java │ │ │ │ │ ├── KakaoWithdrawUseCase.java │ │ │ │ │ └── utils │ │ │ │ │ ├── KakaoClient.java │ │ │ │ │ └── KakaoUnlinkResponse.java │ │ │ ├── exception │ │ │ │ ├── AccountAlreadyExistedException.java │ │ │ │ ├── AppIdInvalidException.java │ │ │ │ ├── AuthException.java │ │ │ │ ├── NicknameDuplicationException.java │ │ │ │ ├── TokenInvalidException.java │ │ │ │ └── UnknownProviderException.java │ │ │ └── presentation │ │ │ │ ├── AuthController.java │ │ │ │ ├── AuthRedirectController.java │ │ │ │ └── constant │ │ │ │ └── AuthResponseMessage.java │ │ ├── block │ │ │ ├── application │ │ │ │ ├── mapper │ │ │ │ │ └── BlockMapper.java │ │ │ │ └── service │ │ │ │ │ ├── BlockCreateUseCase.java │ │ │ │ │ ├── BlockDeleteUseCase.java │ │ │ │ │ └── BlockReadUseCase.java │ │ │ ├── domain │ │ │ │ ├── entity │ │ │ │ │ └── Block.java │ │ │ │ ├── repository │ │ │ │ │ ├── BlockCustomRepository.java │ │ │ │ │ ├── BlockCustomRepositoryImpl.java │ │ │ │ │ ├── BlockRepository.java │ │ │ │ │ └── BlockRepositoryUtils.java │ │ │ │ └── service │ │ │ │ │ ├── BlockDeleteService.java │ │ │ │ │ ├── BlockQueryService.java │ │ │ │ │ └── BlockSaveService.java │ │ │ ├── exception │ │ │ │ ├── BlockException.java │ │ │ │ └── NotFoundBlockException.java │ │ │ └── presentation │ │ │ │ ├── BlockController.java │ │ │ │ └── constant │ │ │ │ └── BlockResponseMessage.java │ │ ├── board │ │ │ ├── application │ │ │ │ ├── dto │ │ │ │ │ ├── request │ │ │ │ │ │ ├── CreateBoardRequest.java │ │ │ │ │ │ └── UpdateBoardRequest.java │ │ │ │ │ └── response │ │ │ │ │ │ ├── BoardBlocks.java │ │ │ │ │ │ ├── CreateBoardResponse.java │ │ │ │ │ │ ├── GetAllBoardResponse.java │ │ │ │ │ │ ├── GetBoardDetailResponse.java │ │ │ │ │ │ └── UpdateBoardResponse.java │ │ │ │ ├── mapper │ │ │ │ │ └── BoardMapper.java │ │ │ │ └── service │ │ │ │ │ ├── CreateBoardUseCase.java │ │ │ │ │ ├── DeleteBoardUseCase.java │ │ │ │ │ ├── GetBoardUseCase.java │ │ │ │ │ ├── SendBoardAlarmUseCase.java │ │ │ │ │ └── UpdateBoardUseCase.java │ │ │ ├── domain │ │ │ │ ├── entity │ │ │ │ │ └── Board.java │ │ │ │ ├── repository │ │ │ │ │ ├── BoardCustomRepository.java │ │ │ │ │ ├── BoardCustomRepositoryImpl.java │ │ │ │ │ └── BoardRepository.java │ │ │ │ └── service │ │ │ │ │ ├── BoardDeleteService.java │ │ │ │ │ ├── BoardGetService.java │ │ │ │ │ └── BoardSaveService.java │ │ │ ├── exception │ │ │ │ ├── BoardException.java │ │ │ │ ├── NotAuthByBoardException.java │ │ │ │ └── NotFoundByBoardIdException.java │ │ │ └── presentation │ │ │ │ ├── BoardController.java │ │ │ │ └── constant │ │ │ │ └── BoardResponseMessage.java │ │ ├── boardComment │ │ │ ├── application │ │ │ │ ├── mapper │ │ │ │ │ └── BoardCommentMapper.java │ │ │ │ └── service │ │ │ │ │ ├── CreateBoardCommentUseCase.java │ │ │ │ │ ├── DeleteBoardCommentUseCase.java │ │ │ │ │ ├── GetBoardCommentUseCase.java │ │ │ │ │ └── SendBoardCommentAlarmUseCase.java │ │ │ ├── domain │ │ │ │ ├── entity │ │ │ │ │ └── BoardComment.java │ │ │ │ ├── repository │ │ │ │ │ ├── BoardCommentCustomRepository.java │ │ │ │ │ ├── BoardCommentCustomRepositoryImpl.java │ │ │ │ │ └── BoardCommentRepository.java │ │ │ │ └── service │ │ │ │ │ ├── BoardCommentDeleteService.java │ │ │ │ │ ├── BoardCommentGetService.java │ │ │ │ │ └── BoardCommentSaveService.java │ │ │ ├── exception │ │ │ │ ├── BoardCommentException.java │ │ │ │ ├── NotAuthByBoardCommentException.java │ │ │ │ └── NotFoundByBoardCommentIdException.java │ │ │ └── presentattion │ │ │ │ ├── BoardCommentController.java │ │ │ │ └── constant │ │ │ │ └── BoardCommentResponseMessage.java │ │ ├── boardRead │ │ │ ├── application │ │ │ │ ├── mapper │ │ │ │ │ └── BoardReadMapper.java │ │ │ │ └── service │ │ │ │ │ └── CreateBoardReadUseCase.java │ │ │ └── domain │ │ │ │ ├── entity │ │ │ │ └── BoardRead.java │ │ │ │ ├── repository │ │ │ │ └── BoardReadRepository.java │ │ │ │ └── service │ │ │ │ └── BoardReadSaveService.java │ │ ├── comment │ │ │ ├── application │ │ │ │ └── dto │ │ │ │ │ ├── request │ │ │ │ │ └── CreateCommentRequest.java │ │ │ │ │ └── response │ │ │ │ │ ├── CommentBlocks.java │ │ │ │ │ ├── CreateCommentResponse.java │ │ │ │ │ └── GetCommentResponse.java │ │ │ └── domain │ │ │ │ ├── entity │ │ │ │ └── Comment.java │ │ │ │ └── service │ │ │ │ ├── CommentDeleteService.java │ │ │ │ ├── CommentGetService.java │ │ │ │ └── CommentSaveService.java │ │ ├── fire │ │ │ ├── application │ │ │ │ ├── dto │ │ │ │ │ ├── req │ │ │ │ │ │ └── FireThrowReq.java │ │ │ │ │ └── res │ │ │ │ │ │ ├── FireReceiveRes.java │ │ │ │ │ │ └── FireThrowRes.java │ │ │ │ ├── mapper │ │ │ │ │ └── FireMapper.java │ │ │ │ └── service │ │ │ │ │ ├── FireThrowAlarmUseCase.java │ │ │ │ │ └── FireThrowUseCase.java │ │ │ ├── domain │ │ │ │ ├── entity │ │ │ │ │ └── Fire.java │ │ │ │ ├── repository │ │ │ │ │ ├── FireCustomRepository.java │ │ │ │ │ ├── FireCustomRepositoryImpl.java │ │ │ │ │ └── FireRepository.java │ │ │ │ └── service │ │ │ │ │ ├── FireQueryService.java │ │ │ │ │ └── FireSaveService.java │ │ │ ├── exception │ │ │ │ ├── FireException.java │ │ │ │ ├── NoAuthThrowFireException.java │ │ │ │ ├── NotFoundFireException.java │ │ │ │ └── NotFoundFireReceiversException.java │ │ │ └── presentation │ │ │ │ ├── FireController.java │ │ │ │ └── constant │ │ │ │ └── FireResponseMessage.java │ │ ├── history │ │ │ ├── application │ │ │ │ ├── dto │ │ │ │ │ └── response │ │ │ │ │ │ ├── GetAlarmCountResponse.java │ │ │ │ │ │ ├── GetAlarmHistoryResponse.java │ │ │ │ │ │ ├── MemberIdAndToken.java │ │ │ │ │ │ └── NewUploadInfo.java │ │ │ │ ├── mapper │ │ │ │ │ └── AlarmHistoryMapper.java │ │ │ │ └── service │ │ │ │ │ ├── CleanupUseCase.java │ │ │ │ │ ├── GetAlarmHistoryUseCase.java │ │ │ │ │ ├── ReadAlarmHistoryUseCase.java │ │ │ │ │ ├── SaveMultiAlarmHistoryUseCase.java │ │ │ │ │ └── SaveSingleAlarmHistoryUseCase.java │ │ │ ├── domain │ │ │ │ ├── entity │ │ │ │ │ ├── AlarmHistory.java │ │ │ │ │ ├── AlarmType.java │ │ │ │ │ └── PagePath.java │ │ │ │ ├── repository │ │ │ │ │ ├── AlarmHistoryCustomRepository.java │ │ │ │ │ ├── AlarmHistoryCustomRepositoryImpl.java │ │ │ │ │ └── AlarmHistoryRepository.java │ │ │ │ └── service │ │ │ │ │ ├── AlarmHistoryDeleteService.java │ │ │ │ │ ├── AlarmHistoryGetService.java │ │ │ │ │ └── AlarmHistorySaveService.java │ │ │ ├── exception │ │ │ │ ├── AlarmHistoryException.java │ │ │ │ └── NotFoundAlarmHistoryException.java │ │ │ └── presentation │ │ │ │ ├── AlarmHistoryController.java │ │ │ │ └── constant │ │ │ │ └── AlarmHistoryResponseMessage.java │ │ ├── infra │ │ │ └── image │ │ │ │ ├── application │ │ │ │ ├── dto │ │ │ │ │ ├── ImageFileExtension.java │ │ │ │ │ ├── ImageUrlDto.java │ │ │ │ │ ├── request │ │ │ │ │ │ └── IssuePresignedUrlRequest.java │ │ │ │ │ └── response │ │ │ │ │ │ └── IssuePresignedUrlResponse.java │ │ │ │ └── service │ │ │ │ │ └── IssuePresignedUrlUseCase.java │ │ │ │ └── presentation │ │ │ │ ├── ImageController.java │ │ │ │ └── constant │ │ │ │ └── EImageResponseMessage.java │ │ ├── member │ │ │ ├── application │ │ │ │ ├── mapper │ │ │ │ │ └── MemberMapper.java │ │ │ │ └── service │ │ │ │ │ └── UpdateRemindAlarmUseCase.java │ │ │ ├── domain │ │ │ │ ├── constant │ │ │ │ │ ├── Gender.java │ │ │ │ │ ├── RegistrationStatus.java │ │ │ │ │ ├── Role.java │ │ │ │ │ └── SocialProvider.java │ │ │ │ ├── entity │ │ │ │ │ └── Member.java │ │ │ │ ├── repository │ │ │ │ │ ├── MemberCustomRepository.java │ │ │ │ │ ├── MemberCustomRepositoryImpl.java │ │ │ │ │ └── MemberRepository.java │ │ │ │ └── service │ │ │ │ │ ├── MemberCheckService.java │ │ │ │ │ ├── MemberDeleteService.java │ │ │ │ │ ├── MemberGetService.java │ │ │ │ │ └── MemberSaveService.java │ │ │ ├── dto │ │ │ │ ├── request │ │ │ │ │ └── PostUpdatePushAlarm.java │ │ │ │ └── response │ │ │ │ │ └── UserProperty.java │ │ │ ├── exception │ │ │ │ ├── MemberException.java │ │ │ │ ├── NotFoundBySocialIdException.java │ │ │ │ └── NotFoundRemindAlarmException.java │ │ │ └── presentation │ │ │ │ └── RemindAlarmController.java │ │ ├── mission │ │ │ ├── application │ │ │ │ ├── dto │ │ │ │ │ ├── req │ │ │ │ │ │ └── MissionReq.java │ │ │ │ │ └── res │ │ │ │ │ │ ├── FinishMissionBoardRes.java │ │ │ │ │ │ ├── GatherRepeatMissionRes.java │ │ │ │ │ │ ├── GatherSingleMissionRes.java │ │ │ │ │ │ ├── MissionConfirmRes.java │ │ │ │ │ │ ├── MissionCreateRes.java │ │ │ │ │ │ ├── MissionReadRes.java │ │ │ │ │ │ ├── MissionRecommendRes.java │ │ │ │ │ │ ├── RepeatMissionBoardRes.java │ │ │ │ │ │ └── SingleMissionBoardRes.java │ │ │ │ ├── mapper │ │ │ │ │ └── MissionMapper.java │ │ │ │ └── service │ │ │ │ │ ├── MissionCreateUseCase.java │ │ │ │ │ ├── MissionDeleteUseCase.java │ │ │ │ │ ├── MissionGatherBoardUseCase.java │ │ │ │ │ ├── MissionReadUseCase.java │ │ │ │ │ ├── MissionRemindAlarmUseCase.java │ │ │ │ │ ├── MissionScheduleUseCase.java │ │ │ │ │ ├── MissionUpdateUseCase.java │ │ │ │ │ ├── SendMissionCreateAlarmUseCase.java │ │ │ │ │ └── SendMissionStartAlarmUseCase.java │ │ │ ├── domain │ │ │ │ ├── entity │ │ │ │ │ ├── Mission.java │ │ │ │ │ └── constant │ │ │ │ │ │ ├── MissionStatus.java │ │ │ │ │ │ ├── MissionType.java │ │ │ │ │ │ └── MissionWay.java │ │ │ │ ├── repository │ │ │ │ │ ├── MissionCustomRepository.java │ │ │ │ │ ├── MissionCustomRepositoryImpl.java │ │ │ │ │ └── MissionRepository.java │ │ │ │ └── service │ │ │ │ │ ├── MissionDeleteService.java │ │ │ │ │ ├── MissionQueryService.java │ │ │ │ │ ├── MissionSaveService.java │ │ │ │ │ └── MissionUpdateService.java │ │ │ ├── exception │ │ │ │ ├── MissionException.java │ │ │ │ ├── NoAccessCreateMission.java │ │ │ │ ├── NoAccessDeleteMission.java │ │ │ │ ├── NoAccessUpdateMission.java │ │ │ │ ├── NoMoreCreateMission.java │ │ │ │ ├── NotFoundEndMissionException.java │ │ │ │ ├── NotFoundMissionException.java │ │ │ │ └── NotFoundOngoingMissionException.java │ │ │ └── presentation │ │ │ │ ├── MissionController.java │ │ │ │ └── constant │ │ │ │ └── MissionResponseMessage.java │ │ ├── missionArchive │ │ │ ├── application │ │ │ │ ├── dto │ │ │ │ │ ├── req │ │ │ │ │ │ ├── MissionArchiveHeartReq.java │ │ │ │ │ │ └── MissionArchiveReq.java │ │ │ │ │ └── res │ │ │ │ │ │ ├── MissionArchiveHeartRes.java │ │ │ │ │ │ ├── MissionArchivePhotoRes.java │ │ │ │ │ │ ├── MissionArchiveRes.java │ │ │ │ │ │ ├── MissionArchiveStatusRes.java │ │ │ │ │ │ ├── MyArchiveStatus.java │ │ │ │ │ │ ├── MyMissionArchiveRes.java │ │ │ │ │ │ ├── MyTeamsRes.java │ │ │ │ │ │ └── PersonalArchiveRes.java │ │ │ │ ├── mapper │ │ │ │ │ └── MissionArchiveMapper.java │ │ │ │ └── service │ │ │ │ │ ├── MissionArchiveBoardUseCase.java │ │ │ │ │ ├── MissionArchiveCreateMessage.java │ │ │ │ │ ├── MissionArchiveCreateUseCase.java │ │ │ │ │ ├── MissionArchiveDeleteUseCase.java │ │ │ │ │ ├── MissionArchiveReadUseCase.java │ │ │ │ │ ├── MissionArchiveUpdateUseCase.java │ │ │ │ │ ├── RepeatMissionArchiveReadUseCase.java │ │ │ │ │ └── SendMissionArchiveCreateAlarmUseCase.java │ │ │ ├── domain │ │ │ │ ├── constant │ │ │ │ │ └── MissionArchiveResponseMessage.java │ │ │ │ ├── entity │ │ │ │ │ ├── MissionArchive.java │ │ │ │ │ └── MissionArchiveStatus.java │ │ │ │ ├── repository │ │ │ │ │ ├── MissionArchiveCustomRepository.java │ │ │ │ │ ├── MissionArchiveCustomRepositoryImpl.java │ │ │ │ │ ├── MissionArchiveRepository.java │ │ │ │ │ └── OrderCondition.java │ │ │ │ └── service │ │ │ │ │ ├── MissionArchiveDeleteService.java │ │ │ │ │ ├── MissionArchiveQueryService.java │ │ │ │ │ ├── MissionArchiveSaveService.java │ │ │ │ │ └── MissionArchiveScheduleQueryService.java │ │ │ ├── exception │ │ │ │ ├── MissionArchiveException.java │ │ │ │ ├── NoAccessMissionArchiveException.java │ │ │ │ ├── NoMoreMissionArchiveException.java │ │ │ │ ├── NotFoundMissionArchiveException.java │ │ │ │ └── NotYetMissionArchiveException.java │ │ │ └── presentation │ │ │ │ ├── MissionArchiveController.java │ │ │ │ ├── MissionBoardController.java │ │ │ │ └── MissionGatherController.java │ │ ├── missionComment │ │ │ ├── application │ │ │ │ ├── mapper │ │ │ │ │ └── MissionCommentMapper.java │ │ │ │ └── service │ │ │ │ │ ├── CreateMissionCommentUseCase.java │ │ │ │ │ ├── DeleteMissionCommentUseCase.java │ │ │ │ │ ├── GetMissionCommentUseCase.java │ │ │ │ │ └── SendMissionCommentAlarmUseCase.java │ │ │ ├── domain │ │ │ │ ├── entity │ │ │ │ │ └── MissionComment.java │ │ │ │ ├── repository │ │ │ │ │ ├── MissionCommentCustomRepository.java │ │ │ │ │ ├── MissionCommentCustomRepositoryImpl.java │ │ │ │ │ └── MissionCommentRepository.java │ │ │ │ └── service │ │ │ │ │ ├── MissionCommentDeleteService.java │ │ │ │ │ ├── MissionCommentGetService.java │ │ │ │ │ └── MissionCommentSaveService.java │ │ │ ├── exception │ │ │ │ ├── MissionCommentException.java │ │ │ │ ├── NotAuthByMissionCommentException.java │ │ │ │ └── NotFoundByMissionCommentIdException.java │ │ │ └── presentation │ │ │ │ └── MissionCommentController.java │ │ ├── missionHeart │ │ │ ├── application │ │ │ │ ├── dto │ │ │ │ │ └── MissionHeartRes.java │ │ │ │ ├── mapper │ │ │ │ │ └── MissionHeartMapper.java │ │ │ │ └── service │ │ │ │ │ └── MissionHeartUseCase.java │ │ │ ├── domain │ │ │ │ ├── constant │ │ │ │ │ └── MissionHeartStatus.java │ │ │ │ ├── entity │ │ │ │ │ └── MissionHeart.java │ │ │ │ ├── repository │ │ │ │ │ ├── MissionHeartCustomRepository.java │ │ │ │ │ ├── MissionHeartCustomRepositoryImpl.java │ │ │ │ │ └── MissionHeartRepository.java │ │ │ │ └── service │ │ │ │ │ ├── MissionHeartQueryService.java │ │ │ │ │ ├── MissionHeartSaveService.java │ │ │ │ │ └── MissionHeartUpdateService.java │ │ │ └── exception │ │ │ │ ├── MissionHeartException.java │ │ │ │ └── NoAccessMissionHeartException.java │ │ ├── missionRead │ │ │ ├── application │ │ │ │ ├── mapper │ │ │ │ │ └── MissionReadMapper.java │ │ │ │ └── service │ │ │ │ │ └── CreateMissionReadUseCase.java │ │ │ └── domain │ │ │ │ ├── entity │ │ │ │ └── MissionRead.java │ │ │ │ ├── repository │ │ │ │ ├── MissionReadRepository.java │ │ │ │ └── MissionReadRepositoryUtils.java │ │ │ │ └── service │ │ │ │ └── MissionReadSaveService.java │ │ ├── mypage │ │ │ ├── application │ │ │ │ ├── dto │ │ │ │ │ ├── request │ │ │ │ │ │ ├── UpdateProfileRequest.java │ │ │ │ │ │ └── WithdrawRequest.java │ │ │ │ │ └── response │ │ │ │ │ │ ├── GetAlarmResponse.java │ │ │ │ │ │ ├── GetMyPageResponse.java │ │ │ │ │ │ ├── GetMyPageTeamBlock.java │ │ │ │ │ │ └── GetProfileResponse.java │ │ │ │ ├── mapper │ │ │ │ │ └── MyPageMapper.java │ │ │ │ └── service │ │ │ │ │ ├── AlarmUseCase.java │ │ │ │ │ ├── GetMyPageUseCase.java │ │ │ │ │ ├── ProfileUseCase.java │ │ │ │ │ ├── SignOutUseCase.java │ │ │ │ │ └── WithdrawUseCase.java │ │ │ ├── domain │ │ │ │ ├── entity │ │ │ │ │ └── Feedback.java │ │ │ │ ├── repository │ │ │ │ │ └── FeedbackRepository.java │ │ │ │ └── service │ │ │ │ │ └── FeedbackSaveService.java │ │ │ ├── exception │ │ │ │ ├── AlarmInvalidException.java │ │ │ │ ├── ExistingTeamException.java │ │ │ │ └── MyPageException.java │ │ │ └── presentation │ │ │ │ ├── MyPageController.java │ │ │ │ └── constant │ │ │ │ └── MypageResponseMessage.java │ │ ├── report │ │ │ ├── application │ │ │ │ ├── dto │ │ │ │ │ └── BlockMemberRes.java │ │ │ │ ├── mapper │ │ │ │ │ └── ReportMapper.java │ │ │ │ └── service │ │ │ │ │ ├── BoardCommentReportStrategy.java │ │ │ │ │ ├── BoardReportStrategy.java │ │ │ │ │ ├── MissionArchiveReportStrategy.java │ │ │ │ │ ├── MissionCommentReportStrategy.java │ │ │ │ │ ├── ReportCreateUseCase.java │ │ │ │ │ └── ReportStrategy.java │ │ │ ├── domain │ │ │ │ ├── entity │ │ │ │ │ ├── Report.java │ │ │ │ │ └── constant │ │ │ │ │ │ └── ReportType.java │ │ │ │ ├── repository │ │ │ │ │ └── ReportRepository.java │ │ │ │ └── service │ │ │ │ │ └── ReportSaveService.java │ │ │ └── presentation │ │ │ │ ├── ReportController.java │ │ │ │ └── constant │ │ │ │ ├── ReportResponseMessage.java │ │ │ │ └── StrategyCategory.java │ │ ├── statistics │ │ │ ├── application │ │ │ │ ├── dto │ │ │ │ │ └── DailyStats.java │ │ │ │ └── service │ │ │ │ │ ├── DAUFire.java │ │ │ │ │ ├── DAUManager.java │ │ │ │ │ ├── DAUMember.java │ │ │ │ │ ├── DAUMissionArchive.java │ │ │ │ │ ├── DAUOnceMission.java │ │ │ │ │ ├── DAUProvider.java │ │ │ │ │ ├── DAURepeatMission.java │ │ │ │ │ ├── DAUScheduleUseCase.java │ │ │ │ │ └── DAUTeam.java │ │ │ └── domain │ │ │ │ └── constant │ │ │ │ └── DAUStatusType.java │ │ ├── team │ │ │ ├── application │ │ │ │ ├── dto │ │ │ │ │ ├── request │ │ │ │ │ │ ├── CreateTeamRequest.java │ │ │ │ │ │ └── UpdateTeamRequest.java │ │ │ │ │ └── response │ │ │ │ │ │ ├── CreateTeamResponse.java │ │ │ │ │ │ ├── DeleteTeamResponse.java │ │ │ │ │ │ ├── GetCurrentStatusResponse.java │ │ │ │ │ │ ├── GetLeaderInfoResponse.java │ │ │ │ │ │ ├── GetNewTeamResponse.java │ │ │ │ │ │ ├── GetTeamCountResponse.java │ │ │ │ │ │ ├── GetTeamDetailResponse.java │ │ │ │ │ │ ├── GetTeamResponse.java │ │ │ │ │ │ ├── ReviewTeamResponse.java │ │ │ │ │ │ ├── TeamBlock.java │ │ │ │ │ │ ├── TeamInfo.java │ │ │ │ │ │ ├── TeamMemberInfo.java │ │ │ │ │ │ └── UpdateTeamResponse.java │ │ │ │ ├── mapper │ │ │ │ │ └── TeamMapper.java │ │ │ │ └── service │ │ │ │ │ ├── CheckLeaderUseCase.java │ │ │ │ │ ├── CreateTeamUseCase.java │ │ │ │ │ ├── DisbandTeamUseCase.java │ │ │ │ │ ├── GetTeamUseCase.java │ │ │ │ │ ├── RejectTeamUseCase.java │ │ │ │ │ ├── ReviewTeamUseCase.java │ │ │ │ │ ├── SignInTeamUseCase.java │ │ │ │ │ ├── UpdateTeamUseCase.java │ │ │ │ │ └── WithdrawTeamUseCase.java │ │ │ ├── domain │ │ │ │ ├── constant │ │ │ │ │ ├── ApprovalStatus.java │ │ │ │ │ └── Category.java │ │ │ │ ├── entity │ │ │ │ │ └── Team.java │ │ │ │ ├── repository │ │ │ │ │ ├── TeamCustomRepository.java │ │ │ │ │ ├── TeamCustomRepositoryImpl.java │ │ │ │ │ └── TeamRepository.java │ │ │ │ └── service │ │ │ │ │ ├── TeamGetService.java │ │ │ │ │ ├── TeamSaveService.java │ │ │ │ │ └── TeamUpdateService.java │ │ │ ├── exception │ │ │ │ ├── AlreadyJoinTeamException.java │ │ │ │ ├── AlreadyWithdrawTeamException.java │ │ │ │ ├── DeletedTeamException.java │ │ │ │ ├── NotAuthByTeamException.java │ │ │ │ ├── NotFoundByTeamIdException.java │ │ │ │ └── TeamException.java │ │ │ └── presentation │ │ │ │ ├── TeamController.java │ │ │ │ └── constant │ │ │ │ └── TeamResponseMessage.java │ │ ├── teamMember │ │ │ ├── domain │ │ │ │ ├── entity │ │ │ │ │ └── TeamMember.java │ │ │ │ ├── repository │ │ │ │ │ ├── TeamMemberCustomRepository.java │ │ │ │ │ ├── TeamMemberCustomRepositoryImpl.java │ │ │ │ │ └── TeamMemberRepository.java │ │ │ │ └── service │ │ │ │ │ ├── TeamMemberGetService.java │ │ │ │ │ └── TeamMemberSaveService.java │ │ │ └── exception │ │ │ │ └── TeamMemberException.java │ │ └── teamScore │ │ │ ├── application │ │ │ ├── dto │ │ │ │ └── TeamScoreRes.java │ │ │ ├── mapper │ │ │ │ └── TeamScoreMapper.java │ │ │ └── service │ │ │ │ ├── TeamScoreGetUseCase.java │ │ │ │ ├── TeamScoreLogicUseCase.java │ │ │ │ └── TeamScoreUpdateUseCase.java │ │ │ ├── domain │ │ │ ├── entity │ │ │ │ ├── ScoreStatus.java │ │ │ │ └── TeamScore.java │ │ │ ├── repository │ │ │ │ ├── TeamScoreCustomRepository.java │ │ │ │ ├── TeamScoreCustomRepositoryImpl.java │ │ │ │ └── TeamScoreRepository.java │ │ │ └── service │ │ │ │ ├── TeamScoreQueryService.java │ │ │ │ └── TeamScoreSaveService.java │ │ │ └── presentation │ │ │ ├── TeamScoreController.java │ │ │ └── constant │ │ │ └── TeamScoreResponseMessage.java │ │ └── global │ │ ├── annotation │ │ ├── DomainService.java │ │ ├── Enum.java │ │ ├── EnumValidator.java │ │ ├── Mapper.java │ │ ├── Util.java │ │ └── ValidEnum.java │ │ ├── config │ │ ├── fcm │ │ │ ├── FcmConfig.java │ │ │ ├── constant │ │ │ │ ├── ApproveTeamMessage.java │ │ │ │ ├── FireThrowMessage.java │ │ │ │ ├── NewCommentUploadMessage.java │ │ │ │ ├── NewMissionTitle.java │ │ │ │ ├── NewNoticeUploadMessage.java │ │ │ │ ├── NewUploadTitle.java │ │ │ │ └── RemindMissionTitle.java │ │ │ ├── dto │ │ │ │ ├── event │ │ │ │ │ ├── MultiFcmEvent.java │ │ │ │ │ └── SingleFcmEvent.java │ │ │ │ ├── request │ │ │ │ │ ├── MultiRequest.java │ │ │ │ │ └── SingleRequest.java │ │ │ │ └── response │ │ │ │ │ ├── MultiResponse.java │ │ │ │ │ └── SingleResponse.java │ │ │ ├── exception │ │ │ │ ├── ExceptionHandler.java │ │ │ │ ├── FirebaseException.java │ │ │ │ ├── InitializeException.java │ │ │ │ ├── MessagingException.java │ │ │ │ └── NotificationException.java │ │ │ └── service │ │ │ │ ├── MessageSender.java │ │ │ │ ├── MultiMessageSender.java │ │ │ │ └── SingleMessageSender.java │ │ ├── querydsl │ │ │ └── QuerydslConfig.java │ │ ├── redis │ │ │ ├── RedisConfig.java │ │ │ ├── RedisUtil.java │ │ │ └── constant │ │ │ │ └── RefreshTokenConstant.java │ │ ├── s3 │ │ │ ├── ImageUrlUtil.java │ │ │ ├── S3Config.java │ │ │ └── S3Service.java │ │ ├── security │ │ │ ├── SecurityConfig.java │ │ │ ├── dto │ │ │ │ └── User.java │ │ │ ├── filter │ │ │ │ ├── JwtAccessDeniedHandler.java │ │ │ │ ├── JwtAuthFilter.java │ │ │ │ └── JwtAuthenticationEntryPoint.java │ │ │ ├── jwt │ │ │ │ ├── JwtExceptionList.java │ │ │ │ ├── JwtSecurityConfig.java │ │ │ │ ├── NotFoundRefreshToken.java │ │ │ │ └── TokenUtil.java │ │ │ ├── oauth │ │ │ │ ├── CustomOAuth2UserService.java │ │ │ │ ├── CustomUserDetails.java │ │ │ │ ├── CustomUserDetailsService.java │ │ │ │ ├── OAuth2Attribute.java │ │ │ │ ├── OAuth2FailureHandler.java │ │ │ │ └── OAuth2SuccessHandler.java │ │ │ └── util │ │ │ │ └── AuthenticationUtil.java │ │ ├── slack │ │ │ ├── SlackConfig.java │ │ │ ├── exception │ │ │ │ ├── ExceptionEventHandler.java │ │ │ │ └── dto │ │ │ │ │ └── ExceptionEvent.java │ │ │ ├── team │ │ │ │ ├── TeamCreateHandler.java │ │ │ │ └── dto │ │ │ │ │ └── TeamCreateEvent.java │ │ │ └── util │ │ │ │ ├── SlackAdapter.java │ │ │ │ └── WebhookUtil.java │ │ ├── sns │ │ │ └── AppleConfig.java │ │ └── webclient │ │ │ └── WebClientConfig.java │ │ ├── entity │ │ └── BaseTimeEntity.java │ │ ├── exception │ │ ├── ApplicationException.java │ │ ├── GlobalExceptionHandler.java │ │ └── InternalServerErrorException.java │ │ ├── interceptor │ │ └── AuthInterceptor.java │ │ ├── log │ │ ├── aop │ │ │ ├── LogAspect.java │ │ │ ├── LogFormat.java │ │ │ ├── LogTrace.java │ │ │ ├── Pointcuts.java │ │ │ └── TraceStatus.java │ │ └── filter │ │ │ ├── LogThreadIdHandleFilter.java │ │ │ └── RequestInfoFormat.java │ │ ├── response │ │ ├── BaseBoardServiceResponse.java │ │ ├── BaseMissionServiceResponse.java │ │ ├── BaseServiceResponse.java │ │ ├── ErrorCode.java │ │ ├── ErrorResponse.java │ │ ├── SuccessResponse.java │ │ └── TokenInfoResponse.java │ │ └── utils │ │ ├── AesConverter.java │ │ ├── AesUtil.java │ │ ├── BaseBoardService.java │ │ ├── BaseMissionService.java │ │ ├── BaseService.java │ │ ├── FeignClientConfig.java │ │ ├── SecurityUtils.java │ │ ├── StartupRunner.java │ │ └── UpdateUtils.java └── resources │ └── logback.xml └── test └── java └── com └── moing └── backend ├── BackendApplicationTests.java ├── config ├── CommonControllerTest.java └── RestDocsConfig.java └── domain ├── auth └── presentation │ └── AuthControllerTest.java ├── block └── presentation │ └── BlockControllerTest.java ├── board ├── domain │ └── BoardRepositoryTest.java └── presentation │ └── BoardControllerTest.java ├── boardComment └── presentation │ └── BoardCommentControllerTest.java ├── fire └── representation │ └── FireControllerTest.java ├── history └── presentation │ └── AlarmHistoryControllerTest.java ├── infra └── image │ └── presentation │ └── ImageControllerTest.java ├── member └── domain │ └── repository │ └── MemberCustomRepositoryTest.java ├── mission └── representation │ └── MissionControllerTest.java ├── missionArchive ├── domain │ └── repository │ │ └── MissionArchiveCustomRepositoryImplTest.java └── representation │ ├── MissionArchiveControllerTest.java │ ├── MissionBoardControllerTest.java │ └── MissionGatherControllerTest.java ├── missionComment ├── domain │ └── MissionRepositoryTest.java └── presentation │ └── MissionCommentControllerTest.java ├── missionState └── domain │ └── service │ └── MissionStateQueryServiceTest.java ├── mypage └── presentation │ └── MypageControllerTest.java ├── report └── presentation │ └── ReportControllerTest.java ├── team ├── application │ └── service │ │ └── CreateTeamUseCaseTest.java └── presentation │ └── TeamControllerTest.java └── teamScore └── presentation └── TeamScoreControllerTest.java /.deploy/dev_dockerfile: -------------------------------------------------------------------------------- 1 | FROM openjdk:11-jdk 2 | 3 | # 타임존 설정 4 | ENV TZ=Asia/Seoul 5 | RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone 6 | 7 | ARG CACHEBREAKER=1 8 | ARG JAR_FILE=./build/libs/backend-0.0.1-SNAPSHOT.jar 9 | COPY ${JAR_FILE} app.jar 10 | 11 | # 문서를 이미지의 /static/docs 디렉토리에 복사 12 | COPY ./build/docs/asciidoc/*.html /static/docs/ 13 | 14 | # 애플리케이션 실행 시 -cp 옵션을 사용하여 /static/docs 디렉토리를 클래스패스에 추가 15 | ENTRYPOINT ["java","-cp",".:/static/docs","-Dspring.profiles.active=dev","-jar","/app.jar"] 16 | 17 | -------------------------------------------------------------------------------- /.deploy/prod_dockerfile: -------------------------------------------------------------------------------- 1 | FROM openjdk:11-jdk 2 | 3 | # 타임존 설정 4 | ENV TZ=Asia/Seoul 5 | RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone 6 | 7 | ARG CACHEBREAKER=1 8 | ARG JAR_FILE=./build/libs/backend-0.0.1-SNAPSHOT.jar 9 | COPY ${JAR_FILE} app.jar 10 | 11 | # 문서를 이미지의 /static/docs 디렉토리에 복사 12 | COPY ./build/docs/asciidoc/*.html /static/docs/ 13 | 14 | # 애플리케이션 실행 시 -cp 옵션을 사용하여 /static/docs 디렉토리를 클래스패스에 추가 15 | ENTRYPOINT ["java","-cp",".:/static/docs","-Dspring.profiles.active=prod","-jar","/app.jar"] 16 | 17 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: feature 3 | about: feat 4 | title: 'feat/ :' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## 📢 description 11 | 12 | ## ✅ to do 13 | - [ ] 14 | - [ ] 15 | - [ ] 16 | 17 | ## 🔗 etc 18 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/fix.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: fix 3 | about: fix 4 | title: 'fix/ :' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## description 11 | 12 | ## to do 13 | [ ] 14 | [ ] 15 | [ ] 16 | 17 | ## etc 18 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## PR 타입 2 | - [ ] 기능 추가 3 | - [ ] 버그 수정 4 | - [ ] 의존성, 환경 변수, 빌드 관련 업데이트 5 | - [ ] 기타 사소한 수정 6 | 7 | ## 개요 8 | 9 | ## 변경 사항 10 | 11 | ## 코드 리뷰 시 참고 사항 12 | 13 | ## 테스트 결과 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | 8 | ### STS ### 9 | .apt_generated 10 | .classpath 11 | .factorypath 12 | .project 13 | .settings 14 | .springBeans 15 | .sts4-cache 16 | bin/ 17 | !**/src/main/**/bin/ 18 | !**/src/test/**/bin/ 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | 39 | ### yml ### 40 | application.yml 41 | application-local.yml 42 | application-dev.yml 43 | .DS_Store 44 | src/main/resources/firebase-key.json 45 | 46 | src/test/resources/ 47 | .jpb 48 | data.sql 49 | 50 | #### docs #### 51 | !**/src/main/resources/static/docs/ 52 | *.html 53 | 54 | firebase-key.json 55 | apple-key.p8 56 | logs/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MOING_server_release 2 | ## System Architecture 3 | ![image](https://github.com/Modagbul/MOING_Server_Release/assets/86006389/02032a32-da0d-429e-babe-15534476f380) 4 | 5 | ## Backend CI/CD 6 | image 7 | 8 | ## Monitoring 9 | ![image](https://github.com/Modagbul/MOING_Server_Release/assets/86006389/c0d135c3-6863-4c32-b6df-0535fcbf9953) 10 | 11 | ## DB ERD 12 | ![KakaoTalk_Image_2023-11-15-20-38-24 (1)](https://github.com/Modagbul/MOING_Server_Release/assets/86006389/e26f65bb-d717-46a6-9ef2-0b9c9dca4679) 13 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modagbul/MOING_Server_Release/5b3dc87235074013925ef84a8115ceece31f3816/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'backend' 2 | -------------------------------------------------------------------------------- /src/docs/asciidoc/AlarmHistory-API.adoc: -------------------------------------------------------------------------------- 1 | [[AlarmHistory-API]] 2 | = AlarmHistory API 3 | 4 | [[AlarmHistory-알림-모아보기]] 5 | == AlarmHistory 알림 모아보기 6 | operation::alarm-history-controller-test/get_all_alarm_history[snippets='http-request,http-response,response-fields'] 7 | 8 | == Type Category 9 | |=== 10 | | Category | Description 11 | 12 | | `NEW_UPLOAD` 13 | | 신규 업로드 알림 14 | 15 | | `FIRE` 16 | | 불던지기 알림 17 | 18 | | `REMIND` 19 | | 리마인드 알림 20 | 21 | | `APPROVE_TEAM` 22 | | 소모임 승인 23 | 24 | | `REJECT_TEAM` 25 | | 소모임 반려 26 | 27 | | `COMMENT` 28 | | 댓글 생성 알림 29 | |=== 30 | 31 | [[AlarmHistory-알림-단건-조회하기]] 32 | == AlarmHistory 알림 단건 조회하기 33 | operation::alarm-history-controller-test/read_alarm_history[snippets='http-request,http-response,response-fields'] 34 | 35 | [[AlarmHistory-안읽은-알림개수-조회하기]] 36 | == AlarmHistory 안읽은 알림 개수 조회하기 37 | operation::alarm-history-controller-test/get_alarm_count[snippets='http-request,http-response,response-fields'] 38 | -------------------------------------------------------------------------------- /src/docs/asciidoc/Block-API.adoc: -------------------------------------------------------------------------------- 1 | 2 | 3 | [[Block-API]] 4 | = Block API 5 | 6 | [[Block-차단하기]] 7 | === 차단하기 8 | operation::block-controller-test/차단_하기[snippets='http-request,path-parameters,request-fields,http-response,response-fields'] 9 | 10 | --- 11 | === 차단 해제 하기 12 | operation::block-controller-test/차단_해제_하기[snippets='http-request,path-parameters,request-fields,http-response,response-fields'] 13 | 14 | --- 15 | 16 | === 차단한 유저 조회 List 17 | operation::block-controller-test/차단한_유저_목록[snippets='http-request,path-parameters,request-fields,http-response,response-fields'] 18 | 19 | --- 20 | 21 | === 차단한 유저 정보 조회 22 | operation::block-controller-test/차단한_유저_정보_목록[snippets='http-request,path-parameters,request-fields,http-response,response-fields'] 23 | 24 | --- 25 | -------------------------------------------------------------------------------- /src/docs/asciidoc/Board-API.adoc: -------------------------------------------------------------------------------- 1 | [[Board-API]] 2 | = Board API 3 | 4 | [[Board-게시글-생성]] 5 | == Board 게시글 생성 6 | operation::board-controller-test/create_board[snippets='http-request,path-parameters,request-fields,http-response,response-fields'] 7 | --- 8 | 9 | [[Board-게시글-수정]] 10 | == Board 게시글 수정 11 | operation::board-controller-test/update_board[snippets='http-request,path-parameters,request-fields,http-response,response-fields'] 12 | --- 13 | 14 | [[Board-게시글-삭제]] 15 | == Board 게시글 삭제 16 | operation::board-controller-test/delete_board[snippets='http-request,path-parameters,response-fields'] 17 | --- 18 | 19 | [[Board-게시글-전체-조회]] 20 | == Board 게시글 전체 조회 21 | operation::board-controller-test/get_board_all[snippets='http-request,path-parameters,http-response,response-fields'] 22 | --- 23 | 24 | [[Board-게시글-상제-조회]] 25 | == Board 게시글 상세 조회 26 | operation::board-controller-test/get_board_detail[snippets='http-request,path-parameters,http-response,response-fields'] 27 | --- -------------------------------------------------------------------------------- /src/docs/asciidoc/BoardComment_API.adoc: -------------------------------------------------------------------------------- 1 | [[Board-Comment-API]] 2 | = Board Comment API 3 | 4 | [[Board-Comment-댓글-생성]] 5 | == Board Comment 댓글 생성 6 | operation::board-comment-controller-test/create_board_comment[snippets='http-request,path-parameters,request-fields,http-response,response-fields'] 7 | --- 8 | 9 | [[Board-Comment-댓글-삭제]] 10 | == Board Comment 댓글 삭제 11 | operation::board-comment-controller-test/delete_board_comment[snippets='http-request,path-parameters,response-fields'] 12 | --- 13 | 14 | [[Board-Comment-댓글-전체-조회]] 15 | == Board Comment 댓글 전체 조회 16 | operation::board-comment-controller-test/get_board_comment_all[snippets='http-request,path-parameters,http-response,response-fields'] 17 | --- 18 | -------------------------------------------------------------------------------- /src/docs/asciidoc/Fire-API.adoc: -------------------------------------------------------------------------------- 1 | 2 | 3 | [[Fire-API]] 4 | = Fire API 5 | 6 | [[Fire-불던지기]] 7 | == 불 던지기 8 | operation::fire-controller-test/불_던지기[snippets='http-request,path-parameters,http-response,response-fields'] 9 | 10 | --- 11 | [[Fire-불던질사람조회]] 12 | == 불 던질 사람 조회 13 | operation::fire-controller-test/불_던질_사람_조회[snippets='http-request,path-parameters,http-response,response-fields'] 14 | 15 | --- 16 | 17 | -------------------------------------------------------------------------------- /src/docs/asciidoc/Image-API.adoc: -------------------------------------------------------------------------------- 1 | [[Image-API]] 2 | = Image API 3 | 4 | [[Presigned-Url-발급]] 5 | == Presigned Url 발급 6 | operation::image-controller-test/create_presigned_url[snippets='http-request,http-response,request-fields,response-fields'] 7 | 8 | === imageFileExtension 9 | |=== 10 | | input 형식 11 | 12 | | `JPG` 13 | 14 | | `JPEG` 15 | 16 | | `PNG` 17 | |=== -------------------------------------------------------------------------------- /src/docs/asciidoc/MissionArchiveComment_API.adoc: -------------------------------------------------------------------------------- 1 | [[Mission-Comment-API]] 2 | = Mission Comment API 3 | 4 | [[Mission-Comment-댓글-생성]] 5 | == Mission Comment 댓글 생성 6 | operation::mission-comment-controller-test/create_mission_comment[snippets='http-request,path-parameters,request-fields,http-response,response-fields'] 7 | --- 8 | 9 | [[Mission-Comment-댓글-삭제]] 10 | == Mission Comment 댓글 삭제 11 | operation::mission-comment-controller-test/delete_mission_comment[snippets='http-request,path-parameters,response-fields'] 12 | --- 13 | 14 | [[MissionArchive-Comment-댓글-전체-조회]] 15 | == Mission Comment 댓글 전체 조회 16 | operation::mission-comment-controller-test/get_board_comment_all[snippets='http-request,path-parameters,http-response,response-fields'] 17 | --- -------------------------------------------------------------------------------- /src/docs/asciidoc/MissionBoard-API.adoc: -------------------------------------------------------------------------------- 1 | 2 | 3 | [[MissionBoard-API]] 4 | = MissionBoard API 5 | 6 | [[MissionBoard-단일미션인증조회]] 7 | == 단일 미션 인증 조회 8 | operation::mission-board-controller-test/단일_미션_인증_조회[snippets='http-request,path-parameters,http-response,response-fields'] 9 | 10 | --- 11 | 12 | [[MissionBoard-반복미션인증조회]] 13 | == 반복 미션 인증 조회 14 | operation::mission-board-controller-test/반복_미션_인증_조회[snipipets='http-request,path-parameters,request-fields,http-response,response-fields'] 15 | 16 | --- 17 | 18 | [[MissionBoard-종료된인증조회]] 19 | == 종료된 인증 조회 20 | operation::mission-board-controller-test/종료된_인증_조회[snippets='http-request,path-parameters,http-response,response-fields'] 21 | 22 | --- 23 | -------------------------------------------------------------------------------- /src/docs/asciidoc/Report-API.adoc: -------------------------------------------------------------------------------- 1 | 2 | 3 | [[Report-API]] 4 | = Report API 5 | 6 | [[Report-신고하기]] 7 | === 신고하기 8 | operation::report-controller-test/신고하기[snippets='http-request,path-parameters,request-fields,http-response,response-fields'] 9 | 10 | --- 11 | -------------------------------------------------------------------------------- /src/docs/asciidoc/TeamScore-API.adoc: -------------------------------------------------------------------------------- 1 | 2 | 3 | [[TeamScore-API]] 4 | = TeamScore API 5 | 6 | [[TeamScore-팀별-불-레벨-경험치-조회]] 7 | === 팀별_불_레벨_경험치_조회 8 | operation::team-score-controller-test/팀별_불_레벨_경험치_조회[snippets='http-request,path-parameters,request-fields,http-response,response-fields'] 9 | 10 | --- 11 | -------------------------------------------------------------------------------- /src/docs/asciidoc/api.adoc: -------------------------------------------------------------------------------- 1 | = Moing API Doc 2 | :doctype: book 3 | :icons: font 4 | :source-highlighter: highlightjs 5 | :toc: left 6 | :toclevels: 1 7 | :sectlinks: 8 | 9 | include::Overview.adoc[] 10 | 11 | include::Image-API.adoc[] 12 | 13 | include::Auth-API.adoc[] 14 | 15 | include::Mypage-API.adoc[] 16 | 17 | include::AlarmHistory-API.adoc[] 18 | 19 | include::Team-API.adoc[] 20 | 21 | include::Mission-API.adoc[] 22 | 23 | include::MissionArchive-API.adoc[] 24 | 25 | include::MissionArchiveComment_API.adoc[] 26 | 27 | include::MissionBoard-API.adoc[] 28 | 29 | include::MissionGatherBoard-API.adoc[] 30 | 31 | include::Fire-API.adoc[] 32 | 33 | include::Board-API.adoc[] 34 | 35 | include::BoardComment_API.adoc[] 36 | 37 | include::TeamScore-API.adoc[] 38 | 39 | include::Report-API.adoc[] 40 | 41 | include::Block-API.adoc[] -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/BackendApplication.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cloud.openfeign.EnableFeignClients; 6 | import org.springframework.data.jpa.repository.config.EnableJpaAuditing; 7 | import org.springframework.scheduling.annotation.EnableAsync; 8 | 9 | @EnableAsync 10 | @EnableFeignClients 11 | @SpringBootApplication 12 | @EnableJpaAuditing 13 | public class BackendApplication { 14 | 15 | public static void main(String[] args) { 16 | SpringApplication.run(BackendApplication.class, args); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/application/dto/request/SignInRequest.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.application.dto.request; 2 | 3 | import lombok.*; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | 7 | @Builder 8 | @AllArgsConstructor 9 | @NoArgsConstructor 10 | @Getter 11 | public class SignInRequest { 12 | @NotBlank(message="socialToken 을 입력해주세요.") 13 | private String socialToken; 14 | 15 | @NotBlank(message = "fcmToken 을 입력해주세요.") 16 | private String fcmToken; 17 | 18 | } 19 | 20 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/application/dto/request/SignUpRequest.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.application.dto.request; 2 | 3 | import com.moing.backend.domain.member.domain.constant.Gender; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Getter; 7 | import lombok.NoArgsConstructor; 8 | 9 | import javax.validation.constraints.NotBlank; 10 | import javax.validation.constraints.Size; 11 | 12 | @Builder 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | @Getter 16 | public class SignUpRequest { 17 | 18 | @NotBlank(message = "nickName 을 입력해주세요.") 19 | @Size(min = 1, max = 10, message="nickName 은 최소 1개, 최대 10개의 문자만 입력 가능합니다.") 20 | private String nickName; 21 | 22 | private Gender gender; 23 | 24 | private String birthDate; 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/application/dto/request/TestRequest.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.application.dto.request; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Builder 9 | @AllArgsConstructor 10 | @NoArgsConstructor 11 | @Getter 12 | public class TestRequest { 13 | private String socialId; 14 | 15 | private String fcmToken; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/application/dto/response/CheckNicknameResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Builder 9 | @AllArgsConstructor 10 | @NoArgsConstructor 11 | @Getter 12 | public class CheckNicknameResponse { 13 | private Boolean isDuplicated; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/application/dto/response/GoogleUserResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.application.dto.response; 2 | 3 | import com.fasterxml.jackson.databind.PropertyNamingStrategy; 4 | import com.fasterxml.jackson.databind.annotation.JsonNaming; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | @Data 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) 13 | public class GoogleUserResponse { 14 | 15 | private String aud; 16 | private String sub; 17 | private String email; 18 | private String name; 19 | private String picture; 20 | 21 | public void adaptResponse() { 22 | if(email.length() > 50) email = email.substring(0, 50); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/application/dto/response/KakaoAccessTokenResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.application.dto.response; 2 | 3 | import com.fasterxml.jackson.databind.PropertyNamingStrategy; 4 | import com.fasterxml.jackson.databind.annotation.JsonNaming; 5 | import lombok.*; 6 | 7 | @Builder 8 | @NoArgsConstructor 9 | @AllArgsConstructor 10 | @Getter 11 | @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) 12 | public class KakaoAccessTokenResponse { 13 | private String appId; 14 | } 15 | 16 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/application/dto/response/ReissueTokenResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.application.dto.response; 2 | 3 | import com.moing.backend.global.response.TokenInfoResponse; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Getter; 7 | import lombok.NoArgsConstructor; 8 | 9 | @Getter 10 | @Builder 11 | @AllArgsConstructor 12 | @NoArgsConstructor 13 | public class ReissueTokenResponse { 14 | 15 | private String accessToken; 16 | private String refreshToken; 17 | 18 | public static ReissueTokenResponse from(TokenInfoResponse tokenInfoResponse) { 19 | return ReissueTokenResponse.builder() 20 | .accessToken(tokenInfoResponse.getAccessToken()) 21 | .refreshToken(tokenInfoResponse.getRefreshToken()) 22 | .build(); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/application/service/CheckNicknameUseCase.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.application.service; 2 | 3 | import com.moing.backend.domain.auth.application.dto.response.CheckNicknameResponse; 4 | import com.moing.backend.domain.member.domain.service.MemberCheckService; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.stereotype.Service; 7 | import org.springframework.transaction.annotation.Transactional; 8 | 9 | @Service 10 | @RequiredArgsConstructor 11 | public class CheckNicknameUseCase { 12 | 13 | private final MemberCheckService memberCheckService; 14 | 15 | @Transactional(readOnly=true) 16 | public CheckNicknameResponse checkNickname(String nickname){ 17 | boolean isDuplicated=memberCheckService.checkNickname(nickname); 18 | return new CheckNicknameResponse(isDuplicated); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/application/service/SignInProvider.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.application.service; 2 | 3 | import com.moing.backend.domain.member.domain.entity.Member; 4 | 5 | public interface SignInProvider { 6 | Member getUserData(String accessToken); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/application/service/WithdrawProvider.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.application.service; 2 | 3 | import java.io.IOException; 4 | 5 | public interface WithdrawProvider { 6 | void withdraw(String token) throws IOException; 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/application/service/apple/utils/AppleClient.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.application.service.apple.utils; 2 | 3 | import com.moing.backend.global.utils.FeignClientConfig; 4 | import org.springframework.cloud.openfeign.FeignClient; 5 | import org.springframework.web.bind.annotation.GetMapping; 6 | import org.springframework.web.bind.annotation.PostMapping; 7 | 8 | @FeignClient(name = "appleClient", url = "https://appleid.apple.com/auth", configuration = FeignClientConfig.class) 9 | public interface AppleClient { 10 | @GetMapping(value = "/keys") 11 | Keys getKeys(); 12 | @PostMapping(value = "/token", consumes = "application/x-www-form-urlencoded") 13 | AppleToken.Response getToken(AppleToken.Request request); 14 | 15 | @PostMapping(value = "/revoke", consumes = "application/x-www-form-urlencoded") 16 | void revoke(AppleToken.RevokeRequest request); 17 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/application/service/apple/utils/Keys.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.application.service.apple.utils; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | @Data 8 | public class Keys { 9 | 10 | private List keys; 11 | 12 | @Data 13 | public static class PubKey{ 14 | private String alg; 15 | 16 | private String e; 17 | 18 | private String kid; 19 | 20 | private String kty; 21 | 22 | private String n; 23 | 24 | private String use; 25 | } 26 | } 27 | 28 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/application/service/google/GoogleTokenUseCase.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.application.service.google; 2 | 3 | import com.moing.backend.domain.auth.exception.AppIdInvalidException; 4 | import com.moing.backend.domain.auth.exception.TokenInvalidException; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.beans.factory.annotation.Value; 7 | import org.springframework.stereotype.Component; 8 | 9 | import java.util.Arrays; 10 | 11 | @Component 12 | @RequiredArgsConstructor 13 | public class GoogleTokenUseCase { 14 | 15 | @Value("${oauth2.google.appId}") 16 | private String appId; 17 | 18 | public void verifyAccessToken(String aud) { 19 | String extractedAppId = Arrays.stream(aud.split("-")) 20 | .findFirst() 21 | .orElseThrow(TokenInvalidException::new); 22 | 23 | if (!appId.equals(extractedAppId)) throw new AppIdInvalidException(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/application/service/google/GoogleWithdrawUseCase.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.application.service.google; 2 | 3 | import com.moing.backend.domain.auth.application.service.WithdrawProvider; 4 | import com.moing.backend.domain.auth.application.service.google.utils.GoogleClient; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.io.IOException; 9 | 10 | @Service("googleWithdraw") 11 | @RequiredArgsConstructor 12 | public class GoogleWithdrawUseCase implements WithdrawProvider { 13 | 14 | private final GoogleClient googleClient; 15 | 16 | public void withdraw(String token) throws IOException { 17 | googleClient.revoke(token); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/application/service/google/utils/GoogleClient.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.application.service.google.utils; 2 | 3 | import com.moing.backend.global.utils.FeignClientConfig; 4 | import org.springframework.cloud.openfeign.FeignClient; 5 | import org.springframework.web.bind.annotation.PostMapping; 6 | import org.springframework.web.bind.annotation.RequestParam; 7 | 8 | @FeignClient(name = "googleClient", url = "https://oauth2.googleapis.com", configuration = FeignClientConfig.class) 9 | public interface GoogleClient { 10 | @PostMapping(value = "/revoke", consumes = "application/x-www-form-urlencoded") 11 | void revoke(@RequestParam("token") String token); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/application/service/kakao/KakaoWithdrawUseCase.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.application.service.kakao; 2 | 3 | import com.moing.backend.domain.auth.application.service.WithdrawProvider; 4 | import com.moing.backend.domain.auth.application.service.kakao.utils.KakaoClient; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.io.IOException; 9 | 10 | @Service("kakaoWithdraw") 11 | @RequiredArgsConstructor 12 | public class KakaoWithdrawUseCase implements WithdrawProvider { 13 | 14 | private final KakaoClient kakaoClient; 15 | 16 | public void withdraw(String token) throws IOException { 17 | 18 | kakaoClient.unlinkUser("Bearer " + token); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/application/service/kakao/utils/KakaoClient.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.application.service.kakao.utils; 2 | 3 | import com.moing.backend.global.utils.FeignClientConfig; 4 | import org.springframework.cloud.openfeign.FeignClient; 5 | import org.springframework.web.bind.annotation.PostMapping; 6 | import org.springframework.web.bind.annotation.RequestHeader; 7 | 8 | @FeignClient(name = "kakaoClient", url = "https://kapi.kakao.com", configuration = FeignClientConfig.class) 9 | public interface KakaoClient { 10 | @PostMapping("/v1/user/unlink") 11 | KakaoUnlinkResponse unlinkUser(@RequestHeader("Authorization") String accessToken); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/application/service/kakao/utils/KakaoUnlinkResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.application.service.kakao.utils; 2 | 3 | import lombok.Getter; 4 | 5 | @Getter 6 | public class KakaoUnlinkResponse { 7 | private String id; 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/exception/AccountAlreadyExistedException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class AccountAlreadyExistedException extends AuthException { 7 | public AccountAlreadyExistedException() { 8 | super(ErrorCode.ACCOUNT_ALREADY_EXIST, 9 | HttpStatus.UNAUTHORIZED); 10 | } 11 | } 12 | 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/exception/AppIdInvalidException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class AppIdInvalidException extends AuthException{ 7 | public AppIdInvalidException() { 8 | super(ErrorCode.APPID_INVALID_ERROR, 9 | HttpStatus.CONFLICT); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/exception/AuthException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.exception; 2 | 3 | import com.moing.backend.global.exception.ApplicationException; 4 | import com.moing.backend.global.response.ErrorCode; 5 | import org.springframework.http.HttpStatus; 6 | 7 | public abstract class AuthException extends ApplicationException { 8 | protected AuthException(ErrorCode errorCode, HttpStatus httpStatus) { 9 | super(errorCode, httpStatus); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/exception/NicknameDuplicationException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NicknameDuplicationException extends AuthException { 7 | public NicknameDuplicationException(){ 8 | super(ErrorCode.NICKNAME_DUPLICATION_ERROR, 9 | HttpStatus.BAD_REQUEST); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/exception/TokenInvalidException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class TokenInvalidException extends AuthException { 7 | public TokenInvalidException() { 8 | super(ErrorCode.TOKEN_INVALID_ERROR, 9 | HttpStatus.CONFLICT); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/exception/UnknownProviderException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.exception; 2 | 3 | public class UnknownProviderException { 4 | } 5 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/auth/presentation/constant/AuthResponseMessage.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.auth.presentation.constant; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public enum AuthResponseMessage { 9 | SIGN_IN_SUCCESS("로그인을 했습니다"), 10 | SIGN_UP_SUCCESS("회원 가입을 했습니다"), 11 | REISSUE_TOKEN_SUCCESS("토큰을 재발급했습니다"), 12 | CHECK_NICKNAME_SUCCESS("닉네임 중복검사를 했습니다"); 13 | private final String message; 14 | } 15 | 16 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/block/application/mapper/BlockMapper.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.block.application.mapper; 2 | 3 | import com.moing.backend.domain.block.domain.entity.Block; 4 | import com.moing.backend.global.annotation.Mapper; 5 | 6 | @Mapper 7 | public class BlockMapper { 8 | 9 | public static Block mapToBlock(Long memberId, Long targetId) { 10 | return Block.builder() 11 | .blockMemberId(memberId) 12 | .targetId(targetId) 13 | .build(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/block/domain/entity/Block.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.block.domain.entity; 2 | 3 | import com.moing.backend.global.entity.BaseTimeEntity; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Getter; 7 | import lombok.NoArgsConstructor; 8 | 9 | import javax.persistence.*; 10 | 11 | @Entity 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | @Getter 15 | @Builder 16 | public class Block extends BaseTimeEntity { 17 | 18 | 19 | @Id 20 | @GeneratedValue(strategy = GenerationType.IDENTITY) 21 | @Column(name = "block_id") 22 | private Long id; 23 | 24 | private Long blockMemberId; 25 | private Long targetId; 26 | 27 | public Block(Long blockMemberId, Long targetId) { 28 | this.blockMemberId=blockMemberId; 29 | this.targetId=targetId; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/block/domain/repository/BlockCustomRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.block.domain.repository; 2 | 3 | import com.moing.backend.domain.block.domain.entity.Block; 4 | import com.moing.backend.domain.report.application.dto.BlockMemberRes; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.stereotype.Repository; 7 | 8 | import java.util.List; 9 | import java.util.Optional; 10 | 11 | 12 | public interface BlockCustomRepository{ 13 | 14 | Optional> getMyBlockList(Long memberId); 15 | Optional> getMyBlockInfoList(Long memberId); 16 | Optional getBlockById(Long memberId, Long targetId); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/block/domain/repository/BlockRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.block.domain.repository; 2 | 3 | import com.moing.backend.domain.block.domain.entity.Block; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface BlockRepository extends JpaRepository,BlockCustomRepository { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/block/domain/service/BlockDeleteService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.block.domain.service; 2 | 3 | import com.moing.backend.domain.block.domain.entity.Block; 4 | import com.moing.backend.domain.block.domain.repository.BlockRepository; 5 | import com.moing.backend.domain.block.exception.NotFoundBlockException; 6 | import com.moing.backend.global.annotation.DomainService; 7 | import lombok.RequiredArgsConstructor; 8 | 9 | @DomainService 10 | @RequiredArgsConstructor 11 | public class BlockDeleteService { 12 | private final BlockRepository blockRepository; 13 | 14 | public void delete(Long memberId, Long targetId) { 15 | Block block = blockRepository.getBlockById(memberId, targetId).orElseThrow(NotFoundBlockException::new); 16 | blockRepository.delete(block); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/block/domain/service/BlockSaveService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.block.domain.service; 2 | 3 | import com.moing.backend.domain.block.domain.entity.Block; 4 | import com.moing.backend.domain.block.domain.repository.BlockRepository; 5 | import com.moing.backend.global.annotation.DomainService; 6 | import lombok.RequiredArgsConstructor; 7 | 8 | import java.util.Optional; 9 | 10 | @DomainService 11 | @RequiredArgsConstructor 12 | public class BlockSaveService { 13 | 14 | private final BlockRepository blockRepository; 15 | 16 | 17 | public Block save(Block block) { 18 | //기존에 동일한 사람이 차단했으면 중복 제거 19 | Optional findBlock=blockRepository.getBlockById(block.getBlockMemberId(), block.getTargetId()); 20 | return findBlock.orElseGet(() -> blockRepository.save(block)); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/block/exception/BlockException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.block.exception; 2 | 3 | import com.moing.backend.global.exception.ApplicationException; 4 | import com.moing.backend.global.response.ErrorCode; 5 | import org.springframework.http.HttpStatus; 6 | 7 | public abstract class BlockException extends ApplicationException { 8 | protected BlockException(ErrorCode errorCode, HttpStatus httpStatus) { 9 | super(errorCode, httpStatus); 10 | } 11 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/block/exception/NotFoundBlockException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.block.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NotFoundBlockException extends BlockException { 7 | public NotFoundBlockException() { 8 | super(ErrorCode.NOT_FOUND_BY_BOARD_ID_ERROR, 9 | HttpStatus.NOT_FOUND); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/block/presentation/constant/BlockResponseMessage.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.block.presentation.constant; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public enum BlockResponseMessage { 9 | 10 | CREATE_BLOCK_SUCCESS("사용자 차단을 완료했습니다."), 11 | GET_BLOCK_SUCCESS("사용자 차단 목록 조회를 완료했습니다."), 12 | DELETE_BLOCK_SUCCESS("사용자 차단 해제를 완료했습니다."); 13 | 14 | private final String message; 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/board/application/dto/request/CreateBoardRequest.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.board.application.dto.request; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import javax.validation.constraints.NotBlank; 9 | import javax.validation.constraints.NotNull; 10 | import javax.validation.constraints.Size; 11 | 12 | @AllArgsConstructor 13 | @Builder 14 | @NoArgsConstructor 15 | @Getter 16 | public class CreateBoardRequest { 17 | @NotBlank(message = "title 을 입력해 주세요.") 18 | @Size(min = 0, max = 30, message = "제목 글자수를 초과했습니다.") 19 | private String title; 20 | 21 | @NotBlank(message = "content 을 입력해 주세요.") 22 | @Size(min = 0, max = 300, message = "내용 글자수를 초과했습니다.") 23 | private String content; 24 | 25 | @NotNull(message = "notice 사용 여부(isNotice) 를 입력해 주세요.") 26 | private Boolean isNotice; 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/board/application/dto/request/UpdateBoardRequest.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.board.application.dto.request; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | import javax.validation.constraints.NotBlank; 7 | import javax.validation.constraints.NotNull; 8 | import javax.validation.constraints.Size; 9 | 10 | @Getter 11 | @Builder 12 | public class UpdateBoardRequest { 13 | @NotBlank(message = "title 을 입력해 주세요.") 14 | @Size(min = 1, max = 15, message = "title 은 최소 1개, 최대 15개의 문자만 입력 가능합니다.") 15 | private String title; 16 | 17 | @NotBlank(message = "content 을 입력해 주세요.") 18 | @Size(min = 1, max = 300, message = "content 은 최소 1개, 최대 10개의 문자만 입력 가능합니다.") 19 | private String content; 20 | 21 | @NotNull(message = "notice 사용 여부(isNotice) 를 입력해 주세요.") 22 | private Boolean isNotice; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/board/application/dto/response/CreateBoardResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.board.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @AllArgsConstructor 9 | @Builder 10 | @NoArgsConstructor 11 | @Getter 12 | public class CreateBoardResponse { 13 | private Long boardId; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/board/application/dto/response/GetAllBoardResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.board.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.util.ArrayList; 9 | import java.util.List; 10 | 11 | @AllArgsConstructor 12 | @Builder 13 | @NoArgsConstructor 14 | @Getter 15 | public class GetAllBoardResponse { 16 | private int noticeNum; 17 | private List noticeBlocks=new ArrayList<>(); 18 | private int notNoticeNum; 19 | private List notNoticeBlocks=new ArrayList<>(); 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/board/application/dto/response/GetBoardDetailResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.board.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @AllArgsConstructor 9 | @Builder 10 | @NoArgsConstructor 11 | @Getter 12 | public class GetBoardDetailResponse { 13 | 14 | private Long boardId; 15 | 16 | private String writerNickName; 17 | 18 | private Boolean writerIsLeader; 19 | 20 | private String writerProfileImage; 21 | 22 | private String title; 23 | 24 | private String content; 25 | 26 | private String createdDate; 27 | 28 | private Boolean isWriter; 29 | 30 | private Boolean isNotice; 31 | 32 | private Long makerId; 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/board/application/dto/response/UpdateBoardResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.board.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | @Getter 8 | @AllArgsConstructor 9 | @Builder 10 | public class UpdateBoardResponse { 11 | private Long boardId; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/board/domain/repository/BoardCustomRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.board.domain.repository; 2 | 3 | import com.moing.backend.domain.board.application.dto.response.GetAllBoardResponse; 4 | 5 | public interface BoardCustomRepository { 6 | GetAllBoardResponse findBoardAll(Long teamId, Long memberId); 7 | Integer findUnReadBoardNum(Long teamId, Long memberId); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/board/domain/repository/BoardRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.board.domain.repository; 2 | 3 | import com.moing.backend.domain.board.domain.entity.Board; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | import java.util.Optional; 7 | 8 | public interface BoardRepository extends JpaRepository, BoardCustomRepository { 9 | 10 | Optional findBoardByBoardId(Long boardId); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/board/domain/service/BoardDeleteService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.board.domain.service; 2 | 3 | import com.moing.backend.domain.board.domain.entity.Board; 4 | import com.moing.backend.domain.board.domain.repository.BoardRepository; 5 | import com.moing.backend.global.annotation.DomainService; 6 | import lombok.RequiredArgsConstructor; 7 | 8 | import javax.transaction.Transactional; 9 | 10 | @DomainService 11 | @Transactional 12 | @RequiredArgsConstructor 13 | public class BoardDeleteService { 14 | 15 | private final BoardRepository boardRepository; 16 | 17 | public void deleteBoard(Board board){ 18 | boardRepository.delete(board); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/board/domain/service/BoardSaveService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.board.domain.service; 2 | 3 | import com.moing.backend.domain.board.domain.entity.Board; 4 | import com.moing.backend.domain.board.domain.repository.BoardRepository; 5 | import com.moing.backend.global.annotation.DomainService; 6 | import lombok.RequiredArgsConstructor; 7 | 8 | import javax.transaction.Transactional; 9 | 10 | @DomainService 11 | @Transactional 12 | @RequiredArgsConstructor 13 | public class BoardSaveService { 14 | 15 | private final BoardRepository boardRepository; 16 | 17 | public Board saveBoard(Board board) { 18 | return this.boardRepository.save(board); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/board/exception/BoardException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.board.exception; 2 | 3 | import com.moing.backend.global.exception.ApplicationException; 4 | import com.moing.backend.global.response.ErrorCode; 5 | import org.springframework.http.HttpStatus; 6 | 7 | public abstract class BoardException extends ApplicationException { 8 | protected BoardException(ErrorCode errorCode, HttpStatus httpStatus) { 9 | super(errorCode, httpStatus); 10 | } 11 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/board/exception/NotAuthByBoardException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.board.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NotAuthByBoardException extends BoardException { 7 | public NotAuthByBoardException() { 8 | super(ErrorCode.NOT_AUTH_BY_BOARD_ID_ERROR, 9 | HttpStatus.NOT_FOUND); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/board/exception/NotFoundByBoardIdException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.board.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NotFoundByBoardIdException extends BoardException { 7 | public NotFoundByBoardIdException() { 8 | super(ErrorCode.NOT_FOUND_BY_BOARD_ID_ERROR, 9 | HttpStatus.NOT_FOUND); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/board/presentation/constant/BoardResponseMessage.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.board.presentation.constant; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public enum BoardResponseMessage { 9 | CREATE_BOARD_SUCCESS("게시글을 생성했습니다."), 10 | GET_BOARD_ALL_SUCCESS("게시글 목록을 모두 조회했습니다."), 11 | UPDATE_BOARD_SUCCESS("게시글을 수정했습니다."), 12 | GET_BOARD_DETAIL_SUCCESS("게시글 상세 조회했습니다."), 13 | DELETE_BOARD_SUCCESS("게시글을 삭제했습니다"); 14 | private final String message; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/boardComment/application/mapper/BoardCommentMapper.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.boardComment.application.mapper; 2 | 3 | import com.moing.backend.domain.board.domain.entity.Board; 4 | import com.moing.backend.domain.comment.application.dto.request.CreateCommentRequest; 5 | import com.moing.backend.domain.boardComment.domain.entity.BoardComment; 6 | import com.moing.backend.domain.teamMember.domain.entity.TeamMember; 7 | import lombok.RequiredArgsConstructor; 8 | import org.springframework.stereotype.Component; 9 | 10 | @Component 11 | @RequiredArgsConstructor 12 | public class BoardCommentMapper { 13 | public static BoardComment toBoardComment(TeamMember teamMember, Board board, CreateCommentRequest createCommentRequest, boolean isLeader) { 14 | BoardComment boardComment= new BoardComment(); 15 | boardComment.init(createCommentRequest.getContent(),isLeader); 16 | boardComment.updateBoard(board); 17 | boardComment.updateTeamMember(teamMember); 18 | return boardComment; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/boardComment/domain/repository/BoardCommentCustomRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.boardComment.domain.repository; 2 | 3 | import com.moing.backend.domain.comment.application.dto.response.GetCommentResponse; 4 | import com.moing.backend.domain.history.application.dto.response.NewUploadInfo; 5 | import com.moing.backend.domain.teamMember.domain.entity.TeamMember; 6 | 7 | import java.util.List; 8 | import java.util.Optional; 9 | 10 | public interface BoardCommentCustomRepository { 11 | GetCommentResponse findBoardCommentAll(Long boardId, TeamMember teamMember); 12 | 13 | Optional> findNewUploadInfo(Long memberId, Long boardId); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/boardComment/domain/repository/BoardCommentRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.boardComment.domain.repository; 2 | 3 | import com.moing.backend.domain.boardComment.domain.entity.BoardComment; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | import java.util.Optional; 7 | 8 | public interface BoardCommentRepository extends JpaRepository, BoardCommentCustomRepository { 9 | Optional findBoardCommentByBoardCommentId(Long boardCommentId); 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/boardComment/domain/service/BoardCommentDeleteService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.boardComment.domain.service; 2 | 3 | import com.moing.backend.domain.boardComment.domain.entity.BoardComment; 4 | import com.moing.backend.domain.boardComment.domain.repository.BoardCommentRepository; 5 | import com.moing.backend.domain.comment.domain.service.CommentDeleteService; 6 | import com.moing.backend.global.annotation.DomainService; 7 | import lombok.RequiredArgsConstructor; 8 | 9 | @DomainService 10 | @RequiredArgsConstructor 11 | public class BoardCommentDeleteService implements CommentDeleteService { 12 | private final BoardCommentRepository boardCommentRepository; 13 | 14 | @Override 15 | public void deleteComment(BoardComment boardComment){ 16 | this.boardCommentRepository.delete(boardComment); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/boardComment/domain/service/BoardCommentSaveService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.boardComment.domain.service; 2 | 3 | import com.moing.backend.domain.boardComment.domain.repository.BoardCommentRepository; 4 | import com.moing.backend.domain.boardComment.domain.entity.BoardComment; 5 | import com.moing.backend.domain.comment.domain.service.CommentSaveService; 6 | import com.moing.backend.global.annotation.DomainService; 7 | import lombok.RequiredArgsConstructor; 8 | 9 | @DomainService 10 | @RequiredArgsConstructor 11 | public class BoardCommentSaveService implements CommentSaveService { 12 | 13 | private final BoardCommentRepository boardCommentRepository; 14 | 15 | @Override 16 | public BoardComment saveComment(BoardComment boardComment){ 17 | return this.boardCommentRepository.save(boardComment); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/boardComment/exception/BoardCommentException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.boardComment.exception; 2 | 3 | import com.moing.backend.global.exception.ApplicationException; 4 | import com.moing.backend.global.response.ErrorCode; 5 | import org.springframework.http.HttpStatus; 6 | 7 | public abstract class BoardCommentException extends ApplicationException { 8 | protected BoardCommentException(ErrorCode errorCode, HttpStatus httpStatus) { 9 | super(errorCode, httpStatus); 10 | } 11 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/boardComment/exception/NotAuthByBoardCommentException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.boardComment.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NotAuthByBoardCommentException extends BoardCommentException { 7 | public NotAuthByBoardCommentException() { 8 | super(ErrorCode.NOT_AUTH_BY_BOARD_COMMENT_ID_ERROR, 9 | HttpStatus.NOT_FOUND); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/boardComment/exception/NotFoundByBoardCommentIdException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.boardComment.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NotFoundByBoardCommentIdException extends BoardCommentException { 7 | public NotFoundByBoardCommentIdException() { 8 | super(ErrorCode.NOT_FOUND_BY_BOARD_COMMENT_ID_ERROR, 9 | HttpStatus.NOT_FOUND); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/boardComment/presentattion/constant/BoardCommentResponseMessage.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.boardComment.presentattion.constant; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public enum BoardCommentResponseMessage { 9 | CREATE_BOARD_COMMENT_SUCCESS("댓글을 생성했습니다."), 10 | GET_BOARD_COMMENT_ALL_SUCCESS("댓글 목록을 모두 조회했습니다."), 11 | DELETE_BOARD_COMMENT_SUCCESS("댓글을 삭제했습니다"); 12 | private final String message; 13 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/boardRead/application/mapper/BoardReadMapper.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.boardRead.application.mapper; 2 | 3 | import com.moing.backend.domain.board.domain.entity.Board; 4 | import com.moing.backend.domain.boardRead.domain.entity.BoardRead; 5 | import com.moing.backend.domain.member.domain.entity.Member; 6 | import com.moing.backend.domain.team.domain.entity.Team; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Component 10 | public class BoardReadMapper { 11 | public static BoardRead toBoardRead(Team team, Member member){ 12 | BoardRead boardRead=new BoardRead(); 13 | boardRead.updateTeam(team); 14 | boardRead.updateMember(member); 15 | return boardRead; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/boardRead/domain/repository/BoardReadRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.boardRead.domain.repository; 2 | 3 | import com.moing.backend.domain.board.domain.entity.Board; 4 | import com.moing.backend.domain.boardRead.domain.entity.BoardRead; 5 | import com.moing.backend.domain.member.domain.entity.Member; 6 | import com.moing.backend.domain.team.domain.entity.Team; 7 | import org.springframework.data.jpa.repository.JpaRepository; 8 | import org.springframework.data.jpa.repository.Lock; 9 | 10 | import javax.persistence.LockModeType; 11 | import java.util.List; 12 | import java.util.Optional; 13 | 14 | public interface BoardReadRepository extends JpaRepository { 15 | 16 | List findBoardReadByBoardAndMemberAndTeam(Board board, Member member, Team team); 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/comment/application/dto/request/CreateCommentRequest.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.comment.application.dto.request; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import javax.validation.constraints.NotBlank; 9 | import javax.validation.constraints.Size; 10 | 11 | @AllArgsConstructor 12 | @Builder 13 | @NoArgsConstructor 14 | @Getter 15 | public class CreateCommentRequest { 16 | 17 | @NotBlank(message = "content 을 입력해 주세요.") 18 | @Size(min = 0, max = 300, message = "댓글 글자수를 초과했습니다.") 19 | private String content; 20 | } 21 | 22 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/comment/application/dto/response/CreateCommentResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.comment.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @AllArgsConstructor 9 | @Builder 10 | @NoArgsConstructor 11 | @Getter 12 | public class CreateCommentResponse { 13 | private Long commentId; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/comment/application/dto/response/GetCommentResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.comment.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.util.List; 9 | 10 | @AllArgsConstructor 11 | @Builder 12 | @NoArgsConstructor 13 | @Getter 14 | public class GetCommentResponse { 15 | private List commentBlocks; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/comment/domain/entity/Comment.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.comment.domain.entity; 2 | 3 | import com.moing.backend.global.entity.BaseTimeEntity; 4 | import lombok.Getter; 5 | import org.springframework.data.jpa.domain.support.AuditingEntityListener; 6 | 7 | import javax.persistence.Column; 8 | import javax.persistence.EntityListeners; 9 | import javax.persistence.MappedSuperclass; 10 | 11 | @Getter 12 | @MappedSuperclass 13 | @EntityListeners(AuditingEntityListener.class) 14 | public class Comment extends BaseTimeEntity { 15 | 16 | @Column(nullable = false, length = 300) 17 | protected String content; 18 | 19 | protected boolean isLeader; /*작성자 소모임장유무*/ 20 | public void updateContent(String content) { 21 | this.content = content; 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/comment/domain/service/CommentDeleteService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.comment.domain.service; 2 | 3 | public interface CommentDeleteService { 4 | void deleteComment(T comment); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/comment/domain/service/CommentGetService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.comment.domain.service; 2 | 3 | import com.moing.backend.domain.comment.application.dto.response.GetCommentResponse; 4 | import com.moing.backend.domain.history.application.dto.response.NewUploadInfo; 5 | import com.moing.backend.domain.teamMember.domain.entity.TeamMember; 6 | 7 | import java.util.List; 8 | import java.util.Optional; 9 | 10 | public interface CommentGetService { 11 | T getComment(Long commentId); 12 | GetCommentResponse getCommentAll(Long boardId, TeamMember teamMember); 13 | Optional> getNewUploadInfo(Long memberId, Long boardId); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/comment/domain/service/CommentSaveService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.comment.domain.service; 2 | 3 | public interface CommentSaveService { 4 | T saveComment(T comment); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/fire/application/dto/req/FireThrowReq.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.fire.application.dto.req; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | 7 | @NoArgsConstructor 8 | @Getter 9 | public class FireThrowReq { 10 | 11 | private String message; 12 | 13 | @Builder 14 | public FireThrowReq(String message) { 15 | this.message = message; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/fire/application/dto/res/FireReceiveRes.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.fire.application.dto.res; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | @Builder 8 | @Getter 9 | @AllArgsConstructor 10 | public class FireReceiveRes { 11 | 12 | private Long receiveMemberId; 13 | private String nickname; 14 | private String fireStatus; 15 | private String profileImg; 16 | 17 | public FireReceiveRes(Long receiveMemberId, String nickname,String profileImg) { 18 | this.receiveMemberId = receiveMemberId; 19 | this.nickname = nickname; 20 | this.profileImg = profileImg; 21 | } 22 | 23 | public void updateFireStatus(boolean status) { 24 | if (status) 25 | this.fireStatus = "True"; 26 | else this.fireStatus = "False"; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/fire/application/dto/res/FireThrowRes.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.fire.application.dto.res; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @Builder 8 | public class FireThrowRes { 9 | 10 | private Long receiveMemberId; 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/fire/domain/entity/Fire.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.fire.domain.entity; 2 | 3 | import com.moing.backend.global.entity.BaseTimeEntity; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Getter; 7 | import lombok.NoArgsConstructor; 8 | 9 | import javax.persistence.*; 10 | 11 | @Entity 12 | @Builder 13 | @Getter 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | public class Fire extends BaseTimeEntity { 17 | 18 | @Id 19 | @GeneratedValue(strategy = GenerationType.IDENTITY) 20 | @Column(name = "fire_id") 21 | private Long id; 22 | 23 | private Long throwMemberId; 24 | 25 | private Long receiveMemberId; 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/fire/domain/repository/FireCustomRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.fire.domain.repository; 2 | 3 | 4 | import com.moing.backend.domain.fire.application.dto.res.FireReceiveRes; 5 | 6 | import java.util.List; 7 | import java.util.Optional; 8 | 9 | public interface FireCustomRepository { 10 | 11 | boolean hasFireCreatedWithinOneHour(Long throwMemberId, Long receiveMemberId); 12 | Optional> getFireReceivers(Long teamId, Long missionId, Long memberId); 13 | Long getTodayFires(); 14 | Long getYesterdayFires(); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/fire/domain/repository/FireRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.fire.domain.repository; 2 | 3 | import com.moing.backend.domain.fire.domain.entity.Fire; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface FireRepository extends JpaRepository,FireCustomRepository { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/fire/domain/service/FireSaveService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.fire.domain.service; 2 | 3 | import com.moing.backend.domain.fire.domain.entity.Fire; 4 | import com.moing.backend.domain.fire.domain.repository.FireCustomRepository; 5 | import com.moing.backend.domain.fire.domain.repository.FireRepository; 6 | import com.moing.backend.global.annotation.DomainService; 7 | import lombok.RequiredArgsConstructor; 8 | import org.springframework.transaction.annotation.Transactional; 9 | 10 | @DomainService 11 | @Transactional 12 | @RequiredArgsConstructor 13 | public class FireSaveService { 14 | 15 | private final FireRepository fireRepository; 16 | 17 | public Fire save(Fire fire) { 18 | return fireRepository.save(fire); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/fire/exception/FireException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.fire.exception; 2 | 3 | import com.moing.backend.global.exception.ApplicationException; 4 | import com.moing.backend.global.response.ErrorCode; 5 | import org.springframework.http.HttpStatus; 6 | 7 | public abstract class FireException extends ApplicationException { 8 | 9 | protected FireException(ErrorCode errorCode, HttpStatus httpStatus) { 10 | super(errorCode, httpStatus); 11 | } 12 | 13 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/fire/exception/NoAuthThrowFireException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.fire.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NoAuthThrowFireException extends FireException { 7 | 8 | public NoAuthThrowFireException() { 9 | super(ErrorCode.NOT_AUTH_FIRE_THROW, 10 | HttpStatus.NOT_FOUND); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/fire/exception/NotFoundFireException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.fire.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NotFoundFireException extends FireException { 7 | 8 | public NotFoundFireException() { 9 | super(ErrorCode.NOT_FOUND_FIRE, 10 | HttpStatus.NOT_FOUND); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/fire/exception/NotFoundFireReceiversException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.fire.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NotFoundFireReceiversException extends FireException { 7 | 8 | public NotFoundFireReceiversException() { 9 | super(ErrorCode.NOT_FOUND_FIRE_RECEIVERS, 10 | HttpStatus.NOT_FOUND); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/fire/presentation/constant/FireResponseMessage.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.fire.presentation.constant; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public enum FireResponseMessage { 9 | THROW_FIRE_SUCCESS("불던지기를 완료 했습니다"), 10 | GET_RECEIVERS_SUCCESS("불 던질사람 조회를 완료 했습니다"); 11 | 12 | private final String message; 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/history/application/dto/response/GetAlarmCountResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.history.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | @Getter 8 | @AllArgsConstructor 9 | @Builder 10 | public class GetAlarmCountResponse { 11 | 12 | private String count; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/history/application/dto/response/MemberIdAndToken.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.history.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.util.List; 9 | 10 | @Getter 11 | @Builder 12 | @AllArgsConstructor 13 | @NoArgsConstructor 14 | public class MemberIdAndToken { 15 | 16 | private String fcmToken; 17 | private Long memberId; 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/history/application/dto/response/NewUploadInfo.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.history.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Getter 9 | @Builder 10 | @AllArgsConstructor 11 | @NoArgsConstructor 12 | public class NewUploadInfo { 13 | 14 | private String fcmToken; 15 | private Long memberId; 16 | private boolean isNewUploadPush; 17 | private boolean isSignOut; 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/history/domain/entity/AlarmType.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.history.domain.entity; 2 | 3 | import lombok.Getter; 4 | 5 | @Getter 6 | public enum AlarmType { 7 | NEW_UPLOAD, 8 | FIRE, 9 | REMIND, 10 | APPROVE_TEAM, 11 | REJECT_TEAM, 12 | COMMENT 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/history/domain/entity/PagePath.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.history.domain.entity; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @AllArgsConstructor 8 | public enum PagePath { 9 | 10 | NOTICE_PATH("/post/detail"), 11 | 12 | MISSION_PATH("/missions/prove"), 13 | 14 | MISSION_ALL_PTAH("/missions"), 15 | 16 | HOME_PATH("/home"); 17 | 18 | 19 | private final String value; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/history/domain/repository/AlarmHistoryCustomRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.history.domain.repository; 2 | 3 | import com.moing.backend.domain.history.application.dto.response.GetAlarmHistoryResponse; 4 | 5 | import java.util.List; 6 | 7 | public interface AlarmHistoryCustomRepository { 8 | 9 | List findAlarmHistoriesByMemberId(Long memberId); 10 | String findUnreadAlarmCount(Long memberId); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/history/domain/repository/AlarmHistoryRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.history.domain.repository; 2 | 3 | import com.moing.backend.domain.history.domain.entity.AlarmHistory; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | import java.time.LocalDateTime; 7 | import java.util.Optional; 8 | 9 | public interface AlarmHistoryRepository extends JpaRepository, AlarmHistoryCustomRepository { 10 | 11 | Optional findAlarmHistoryByIdAndReceiverId(Long id, Long receiverId); 12 | void deleteByCreatedDateBefore(LocalDateTime dateTime); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/history/domain/service/AlarmHistoryDeleteService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.history.domain.service; 2 | 3 | import com.moing.backend.domain.history.domain.repository.AlarmHistoryRepository; 4 | import com.moing.backend.global.annotation.DomainService; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.transaction.annotation.Transactional; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | @DomainService 11 | @Transactional 12 | @RequiredArgsConstructor 13 | public class AlarmHistoryDeleteService { 14 | 15 | private final AlarmHistoryRepository alarmHistoryRepository; 16 | 17 | public void deleteByCreatedDateBefore(LocalDateTime oneWeekAgo) { 18 | alarmHistoryRepository.deleteByCreatedDateBefore(oneWeekAgo); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/history/domain/service/AlarmHistorySaveService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.history.domain.service; 2 | 3 | import com.moing.backend.domain.history.domain.entity.AlarmHistory; 4 | import com.moing.backend.domain.history.domain.repository.AlarmHistoryRepository; 5 | import com.moing.backend.global.annotation.DomainService; 6 | import lombok.RequiredArgsConstructor; 7 | 8 | import javax.transaction.Transactional; 9 | import java.util.List; 10 | 11 | @DomainService 12 | @Transactional 13 | @RequiredArgsConstructor 14 | public class AlarmHistorySaveService { 15 | 16 | private final AlarmHistoryRepository alarmHistoryRepository; 17 | 18 | public void saveAlarmHistories(List alarmHistories){ 19 | alarmHistoryRepository.saveAll(alarmHistories); 20 | } 21 | 22 | public void saveAlarmHistory(AlarmHistory alarmHistory){ 23 | alarmHistoryRepository.save(alarmHistory); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/history/exception/AlarmHistoryException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.history.exception; 2 | 3 | import com.moing.backend.global.exception.ApplicationException; 4 | import com.moing.backend.global.response.ErrorCode; 5 | import org.springframework.http.HttpStatus; 6 | 7 | public abstract class AlarmHistoryException extends ApplicationException { 8 | protected AlarmHistoryException(ErrorCode errorCode, HttpStatus httpStatus) { 9 | super(errorCode, httpStatus); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/history/exception/NotFoundAlarmHistoryException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.history.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NotFoundAlarmHistoryException extends AlarmHistoryException { 7 | public NotFoundAlarmHistoryException() { 8 | super(ErrorCode.NOT_FOUND_BY_ALARM_HISOTRY_ID_ERROR, 9 | HttpStatus.NOT_FOUND); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/history/presentation/constant/AlarmHistoryResponseMessage.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.history.presentation.constant; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public enum AlarmHistoryResponseMessage { 9 | GET_ALL_ALARM_HISTORY("알림 히스토리를 모두 조회했습니다."), 10 | READ_ALARM_HISTORY("알림 히스토리 한 개를 조회했습니다."), 11 | GET_UNREAD_ALARM_HISTORY("안읽은 알림 개수를 조회했습니다"); 12 | private final String message; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/infra/image/application/dto/ImageFileExtension.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.infra.image.application.dto; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | 7 | @Getter 8 | @AllArgsConstructor 9 | public enum ImageFileExtension { 10 | JPEG("jpeg"), 11 | JPG("jpg"), 12 | PNG("png"); 13 | 14 | private final String uploadExtension; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/infra/image/application/dto/ImageUrlDto.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.infra.image.application.dto; 2 | 3 | 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | @Getter 8 | @Builder 9 | public class ImageUrlDto { 10 | 11 | private final String presignedUrl; 12 | private final String key; 13 | 14 | public static ImageUrlDto of(String url, String key) { 15 | return ImageUrlDto.builder().presignedUrl(url).key(key).build(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/infra/image/application/dto/request/IssuePresignedUrlRequest.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.infra.image.application.dto.request; 2 | 3 | 4 | import com.moing.backend.domain.infra.image.application.dto.ImageFileExtension; 5 | import com.moing.backend.global.annotation.ValidEnum; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Getter; 9 | import lombok.NoArgsConstructor; 10 | 11 | import javax.validation.constraints.NotBlank; 12 | 13 | @Builder 14 | @Getter 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | public class IssuePresignedUrlRequest { 18 | 19 | 20 | @NotBlank(message = "파일 확장자를 입력해주세요.") 21 | @ValidEnum( 22 | enumClass = ImageFileExtension.class, 23 | message = "유효하지 않은 ImageFileExtension 파라미터입니다.") 24 | private ImageFileExtension imageFileExtension; 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/infra/image/application/dto/response/IssuePresignedUrlResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.infra.image.application.dto.response; 2 | 3 | 4 | import com.moing.backend.domain.infra.image.application.dto.ImageUrlDto; 5 | import com.moing.backend.global.config.s3.ImageUrlUtil; 6 | import lombok.Builder; 7 | import lombok.Getter; 8 | 9 | @Getter 10 | @Builder 11 | public class IssuePresignedUrlResponse { 12 | 13 | private final String presignedUrl; 14 | 15 | private final String imgUrl; 16 | 17 | public static IssuePresignedUrlResponse from(ImageUrlDto urlDto) { 18 | String imgUrl = ImageUrlUtil.prefix +"/"+ urlDto.getKey(); 19 | 20 | return IssuePresignedUrlResponse.builder() 21 | .presignedUrl(urlDto.getPresignedUrl()) 22 | .imgUrl(imgUrl) 23 | .build(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/infra/image/application/service/IssuePresignedUrlUseCase.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.infra.image.application.service; 2 | 3 | 4 | import com.moing.backend.domain.infra.image.application.dto.request.IssuePresignedUrlRequest; 5 | import com.moing.backend.domain.infra.image.application.dto.response.IssuePresignedUrlResponse; 6 | import com.moing.backend.global.config.s3.S3Service; 7 | import lombok.RequiredArgsConstructor; 8 | import org.springframework.stereotype.Service; 9 | 10 | 11 | @Service 12 | @RequiredArgsConstructor 13 | public class IssuePresignedUrlUseCase { 14 | 15 | private final S3Service s3Service; 16 | 17 | public IssuePresignedUrlResponse execute(IssuePresignedUrlRequest issuePresignedUrlRequest) { 18 | 19 | return IssuePresignedUrlResponse.from( 20 | s3Service.issuePreSignedUrl( 21 | issuePresignedUrlRequest.getImageFileExtension())); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/infra/image/presentation/constant/EImageResponseMessage.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.infra.image.presentation.constant; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public enum EImageResponseMessage { 9 | ISSUE_PRESIGNED_URL_SUCCESS("presignedUrl을 발급하였습니다"); 10 | 11 | private final String message; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/member/domain/constant/Gender.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.member.domain.constant; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | @AllArgsConstructor 7 | @Getter 8 | public enum Gender { 9 | MAN, WOMAN, NEUTRALITY 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/member/domain/constant/RegistrationStatus.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.member.domain.constant; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | @AllArgsConstructor 7 | @Getter 8 | public enum RegistrationStatus { 9 | UNCOMPLETED("회원가입을 합니다. 추가 정보를 입력하세요."), 10 | COMPLETED("로그인을 합니다."); 11 | private String message; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/member/domain/constant/Role.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.member.domain.constant; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | @AllArgsConstructor 7 | @Getter 8 | public enum Role { 9 | USER("ROLE_USER"), 10 | ADMIN("ROLE_ADMIN"); 11 | 12 | private final String key; 13 | } 14 | 15 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/member/domain/constant/SocialProvider.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.member.domain.constant; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | @AllArgsConstructor 7 | @Getter 8 | public enum SocialProvider { 9 | GOOGLE, APPLE, KAKAO; 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/member/domain/repository/MemberCustomRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.member.domain.repository; 2 | 3 | import com.moing.backend.domain.member.domain.entity.Member; 4 | 5 | import java.util.List; 6 | import java.util.Optional; 7 | 8 | public interface MemberCustomRepository { 9 | 10 | boolean checkNickname(String nickname); 11 | Optional findNotDeletedBySocialId(String socialId); 12 | Optional findNotDeletedByEmail(String email); 13 | Optional findNotDeletedByMemberId(Long id); 14 | Long getTodayNewMembers(); 15 | Long getYesterdayNewMembers(); 16 | 17 | Optional> findAllMemberOnPushAlarm(Long offset, Long limit); 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/member/domain/repository/MemberRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.member.domain.repository; 2 | 3 | import com.moing.backend.domain.member.domain.entity.Member; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface MemberRepository extends JpaRepository, MemberCustomRepository { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/member/domain/service/MemberCheckService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.member.domain.service; 2 | 3 | import com.moing.backend.domain.member.domain.repository.MemberRepository; 4 | import com.moing.backend.global.annotation.DomainService; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.transaction.annotation.Transactional; 7 | 8 | @DomainService 9 | @RequiredArgsConstructor 10 | public class MemberCheckService { 11 | private final MemberRepository memberRepository; 12 | 13 | @Transactional(readOnly = true) 14 | public boolean checkNickname(String nickname) { 15 | return memberRepository.checkNickname(nickname); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/member/domain/service/MemberDeleteService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.member.domain.service; 2 | 3 | import com.moing.backend.domain.member.domain.entity.Member; 4 | import com.moing.backend.domain.member.domain.repository.MemberRepository; 5 | import com.moing.backend.global.annotation.DomainService; 6 | import lombok.RequiredArgsConstructor; 7 | 8 | import javax.transaction.Transactional; 9 | 10 | @DomainService 11 | @Transactional 12 | @RequiredArgsConstructor 13 | public class MemberDeleteService { 14 | 15 | private final MemberRepository memberRepository; 16 | 17 | public void deleteMember(Member member){ 18 | this.memberRepository.delete(member); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/member/dto/request/PostUpdatePushAlarm.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.member.dto.request; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | 7 | @Getter 8 | @AllArgsConstructor 9 | @NoArgsConstructor 10 | public class PostUpdatePushAlarm { 11 | 12 | private String title; 13 | private String message; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/member/dto/response/UserProperty.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.member.dto.response; 2 | 3 | import com.moing.backend.domain.member.domain.constant.Gender; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Getter; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.time.LocalDate; 10 | 11 | @Builder 12 | @AllArgsConstructor 13 | @NoArgsConstructor 14 | @Getter 15 | public class UserProperty { 16 | private Gender gender; 17 | private LocalDate birthDate; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/member/exception/MemberException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.member.exception; 2 | 3 | import com.moing.backend.global.exception.ApplicationException; 4 | import com.moing.backend.global.response.ErrorCode; 5 | import org.springframework.http.HttpStatus; 6 | 7 | public abstract class MemberException extends ApplicationException { 8 | protected MemberException(ErrorCode errorCode, HttpStatus httpStatus) { 9 | super(errorCode, httpStatus); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/member/exception/NotFoundBySocialIdException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.member.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NotFoundBySocialIdException extends MemberException { 7 | public NotFoundBySocialIdException() { 8 | super(ErrorCode.NOT_FOUND_BY_SOCIAL_ID_ERROR, 9 | HttpStatus.NOT_FOUND); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/member/exception/NotFoundRemindAlarmException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.member.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NotFoundRemindAlarmException extends MemberException { 7 | public NotFoundRemindAlarmException() { 8 | super(ErrorCode.NOT_FOUND_ALL_MEMBER, 9 | HttpStatus.NOT_FOUND); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/application/dto/req/MissionReq.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.application.dto.req; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | import lombok.*; 8 | 9 | 10 | @AllArgsConstructor 11 | @Builder 12 | @NoArgsConstructor 13 | @Getter 14 | public class MissionReq { 15 | 16 | private String title; 17 | private String dueTo; 18 | 19 | private String rule; 20 | private String content; 21 | private int number; 22 | 23 | private String type; 24 | private String way; 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/application/dto/res/GatherRepeatMissionRes.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.application.dto.res; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | import java.util.List; 8 | 9 | @Getter 10 | @Builder 11 | @AllArgsConstructor 12 | public class GatherRepeatMissionRes { 13 | 14 | private Long missionId; 15 | private Long teamId; 16 | private String teamName; 17 | private String missionTitle; 18 | private String totalNum; 19 | private String doneNum; 20 | private String status; 21 | private String donePeople; 22 | private String totalPeople; 23 | 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/application/dto/res/GatherSingleMissionRes.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.application.dto.res; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.ToString; 7 | 8 | @Getter 9 | @Builder 10 | @ToString 11 | @AllArgsConstructor 12 | public class GatherSingleMissionRes { 13 | private Long missionId; 14 | private Long teamId; 15 | private String teamName; 16 | private String missionTitle; 17 | private String dueTo; 18 | private String status; 19 | private String done; 20 | private String total; 21 | 22 | public GatherSingleMissionRes(Long missionId, Long teamId, String teamName, String missionTitle, String dueTo, String status, String total) { 23 | this.missionId = missionId; 24 | this.teamId = teamId; 25 | this.teamName = teamName; 26 | this.missionTitle = missionTitle; 27 | this.dueTo = dueTo; 28 | this.status = status; 29 | this.total = total; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/application/dto/res/MissionConfirmRes.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.application.dto.res; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | @Getter 8 | @Builder 9 | @AllArgsConstructor 10 | public class MissionConfirmRes { 11 | private Long missionId; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/application/dto/res/MissionCreateRes.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.application.dto.res; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @Builder 8 | public class MissionCreateRes { 9 | 10 | private Long missionId; 11 | 12 | private String title; 13 | private String dueTo; 14 | 15 | private String rule; 16 | private String content; 17 | private int number; 18 | 19 | private String type; 20 | private String status; 21 | private String way; 22 | 23 | private Boolean isLeader; 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/application/dto/res/MissionReadRes.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.application.dto.res; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | @Getter 8 | @Builder 9 | @AllArgsConstructor 10 | public class MissionReadRes { 11 | 12 | private String title; 13 | private String dueTo; 14 | 15 | private String rule; 16 | private String content; 17 | 18 | private String type; 19 | private String way; 20 | 21 | private Boolean isLeader; 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/application/dto/res/MissionRecommendRes.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.application.dto.res; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | @Builder 8 | @Getter 9 | @Setter 10 | public class MissionRecommendRes { 11 | String category; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/application/dto/res/SingleMissionBoardRes.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.application.dto.res; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | 8 | @Getter 9 | @Setter 10 | @Builder 11 | @AllArgsConstructor 12 | public class SingleMissionBoardRes { 13 | private Long missionId; 14 | private String dueTo; // 날짜 15 | private String title; 16 | private String status; 17 | private String missionType; 18 | private Boolean isRead; 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/domain/entity/constant/MissionStatus.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.domain.entity.constant; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @AllArgsConstructor 8 | public enum MissionStatus { 9 | END, 10 | ONGOING, 11 | SUCCESS, 12 | FAIL, 13 | WAIT 14 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/domain/entity/constant/MissionType.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.domain.entity.constant; 2 | 3 | public enum MissionType { 4 | 5 | ONCE,REPEAT; 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/domain/entity/constant/MissionWay.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.domain.entity.constant; 2 | 3 | public enum MissionWay { 4 | TEXT, 5 | LINK, 6 | PHOTO; 7 | 8 | private String name; 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/domain/repository/MissionRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.domain.repository; 2 | 3 | import com.moing.backend.domain.mission.domain.entity.Mission; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | @Repository 8 | public interface MissionRepository extends JpaRepository,MissionCustomRepository { 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/domain/service/MissionDeleteService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.domain.service; 2 | 3 | import com.moing.backend.domain.mission.domain.repository.MissionRepository; 4 | import com.moing.backend.global.annotation.DomainService; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.transaction.annotation.Transactional; 7 | 8 | @DomainService 9 | @Transactional 10 | @RequiredArgsConstructor 11 | public class MissionDeleteService { 12 | 13 | private final MissionRepository missionRepository; 14 | 15 | public Long deleteMission(Long missionId) { 16 | missionRepository.deleteById(missionId); 17 | return missionId; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/domain/service/MissionSaveService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.domain.service; 2 | 3 | import com.moing.backend.domain.mission.domain.entity.Mission; 4 | import com.moing.backend.domain.mission.domain.repository.MissionRepository; 5 | import com.moing.backend.global.annotation.DomainService; 6 | import lombok.RequiredArgsConstructor; 7 | import org.springframework.transaction.annotation.Transactional; 8 | 9 | @DomainService 10 | @Transactional 11 | @RequiredArgsConstructor 12 | public class MissionSaveService { 13 | 14 | private final MissionRepository missionRepository; 15 | 16 | public void save(Mission mission) { 17 | missionRepository.save(mission); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/domain/service/MissionUpdateService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.domain.service; 2 | 3 | import com.moing.backend.domain.mission.domain.entity.Mission; 4 | import com.moing.backend.domain.mission.domain.repository.MissionRepository; 5 | import com.moing.backend.global.annotation.DomainService; 6 | import lombok.RequiredArgsConstructor; 7 | import org.springframework.transaction.annotation.Transactional; 8 | 9 | @DomainService 10 | @Transactional 11 | @RequiredArgsConstructor 12 | public class MissionUpdateService { 13 | 14 | private final MissionRepository missionRepository; 15 | 16 | public void updateMission(Mission mission) { 17 | missionRepository.save(mission); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/exception/MissionException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.exception; 2 | 3 | import com.moing.backend.global.exception.ApplicationException; 4 | import com.moing.backend.global.response.ErrorCode; 5 | import org.springframework.http.HttpStatus; 6 | 7 | public abstract class MissionException extends ApplicationException { 8 | 9 | protected MissionException(ErrorCode errorCode, HttpStatus httpStatus) { 10 | super(errorCode, httpStatus); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/exception/NoAccessCreateMission.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NoAccessCreateMission extends MissionException { 7 | 8 | public NoAccessCreateMission() { 9 | super(ErrorCode.NO_ACCESS_CREATE_MISSION, 10 | HttpStatus.UNAUTHORIZED); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/exception/NoAccessDeleteMission.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NoAccessDeleteMission extends MissionException { 7 | 8 | public NoAccessDeleteMission() { 9 | super(ErrorCode.NO_ACCESS_DELETE_MISSION, 10 | HttpStatus.UNAUTHORIZED); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/exception/NoAccessUpdateMission.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NoAccessUpdateMission extends MissionException { 7 | 8 | public NoAccessUpdateMission() { 9 | super(ErrorCode.NO_ACCESS_UPDATE_MISSION, 10 | HttpStatus.UNAUTHORIZED); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/exception/NoMoreCreateMission.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NoMoreCreateMission extends MissionException { 7 | 8 | public NoMoreCreateMission() { 9 | super(ErrorCode.NO_MORE_CREATE_MISSION, 10 | HttpStatus.UNAUTHORIZED); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/exception/NotFoundEndMissionException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NotFoundEndMissionException extends MissionException { 7 | 8 | public NotFoundEndMissionException() { 9 | super(ErrorCode.NOT_FOUND_MISSION, 10 | HttpStatus.NOT_FOUND); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/exception/NotFoundMissionException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.exception; 2 | 3 | import com.moing.backend.global.exception.ApplicationException; 4 | import com.moing.backend.global.response.ErrorCode; 5 | import org.springframework.http.HttpStatus; 6 | 7 | public class NotFoundMissionException extends MissionException { 8 | 9 | public NotFoundMissionException() { 10 | super(ErrorCode.NOT_FOUND_MISSION, 11 | HttpStatus.NOT_FOUND); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/exception/NotFoundOngoingMissionException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NotFoundOngoingMissionException extends MissionException { 7 | 8 | public NotFoundOngoingMissionException() { 9 | super(ErrorCode.NOT_FOUND_MISSION, 10 | HttpStatus.NOT_FOUND); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mission/presentation/constant/MissionResponseMessage.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mission.presentation.constant; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public enum MissionResponseMessage { 9 | CREATE_MISSION_SUCCESS("미션 생성을 완료 했습니다"), 10 | READ_MISSION_SUCCESS("미션 조회를 완료 했습니다"), 11 | UPDATE_MISSION_SUCCESS("미션 수정을 완료 했습니다"), 12 | END_MISSION_SUCCESS("미션 종료를 완료 했습니다"), 13 | DELETE_MISSION_SUCCESS("미션 삭제를 완료 했습니다"), 14 | RECOMMEND_MISSION_SUCCESS("미션 추천을 위한 팀 카테고리를 조회 했습니다"), 15 | CONFIRM_MISSION_SUCCESS("미션 설명을 확인했습니다."); 16 | 17 | private final String message; 18 | } 19 | 20 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/application/dto/req/MissionArchiveHeartReq.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.application.dto.req; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Getter 9 | @NoArgsConstructor 10 | @AllArgsConstructor 11 | @Builder 12 | public class MissionArchiveHeartReq { 13 | private Long archiveId; 14 | private String heartStatus; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/application/dto/req/MissionArchiveReq.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.application.dto.req; 2 | 3 | import lombok.*; 4 | 5 | import javax.annotation.Nullable; 6 | import javax.validation.constraints.Size; 7 | 8 | @Builder 9 | @NoArgsConstructor 10 | @Getter 11 | public class MissionArchiveReq { 12 | 13 | private String status; 14 | 15 | @Size(min = 1, max = 1000) 16 | private String archive; //사진일 경우 파일명, 이외에는 text,link 17 | 18 | private String contents; 19 | 20 | @Builder 21 | public MissionArchiveReq(String status, String archive, String contents) { 22 | this.status = status; 23 | this.archive = archive; 24 | this.contents = contents; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/application/dto/res/MissionArchiveHeartRes.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.application.dto.res; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Getter 9 | @NoArgsConstructor 10 | @AllArgsConstructor 11 | @Builder 12 | public class MissionArchiveHeartRes { 13 | private Long archiveId; 14 | private String heartStatus; 15 | private int hearts; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/application/dto/res/MissionArchivePhotoRes.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.application.dto.res; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.util.List; 9 | 10 | @Builder 11 | @Getter 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class MissionArchivePhotoRes { 15 | Long teamId; 16 | List photo; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/application/dto/res/MissionArchiveRes.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.application.dto.res; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | @AllArgsConstructor 8 | @Builder 9 | @NoArgsConstructor 10 | @Getter 11 | public class MissionArchiveRes { 12 | 13 | private Long archiveId; 14 | private String archive; 15 | private String way; 16 | private String createdDate; 17 | private String status; 18 | private Long count; 19 | private String heartStatus; 20 | private Long hearts; 21 | private String contents; 22 | private Long comments; 23 | 24 | public void updateCount(Long count) { 25 | this.count = count; 26 | } 27 | 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/application/dto/res/MissionArchiveStatusRes.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.application.dto.res; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @AllArgsConstructor 9 | @Builder 10 | @NoArgsConstructor 11 | @Getter 12 | public class MissionArchiveStatusRes { 13 | private String total; 14 | private String done; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/application/dto/res/MyArchiveStatus.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.application.dto.res; 2 | 3 | import lombok.*; 4 | 5 | @ToString 6 | @AllArgsConstructor 7 | @Builder 8 | @NoArgsConstructor 9 | @Getter 10 | public class MyArchiveStatus { 11 | private boolean end; 12 | private String status; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/application/dto/res/MyMissionArchiveRes.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.application.dto.res; 2 | 3 | import com.moing.backend.domain.missionArchive.domain.entity.MissionArchive; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Getter; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.util.List; 10 | 11 | @AllArgsConstructor 12 | @Builder 13 | @NoArgsConstructor 14 | @Getter 15 | public class MyMissionArchiveRes { 16 | private String today; 17 | private List archives; 18 | 19 | public void updateArchives(List archives) { 20 | this.archives = archives; 21 | } 22 | 23 | public void updateTodayStatus(Boolean bo) { 24 | if (bo) { 25 | this.today = "True"; 26 | } else { 27 | this.today = "False"; 28 | } 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/application/dto/res/MyTeamsRes.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.application.dto.res; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @NoArgsConstructor 9 | @AllArgsConstructor 10 | @Getter 11 | @Builder 12 | public class MyTeamsRes { 13 | private Long teamId; 14 | private String teamName; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/application/dto/res/PersonalArchiveRes.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.application.dto.res; 2 | 3 | import lombok.*; 4 | 5 | import javax.annotation.Nullable; 6 | 7 | @AllArgsConstructor 8 | @Builder 9 | @NoArgsConstructor 10 | @Getter 11 | public class PersonalArchiveRes { 12 | 13 | private Long archiveId; 14 | private String nickname; 15 | private String profileImg; 16 | 17 | private String archive; 18 | private String createdDate; 19 | private String way; 20 | 21 | private String heartStatus; 22 | private int hearts; 23 | 24 | private String status; 25 | private Long count; 26 | 27 | private Long makerId; 28 | 29 | @Nullable 30 | private String contents; 31 | private Long comments; 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/application/service/MissionArchiveCreateMessage.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.application.service; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public enum MissionArchiveCreateMessage { 9 | 10 | CREATOR_CREATE_MISSION_ARCHIVE("%s님이 미션을 인증했어요!"), 11 | TEAM_AND_TITLE("[%s] %s"); 12 | 13 | private final String message; 14 | 15 | public String to(String creator) { 16 | return String.format(message, creator); 17 | } 18 | 19 | public String teamAndTitle(String team, String title) { 20 | return String.format(message, team, title); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/domain/entity/MissionArchiveStatus.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.domain.entity; 2 | 3 | public enum MissionArchiveStatus { 4 | INCOMPLETE,COMPLETE,SKIP 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/domain/repository/MissionArchiveRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.domain.repository; 2 | 3 | import com.moing.backend.domain.missionArchive.domain.entity.MissionArchive; 4 | import feign.Param; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | import org.springframework.data.jpa.repository.Query; 7 | import org.springframework.stereotype.Repository; 8 | 9 | import java.util.List; 10 | import java.util.Optional; 11 | 12 | @Repository 13 | public interface MissionArchiveRepository extends JpaRepository,MissionArchiveCustomRepository { 14 | 15 | @Query("select m from MissionArchive as m where m.mission.id = :missionId and m.member.memberId =:memberId order by m.createdDate") 16 | Optional> findArchivesByMissionIdAndMemberId(@Param("memberId") Long memberId, @Param("missionId")Long missionId); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/domain/repository/OrderCondition.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.domain.repository; 2 | 3 | public enum OrderCondition { 4 | DUETO,CREATED 5 | 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/domain/service/MissionArchiveDeleteService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.domain.service; 2 | 3 | import com.moing.backend.domain.missionArchive.domain.entity.MissionArchive; 4 | import com.moing.backend.domain.missionArchive.domain.repository.MissionArchiveRepository; 5 | import com.moing.backend.domain.missionComment.domain.service.MissionCommentDeleteService; 6 | import com.moing.backend.global.annotation.DomainService; 7 | import lombok.RequiredArgsConstructor; 8 | import org.springframework.transaction.annotation.Transactional; 9 | 10 | @DomainService 11 | @Transactional 12 | @RequiredArgsConstructor 13 | public class MissionArchiveDeleteService { 14 | 15 | private final MissionArchiveRepository missionArchiveRepository; 16 | 17 | public void deleteMissionArchive(MissionArchive missionArchive) { 18 | missionArchiveRepository.delete(missionArchive); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/domain/service/MissionArchiveSaveService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.domain.service; 2 | 3 | import com.moing.backend.domain.missionArchive.domain.entity.MissionArchive; 4 | import com.moing.backend.domain.missionArchive.domain.repository.MissionArchiveRepository; 5 | import com.moing.backend.global.annotation.DomainService; 6 | import lombok.RequiredArgsConstructor; 7 | import org.springframework.transaction.annotation.Transactional; 8 | 9 | @DomainService 10 | @Transactional 11 | @RequiredArgsConstructor 12 | public class MissionArchiveSaveService { 13 | 14 | private final MissionArchiveRepository missionArchiveRepository; 15 | 16 | public MissionArchive save(MissionArchive missionArchive) { 17 | return missionArchiveRepository.save(missionArchive); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/exception/MissionArchiveException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.exception; 2 | 3 | import com.moing.backend.global.exception.ApplicationException; 4 | import com.moing.backend.global.response.ErrorCode; 5 | import org.springframework.http.HttpStatus; 6 | 7 | public abstract class MissionArchiveException extends ApplicationException { 8 | 9 | protected MissionArchiveException(ErrorCode errorCode, HttpStatus httpStatus) { 10 | super(errorCode, httpStatus); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/exception/NoAccessMissionArchiveException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NoAccessMissionArchiveException extends MissionArchiveException { 7 | public NoAccessMissionArchiveException() { 8 | super(ErrorCode.NO_MORE_ARCHIVE_ERROR, HttpStatus.NOT_FOUND); 9 | 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/exception/NoMoreMissionArchiveException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NoMoreMissionArchiveException extends MissionArchiveException { 7 | 8 | public NoMoreMissionArchiveException() { 9 | super(ErrorCode.NO_MORE_ARCHIVE_ERROR, 10 | HttpStatus.NOT_FOUND); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/exception/NotFoundMissionArchiveException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NotFoundMissionArchiveException extends MissionArchiveException { 7 | 8 | public NotFoundMissionArchiveException() { 9 | super(ErrorCode.NOT_FOUND_MISSION_ARCHIVE, 10 | HttpStatus.NOT_FOUND); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionArchive/exception/NotYetMissionArchiveException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionArchive.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NotYetMissionArchiveException extends MissionArchiveException { 7 | 8 | public NotYetMissionArchiveException() { 9 | super(ErrorCode.NOT_YET_MISSION_ARCHIVE, 10 | HttpStatus.NOT_FOUND); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionComment/domain/repository/MissionCommentCustomRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionComment.domain.repository; 2 | 3 | import com.moing.backend.domain.comment.application.dto.response.GetCommentResponse; 4 | import com.moing.backend.domain.history.application.dto.response.NewUploadInfo; 5 | import com.moing.backend.domain.teamMember.domain.entity.TeamMember; 6 | 7 | import java.util.List; 8 | import java.util.Optional; 9 | 10 | public interface MissionCommentCustomRepository { 11 | GetCommentResponse findMissionCommentAll(Long missionArchiveId, TeamMember teamMember); 12 | 13 | Optional> findNewUploadInfo(Long memberId, Long missionArchiveId); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionComment/domain/repository/MissionCommentRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionComment.domain.repository; 2 | 3 | import com.moing.backend.domain.missionComment.domain.entity.MissionComment; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | import java.util.List; 7 | import java.util.Optional; 8 | 9 | public interface MissionCommentRepository extends JpaRepository, MissionCommentCustomRepository { 10 | 11 | Optional findMissionCommentByMissionCommentId(Long missionCommentId); 12 | 13 | void deleteAllMissionCommentsByMissionArchiveId(Long missionArchiveId); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionComment/domain/service/MissionCommentSaveService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionComment.domain.service; 2 | 3 | import com.moing.backend.domain.comment.domain.service.CommentSaveService; 4 | import com.moing.backend.domain.missionComment.domain.entity.MissionComment; 5 | import com.moing.backend.domain.missionComment.domain.repository.MissionCommentRepository; 6 | import com.moing.backend.global.annotation.DomainService; 7 | import lombok.RequiredArgsConstructor; 8 | 9 | @DomainService 10 | @RequiredArgsConstructor 11 | public class MissionCommentSaveService implements CommentSaveService { 12 | 13 | private final MissionCommentRepository missionCommentRepository; 14 | 15 | @Override 16 | public MissionComment saveComment(MissionComment comment) { 17 | return missionCommentRepository.save(comment); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionComment/exception/MissionCommentException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionComment.exception; 2 | 3 | import com.moing.backend.global.exception.ApplicationException; 4 | import com.moing.backend.global.response.ErrorCode; 5 | import org.springframework.http.HttpStatus; 6 | 7 | public abstract class MissionCommentException extends ApplicationException { 8 | protected MissionCommentException(ErrorCode errorCode, HttpStatus httpStatus) { 9 | super(errorCode, httpStatus); 10 | } 11 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionComment/exception/NotAuthByMissionCommentException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionComment.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NotAuthByMissionCommentException extends MissionCommentException { 7 | public NotAuthByMissionCommentException() { 8 | super(ErrorCode.NOT_AUTH_BY_MISSION_COMMENT_ID_ERROR, 9 | HttpStatus.NOT_FOUND); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionComment/exception/NotFoundByMissionCommentIdException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionComment.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NotFoundByMissionCommentIdException extends MissionCommentException { 7 | public NotFoundByMissionCommentIdException() { 8 | super(ErrorCode.NOT_FOUND_BY_MISSION_COMMENT_ID_ERROR, 9 | HttpStatus.NOT_FOUND); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionHeart/application/dto/MissionHeartRes.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionHeart.application.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @AllArgsConstructor 9 | @Builder 10 | @NoArgsConstructor 11 | @Getter 12 | public class MissionHeartRes { 13 | private Long missionArchiveId; 14 | private String missionHeartStatus; 15 | private int hearts; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionHeart/domain/constant/MissionHeartStatus.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionHeart.domain.constant; 2 | 3 | public enum MissionHeartStatus { 4 | True,False 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionHeart/domain/repository/MissionHeartCustomRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionHeart.domain.repository; 2 | 3 | import com.moing.backend.domain.missionHeart.domain.entity.MissionHeart; 4 | import org.springframework.stereotype.Repository; 5 | 6 | import java.util.Optional; 7 | 8 | @Repository 9 | public interface MissionHeartCustomRepository { 10 | 11 | boolean findAlreadyHeart(Long memberId, Long archiveId); 12 | MissionHeart findByMemberIdAndArchiveId(Long memberId, Long archiveId); 13 | 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionHeart/domain/repository/MissionHeartRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionHeart.domain.repository; 2 | 3 | import com.moing.backend.domain.missionHeart.domain.entity.MissionHeart; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface MissionHeartRepository extends JpaRepository,MissionHeartCustomRepository { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionHeart/domain/service/MissionHeartSaveService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionHeart.domain.service; 2 | 3 | import com.moing.backend.domain.missionHeart.domain.entity.MissionHeart; 4 | import com.moing.backend.domain.missionHeart.domain.repository.MissionHeartCustomRepository; 5 | import com.moing.backend.domain.missionHeart.domain.repository.MissionHeartRepository; 6 | import com.moing.backend.global.annotation.DomainService; 7 | import lombok.RequiredArgsConstructor; 8 | import org.springframework.transaction.annotation.Transactional; 9 | 10 | @DomainService 11 | @Transactional 12 | @RequiredArgsConstructor 13 | public class MissionHeartSaveService { 14 | 15 | private final MissionHeartRepository missionHeartRepository; 16 | 17 | public MissionHeart save(MissionHeart missionHeart) { 18 | return missionHeartRepository.save(missionHeart); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionHeart/exception/MissionHeartException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionHeart.exception; 2 | 3 | import com.moing.backend.global.exception.ApplicationException; 4 | import com.moing.backend.global.response.ErrorCode; 5 | import org.springframework.http.HttpStatus; 6 | 7 | public abstract class MissionHeartException extends ApplicationException { 8 | protected MissionHeartException(ErrorCode errorCode, HttpStatus httpStatus) { 9 | super(errorCode, httpStatus); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionHeart/exception/NoAccessMissionHeartException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionHeart.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NoAccessMissionHeartException extends MissionHeartException { 7 | public NoAccessMissionHeartException() { 8 | super(ErrorCode.NO_ACCESS_HEART_FOR_ME, HttpStatus.NOT_FOUND); 9 | 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionRead/application/mapper/MissionReadMapper.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionRead.application.mapper; 2 | 3 | import com.moing.backend.domain.member.domain.entity.Member; 4 | import com.moing.backend.domain.missionRead.domain.entity.MissionRead; 5 | import com.moing.backend.domain.team.domain.entity.Team; 6 | import org.springframework.stereotype.Component; 7 | 8 | @Component 9 | public class MissionReadMapper { 10 | public static MissionRead toMissionRead(Team team, Member member){ 11 | MissionRead missionRead=new MissionRead(); 12 | missionRead.updateTeam(team); 13 | missionRead.updateMember(member); 14 | return missionRead; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/missionRead/domain/repository/MissionReadRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionRead.domain.repository; 2 | 3 | import com.moing.backend.domain.member.domain.entity.Member; 4 | import com.moing.backend.domain.mission.domain.entity.Mission; 5 | import com.moing.backend.domain.missionRead.domain.entity.MissionRead; 6 | import com.moing.backend.domain.team.domain.entity.Team; 7 | import org.springframework.data.jpa.repository.JpaRepository; 8 | 9 | import java.util.List; 10 | 11 | public interface MissionReadRepository extends JpaRepository { 12 | 13 | List findMissionReadByMissionAndMemberAndTeam(Mission mission, Member member, Team team); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mypage/application/dto/request/UpdateProfileRequest.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mypage.application.dto.request; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Builder 9 | @AllArgsConstructor 10 | @NoArgsConstructor 11 | @Getter 12 | public class UpdateProfileRequest { 13 | 14 | private String profileImage; 15 | private String nickName; 16 | private String introduction; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mypage/application/dto/request/WithdrawRequest.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mypage.application.dto.request; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import javax.validation.constraints.NotBlank; 9 | import javax.validation.constraints.Size; 10 | 11 | @Builder 12 | @AllArgsConstructor 13 | @NoArgsConstructor 14 | @Getter 15 | public class WithdrawRequest { 16 | @NotBlank(message = "reason 을 입력해주세요.") 17 | @Size(min = 1, max = 500, message="reason 은 최소 1개, 최대 500개의 문자만 입력 가능합니다.") 18 | private String reason; 19 | 20 | @NotBlank(message = "socialToken 을 입력해주세요.") 21 | private String socialToken; 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mypage/application/dto/response/GetAlarmResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mypage.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Builder 9 | @AllArgsConstructor 10 | @NoArgsConstructor 11 | @Getter 12 | public class GetAlarmResponse { 13 | 14 | private boolean isNewUploadPush; 15 | private boolean isRemindPush; 16 | private boolean isFirePush; 17 | private boolean isCommentPush; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mypage/application/dto/response/GetMyPageResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mypage.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.util.ArrayList; 9 | import java.util.List; 10 | 11 | @Builder 12 | @AllArgsConstructor 13 | @NoArgsConstructor 14 | @Getter 15 | public class GetMyPageResponse { 16 | private String profileImage; 17 | private String nickName; 18 | private String introduction; 19 | private List categories=new ArrayList<>(); 20 | private List getMyPageTeamBlocks = new ArrayList<>(); 21 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mypage/application/dto/response/GetMyPageTeamBlock.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mypage.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Builder 9 | @AllArgsConstructor 10 | @NoArgsConstructor 11 | @Getter 12 | public class GetMyPageTeamBlock { 13 | private Long teamId; 14 | private String teamName; 15 | private String category; 16 | private String profileImgUrl; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mypage/application/dto/response/GetProfileResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mypage.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Builder 9 | @AllArgsConstructor 10 | @NoArgsConstructor 11 | @Getter 12 | public class GetProfileResponse { 13 | private String profileImage; 14 | private String nickName; 15 | private String introduction; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mypage/application/service/SignOutUseCase.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mypage.application.service; 2 | 3 | import com.moing.backend.domain.member.domain.entity.Member; 4 | import com.moing.backend.domain.member.domain.service.MemberGetService; 5 | import com.moing.backend.global.config.security.jwt.TokenUtil; 6 | import lombok.RequiredArgsConstructor; 7 | import org.springframework.stereotype.Service; 8 | 9 | import javax.transaction.Transactional; 10 | 11 | @Service 12 | @Transactional 13 | @RequiredArgsConstructor 14 | public class SignOutUseCase { 15 | 16 | private final TokenUtil tokenUtil; 17 | private final MemberGetService memberGetService; 18 | 19 | public void signOut(String socialId){ 20 | tokenUtil.expireRefreshToken(socialId); 21 | Member member=memberGetService.getMemberBySocialId(socialId); 22 | member.signOut(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mypage/domain/entity/Feedback.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mypage.domain.entity; 2 | 3 | import com.moing.backend.global.entity.BaseTimeEntity; 4 | import lombok.*; 5 | 6 | import javax.persistence.*; 7 | 8 | 9 | @Builder 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | @Getter 13 | @Entity 14 | public class Feedback extends BaseTimeEntity { 15 | 16 | @Id 17 | @GeneratedValue(strategy = GenerationType.IDENTITY) 18 | @Column(name = "feedback_id") 19 | private Long feedbackId; 20 | 21 | @Column(nullable = false) 22 | private Long memberId; 23 | 24 | @Column(nullable = false, length = 500) 25 | private String reason; 26 | 27 | public Feedback(Long memberId, String reason){ 28 | this.memberId=memberId; 29 | this.reason=reason; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mypage/domain/repository/FeedbackRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mypage.domain.repository; 2 | 3 | import com.moing.backend.domain.mypage.domain.entity.Feedback; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface FeedbackRepository extends JpaRepository { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mypage/domain/service/FeedbackSaveService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mypage.domain.service; 2 | 3 | import com.moing.backend.domain.member.domain.entity.Member; 4 | import com.moing.backend.domain.mypage.application.dto.request.WithdrawRequest; 5 | import com.moing.backend.domain.mypage.domain.entity.Feedback; 6 | import com.moing.backend.domain.mypage.domain.repository.FeedbackRepository; 7 | import com.moing.backend.global.annotation.DomainService; 8 | import lombok.RequiredArgsConstructor; 9 | 10 | import javax.transaction.Transactional; 11 | 12 | @DomainService 13 | @RequiredArgsConstructor 14 | public class FeedbackSaveService { 15 | private final FeedbackRepository feedbackRepository; 16 | 17 | @Transactional 18 | public void saveFeedback(Member member, WithdrawRequest withdrawRequest){ 19 | Feedback feedback=new Feedback(member.getMemberId(), withdrawRequest.getReason()); 20 | feedbackRepository.save(feedback); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mypage/exception/AlarmInvalidException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mypage.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class AlarmInvalidException extends MyPageException { 7 | public AlarmInvalidException() { 8 | super(ErrorCode.INVALID_ALARM_ERROR, 9 | HttpStatus.NOT_FOUND); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mypage/exception/ExistingTeamException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mypage.exception; 2 | 3 | import com.moing.backend.global.exception.ApplicationException; 4 | import com.moing.backend.global.response.ErrorCode; 5 | import org.springframework.http.HttpStatus; 6 | 7 | public class ExistingTeamException extends ApplicationException { 8 | public ExistingTeamException() { 9 | super(ErrorCode.EXISTING_TEAM_ERROR, 10 | HttpStatus.NOT_FOUND); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mypage/exception/MyPageException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mypage.exception; 2 | 3 | import com.moing.backend.global.exception.ApplicationException; 4 | import com.moing.backend.global.response.ErrorCode; 5 | import org.springframework.http.HttpStatus; 6 | 7 | public abstract class MyPageException extends ApplicationException { 8 | protected MyPageException(ErrorCode errorCode, HttpStatus httpStatus) { 9 | super(errorCode, httpStatus); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/mypage/presentation/constant/MypageResponseMessage.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.mypage.presentation.constant; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public enum MypageResponseMessage { 9 | TEST_SIGNUP_SUCCESS("회원가입이 되었습니다."), 10 | SIGN_OUT_SUCCESS("로그아웃을 했습니다"), 11 | WITHDRAWAL_SUCCESS("회원탈퇴를 했습니다"), 12 | GET_MYPAGE_SUCCESS("마이페이지를 조회했습니다"), 13 | GET_PROFILE_SUCCESS("프로필을 조회했습니다"), 14 | UPDATE_PROFILE_SUCCESS("프로필을 수정했습니다"), 15 | GET_ALARM_SUCCESS("알람 정보를 조회했습니다"), 16 | UPDATE_ALARM_SUCCESS("알람 정보를 수정했습니다"); 17 | private final String message; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/report/application/dto/BlockMemberRes.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.report.application.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | 8 | @Builder 9 | @Getter 10 | @Setter 11 | @AllArgsConstructor 12 | public class BlockMemberRes { 13 | private Long targetId; 14 | private String nickName; 15 | private String introduce; 16 | private String profileImg; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/report/application/mapper/ReportMapper.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.report.application.mapper; 2 | 3 | import com.moing.backend.domain.report.domain.entity.Report; 4 | import com.moing.backend.domain.report.domain.entity.constant.ReportType; 5 | import com.moing.backend.global.annotation.Mapper; 6 | 7 | @Mapper 8 | public class ReportMapper { 9 | 10 | public static Report mapToReport(Long memberId, Long targetId, String reportType,String targetMemberNickName) { 11 | return Report.builder() 12 | .reportMemberId(memberId) 13 | .reportType(ReportType.valueOf(reportType)) 14 | .targetId(targetId) 15 | .targetMemberNickName(targetMemberNickName) 16 | .build(); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/report/application/service/ReportStrategy.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.report.application.service; 2 | 3 | public interface ReportStrategy { 4 | String processReport(Long targetId); 5 | 6 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/report/domain/entity/Report.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.report.domain.entity; 2 | 3 | 4 | import com.moing.backend.domain.report.domain.entity.constant.ReportType; 5 | import com.moing.backend.global.entity.BaseTimeEntity; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Getter; 9 | import lombok.NoArgsConstructor; 10 | 11 | import javax.persistence.*; 12 | 13 | @Entity 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | @Getter 17 | @Builder 18 | public class Report extends BaseTimeEntity { 19 | 20 | @Id 21 | @GeneratedValue(strategy = GenerationType.IDENTITY) 22 | @Column(name = "report_id") 23 | private Long id; 24 | 25 | @Enumerated(EnumType.STRING) 26 | private ReportType reportType; 27 | 28 | private Long reportMemberId; 29 | private Long targetId; 30 | private String targetMemberNickName; 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/report/domain/entity/constant/ReportType.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.report.domain.entity.constant; 2 | 3 | public enum ReportType { 4 | MISSION, BOARD, BCOMMENT, MCOMMENT 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/report/domain/repository/ReportRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.report.domain.repository; 2 | 3 | import com.moing.backend.domain.report.domain.entity.Report; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface ReportRepository extends JpaRepository { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/report/domain/service/ReportSaveService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.report.domain.service; 2 | 3 | import com.moing.backend.domain.report.domain.entity.Report; 4 | import com.moing.backend.domain.report.domain.repository.ReportRepository; 5 | import com.moing.backend.global.annotation.DomainService; 6 | import lombok.RequiredArgsConstructor; 7 | 8 | @DomainService 9 | @RequiredArgsConstructor 10 | public class ReportSaveService { 11 | 12 | private final ReportRepository reportRepository; 13 | 14 | public Report save(Report report) { 15 | return reportRepository.save(report); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/report/presentation/constant/ReportResponseMessage.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.report.presentation.constant; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public enum ReportResponseMessage { 9 | 10 | CREATE_REPORT_SUCCESS("게시글 신고를 완료 했습니다."), 11 | REPORT_MESSAGE("신고 접수로 삭제되었습니다."), 12 | REPORT_PHOTO("https://mo-ing.s3.ap-northeast-2.amazonaws.com/reportImage.png"); 13 | 14 | private final String message; 15 | 16 | 17 | } 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/report/presentation/constant/StrategyCategory.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.report.presentation.constant; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public enum StrategyCategory { 9 | 10 | BCOMMENT("boardCommentReportStrategy"), 11 | BOARD("boardReportStrategy"), 12 | MISSION("missionArchiveReportStrategy"), 13 | MCOMMENT("missionCommentReportStrategy"); 14 | 15 | private final String strategyName; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/statistics/application/dto/DailyStats.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.statistics.application.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | 7 | import javax.persistence.SqlResultSetMapping; 8 | 9 | @Getter 10 | @AllArgsConstructor 11 | @NoArgsConstructor 12 | public class DailyStats { 13 | 14 | private long todayNewMembers; 15 | private long yesterdayNewMembers; 16 | private long todayNewTeams; 17 | private long yesterdayNewTeams; 18 | private long todayRepeatMission; 19 | private long yesterdayRepeatMission; 20 | private long todayOnceMission; 21 | private long yesterdayOnceMission; 22 | 23 | } 24 | 25 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/statistics/application/service/DAUFire.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.statistics.application.service; 2 | 3 | import com.moing.backend.domain.fire.domain.service.FireQueryService; 4 | import com.moing.backend.domain.statistics.domain.constant.DAUStatusType; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.stereotype.Service; 7 | 8 | @RequiredArgsConstructor 9 | @Service 10 | public class DAUFire implements DAUProvider { 11 | 12 | private final FireQueryService fireQueryService; 13 | 14 | @Override 15 | public Long getTodayStats() { 16 | return fireQueryService.getTodayFires(); 17 | } 18 | 19 | @Override 20 | public Long getYesterdayStats() { 21 | return fireQueryService.getYesterdayFires(); 22 | } 23 | 24 | @Override 25 | public DAUStatusType getSupportedType() { 26 | return DAUStatusType.DAILY_FIRE_COUNT; 27 | } 28 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/statistics/application/service/DAUMember.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.statistics.application.service; 2 | 3 | import com.moing.backend.domain.member.domain.service.MemberGetService; 4 | import com.moing.backend.domain.statistics.domain.constant.DAUStatusType; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.stereotype.Service; 7 | 8 | @RequiredArgsConstructor 9 | @Service 10 | public class DAUMember implements DAUProvider { 11 | 12 | private final MemberGetService memberGetService; 13 | 14 | @Override 15 | public Long getTodayStats() { 16 | return memberGetService.getTodayNewMembers(); 17 | } 18 | 19 | @Override 20 | public Long getYesterdayStats() { 21 | return memberGetService.getYesterdayNewMembers(); 22 | } 23 | 24 | @Override 25 | public DAUStatusType getSupportedType() { 26 | return DAUStatusType.DAILY_MEMBER_COUNT; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/statistics/application/service/DAUMissionArchive.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.statistics.application.service; 2 | 3 | import com.moing.backend.domain.missionArchive.domain.service.MissionArchiveQueryService; 4 | import com.moing.backend.domain.statistics.domain.constant.DAUStatusType; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.stereotype.Service; 7 | 8 | @RequiredArgsConstructor 9 | @Service 10 | public class DAUMissionArchive implements DAUProvider { 11 | 12 | private final MissionArchiveQueryService missionArchiveQueryService; 13 | 14 | @Override 15 | public Long getTodayStats() { 16 | return missionArchiveQueryService.getTodayMissionArchives(); 17 | } 18 | 19 | @Override 20 | public Long getYesterdayStats() { 21 | return missionArchiveQueryService.getYesterdayMissionArchives(); 22 | } 23 | 24 | @Override 25 | public DAUStatusType getSupportedType() { 26 | return DAUStatusType.DAILY_MISSION_ARCHIVE_COUNT; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/statistics/application/service/DAUOnceMission.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.statistics.application.service; 2 | 3 | import com.moing.backend.domain.mission.domain.service.MissionQueryService; 4 | import com.moing.backend.domain.statistics.domain.constant.DAUStatusType; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.stereotype.Service; 7 | 8 | @RequiredArgsConstructor 9 | @Service 10 | public class DAUOnceMission implements DAUProvider { 11 | private final MissionQueryService missionQueryService; 12 | 13 | @Override 14 | public Long getTodayStats() { 15 | return missionQueryService.getTodayOnceMissions(); 16 | } 17 | 18 | @Override 19 | public Long getYesterdayStats() { 20 | return missionQueryService.getYesterdayOnceMissions(); 21 | } 22 | 23 | @Override 24 | public DAUStatusType getSupportedType() { 25 | return DAUStatusType.DAILY_ONCE_MISSION_COUNT; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/statistics/application/service/DAUProvider.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.statistics.application.service; 2 | 3 | import com.moing.backend.domain.statistics.domain.constant.DAUStatusType; 4 | 5 | public interface DAUProvider { 6 | Long getTodayStats(); 7 | Long getYesterdayStats(); 8 | DAUStatusType getSupportedType(); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/statistics/application/service/DAURepeatMission.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.statistics.application.service; 2 | 3 | import com.moing.backend.domain.mission.domain.service.MissionQueryService; 4 | import com.moing.backend.domain.statistics.domain.constant.DAUStatusType; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.stereotype.Service; 7 | 8 | @RequiredArgsConstructor 9 | @Service 10 | public class DAURepeatMission implements DAUProvider { 11 | private final MissionQueryService missionQueryService; 12 | 13 | @Override 14 | public Long getTodayStats() { 15 | return missionQueryService.getTodayRepeatMissions(); 16 | } 17 | 18 | @Override 19 | public Long getYesterdayStats() { 20 | return missionQueryService.getYesterdayRepeatMissions(); 21 | } 22 | 23 | @Override 24 | public DAUStatusType getSupportedType() { 25 | return DAUStatusType.DAILY_REPEAT_MISSION_COUNT; 26 | } 27 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/statistics/application/service/DAUTeam.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.statistics.application.service; 2 | 3 | import com.moing.backend.domain.statistics.domain.constant.DAUStatusType; 4 | import com.moing.backend.domain.team.domain.service.TeamGetService; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.stereotype.Service; 7 | 8 | @RequiredArgsConstructor 9 | @Service 10 | public class DAUTeam implements DAUProvider { 11 | 12 | private final TeamGetService teamGetService; 13 | 14 | @Override 15 | public Long getTodayStats() { 16 | return teamGetService.getTodayNewTeams(); 17 | } 18 | 19 | @Override 20 | public Long getYesterdayStats() { 21 | return teamGetService.getYesterdayNewTeams(); 22 | } 23 | 24 | @Override 25 | public DAUStatusType getSupportedType() { 26 | return DAUStatusType.DAILY_TEAM_COUNT; 27 | } 28 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/statistics/domain/constant/DAUStatusType.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.statistics.domain.constant; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | @AllArgsConstructor 7 | @Getter 8 | public enum DAUStatusType { 9 | DAILY_TEAM_COUNT("[DAU] 일일 모임 생성 수"), 10 | DAILY_MEMBER_COUNT("[DAU] 일일 신규 가입자 수"), 11 | DAILY_REPEAT_MISSION_COUNT("[DAU] 일일 반복 미션 생성 개수"), 12 | DAILY_ONCE_MISSION_COUNT("[DAU] 일일 한번 미션 생성 개수"), 13 | DAILY_MISSION_ARCHIVE_COUNT("[DAU] 일일 미션 인증 개수"), 14 | DAILY_FIRE_COUNT("[DAU] 일일 불 던지기 생성 개수"); 15 | private final String message; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/application/dto/request/UpdateTeamRequest.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.application.dto.request; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import javax.validation.constraints.NotBlank; 9 | import javax.validation.constraints.Size; 10 | 11 | @AllArgsConstructor 12 | @Builder 13 | @NoArgsConstructor 14 | @Getter 15 | public class UpdateTeamRequest { 16 | 17 | private String name; 18 | 19 | private String introduction; 20 | 21 | private String profileImgUrl; 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/application/dto/response/CreateTeamResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Getter 9 | @Builder 10 | @AllArgsConstructor 11 | @NoArgsConstructor 12 | public class CreateTeamResponse { 13 | private Long teamId; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/application/dto/response/DeleteTeamResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Getter 9 | @Builder 10 | @AllArgsConstructor 11 | @NoArgsConstructor 12 | public class DeleteTeamResponse { 13 | private Long teamId; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/application/dto/response/GetCurrentStatusResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | @Getter 8 | @Builder 9 | @AllArgsConstructor 10 | public class GetCurrentStatusResponse { 11 | 12 | private String name; 13 | 14 | private String introduction; 15 | 16 | private String profileImgUrl; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/application/dto/response/GetLeaderInfoResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | @Getter 8 | @Builder 9 | @AllArgsConstructor 10 | public class GetLeaderInfoResponse { 11 | 12 | private Long teamId; 13 | private String teamName; 14 | private Long leaderId; 15 | private String leaderName; 16 | private String leaderFcmToken; 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/application/dto/response/GetNewTeamResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | import java.time.LocalDateTime; 8 | 9 | @Getter 10 | @Builder 11 | @AllArgsConstructor 12 | public class GetNewTeamResponse { 13 | 14 | private String teamName; 15 | private String category; 16 | private String promise; 17 | private String introduction; 18 | private String profileImgUrl; 19 | private LocalDateTime createdDate; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/application/dto/response/GetTeamCountResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.application.dto.response; 2 | 3 | import com.querydsl.core.annotations.QueryProjection; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Getter; 7 | 8 | @Getter 9 | @Builder 10 | @AllArgsConstructor 11 | public class GetTeamCountResponse { 12 | 13 | private String teamName; 14 | private Long numOfTeam; 15 | private String leaderName; 16 | private String memberName; 17 | 18 | public void updateCount(Long count){ 19 | this.numOfTeam=count; 20 | } 21 | 22 | public void updateMemberName(String nickName){ 23 | this.memberName=nickName; 24 | } 25 | 26 | @QueryProjection 27 | public GetTeamCountResponse(String teamName, String leaderName){ 28 | this.teamName=teamName; 29 | this.leaderName=leaderName; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/application/dto/response/GetTeamDetailResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | @Getter 8 | @Builder 9 | @AllArgsConstructor 10 | public class GetTeamDetailResponse { 11 | private Integer boardNum; //안 읽은 게시글 12 | private TeamInfo teamInfo; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/application/dto/response/ReviewTeamResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Getter 9 | @Builder 10 | @AllArgsConstructor 11 | @NoArgsConstructor 12 | public class ReviewTeamResponse { 13 | 14 | private Long teamId; 15 | private String teamName; 16 | private Integer numOfMember; 17 | private Long duration; //걸린시간(단위:날짜) 18 | private Long numOfMission; 19 | private Integer levelOfFire; //불꽃 레벨 20 | private Boolean isLeader; 21 | private String memberName; 22 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/application/dto/response/TeamInfo.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | import java.time.LocalDateTime; 8 | import java.util.ArrayList; 9 | import java.util.List; 10 | 11 | @AllArgsConstructor 12 | @Getter 13 | @Builder 14 | public class TeamInfo { 15 | private Boolean isDeleted; 16 | private LocalDateTime deletionTime; 17 | private String teamName; //소모임 이름 18 | private Integer numOfMember; //소모임원 수 19 | private String category; //카테고리 20 | private String introduction; //소개 21 | private Long currentUserId; //현재 유저 아이디 22 | private List teamMemberInfoList = new ArrayList<>(); //소모임원 정보 23 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/application/dto/response/TeamMemberInfo.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.application.dto.response; 2 | 3 | import com.querydsl.core.annotations.QueryProjection; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Getter; 7 | 8 | @Getter 9 | @AllArgsConstructor 10 | @Builder 11 | public class TeamMemberInfo { 12 | private Long memberId; 13 | private String nickName; 14 | private String profileImage; 15 | private String introduction; 16 | private Boolean isLeader; 17 | 18 | @QueryProjection 19 | public TeamMemberInfo(Long memberId, String nickName, String profileImage, String introduction, Long leaderId){ 20 | this.memberId=memberId; 21 | this.nickName=nickName; 22 | this.profileImage=profileImage; 23 | this.introduction=introduction; 24 | this.isLeader=memberId.equals(leaderId); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/application/dto/response/UpdateTeamResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.application.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | @Getter 8 | @AllArgsConstructor 9 | @Builder 10 | public class UpdateTeamResponse { 11 | private Long teamId; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/application/service/CheckLeaderUseCase.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.application.service; 2 | 3 | import com.moing.backend.domain.member.domain.entity.Member; 4 | import com.moing.backend.domain.team.domain.entity.Team; 5 | import com.moing.backend.domain.team.exception.NotAuthByTeamException; 6 | import lombok.RequiredArgsConstructor; 7 | import org.springframework.stereotype.Service; 8 | 9 | import javax.transaction.Transactional; 10 | import java.util.Objects; 11 | 12 | @Service 13 | @Transactional 14 | @RequiredArgsConstructor 15 | public class CheckLeaderUseCase { 16 | public boolean isTeamLeader(Member member, Team team) { 17 | return Objects.equals(member.getMemberId(), team.getLeaderId()); 18 | } 19 | 20 | public void validateTeamLeader(Member member, Team team) { 21 | if (!isTeamLeader(member, team)) { 22 | throw new NotAuthByTeamException(); 23 | } 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/domain/constant/ApprovalStatus.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.domain.constant; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.RequiredArgsConstructor; 6 | 7 | @Getter 8 | @AllArgsConstructor 9 | public enum ApprovalStatus { 10 | NO_CONFIRMATION("확인안함"), 11 | APPROVAL("승인"), 12 | REJECTION("거절"); 13 | private final String message; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/domain/constant/Category.java: -------------------------------------------------------------------------------- 1 | //package com.moing.backend.domain.team.domain.constant; 2 | // 3 | //import lombok.Getter; 4 | //import lombok.RequiredArgsConstructor; 5 | // 6 | //@Getter 7 | //@RequiredArgsConstructor 8 | //public enum Category{ 9 | // SPORTS("스포츠/운동"), 10 | // HABIT("생활습관 개선"), 11 | // TEST("시험/취업준비"), 12 | // STUDY("스터디/공부"), 13 | // READING("독서"), 14 | // ETC("그외 자기계발"); 15 | // 16 | // private final String message; 17 | //} 18 | // 19 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/domain/repository/TeamRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.domain.repository; 2 | 3 | import com.moing.backend.domain.team.domain.entity.Team; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | import java.util.Optional; 7 | 8 | public interface TeamRepository extends JpaRepository, TeamCustomRepository { 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/domain/service/TeamSaveService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.domain.service; 2 | 3 | import com.moing.backend.domain.team.domain.entity.Team; 4 | import com.moing.backend.domain.team.domain.repository.TeamRepository; 5 | import com.moing.backend.global.annotation.DomainService; 6 | import lombok.RequiredArgsConstructor; 7 | 8 | @DomainService 9 | @RequiredArgsConstructor 10 | public class TeamSaveService { 11 | private final TeamRepository teamRepository; 12 | public void saveTeam(Team team){ 13 | teamRepository.save(team); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/domain/service/TeamUpdateService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.domain.service; 2 | 3 | import com.moing.backend.domain.team.domain.repository.TeamRepository; 4 | import com.moing.backend.global.annotation.DomainService; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.context.ApplicationEventPublisher; 7 | 8 | import java.util.List; 9 | 10 | @DomainService 11 | @RequiredArgsConstructor 12 | public class TeamUpdateService { 13 | 14 | private final TeamRepository teamRepository; 15 | private final ApplicationEventPublisher eventPublisher; 16 | public void updateTeamStatus(boolean isApproved, List teamIds){ 17 | teamRepository.updateTeamStatus(isApproved, teamIds); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/exception/AlreadyJoinTeamException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class AlreadyJoinTeamException extends TeamException{ 7 | public AlreadyJoinTeamException(){ 8 | super(ErrorCode.ALREADY_JOIN_ERROR, 9 | HttpStatus.UNAUTHORIZED); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/exception/AlreadyWithdrawTeamException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class AlreadyWithdrawTeamException extends TeamException{ 7 | public AlreadyWithdrawTeamException(){ 8 | super(ErrorCode.ALREADY_WITHDRAW_ERROR, 9 | HttpStatus.NOT_FOUND); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/exception/DeletedTeamException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class DeletedTeamException extends TeamException{ 7 | public DeletedTeamException(){ 8 | super(ErrorCode.DELETED_TEAM_ERROR, 9 | HttpStatus.NOT_FOUND); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/exception/NotAuthByTeamException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NotAuthByTeamException extends TeamException{ 7 | public NotAuthByTeamException(){ 8 | super(ErrorCode.NOT_AUTH_BY_TEAM_ERROR, 9 | HttpStatus.UNAUTHORIZED); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/exception/NotFoundByTeamIdException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NotFoundByTeamIdException extends TeamException{ 7 | public NotFoundByTeamIdException(){ 8 | super(ErrorCode.NOT_FOUND_BY_TEAM_ID_ERROR, 9 | HttpStatus.NOT_FOUND); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/exception/TeamException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.exception; 2 | 3 | import com.moing.backend.global.exception.ApplicationException; 4 | import com.moing.backend.global.response.ErrorCode; 5 | import org.springframework.http.HttpStatus; 6 | 7 | public abstract class TeamException extends ApplicationException { 8 | protected TeamException(ErrorCode errorCode, HttpStatus httpStatus) { 9 | super(errorCode, httpStatus); 10 | } 11 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/team/presentation/constant/TeamResponseMessage.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.presentation.constant; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public enum TeamResponseMessage { 9 | CREATE_TEAM_SUCCESS("소모임을 생성하였습니다."), 10 | GET_TEAM_SUCCESS("홈 화면에서 내 소모임을 모두 조회했습니다."), 11 | GET_TEAM_DETAIL_SUCCESS("목표보드를 조회했습니다."), 12 | SIGNIN_TEAM_SUCCESS("소모임에 가입하였습니다."), 13 | GET_CURRENT_STATUS_SUCCESS("소모임 수정 전 조회했습니다."), 14 | REVIEW_TEAM_SUCCESS("소모임 삭제 전 조회했습니다."), 15 | DISBAND_TEAM_SUCCESS("[소모임장 권한] 소모임을 강제 종료했습니다."), 16 | UPDATE_TEAM_SUCCESS("[소모임장 권한] 소모임을 수정했습니다"), 17 | WITHDRAW_TEAM_SUCCESS("[소모임원 권한] 소모임을 탈퇴하였습니다"), 18 | SEND_APPROVAL_ALARM_SUCCESS("소모임들이 승인되었습니다."), 19 | SEND_REJECTION_ALARM_SUCCESS("소모임들이 반려되었습니다."), 20 | GET_NEW_TEAM_SUCCESS("새로운 소모임들을 조회했습니다."), 21 | GET_TEAM_COUNT_SUCCESS("소모임의 개수와 닉네임을 조회했습니다."); 22 | private final String message; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/teamMember/domain/repository/TeamMemberCustomRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.teamMember.domain.repository; 2 | 3 | import com.moing.backend.domain.history.application.dto.response.NewUploadInfo; 4 | import com.moing.backend.domain.team.application.dto.response.TeamMemberInfo; 5 | 6 | import java.util.List; 7 | import java.util.Optional; 8 | 9 | public interface TeamMemberCustomRepository { 10 | Optional> findNewUploadInfo(Long teamId, Long memberId); 11 | List findTeamMemberInfoByTeamId(Long memberId, Long teamId); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/teamMember/domain/repository/TeamMemberRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.teamMember.domain.repository; 2 | 3 | import com.moing.backend.domain.member.domain.entity.Member; 4 | import com.moing.backend.domain.team.domain.entity.Team; 5 | import com.moing.backend.domain.teamMember.domain.entity.TeamMember; 6 | import org.springframework.data.jpa.repository.JpaRepository; 7 | import org.springframework.data.jpa.repository.Modifying; 8 | import org.springframework.data.jpa.repository.Query; 9 | 10 | import javax.swing.text.html.Option; 11 | import java.util.Optional; 12 | 13 | public interface TeamMemberRepository extends JpaRepository, TeamMemberCustomRepository{ 14 | 15 | Optional findTeamMemberByTeamAndMember(Team team, Member member); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/teamMember/exception/TeamMemberException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.teamMember.exception; 2 | 3 | import com.moing.backend.global.exception.ApplicationException; 4 | import com.moing.backend.global.response.ErrorCode; 5 | import org.springframework.http.HttpStatus; 6 | 7 | public abstract class TeamMemberException extends ApplicationException { 8 | protected TeamMemberException(ErrorCode errorCode, HttpStatus httpStatus) { 9 | super(errorCode, httpStatus); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/teamScore/application/dto/TeamScoreRes.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.teamScore.application.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Getter 9 | @Builder 10 | @AllArgsConstructor 11 | @NoArgsConstructor 12 | public class TeamScoreRes { 13 | 14 | private Long score; 15 | private Long level; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/teamScore/application/mapper/TeamScoreMapper.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.teamScore.application.mapper; 2 | 3 | import com.moing.backend.domain.team.domain.entity.Team; 4 | import com.moing.backend.domain.teamScore.domain.entity.TeamScore; 5 | import com.moing.backend.global.annotation.Mapper; 6 | import org.springframework.stereotype.Component; 7 | 8 | @Component 9 | public class TeamScoreMapper { 10 | 11 | public static TeamScore mapToTeamScore(Team team) { 12 | return TeamScore.builder() 13 | .score(0L) 14 | .level(1L) 15 | .team(team) 16 | .build(); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/teamScore/domain/entity/ScoreStatus.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.teamScore.domain.entity; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public enum ScoreStatus { 9 | PLUS(1L), MINUS(-1L); 10 | private final Long value; 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/teamScore/domain/repository/TeamScoreCustomRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.teamScore.domain.repository; 2 | 3 | 4 | import com.moing.backend.domain.team.domain.entity.Team; 5 | import com.moing.backend.domain.teamScore.domain.entity.TeamScore; 6 | 7 | public interface TeamScoreCustomRepository { 8 | 9 | TeamScore findTeamScoreByTeam(Long teamId); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/teamScore/domain/repository/TeamScoreCustomRepositoryImpl.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.teamScore.domain.repository; 2 | 3 | import static com.moing.backend.domain.teamScore.domain.entity.QTeamScore.teamScore; 4 | 5 | import com.moing.backend.domain.team.domain.entity.Team; 6 | import com.moing.backend.domain.teamScore.domain.entity.TeamScore; 7 | import com.querydsl.jpa.impl.JPAQueryFactory; 8 | 9 | import javax.persistence.EntityManager; 10 | 11 | public class TeamScoreCustomRepositoryImpl implements TeamScoreCustomRepository { 12 | 13 | 14 | private final JPAQueryFactory queryFactory; 15 | 16 | public TeamScoreCustomRepositoryImpl(EntityManager entityManager) { 17 | this.queryFactory = new JPAQueryFactory(entityManager); 18 | } 19 | 20 | @Override 21 | public TeamScore findTeamScoreByTeam(Long teamId) { 22 | return queryFactory 23 | .selectFrom(teamScore) 24 | .where(teamScore.team.teamId.eq(teamId)).fetchFirst(); 25 | } 26 | 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/teamScore/domain/repository/TeamScoreRepository.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.teamScore.domain.repository; 2 | 3 | import com.moing.backend.domain.teamScore.domain.entity.TeamScore; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface TeamScoreRepository extends JpaRepository , TeamScoreCustomRepository{ 7 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/teamScore/domain/service/TeamScoreQueryService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.teamScore.domain.service; 2 | 3 | import com.moing.backend.domain.team.domain.entity.Team; 4 | import com.moing.backend.domain.team.domain.service.TeamGetService; 5 | import com.moing.backend.domain.teamScore.domain.entity.TeamScore; 6 | import com.moing.backend.domain.teamScore.domain.repository.TeamScoreRepository; 7 | import com.moing.backend.global.annotation.DomainService; 8 | import lombok.RequiredArgsConstructor; 9 | import org.springframework.transaction.annotation.Transactional; 10 | 11 | 12 | @DomainService 13 | @Transactional 14 | @RequiredArgsConstructor 15 | public class TeamScoreQueryService { 16 | 17 | private final TeamScoreRepository teamScoreRepository; 18 | private final TeamGetService teamGetService; 19 | 20 | public TeamScore findTeamScoreByTeam(Long teamId) { 21 | 22 | return teamScoreRepository.findTeamScoreByTeam(teamId); 23 | } 24 | 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/teamScore/domain/service/TeamScoreSaveService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.teamScore.domain.service; 2 | 3 | import com.moing.backend.domain.team.domain.entity.Team; 4 | import com.moing.backend.domain.team.domain.service.TeamGetService; 5 | import com.moing.backend.domain.teamScore.domain.entity.TeamScore; 6 | import com.moing.backend.domain.teamScore.domain.repository.TeamScoreRepository; 7 | import com.moing.backend.global.annotation.DomainService; 8 | import lombok.RequiredArgsConstructor; 9 | import org.springframework.transaction.annotation.Transactional; 10 | 11 | 12 | @DomainService 13 | @Transactional 14 | @RequiredArgsConstructor 15 | public class TeamScoreSaveService { 16 | 17 | private final TeamScoreRepository teamScoreRepository; 18 | private final TeamGetService teamGetService; 19 | 20 | public TeamScore save(TeamScore teamScore) { 21 | 22 | return teamScoreRepository.save(teamScore); 23 | } 24 | 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/domain/teamScore/presentation/constant/TeamScoreResponseMessage.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.teamScore.presentation.constant; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public enum TeamScoreResponseMessage { 9 | GET_TEAMSCORE_SUCCESS("팀 경험치/레벨 조회를 완료 했습니다"); 10 | 11 | private final String message; 12 | } 13 | 14 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/annotation/DomainService.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.annotation; 2 | 3 | import org.springframework.stereotype.Service; 4 | 5 | import java.lang.annotation.ElementType; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.RetentionPolicy; 8 | import java.lang.annotation.Target; 9 | 10 | @Target(ElementType.TYPE) 11 | @Retention(RetentionPolicy.RUNTIME) 12 | @Service 13 | public @interface DomainService { 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/annotation/Enum.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.annotation; 2 | 3 | import javax.validation.Constraint; 4 | import javax.validation.Payload; 5 | import java.lang.annotation.ElementType; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.RetentionPolicy; 8 | import java.lang.annotation.Target; 9 | 10 | @Constraint(validatedBy = {EnumValidator.class}) 11 | @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER}) 12 | @Retention(RetentionPolicy.RUNTIME) 13 | public @interface Enum { 14 | String message() default "enum 형식메 맞지 않습니다."; 15 | Class[] groups() default {}; 16 | Class[] payload() default {}; 17 | Class> enumClass(); 18 | boolean ignoreCase() default false; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/annotation/Mapper.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target(ElementType.TYPE) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface Mapper { 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/annotation/Util.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.annotation; 2 | 3 | import org.springframework.core.annotation.AliasFor; 4 | import org.springframework.stereotype.Component; 5 | 6 | import java.lang.annotation.*; 7 | 8 | @Target({ElementType.TYPE}) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | @Documented 11 | @Component 12 | public @interface Util { 13 | @AliasFor(annotation = Component.class) 14 | String value() default ""; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/annotation/ValidEnum.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.annotation; 2 | 3 | import javax.validation.Constraint; 4 | import javax.validation.Payload; 5 | import java.lang.annotation.ElementType; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.RetentionPolicy; 8 | import java.lang.annotation.Target; 9 | 10 | @Constraint(validatedBy = {EnumValidator.class}) 11 | @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER}) 12 | @Retention(RetentionPolicy.RUNTIME) 13 | public @interface ValidEnum { 14 | String message() default "Invalid value. This is not permitted."; 15 | 16 | Class[] groups() default {}; 17 | 18 | Class[] payload() default {}; 19 | 20 | Class> enumClass(); 21 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/fcm/constant/ApproveTeamMessage.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.fcm.constant; 2 | 3 | import lombok.RequiredArgsConstructor; 4 | 5 | @RequiredArgsConstructor 6 | public enum ApproveTeamMessage { 7 | 8 | APPROVE_TEAM_MESSAGE("%s님, [%s] 모임이 타오를 준비를 마쳤어요!", "지금 바로 우리 모임원들을 초대해볼까요? 🔥"), 9 | 10 | REJECT_TEAM_MESSAGE("%s님, [%s] 모임 신청이 반려됐어요.", "신청서를 점검한 뒤 다시 한번 모임을 신청해주세요!"); 11 | 12 | private final String title; 13 | private final String body; 14 | 15 | public String title(String memberName, String teamName) { 16 | return String.format(title, memberName, teamName); 17 | } 18 | 19 | public String body() { 20 | return body; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/fcm/constant/NewCommentUploadMessage.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.fcm.constant; 2 | 3 | 4 | import lombok.Getter; 5 | import lombok.RequiredArgsConstructor; 6 | 7 | @Getter 8 | @RequiredArgsConstructor 9 | public enum NewCommentUploadMessage { 10 | 11 | NEW_COMMENT_UPLOAD_MESSAGE("%s", "[%s님의 댓글] %s"); 12 | 13 | private final String title; 14 | private final String body; 15 | 16 | public String title(String commentContent) { 17 | return String.format(title, commentContent); 18 | } 19 | 20 | public String body(String writerNickname, String boardTitle) { 21 | return String.format(body, writerNickname, boardTitle); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/fcm/constant/NewMissionTitle.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.fcm.constant; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public enum NewMissionTitle { 9 | 10 | NEW_SINGLE_MISSION_COMING("의 새로운 미션이 등장했어요! "), 11 | NEW_REPEAT_MISSION_COMING("의 새로운 반복미션이 시작되었어요! "); 12 | private final String title; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/fcm/constant/NewNoticeUploadMessage.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.fcm.constant; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public enum NewNoticeUploadMessage { 9 | 10 | NEW_NOTICE_UPLOAD_MESSAGE("%s에 새로 올라온 공지를 확인하세요!", "%s"); 11 | 12 | private final String title; 13 | private final String body; 14 | 15 | public String title(String teamName) { 16 | return String.format(title, teamName); 17 | } 18 | 19 | public String body(String noticeTitle) { 20 | return String.format(body, noticeTitle); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/fcm/constant/NewUploadTitle.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.fcm.constant; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public enum NewUploadTitle{ 9 | UPLOAD_NOTICE_NEW_TITLE("새로운 공지 알려드려요!"), 10 | UPLOAD_VOTE_NEW_TITLE("새로운 투표 알려드려요!"), 11 | UPLOAD_MISSION_NEW_TITLE("새로운 미션 알려드려요!"); 12 | private final String title; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/fcm/dto/event/MultiFcmEvent.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.fcm.dto.event; 2 | 3 | import com.moing.backend.domain.history.application.dto.response.MemberIdAndToken; 4 | import com.moing.backend.domain.history.domain.entity.AlarmType; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Getter; 7 | 8 | import java.util.List; 9 | import java.util.Optional; 10 | 11 | @Getter 12 | @AllArgsConstructor 13 | public class MultiFcmEvent { 14 | 15 | private String title; 16 | private String body; 17 | private Optional> idAndTokensByPush; 18 | private Optional> idAndTokensBySave; 19 | private String idInfo; 20 | private String name; 21 | private AlarmType alarmType; 22 | private String path; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/fcm/dto/event/SingleFcmEvent.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.fcm.dto.event; 2 | 3 | import com.moing.backend.domain.history.application.dto.response.MemberIdAndToken; 4 | import com.moing.backend.domain.history.domain.entity.AlarmType; 5 | import com.moing.backend.domain.member.domain.entity.Member; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Getter; 8 | 9 | import java.util.List; 10 | 11 | @Getter 12 | @AllArgsConstructor 13 | public class SingleFcmEvent { 14 | 15 | private Member member; 16 | private String title; 17 | private String body; 18 | private String idInfo; 19 | private String name; 20 | private AlarmType alarmType; 21 | private String path; 22 | private boolean isAlarmPush; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/fcm/dto/request/MultiRequest.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.fcm.dto.request; 2 | 3 | import com.moing.backend.domain.history.application.dto.response.MemberIdAndToken; 4 | import com.moing.backend.domain.history.domain.entity.AlarmType; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Getter; 7 | import lombok.NoArgsConstructor; 8 | 9 | import javax.validation.constraints.NotNull; 10 | import java.util.List; 11 | import java.util.Optional; 12 | 13 | @Getter 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | public class MultiRequest { 17 | 18 | private List memberIdAndTokens; 19 | 20 | private String title; 21 | 22 | private String body; 23 | 24 | private String idInfo; 25 | 26 | private String name; 27 | 28 | private AlarmType alarmType; 29 | 30 | private String path; 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/fcm/dto/request/SingleRequest.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.fcm.dto.request; 2 | 3 | import com.moing.backend.domain.history.domain.entity.AlarmType; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Getter 9 | @NoArgsConstructor 10 | @AllArgsConstructor 11 | public class SingleRequest { 12 | 13 | private String registrationToken; 14 | 15 | private String title; 16 | 17 | private String body; 18 | 19 | private Long memberId; 20 | 21 | private String idInfo; 22 | 23 | private String name; 24 | 25 | private AlarmType alarmType; 26 | 27 | private String path; 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/fcm/dto/response/MultiResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.fcm.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | import java.util.List; 7 | 8 | @Getter 9 | @AllArgsConstructor 10 | public class MultiResponse { 11 | private final String response; 12 | private final List failedTokens; 13 | 14 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/fcm/dto/response/SingleResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.fcm.dto.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @AllArgsConstructor 8 | public class SingleResponse { 9 | private final String response; 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/fcm/exception/FirebaseException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.fcm.exception; 2 | 3 | import com.moing.backend.global.exception.ApplicationException; 4 | import com.moing.backend.global.response.ErrorCode; 5 | import org.springframework.http.HttpStatus; 6 | 7 | public abstract class FirebaseException extends ApplicationException { 8 | protected FirebaseException(ErrorCode errorCode, HttpStatus httpStatus) { 9 | super(errorCode, httpStatus); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/fcm/exception/InitializeException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.fcm.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class InitializeException extends FirebaseException { 7 | public InitializeException() { 8 | super(ErrorCode.INITIALIZE_ERROR, 9 | HttpStatus.INTERNAL_SERVER_ERROR 10 | ); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/fcm/exception/MessagingException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.fcm.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class MessagingException extends FirebaseException { 7 | public MessagingException(String message) { 8 | super(ErrorCode.MESSAGING_ERROR, 9 | HttpStatus.INTERNAL_SERVER_ERROR); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/fcm/exception/NotificationException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.fcm.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public class NotificationException extends FirebaseException { 7 | public NotificationException(String message) { 8 | super(ErrorCode.NOTIFICATION_ERROR, 9 | HttpStatus.INTERNAL_SERVER_ERROR); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/fcm/service/MessageSender.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.fcm.service; 2 | 3 | public interface MessageSender { 4 | void send(T request); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/querydsl/QuerydslConfig.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.querydsl; 2 | 3 | import com.querydsl.jpa.impl.JPAQueryFactory; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | import javax.persistence.EntityManager; 8 | import javax.persistence.PersistenceContext; 9 | 10 | @Configuration 11 | public class QuerydslConfig { 12 | @PersistenceContext 13 | private EntityManager entityManager; 14 | 15 | @Bean 16 | public JPAQueryFactory jpaQueryFactory() { 17 | return new JPAQueryFactory(this.entityManager); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/redis/constant/RefreshTokenConstant.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.redis.constant; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | import org.springframework.http.HttpStatus; 6 | 7 | public class RefreshTokenConstant { 8 | @Getter 9 | @RequiredArgsConstructor 10 | public enum ERefreshTokenMessage { 11 | TOKEN_REFRESH_SUCCESS("토큰 재발급을 완료하였습니다"); 12 | private final String message; 13 | } 14 | 15 | @Getter 16 | @RequiredArgsConstructor 17 | public enum RefreshTokenExceptionList { 18 | NOT_FOUND_TOKEN_ERROR("R0003", HttpStatus.NOT_FOUND, "Refresh-Token을 찾을 수 없습니다. 아예 새롭게 로그인을 하세요"); 19 | private final String errorCode; 20 | private final HttpStatus httpStatus; 21 | private final String message; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/s3/ImageUrlUtil.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.s3; 2 | 3 | import com.moing.backend.global.annotation.Util; 4 | import org.springframework.beans.factory.annotation.Value; 5 | 6 | @Util 7 | public class ImageUrlUtil { 8 | public static String prefix; 9 | 10 | @Value("${image.prefix}") 11 | public void setPrefix(String value) { 12 | prefix = value; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/security/dto/User.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.security.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.util.List; 9 | 10 | @Builder 11 | @AllArgsConstructor 12 | @NoArgsConstructor 13 | @Data 14 | public class User { 15 | private String socialId; 16 | private String email; 17 | private List roles; 18 | } 19 | 20 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/security/jwt/JwtExceptionList.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.security.jwt; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | import org.springframework.http.HttpStatus; 6 | 7 | @Getter 8 | @RequiredArgsConstructor 9 | public enum JwtExceptionList { 10 | UNKNOWN_ERROR("J0001", HttpStatus.INTERNAL_SERVER_ERROR, "예상치 못한 오류가 발생했습니다."), 11 | MAL_FORMED_TOKEN("J0002", HttpStatus.UNAUTHORIZED, "잘못된 JWT 서명입니다."), 12 | EXPIRED_TOKEN("J0003", HttpStatus.UNAUTHORIZED, "만료된 토큰입니다."), 13 | UNSUPPORTED_TOKEN("J0004", HttpStatus.UNAUTHORIZED, "지원되지 않는 토큰입니다."), 14 | ACCESS_DENIED("J0005", HttpStatus.UNAUTHORIZED, "접근이 거부되었습니다."), 15 | ILLEGAL_TOKEN("J0006", HttpStatus.UNAUTHORIZED, "JWT 토큰이 잘못되었습니다."), 16 | ADDITIONAL_REQUIRED_TOKEN("J0007", HttpStatus.UNAUTHORIZED, "추가 정보를 입력해야 합니다."); 17 | private final String errorCode; 18 | private final HttpStatus httpStatus; 19 | private final String message; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/security/jwt/NotFoundRefreshToken.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.security.jwt; 2 | 3 | import com.moing.backend.global.exception.ApplicationException; 4 | import com.moing.backend.global.response.ErrorCode; 5 | import org.springframework.http.HttpStatus; 6 | 7 | public class NotFoundRefreshToken extends ApplicationException { 8 | public NotFoundRefreshToken() { 9 | super(ErrorCode.NOT_FOUND_REFRESH_TOKEN_ERROR, 10 | HttpStatus.UNAUTHORIZED); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/slack/SlackConfig.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.slack; 2 | 3 | import com.slack.api.Slack; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | @Configuration 8 | public class SlackConfig { 9 | 10 | @Bean 11 | public Slack slackClient() { 12 | return Slack.getInstance(); 13 | } 14 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/slack/exception/ExceptionEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.slack.exception; 2 | 3 | import com.moing.backend.global.config.slack.exception.dto.ExceptionEvent; 4 | import com.moing.backend.global.config.slack.util.WebhookUtil; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.context.annotation.Profile; 7 | import org.springframework.context.event.EventListener; 8 | import org.springframework.scheduling.annotation.Async; 9 | import org.springframework.stereotype.Component; 10 | 11 | @RequiredArgsConstructor 12 | @Component 13 | @Profile("prod") 14 | public class ExceptionEventHandler { 15 | 16 | private final WebhookUtil webhookUtil; 17 | 18 | @Async 19 | @EventListener 20 | public void onExceptionEvent(ExceptionEvent event) { 21 | webhookUtil.sendSlackAlertErrorLog(event.getRequest(), event.getException()); 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/slack/exception/dto/ExceptionEvent.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.slack.exception.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | import javax.servlet.http.HttpServletRequest; 7 | 8 | @Getter 9 | @AllArgsConstructor 10 | public class ExceptionEvent { 11 | 12 | private final HttpServletRequest request; 13 | private final Exception exception; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/slack/team/TeamCreateHandler.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.slack.team; 2 | 3 | import com.moing.backend.global.config.slack.team.dto.TeamCreateEvent; 4 | import com.moing.backend.global.config.slack.util.WebhookUtil; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.context.annotation.Profile; 7 | import org.springframework.context.event.EventListener; 8 | import org.springframework.scheduling.annotation.Async; 9 | import org.springframework.stereotype.Component; 10 | 11 | @RequiredArgsConstructor 12 | @Component 13 | @Profile("prod") 14 | public class TeamCreateHandler { 15 | 16 | private final WebhookUtil webhookUtil; 17 | 18 | @Async 19 | @EventListener 20 | public void onTeamCreateEvent(TeamCreateEvent event) { 21 | webhookUtil.sendSlackTeamCreatedMessage(event.getTeamName(), event.getLeaderId()); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/slack/team/dto/TeamCreateEvent.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.slack.team.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @AllArgsConstructor 8 | public class TeamCreateEvent { 9 | 10 | private final String teamName; 11 | private final Long leaderId; 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/config/slack/util/WebhookUtil.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.config.slack.util; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | import java.util.Map; 5 | 6 | public interface WebhookUtil { 7 | 8 | void sendSlackAlertErrorLog(HttpServletRequest request, Exception e); 9 | 10 | void sendSlackTeamCreatedMessage(String teamName, Long leaderId); 11 | 12 | void sendDailyStatsMessage(Map todayStats, Map yesterdayStats); 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/entity/BaseTimeEntity.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.entity; 2 | 3 | import lombok.Getter; 4 | import org.springframework.data.annotation.CreatedDate; 5 | import org.springframework.data.annotation.LastModifiedDate; 6 | import org.springframework.data.jpa.domain.support.AuditingEntityListener; 7 | 8 | import javax.persistence.Column; 9 | import javax.persistence.EntityListeners; 10 | import javax.persistence.MappedSuperclass; 11 | import java.time.LocalDateTime; 12 | 13 | @Getter 14 | @MappedSuperclass 15 | @EntityListeners(AuditingEntityListener.class) 16 | public class BaseTimeEntity { 17 | 18 | @CreatedDate 19 | @Column(updatable = false) 20 | private LocalDateTime createdDate; 21 | 22 | @LastModifiedDate 23 | private LocalDateTime lastModifiedDate; 24 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/exception/ApplicationException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.exception; 2 | 3 | import com.moing.backend.global.response.ErrorCode; 4 | import org.springframework.http.HttpStatus; 5 | 6 | public abstract class ApplicationException extends RuntimeException { 7 | 8 | private final ErrorCode errorCode; 9 | private final HttpStatus httpStatus; 10 | 11 | protected ApplicationException(ErrorCode errorCode, HttpStatus httpStatus) { 12 | super(errorCode.getMessage()); 13 | this.errorCode = errorCode; 14 | this.httpStatus = httpStatus; 15 | } 16 | 17 | public ErrorCode getErrorCode() { return errorCode;} 18 | 19 | public HttpStatus getHttpStatus() { 20 | return httpStatus; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/exception/InternalServerErrorException.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.exception; 2 | 3 | public class InternalServerErrorException extends RuntimeException{ 4 | 5 | public InternalServerErrorException(String message){ super(message); } 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/log/aop/Pointcuts.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.log.aop; 2 | 3 | import org.aspectj.lang.annotation.Aspect; 4 | import org.aspectj.lang.annotation.Pointcut; 5 | 6 | @Aspect 7 | public class Pointcuts { 8 | 9 | 10 | @Pointcut("execution(* com.moing.backend.*presentation.*Controller.*(..))") 11 | public void allController() {} 12 | 13 | @Pointcut("execution(* com.moing.backend..service..*.*(..))") 14 | public void allService() { 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/log/aop/TraceStatus.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.log.aop; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.RequiredArgsConstructor; 6 | 7 | @RequiredArgsConstructor 8 | @Getter 9 | @AllArgsConstructor 10 | public class TraceStatus { 11 | private String threadId; 12 | private Long startTime; 13 | private String className; 14 | private String methodName; 15 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/log/filter/RequestInfoFormat.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.log.filter; 2 | 3 | import com.fasterxml.jackson.annotation.JsonInclude; 4 | import lombok.AccessLevel; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Getter; 8 | 9 | @Getter 10 | @Builder 11 | @JsonInclude(JsonInclude.Include.NON_NULL) 12 | @AllArgsConstructor(access = AccessLevel.PRIVATE) 13 | public class RequestInfoFormat { 14 | private final String threadId; 15 | private final String url; 16 | private final String method; 17 | private final String ip; 18 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/response/BaseBoardServiceResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.response; 2 | 3 | import com.moing.backend.domain.board.domain.entity.Board; 4 | import com.moing.backend.domain.member.domain.entity.Member; 5 | import com.moing.backend.domain.team.domain.entity.Team; 6 | import com.moing.backend.domain.teamMember.domain.entity.TeamMember; 7 | import lombok.AllArgsConstructor; 8 | import lombok.Getter; 9 | import lombok.NoArgsConstructor; 10 | 11 | @Getter 12 | @AllArgsConstructor 13 | @NoArgsConstructor 14 | public class BaseBoardServiceResponse { 15 | private Member member; 16 | private Team team; 17 | private Board board; 18 | private TeamMember teamMember; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/response/BaseMissionServiceResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.response; 2 | 3 | import com.moing.backend.domain.member.domain.entity.Member; 4 | import com.moing.backend.domain.missionArchive.domain.entity.MissionArchive; 5 | import com.moing.backend.domain.team.domain.entity.Team; 6 | import com.moing.backend.domain.teamMember.domain.entity.TeamMember; 7 | import lombok.AllArgsConstructor; 8 | import lombok.Getter; 9 | import lombok.NoArgsConstructor; 10 | 11 | @Getter 12 | @AllArgsConstructor 13 | @NoArgsConstructor 14 | public class BaseMissionServiceResponse { 15 | private Member member; 16 | private Team team; 17 | private MissionArchive missionArchive; 18 | private TeamMember teamMember; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/response/BaseServiceResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.response; 2 | 3 | import com.moing.backend.domain.member.domain.entity.Member; 4 | import com.moing.backend.domain.team.domain.entity.Team; 5 | import com.moing.backend.domain.teamMember.domain.entity.TeamMember; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Getter; 8 | import lombok.NoArgsConstructor; 9 | 10 | @Getter 11 | @AllArgsConstructor 12 | @NoArgsConstructor 13 | public class BaseServiceResponse { 14 | private Member member; 15 | private Team team; 16 | private TeamMember teamMember; 17 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/response/SuccessResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.response; 2 | 3 | import com.fasterxml.jackson.annotation.JsonInclude; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Getter 9 | @AllArgsConstructor 10 | @NoArgsConstructor 11 | public class SuccessResponse { 12 | private Boolean isSuccess; 13 | private String message; 14 | @JsonInclude(JsonInclude.Include.NON_NULL) 15 | private T data; 16 | 17 | public static SuccessResponse create(String message) { 18 | return new SuccessResponse<>(true, message, null); 19 | } 20 | 21 | public static SuccessResponse create(String message, T data) { 22 | return new SuccessResponse<>(true, message, data); 23 | } 24 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/response/TokenInfoResponse.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | @Builder 8 | @Getter 9 | @AllArgsConstructor 10 | public class TokenInfoResponse { 11 | private String grantType; 12 | private String accessToken; 13 | private String refreshToken; 14 | private Long refreshTokenExpirationTime; 15 | 16 | public static TokenInfoResponse from(String grantType, String accessToken, String refreshToken, Long refreshTokenExpirationTime) { 17 | return TokenInfoResponse.builder() 18 | .grantType(grantType) 19 | .accessToken(accessToken) 20 | .refreshToken(refreshToken) 21 | .refreshTokenExpirationTime(refreshTokenExpirationTime) 22 | .build(); 23 | } 24 | 25 | public void updateRefreshToken(String refreshToken){ 26 | this.refreshToken=refreshToken; 27 | } 28 | } 29 | 30 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/utils/FeignClientConfig.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.utils; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | 5 | @Configuration 6 | public class FeignClientConfig { 7 | } -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/utils/SecurityUtils.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.utils; 2 | 3 | import com.moing.backend.domain.member.domain.entity.Member; 4 | import com.moing.backend.global.config.security.oauth.CustomUserDetails; 5 | import lombok.AccessLevel; 6 | import lombok.NoArgsConstructor; 7 | import org.springframework.security.core.context.SecurityContextHolder; 8 | import org.springframework.transaction.annotation.Transactional; 9 | 10 | import java.util.Objects; 11 | 12 | @NoArgsConstructor(access = AccessLevel.PROTECTED) 13 | @Transactional 14 | public class SecurityUtils { 15 | 16 | public static Member getLoggedInUser() { 17 | try { 18 | return 19 | ((CustomUserDetails) Objects.requireNonNull(SecurityContextHolder.getContext().getAuthentication()).getPrincipal()).getMember(); 20 | } catch (NullPointerException e) { 21 | throw new RuntimeException(); 22 | } 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/moing/backend/global/utils/UpdateUtils.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.global.utils; 2 | 3 | import com.moing.backend.global.annotation.Util; 4 | import com.moing.backend.global.config.s3.S3Service; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.stereotype.Component; 7 | 8 | @Util 9 | @RequiredArgsConstructor 10 | public class UpdateUtils { 11 | 12 | private final S3Service s3Service; 13 | 14 | public static T getUpdatedValue(T currentValue, T oldValue) { 15 | if(currentValue!=null){ 16 | return currentValue; 17 | } 18 | return oldValue; 19 | } 20 | 21 | public void deleteOldImgUrl(String currentImageUrl, String oldImageUrl) { 22 | if (currentImageUrl != null && oldImageUrl != null) { 23 | s3Service.deleteImage(oldImageUrl); 24 | } 25 | } 26 | 27 | public void deleteImgUrl(String imageUrl) { 28 | if (imageUrl != null) { 29 | s3Service.deleteImage(imageUrl); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/test/java/com/moing/backend/BackendApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | //@SpringBootTest 7 | class BackendApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/test/java/com/moing/backend/config/RestDocsConfig.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.config; 2 | 3 | import org.springframework.boot.test.context.TestConfiguration; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; 6 | import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler; 7 | import org.springframework.restdocs.operation.preprocess.Preprocessors; 8 | 9 | @TestConfiguration 10 | public class RestDocsConfig { 11 | @Bean 12 | public RestDocumentationResultHandler write(){ 13 | return MockMvcRestDocumentation.document( 14 | "{class-name}/{method-name}", 15 | Preprocessors.preprocessRequest(Preprocessors.prettyPrint()), 16 | Preprocessors.preprocessResponse(Preprocessors.prettyPrint()) 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/test/java/com/moing/backend/domain/missionComment/domain/MissionRepositoryTest.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.missionComment.domain; 2 | 3 | import com.moing.backend.domain.missionComment.domain.repository.MissionCommentRepository; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; 6 | import org.springframework.boot.test.context.SpringBootTest; 7 | import org.springframework.test.context.ActiveProfiles; 8 | import org.springframework.transaction.annotation.Transactional; 9 | 10 | @SpringBootTest 11 | @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) 12 | @ActiveProfiles("dev") 13 | @Transactional 14 | public class MissionRepositoryTest { 15 | 16 | @Autowired 17 | MissionCommentRepository missionCommentRepository; 18 | public void create_Mission_Comment(){ 19 | 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/test/java/com/moing/backend/domain/missionState/domain/service/MissionStateQueryServiceTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modagbul/MOING_Server_Release/5b3dc87235074013925ef84a8115ceece31f3816/src/test/java/com/moing/backend/domain/missionState/domain/service/MissionStateQueryServiceTest.java -------------------------------------------------------------------------------- /src/test/java/com/moing/backend/domain/team/application/service/CreateTeamUseCaseTest.java: -------------------------------------------------------------------------------- 1 | package com.moing.backend.domain.team.application.service; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import static org.junit.jupiter.api.Assertions.*; 6 | 7 | class CreateTeamUseCaseTest { 8 | 9 | @Test 10 | void createTeam() { 11 | } 12 | } --------------------------------------------------------------------------------