From 74d532c0b1b034a24f023495fbebec0d6e235701 Mon Sep 17 00:00:00 2001 From: DongkyunKim <134477764+dongkyun0713@users.noreply.github.com> Date: Sun, 15 Sep 2024 14:57:15 +0900 Subject: [PATCH] Main push (#137) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Feat(#29) 필터 기능 구현 * Refactor(#29): GenericFilterBean로 filter 기능 확장 * Refactor(#29): WebConfig 위치 변경 * Refactor(#6): AuthService getIdToken 메서드 추가 구현 * Refactor(#6): validateNotFoundEmail 메서드 예외 메시지 추가 작성 * Refactor(#6): validateNotFoundEmail 메서드 객체지향 생활 체조 9가지 원칙 규칙 4 적용 * Feat(#29): getUserIdFromToken 메서드 구현 * Refactor(#29): getUserEmailFromToken로 수정 * Refactor(AJD-Archive#6): generateAccessToken 메서드 분리 * Refactor(AJD-Archive#6): createMember 메서드 분리 * Refactor(AJD-Archive#6): AuthService 들여쓰기 수정 * Refactor(AJD-Archive#6): AuthService 상수 static 추가 * Test(#18): test yml 파일 추가, 적용 * Test(#20): yml 파일 적용 코드 추가 * Feat(#29): 어노테이션 구현 * Refactor(#29): 클래스 이름 수정 * Test(#18): BlockControllerTest Restdocs 적용 * Refeactor(#6): 커스텀 예외처리 추가 구현 * Feat(#11): Block 상태별 전체 조회, 단건 조회 기능 구현 * Feat(#11): Block 상태별 전체 조회, 단건 조회 기능 구현 * Test(#18): Block 상태별 전체 조회, 단건 조회 테스트 코드 구현 * Refactor(#11): 불필요 코드 제거 * Test(#20): AuthService 테스트코드 작성 * Test(#20): AuthService 테스트코드 작성 * Test(#20): AuthController 테스트코드 작성 * Test(44): LoginCheckFilter 테스트코드 작성 * Test(#44): LoginCheckFilter 테스트코드 작성 * Test(#20): GoogleAuthService 테스트코드 수정 * Test(#44): LoginCheckFilter 테스트코드 주석 수정 * Test(#44): urrentUserEmailArgumentResolver 테스트코드 작성 * Feat(#11): Block 논리 삭제 기능 구현, Block 상태별 전체조회 Query 수정 * Test(#18): Block 논리 삭제 테스트 코드 구현 * Test(#18): Block 논리 삭제 Restdocs 수정 * Test(#18): Block 테스트 코드 구현 * Test(#18): Repository 테스트를 위한 h2 의존성 추가 * Test(#18): BlockRepository 테스트 코드 구현 * Refactor: 중복 클레스 제거 * Test: TokenProvider 목킹 의존성 주입 추가 * Feat(#48): 프로필 정보 조회 기능 구현 * Refactor(#48): MemberController 위치 변경 * Refactor(#48): mypage 반환 값 변경 * Feat(#48): 프로필 정보 수정 구현 * Feat(#52): 프로필 정보 조회 테스트 * Feat(#52): 프로필 정보 변경 테스트 * Refactor(#52): 프로필 조회 관련 url 수정 * Feat(#50): Validation 의존성 추가 * Refactor: RestTemplate 의존성 주입으로 수정 * Feat(#50): Challenge 구현 * Feat(#50): Cycle 구현 * Feat(#50): CycleDetail 구현 * Feat(#48): 회원가입시 랜덤 닉네임 부여 * Refactor(#50): 생성자에 status 추가 * Feat(#50): ChallengeSaveReqDto 구현 * Feat(#50): ChallengeInfoResDto 구현 * Feat(#50):CycleList를 json 배열로 저장하기 위한 CycleDetailsConverter 구현 * Feat(#50): ChallengeRepository 구현 * Feat(#50): customException 구현 * Feat(#50): customException 구현 * Feat(#50): ChallengeService 구현 * Feat(#50): ChallengeController 구현 * Test(#50): ChallengeTest 작성 * Test(#50): CycleDetailsConverterTest 작성 * Test(#50): ChallengeServiceTest 작성 * Refactor(#48): 닉네임 관련 객체들 빈으로 등록 * Refactor(#48): 닉네임 중복 확인 로직 데이터베이스 접근 방법으로 수정 * Refactor(#48): 닉네임 중복 확인 로직 로직 추가 * Refactor(#48): 닉네임 부여 방식 수정 * Refactor(#50): 날짜 타입을 String에서 LocalDate타입으로 변경 * Refactor(#50):생성 요청 dto 날짜 타입을 String에서 LocalDate타입으로 변경 * Feat(#50): ChallengeController.class 추가 * Refactor(#48): 닉네임 타임아웃 예외처리 수정 * Refacor(): Staus 필드 명 변경 * Refactor():챌린지 생성 메서드 명 변경 * Refactor():챌린지 생성 메서드 명 변경 * Feat(): MemberNotFoundException 추가 * Refactor(#50): Status.ACTIVE로 변경 * Refactor(#50): Status.ACTIVE로 변경 * Feat(#50): challengeService 추가 * Feat(#50): DELETED로 변경 * Refactor(#48): 회원가입시 닉네임 이름 동일화 코드 수정 * Refactor: status 수정 * Refactor: status 수정 * Refactor: MockBean 수정 * Refactor(#48): 닉네임 중복 가능하게 로직 수정 * Refactor(#11): RequestParam에 name 속성 추가 * Refactor: 닉네임 반환 테스트코드 수정 * Refactor: 쓰지 않는 timeout 예외처리 삭제 * Refactor: 쓰지 않는 timeout 예외처리 삭제 * Refactor(#48): 닉네임 중복 가능명사, 형용사 주입 오류 수정 * Refactor(#52): 닉네임 생성 테스트코드 * Update README.md * Feat(#48): 회원가입시 랜덤 태그 부여 * Feat(#48): 랜덤 태그 중복 처리 * Feat(#48): 랜덤 태그 중복 처리 * Refactor(#48): return 개행 수정 * Refactor(#52): tag 생성 테스트코드 * Refactor(#52): MemberController 테스트코드 작성 * Refactor(#52): 개행 수정 * Refactor(#11): Block 사용자 선언, dto 정적 팩토리 메소드 수정 * Refactor(#18): ControllerTest Header 추가, mockMvc 설정 * Refactor(#48): MemberCustomRepository 이름 수정 * Feat(#62): Dashboard 도메인 구현, Block에 dashboard 연관 관계 추가 * Feat(#62): PersonalDashboard 저장, 수정 기능 구현 * Test(#62): PersonalDashboardService 저장, 수정 테스트코드 구현 * Refactor(#62): PersonalDashboard 수정 요청값 추가 * Refactor(#62): 개인 대시보드 Save DTO에 Validation 예외 추가 * Refactor(#62): 블록 생성 수정(대시보드 요청 추가) * Test(#62): 블록 생성 수정(대시보드 요청 추가) * Test(#62): 개인 대시보드 생성, 수정 테스트 코드 구현, 블록 컨트롤러 어노테이션 수정, Dto 어노테이션 수정 * Refactor(#48): MemberCustomRepositoryImpl 이름 수정 * Feat(#62): 개인 대시보드 삭제 기능 구현 * Refactor(#48): config 위치 수정 * Test(#62): 개인 대시보드 삭제 테스트 코드 구현 * Refactor(#62): 블록 리스트 요청시 대시보드 아이디 추가 구현 * Test(#62): 블록 리스트 요청시 대시보드 아이디 추가 테스트 구현 * Feat(#62): 개인 대시보드 전체, 상세 조회 기능 구현 * Test(#62): 개인 대시보드 전체, 상세 조회 테스트 코드 구현 * Docs(#62): 개인 대시보드 Restdocs 정적 페이지 구현 * Feat(#62): 개인 대시보드 상세 보기에 블록 진행도 추가 * Test(#62): 개인 대시보드 상세 보기 테스트에 블록 진행도 추가 * Test(#62): 개인 대시보드 Entity, Repository 테스트 코드 구현 * Refactor(#62): 개인 대시보드 queryDSL 코드 수정 * Test(#62): 개인 대시보드 ControllerTest 반환 추가 * Docs(#52): 내 프로필 정보 조회 API 문서 작성 * Docs(#52): 로그인, 토큰 재발급 API 문서 작성 * Refactor(#11): 블록 삭제 기능 메시지 변경 * Refactor(#18): 블록 삭제 테스트 DisplayName 수정 * Refactor(#11): 블록 Type 추가 * Feat(#67 #62): 팀 대시보드 기능 구현, 테스트 코드 구현, 개인 대시보드 삭제 메시지, queryDSL 수정 (#68) * Feat(#67): 팀 대시보드 도메인 구현 * Feat(#67): 팀 대시보드 저장 기능 구현 * Feat(#67): 팀 대시보드 수정 기능 구현 * Refactor(#62): 개인 대시보드 삭제 기능 메시지 변경 * Refactor(#62): 개인 대시보드 삭제 예외 처리 추가 * Refactor(#62): 개인 대시보드 queryDSL 수정 * Test(#62): 개인 대시보드 삭제 테스트 DisplayName 수정 * Feat(#67): 팀 대시보드 삭제 기능 구현 * Feat(#67): 팀 대시보드 전체, 상세 조회 기능 구현 * Refactor(#62): 개인 대시보드 정적 팩토리 메소드명 수정 * Feat(#67): 팀 대시보드 참여, 탈퇴 기능 구현 * Feat(#67): 팀 대시보드 초대 멤버 리스트 불러오는 기능 구현 * Test(#67): 팀 대시보드 컨트롤러 테스트 코드 구현 * Test(#67): 팀 대시보드 테스트 코드 구현 * Test(#67): 팀 대시보드 서비스 테스트 코드 구현 * Test(#67): 팀 대시보드 레포지토리 테스트 코드 구현 * Test(#62): 개인 대시보드 서비스 테스트 코드 수정 * Test(#67): 팀 대시보드 서비스 테스트 코드 수정 * Docs(#67): 팀 대시보드 Restdocs 정적 페이지 추가 * Refactor(#11 #18): 블록 반환 값 추가, 반환 값 추가로 인한 테스트 코드 수정 (#71) * Refactor(#11): 블록 반환 값 추가 * Refactor(#18): 블록 반환 값 추가로 인한 테스트 코드 수정 * Feat(#50): 챌린지 전체 조회, 상세 조회, 삭제, 검색 기능 추가 (#64) * Feat(#50): 수정 메서드, 상태 변경 메서드 추가 * Feat(#50): 멤버-챌린지 연관관계 설정 * Feat(#50): 챌린지 커스텀 레포지토리 인터페이스 추가 * Feat(#50): 챌린지 커스텀 레포지토리 구현체 추가 * Feat(#50): 챌린지 커스텀 레포지토리 상속받도록 추가 * Refactor(#50): dto단에서 예외처리하도록 변경 * Refactor(#50): 정적 팩토리 메서드 네이밍, 매개변수 변경 * Feat(#50): ChallengeListResDto 추가 * Feat(#50): ChallengeListResDto 추가 * Feat(#50): 조회, 상세조회, 수정, 삭제, 검색 기능 추가 * Feat(#50): 조회, 상세조회, 수정, 삭제, 검색 api 추가 * Feat(#50): ChallengeAccessDeniedException 추가 * Feat(#50): ChallengeNotFoundException 추가 * Refactor(#50): 메서드 추가 * Refactor(#50): 메서드 추가 * Refactor(#50): 커스텀 예외에서 메시지 처리하도록 변경 * Test(#50): 수정, 상태 변경 로직 테스트 추가 * Test(#50): ChallengeServiceTest 조회, 수정, 삭제, 검색 메서드 테스트 추가 * Test(#50): ChallengeServiceTest 조회, 수정, 삭제, 검색 api 테스트 및 레스트독스 적용 * Docs(#50): challenge.adoc 추가 * Docs(#50): index.adoc 추가 * Test(#50): ControllerTest ChallengeController.class 추가 * Feat(#50): Valid 어노테이션 추가 * Style(#50): 코즈 포맷팅 수정 * Refactor(#50): startDate, endDate @NotNull 적용 * Style(#50): 경로변수 카멜케이스로 변경 * Style(#50): 메서드 명 변경 * Style(#50): 매개변수명 변경 * Refactor(#50): 상세조회에 readOnly옵션 설정 * Feat(#50): cycle 필드 저장하도록 변경 * Feat(#50): 블록 엔티티에 챌린지 매핑 및 상태 수정 메서드 추가 * Feat(#50): CycleDetail value 추가 * Feat(#50): status 계산을 위한 ChallengeBlockStatusUtil 추가 * Feat(#50): 매일 자정에 챌린지 블록 상태를 업데이트 하기 위한 스케줄러 설정 * Feat(#50): 챌린지 참여 메서드 추가 * Feat(#50): 챌린지 참여 메서드 추가 * Test(#50): ChallengeBlockStatusUtilTest 추가 * Test(#50): 챌린지 참여 메서드 테스트 추가 * Feat(#50): findByType 추가 * Docs(#50): 챌린지 참여 문서화 * Style(#50): 불필요한 공백 라인 제거 * Test(#50): 블록 도메인에 타입 필드 추가에 따른 챌린지 컨트롤러 테스트 코드 수정 (#72) * Feat(#50): 수정 메서드, 상태 변경 메서드 추가 * Feat(#50): 멤버-챌린지 연관관계 설정 * Feat(#50): 챌린지 커스텀 레포지토리 인터페이스 추가 * Feat(#50): 챌린지 커스텀 레포지토리 구현체 추가 * Feat(#50): 챌린지 커스텀 레포지토리 상속받도록 추가 * Refactor(#50): dto단에서 예외처리하도록 변경 * Refactor(#50): 정적 팩토리 메서드 네이밍, 매개변수 변경 * Feat(#50): ChallengeListResDto 추가 * Feat(#50): ChallengeListResDto 추가 * Feat(#50): 조회, 상세조회, 수정, 삭제, 검색 기능 추가 * Feat(#50): 조회, 상세조회, 수정, 삭제, 검색 api 추가 * Feat(#50): ChallengeAccessDeniedException 추가 * Feat(#50): ChallengeNotFoundException 추가 * Refactor(#50): 메서드 추가 * Refactor(#50): 메서드 추가 * Refactor(#50): 커스텀 예외에서 메시지 처리하도록 변경 * Test(#50): 수정, 상태 변경 로직 테스트 추가 * Test(#50): ChallengeServiceTest 조회, 수정, 삭제, 검색 메서드 테스트 추가 * Test(#50): ChallengeServiceTest 조회, 수정, 삭제, 검색 api 테스트 및 레스트독스 적용 * Docs(#50): challenge.adoc 추가 * Docs(#50): index.adoc 추가 * Test(#50): ControllerTest ChallengeController.class 추가 * Feat(#50): Valid 어노테이션 추가 * Style(#50): 코즈 포맷팅 수정 * Refactor(#50): startDate, endDate @NotNull 적용 * Style(#50): 경로변수 카멜케이스로 변경 * Style(#50): 메서드 명 변경 * Style(#50): 매개변수명 변경 * Refactor(#50): 상세조회에 readOnly옵션 설정 * Feat(#50): cycle 필드 저장하도록 변경 * Feat(#50): 블록 엔티티에 챌린지 매핑 및 상태 수정 메서드 추가 * Feat(#50): CycleDetail value 추가 * Feat(#50): status 계산을 위한 ChallengeBlockStatusUtil 추가 * Feat(#50): 매일 자정에 챌린지 블록 상태를 업데이트 하기 위한 스케줄러 설정 * Feat(#50): 챌린지 참여 메서드 추가 * Feat(#50): 챌린지 참여 메서드 추가 * Test(#50): ChallengeBlockStatusUtilTest 추가 * Test(#50): 챌린지 참여 메서드 테스트 추가 * Feat(#50): findByType 추가 * Docs(#50): 챌린지 참여 문서화 * Style(#50): 불필요한 공백 라인 제거 * feat(#50): 블록 도메인에 타입 추가에 따른 테스트 코드 수정 * Refactor(#11 #18): 블록 시작 시간 속성 추가 (#75) * Refactor(#11): 블록 반환 값 추가 * Refactor(#18): 블록 반환 값 추가로 인한 테스트 코드 수정 * Refactor(#11): 블록 시작 시간 속성 추가 * Test(#18): 블록 시작 시간 속성이 추가됨으로써 테스트 코드 수정 * Feat(#67 #62): 팀 대시보드 기능 구현, 테스트 코드 구현, 개인 대시보드 삭제 메시지, queryDSL 수정 (#68) * Feat(#67): 팀 대시보드 도메인 구현 * Feat(#67): 팀 대시보드 저장 기능 구현 * Feat(#67): 팀 대시보드 수정 기능 구현 * Refactor(#62): 개인 대시보드 삭제 기능 메시지 변경 * Refactor(#62): 개인 대시보드 삭제 예외 처리 추가 * Refactor(#62): 개인 대시보드 queryDSL 수정 * Test(#62): 개인 대시보드 삭제 테스트 DisplayName 수정 * Feat(#67): 팀 대시보드 삭제 기능 구현 * Feat(#67): 팀 대시보드 전체, 상세 조회 기능 구현 * Refactor(#62): 개인 대시보드 정적 팩토리 메소드명 수정 * Feat(#67): 팀 대시보드 참여, 탈퇴 기능 구현 * Feat(#67): 팀 대시보드 초대 멤버 리스트 불러오는 기능 구현 * Test(#67): 팀 대시보드 컨트롤러 테스트 코드 구현 * Test(#67): 팀 대시보드 테스트 코드 구현 * Test(#67): 팀 대시보드 서비스 테스트 코드 구현 * Test(#67): 팀 대시보드 레포지토리 테스트 코드 구현 * Test(#62): 개인 대시보드 서비스 테스트 코드 수정 * Test(#67): 팀 대시보드 서비스 테스트 코드 수정 * Docs(#67): 팀 대시보드 Restdocs 정적 페이지 추가 * Refactor(#11 #18): 블록 반환 값 추가, 반환 값 추가로 인한 테스트 코드 수정 (#71) * Refactor(#11): 블록 반환 값 추가 * Refactor(#18): 블록 반환 값 추가로 인한 테스트 코드 수정 * Feat(#50): 챌린지 전체 조회, 상세 조회, 삭제, 검색 기능 추가 (#64) * Feat(#50): 수정 메서드, 상태 변경 메서드 추가 * Feat(#50): 멤버-챌린지 연관관계 설정 * Feat(#50): 챌린지 커스텀 레포지토리 인터페이스 추가 * Feat(#50): 챌린지 커스텀 레포지토리 구현체 추가 * Feat(#50): 챌린지 커스텀 레포지토리 상속받도록 추가 * Refactor(#50): dto단에서 예외처리하도록 변경 * Refactor(#50): 정적 팩토리 메서드 네이밍, 매개변수 변경 * Feat(#50): ChallengeListResDto 추가 * Feat(#50): ChallengeListResDto 추가 * Feat(#50): 조회, 상세조회, 수정, 삭제, 검색 기능 추가 * Feat(#50): 조회, 상세조회, 수정, 삭제, 검색 api 추가 * Feat(#50): ChallengeAccessDeniedException 추가 * Feat(#50): ChallengeNotFoundException 추가 * Refactor(#50): 메서드 추가 * Refactor(#50): 메서드 추가 * Refactor(#50): 커스텀 예외에서 메시지 처리하도록 변경 * Test(#50): 수정, 상태 변경 로직 테스트 추가 * Test(#50): ChallengeServiceTest 조회, 수정, 삭제, 검색 메서드 테스트 추가 * Test(#50): ChallengeServiceTest 조회, 수정, 삭제, 검색 api 테스트 및 레스트독스 적용 * Docs(#50): challenge.adoc 추가 * Docs(#50): index.adoc 추가 * Test(#50): ControllerTest ChallengeController.class 추가 * Feat(#50): Valid 어노테이션 추가 * Style(#50): 코즈 포맷팅 수정 * Refactor(#50): startDate, endDate @NotNull 적용 * Style(#50): 경로변수 카멜케이스로 변경 * Style(#50): 메서드 명 변경 * Style(#50): 매개변수명 변경 * Refactor(#50): 상세조회에 readOnly옵션 설정 * Feat(#50): cycle 필드 저장하도록 변경 * Feat(#50): 블록 엔티티에 챌린지 매핑 및 상태 수정 메서드 추가 * Feat(#50): CycleDetail value 추가 * Feat(#50): status 계산을 위한 ChallengeBlockStatusUtil 추가 * Feat(#50): 매일 자정에 챌린지 블록 상태를 업데이트 하기 위한 스케줄러 설정 * Feat(#50): 챌린지 참여 메서드 추가 * Feat(#50): 챌린지 참여 메서드 추가 * Test(#50): ChallengeBlockStatusUtilTest 추가 * Test(#50): 챌린지 참여 메서드 테스트 추가 * Feat(#50): findByType 추가 * Docs(#50): 챌린지 참여 문서화 * Style(#50): 불필요한 공백 라인 제거 * Test(#50): 블록 도메인에 타입 필드 추가에 따른 챌린지 컨트롤러 테스트 코드 수정 (#72) * Feat(#50): 수정 메서드, 상태 변경 메서드 추가 * Feat(#50): 멤버-챌린지 연관관계 설정 * Feat(#50): 챌린지 커스텀 레포지토리 인터페이스 추가 * Feat(#50): 챌린지 커스텀 레포지토리 구현체 추가 * Feat(#50): 챌린지 커스텀 레포지토리 상속받도록 추가 * Refactor(#50): dto단에서 예외처리하도록 변경 * Refactor(#50): 정적 팩토리 메서드 네이밍, 매개변수 변경 * Feat(#50): ChallengeListResDto 추가 * Feat(#50): ChallengeListResDto 추가 * Feat(#50): 조회, 상세조회, 수정, 삭제, 검색 기능 추가 * Feat(#50): 조회, 상세조회, 수정, 삭제, 검색 api 추가 * Feat(#50): ChallengeAccessDeniedException 추가 * Feat(#50): ChallengeNotFoundException 추가 * Refactor(#50): 메서드 추가 * Refactor(#50): 메서드 추가 * Refactor(#50): 커스텀 예외에서 메시지 처리하도록 변경 * Test(#50): 수정, 상태 변경 로직 테스트 추가 * Test(#50): ChallengeServiceTest 조회, 수정, 삭제, 검색 메서드 테스트 추가 * Test(#50): ChallengeServiceTest 조회, 수정, 삭제, 검색 api 테스트 및 레스트독스 적용 * Docs(#50): challenge.adoc 추가 * Docs(#50): index.adoc 추가 * Test(#50): ControllerTest ChallengeController.class 추가 * Feat(#50): Valid 어노테이션 추가 * Style(#50): 코즈 포맷팅 수정 * Refactor(#50): startDate, endDate @NotNull 적용 * Style(#50): 경로변수 카멜케이스로 변경 * Style(#50): 메서드 명 변경 * Style(#50): 매개변수명 변경 * Refactor(#50): 상세조회에 readOnly옵션 설정 * Feat(#50): cycle 필드 저장하도록 변경 * Feat(#50): 블록 엔티티에 챌린지 매핑 및 상태 수정 메서드 추가 * Feat(#50): CycleDetail value 추가 * Feat(#50): status 계산을 위한 ChallengeBlockStatusUtil 추가 * Feat(#50): 매일 자정에 챌린지 블록 상태를 업데이트 하기 위한 스케줄러 설정 * Feat(#50): 챌린지 참여 메서드 추가 * Feat(#50): 챌린지 참여 메서드 추가 * Test(#50): ChallengeBlockStatusUtilTest 추가 * Test(#50): 챌린지 참여 메서드 테스트 추가 * Feat(#50): findByType 추가 * Docs(#50): 챌린지 참여 문서화 * Style(#50): 불필요한 공백 라인 제거 * feat(#50): 블록 도메인에 타입 추가에 따른 테스트 코드 수정 * Refactor(#11): 블록 시작 시간 속성 추가 * Fix: 컨플릭 수정 * Fix: 컨플릭 수정 --------- Co-authored-by: DongkyunKim <134477764+dongkyun0713@users.noreply.github.com> * Test (#76) * Feat(#67): 팀 대시보드 도메인 구현 * Feat(#67): 팀 대시보드 저장 기능 구현 * Feat(#67): 팀 대시보드 수정 기능 구현 * Refactor(#62): 개인 대시보드 삭제 기능 메시지 변경 * Refactor(#62): 개인 대시보드 삭제 예외 처리 추가 * Refactor(#62): 개인 대시보드 queryDSL 수정 * Test(#62): 개인 대시보드 삭제 테스트 DisplayName 수정 * Feat(#67): 팀 대시보드 삭제 기능 구현 * Feat(#67): 팀 대시보드 전체, 상세 조회 기능 구현 * Refactor(#62): 개인 대시보드 정적 팩토리 메소드명 수정 * Feat(#67): 팀 대시보드 참여, 탈퇴 기능 구현 * Feat(#67): 팀 대시보드 초대 멤버 리스트 불러오는 기능 구현 * Test(#67): 팀 대시보드 컨트롤러 테스트 코드 구현 * Test(#67): 팀 대시보드 테스트 코드 구현 * Test(#67): 팀 대시보드 서비스 테스트 코드 구현 * Test(#67): 팀 대시보드 레포지토리 테스트 코드 구현 * Test(#62): 개인 대시보드 서비스 테스트 코드 수정 * Test(#67): 팀 대시보드 서비스 테스트 코드 수정 * Docs(#67): 팀 대시보드 Restdocs 정적 페이지 추가 * Feat(#70): 팀 문서, 팀 파일 CRUD 구현 (#73) * Feat(#70): 팀 문서, 팀 파일 CRUD 구현 초안 * Test(#70): 팀 파일 repositoryTest 구현 * Test(#70): 팀 파일 Controller, Service, domain 구현 * Test(#70): 레스트독스 적용 * Feat(#70): 팀 문서 CRUD 완성 * Test(#70): DocumentRepository Test 구현 * Test(#70): DocumentRepositoryTest 구현 * Refactor(#70): Document 주석 삭제 * Test(#70): DocumentTest 구현 * Test(#70): DocumentServiceTest 구현 * Test(#70): DocumentControllerTest 구현 * Refactor(#70): document update 전용 dto 생성 * Refactor(#70): 컨밴션 수정 * Refactor(#70): 띄어쓰기 컨밴션 수정 * Refactor(#70): 띄어쓰기 컨밴션 수정 * Feature(#74): 알림 기능 구현 (#77) * Feat(#74): 알림 엔티티 구현 * Feat(#74): 알림 레포지토리 구현 * Feat(#74): NotificationInfoResDto 구현 * Feat(#74): NotificationListResDto 구현 * Feat(#74): NotificationNotFoundException 구현 * Feat(#74): service 로직 구현 * Feat(#74): controller 로직 구현 * Feat(#74): spring-boot-starter-web-services 의존성 추가 * Feat(#74): 알림-멤버 매핑 * Feat(#74): 챌린지 참여 할 때 알림가도록 추가 * Feat(#74): 챌린지 생성될때마다 알림가도록 변경 * Style(#74): RequiredArgsConstructor 어노테이션 사용하도록 변경 * Feat(#74):notificationService 추가 * Style(#74):notification 객체 생성 빌더 패턴 방식으로 변경 * Refactor(#74): emitter를 SseEmitterManager 에서 관리하도록 변경 * Style(#74): 불필요한 공백 라인 제거 * Style(#74): 줄바꿈 추가 * Style(#74): 마지막 공백 라인 추가 * Style(#74): SseEmitterManager 추가 * Fix(#74): 챌린지를_개인_대시보드에_추가할_수_있다 테스트 안되는 오류 해결 * Test(#74): NotificationServiceTest 구현 * Feat(#74): 파라미터 name 설정 * Feat(#74): JsonIgnore 어노테이션 삽입 * Feat(#74): isRead 필드 업데이트 메서드 로직 수정 * Test(#74): NotificationController 추가 * Feat(#74): JsonIgnore 어노테이션 삭제 * Fix(#74): Member 필드 삭제 * Test(#74): NotificationController 테스트 구현 * Test(#74): 문서 생성 경로 변경 * Test(#74): 알림 조회 문서 헤더 필드 생성 * Docs(#74): 알림 문서화 * Feat(#81): 챌린지 카테고리 추가 (#83) * Feat(#74): 카테고리 검색 메서드 추가 * Test(#81): * Feat(#81): 카테고리 검색 메서드 추가 * Feat(#81): 카테고리 검색 메서드 추가 * Feat(#81): 카테고리 클래스 추가 * Feat(#81): 챌린지 엔티티에 카테고리 필드 추가 * Feat(#81): 카테고리 필드 추가 * Feat(#81): 카테고리 검색 메서드 추가 * Feat(#81): 카테고리 필드 추가 * Test(#81): 챌린지 카테고리 검색 테스트 * Fix(#81): 카테고리 타입 변경 * Fix(#81): 카테고리 타입 변경 * Fix(#81): 카테고리 타입 변경 * Refactor: 컨벤션에 맞게 수정 (#80) * Feat(#70): 팀 문서, 팀 파일 CRUD 구현 초안 * Test(#70): 팀 파일 repositoryTest 구현 * Test(#70): 팀 파일 Controller, Service, domain 구현 * Test(#70): 레스트독스 적용 * Feat(#70): 팀 문서 CRUD 완성 * Test(#70): DocumentRepository Test 구현 * Test(#70): DocumentRepositoryTest 구현 * Refactor(#70): Document 주석 삭제 * Test(#70): DocumentTest 구현 * Test(#70): DocumentServiceTest 구현 * Test(#70): DocumentControllerTest 구현 * Refactor(#70): document update 전용 dto 생성 * Refactor(#70): 컨밴션 수정 * Refactor(#70): 띄어쓰기 컨밴션 수정 * Refactor(#70): 띄어쓰기 컨밴션 수정 * Refactor: 컨벤션에 맞게 수정 * Refactor: 컨벤션에 맞게 수정 * Feat(#48): 마이페이지 챌린지, 팀 대시보드 조회 (#82) * Feat(#48): 마이페이지 챌린지, 팀 대시보드 조회 * Refactor(#48): 컨벤션 리팩토링 * Refactor(#48): 컨벤션 리팩토링 * Refactor(#48): 어노테이션 순서 수정 * Feat(#48): 챌린지 이메일로 조회하는 로직 추가, 마이페이지에서 조회하기 로직 추가 * Refactor(#48): 줄바꿈 수정 * Test(#48): 마이페이지 팀 대시보드, 챌린지 조회 테스트코드, 문서 작업 * Feat(#62): 사용자의 개인 대시보드 카테고리 조회 기능 구현 (#84) * Feat(#62): 사용자의 개인 대시보드 카테고리 조회 기능 구현 * Test(#62): 사용자의 개인 대시보드 카테고리 조회 테스트 코드 구현 * Feat(#86): 블록 순번 속성 추가, 순번 지정, 순번 변경 api 기능 구현, 테스트 코드 구현 (#87) * Feat(#86): 블록 순번 속성 추가, 순번 지정, 순번 변경 api 기능 구현 * Test(#86): 블록 순번 속성 추가와 지정함으로써 테스트 코드 구현 * Docs(#86): restdocs 문서 추가 * Docs(#86): restdocs 문서 수정을 위한 테스트 코드 수정 * Refactor(#86): 블록의 대시보드 반환을 위한 dType 속성, 반환 값 추가 * Style: 끝 줄 추가 * Refactor(#88): 개인, 팀 대시보드 전체 조회 페이지네이션 제거 (#89) * Feat(#62): 사용자의 개인 대시보드 카테고리 조회 기능 구현 * Test(#62): 사용자의 개인 대시보드 카테고리 조회 테스트 코드 구현 * Feature(#74): 알림 기능 구현 (#77) * Feat(#74): 알림 엔티티 구현 * Feat(#74): 알림 레포지토리 구현 * Feat(#74): NotificationInfoResDto 구현 * Feat(#74): NotificationListResDto 구현 * Feat(#74): NotificationNotFoundException 구현 * Feat(#74): service 로직 구현 * Feat(#74): controller 로직 구현 * Feat(#74): spring-boot-starter-web-services 의존성 추가 * Feat(#74): 알림-멤버 매핑 * Feat(#74): 챌린지 참여 할 때 알림가도록 추가 * Feat(#74): 챌린지 생성될때마다 알림가도록 변경 * Style(#74): RequiredArgsConstructor 어노테이션 사용하도록 변경 * Feat(#74):notificationService 추가 * Style(#74):notification 객체 생성 빌더 패턴 방식으로 변경 * Refactor(#74): emitter를 SseEmitterManager 에서 관리하도록 변경 * Style(#74): 불필요한 공백 라인 제거 * Style(#74): 줄바꿈 추가 * Style(#74): 마지막 공백 라인 추가 * Style(#74): SseEmitterManager 추가 * Fix(#74): 챌린지를_개인_대시보드에_추가할_수_있다 테스트 안되는 오류 해결 * Test(#74): NotificationServiceTest 구현 * Feat(#74): 파라미터 name 설정 * Feat(#74): JsonIgnore 어노테이션 삽입 * Feat(#74): isRead 필드 업데이트 메서드 로직 수정 * Test(#74): NotificationController 추가 * Feat(#74): JsonIgnore 어노테이션 삭제 * Fix(#74): Member 필드 삭제 * Test(#74): NotificationController 테스트 구현 * Test(#74): 문서 생성 경로 변경 * Test(#74): 알림 조회 문서 헤더 필드 생성 * Docs(#74): 알림 문서화 * Feat(#81): 챌린지 카테고리 추가 (#83) * Feat(#74): 카테고리 검색 메서드 추가 * Test(#81): * Feat(#81): 카테고리 검색 메서드 추가 * Feat(#81): 카테고리 검색 메서드 추가 * Feat(#81): 카테고리 클래스 추가 * Feat(#81): 챌린지 엔티티에 카테고리 필드 추가 * Feat(#81): 카테고리 필드 추가 * Feat(#81): 카테고리 검색 메서드 추가 * Feat(#81): 카테고리 필드 추가 * Test(#81): 챌린지 카테고리 검색 테스트 * Fix(#81): 카테고리 타입 변경 * Fix(#81): 카테고리 타입 변경 * Fix(#81): 카테고리 타입 변경 * Refactor: 컨벤션에 맞게 수정 (#80) * Feat(#70): 팀 문서, 팀 파일 CRUD 구현 초안 * Test(#70): 팀 파일 repositoryTest 구현 * Test(#70): 팀 파일 Controller, Service, domain 구현 * Test(#70): 레스트독스 적용 * Feat(#70): 팀 문서 CRUD 완성 * Test(#70): DocumentRepository Test 구현 * Test(#70): DocumentRepositoryTest 구현 * Refactor(#70): Document 주석 삭제 * Test(#70): DocumentTest 구현 * Test(#70): DocumentServiceTest 구현 * Test(#70): DocumentControllerTest 구현 * Refactor(#70): document update 전용 dto 생성 * Refactor(#70): 컨밴션 수정 * Refactor(#70): 띄어쓰기 컨밴션 수정 * Refactor(#70): 띄어쓰기 컨밴션 수정 * Refactor: 컨벤션에 맞게 수정 * Refactor: 컨벤션에 맞게 수정 * Feat(#48): 마이페이지 챌린지, 팀 대시보드 조회 (#82) * Feat(#48): 마이페이지 챌린지, 팀 대시보드 조회 * Refactor(#48): 컨벤션 리팩토링 * Refactor(#48): 컨벤션 리팩토링 * Refactor(#48): 어노테이션 순서 수정 * Feat(#48): 챌린지 이메일로 조회하는 로직 추가, 마이페이지에서 조회하기 로직 추가 * Refactor(#48): 줄바꿈 수정 * Test(#48): 마이페이지 팀 대시보드, 챌린지 조회 테스트코드, 문서 작업 * Refactor(#88): 개인, 팀 대시보드 전체 조회 페이지네이션 제거 --------- Co-authored-by: DongkyunKim <134477764+dongkyun0713@users.noreply.github.com> Co-authored-by: choi inho <129029251+inhooo00@users.noreply.github.com> * Fix(#92): Build시에 Q클래스 생성되지 않는 버그 (#93) * Revert "Refactor(#88): 개인, 팀 대시보드 전체 조회 페이지네이션 제거 (#89)" (#94) This reverts commit dc3dd78f1e0b9ba8ef4c1efccb8417b2fe512cfc. * Refactor(#88): 개인, 팀 대시보드 전체 조회 페이지네이션 제거 (#95) * Revert "Refactor(#88): 개인, 팀 대시보드 전체 조회 페이지네이션 제거 (#89)" This reverts commit dc3dd78f1e0b9ba8ef4c1efccb8417b2fe512cfc. * Refactor(#88): 개인, 팀 대시보드 전체 조회 페이지네이션 제거 * Docs(#90): api 명세서에 enum 항목 설명 추가 (#91) * Feat(#74): 카테고리 검색 메서드 추가 * Test(#81): * Feat(#81): 카테고리 검색 메서드 추가 * Feat(#81): 카테고리 검색 메서드 추가 * Feat(#81): 카테고리 클래스 추가 * Feat(#81): 챌린지 엔티티에 카테고리 필드 추가 * Feat(#81): 카테고리 필드 추가 * Feat(#81): 카테고리 검색 메서드 추가 * Feat(#81): 카테고리 필드 추가 * Test(#81): 챌린지 카테고리 검색 테스트 * Fix(#81): 카테고리 타입 변경 * Fix(#81): 카테고리 타입 변경 * Fix(#81): 카테고리 타입 변경 * Docs(#90): enum 항목 설명 추가 * Refactor(#18): 테스트 코드 페이지, 사이즈 파라미터 추가 (#98) * Refactor(#74): 팀 대시보드 초대 시 알림 발송 API 추가 (#99) * Feat(#74): 알림 엔티티 구현 * Feat(#74): 알림 레포지토리 구현 * Feat(#74): NotificationInfoResDto 구현 * Feat(#74): NotificationListResDto 구현 * Feat(#74): NotificationNotFoundException 구현 * Feat(#74): service 로직 구현 * Feat(#74): controller 로직 구현 * Feat(#74): spring-boot-starter-web-services 의존성 추가 * Feat(#74): 알림-멤버 매핑 * Feat(#74): 챌린지 참여 할 때 알림가도록 추가 * Feat(#74): 챌린지 생성될때마다 알림가도록 변경 * Style(#74): RequiredArgsConstructor 어노테이션 사용하도록 변경 * Feat(#74):notificationService 추가 * Style(#74):notification 객체 생성 빌더 패턴 방식으로 변경 * Refactor(#74): emitter를 SseEmitterManager 에서 관리하도록 변경 * Style(#74): 불필요한 공백 라인 제거 * Style(#74): 줄바꿈 추가 * Style(#74): 마지막 공백 라인 추가 * Style(#74): SseEmitterManager 추가 * Fix(#74): 챌린지를_개인_대시보드에_추가할_수_있다 테스트 안되는 오류 해결 * Test(#74): NotificationServiceTest 구현 * Feat(#74): 파라미터 name 설정 * Feat(#74): JsonIgnore 어노테이션 삽입 * Feat(#74): isRead 필드 업데이트 메서드 로직 수정 * Test(#74): NotificationController 추가 * Feat(#74): JsonIgnore 어노테이션 삭제 * Fix(#74): Member 필드 삭제 * Test(#74): NotificationController 테스트 구현 * Test(#74): 문서 생성 경로 변경 * Test(#74): 알림 조회 문서 헤더 필드 생성 * Docs(#74): 알림 문서화 * Refactor(#74): 어노테이션 변경 * Refactor(#74): 팀 대시보드 초대 시 알림 메시지 전송 구현 * Refactor(#74): 매직 넘버 상수화 * Test(#74): notificationService 필드 추가 * Feat(#74): 팀원 초대 api 추가 * Refactor(#74): 쿼리스트링으로 입력받도록 변경 및 예외처리 추가 * Test(#74): 팀원 초대 테스트 * Refactor(#74): 팀 대시보드 생성 및 수정 시 팀 초대 알림 가도록 변경 (#102) * Feat(#74): 알림 엔티티 구현 * Feat(#74): 알림 레포지토리 구현 * Feat(#74): NotificationInfoResDto 구현 * Feat(#74): NotificationListResDto 구현 * Feat(#74): NotificationNotFoundException 구현 * Feat(#74): service 로직 구현 * Feat(#74): controller 로직 구현 * Feat(#74): spring-boot-starter-web-services 의존성 추가 * Feat(#74): 알림-멤버 매핑 * Feat(#74): 챌린지 참여 할 때 알림가도록 추가 * Feat(#74): 챌린지 생성될때마다 알림가도록 변경 * Style(#74): RequiredArgsConstructor 어노테이션 사용하도록 변경 * Feat(#74):notificationService 추가 * Style(#74):notification 객체 생성 빌더 패턴 방식으로 변경 * Refactor(#74): emitter를 SseEmitterManager 에서 관리하도록 변경 * Style(#74): 불필요한 공백 라인 제거 * Style(#74): 줄바꿈 추가 * Style(#74): 마지막 공백 라인 추가 * Style(#74): SseEmitterManager 추가 * Fix(#74): 챌린지를_개인_대시보드에_추가할_수_있다 테스트 안되는 오류 해결 * Test(#74): NotificationServiceTest 구현 * Feat(#74): 파라미터 name 설정 * Feat(#74): JsonIgnore 어노테이션 삽입 * Feat(#74): isRead 필드 업데이트 메서드 로직 수정 * Test(#74): NotificationController 추가 * Feat(#74): JsonIgnore 어노테이션 삭제 * Fix(#74): Member 필드 삭제 * Test(#74): NotificationController 테스트 구현 * Test(#74): 문서 생성 경로 변경 * Test(#74): 알림 조회 문서 헤더 필드 생성 * Docs(#74): 알림 문서화 * Refactor(#74): 어노테이션 변경 * Refactor(#74): 팀 대시보드 초대 시 알림 메시지 전송 구현 * Refactor(#74): 매직 넘버 상수화 * Test(#74): notificationService 필드 추가 * Feat(#74): 팀원 초대 api 추가 * Refactor(#74): 쿼리스트링으로 입력받도록 변경 및 예외처리 추가 * Test(#74): 팀원 초대 테스트 * Refactor(#74): 팀 대시보드 생성 시 초대 알림 가도록 변경 * Test(#74): 팀 대시보드 생성 시 초대 알림 가도록 변경 * Fix(#74): 충돌 수정 * Feat(#100): 삭제된 블록 조회, 영구 삭제 기능, 테스트 코드 구현 (#101) * Refactor(#18): 테스트 코드 페이지, 사이즈 파라미터 추가 * Feat(#100): 삭제된 블록 조회, 영구 삭제 기능 구현 * Test(#100): 삭제된 블록 조회, 영구 삭제 테스트 코드 구현 * Test(#100): 영구 삭제 테스트 코드 수정 * Docs(#100): 삭제된 블록, 영구 삭제 문서화 * Refactor(#104): Response에 챌린지 id 추가 (#105) * Feat(#74): 카테고리 검색 메서드 추가 * Test(#81): * Feat(#81): 카테고리 검색 메서드 추가 * Feat(#81): 카테고리 검색 메서드 추가 * Feat(#81): 카테고리 클래스 추가 * Feat(#81): 챌린지 엔티티에 카테고리 필드 추가 * Feat(#81): 카테고리 필드 추가 * Feat(#81): 카테고리 검색 메서드 추가 * Feat(#81): 카테고리 필드 추가 * Test(#81): 챌린지 카테고리 검색 테스트 * Fix(#81): 카테고리 타입 변경 * Fix(#81): 카테고리 타입 변경 * Fix(#81): 카테고리 타입 변경 * Docs(#90): enum 항목 설명 추가 * Refactor(#97): 매직 넘버 상수로 변환 * Refactor(#104): responseDto에 challengeId 추가 * Refactor: authServiceFactory로 id토큰 반환하는 로직 수정, JsonNode 반환 방법 DTO 사용 (#103) * Refactor: authServiceFactory로 id토큰 반환하는 로직 수정, JsonNode 반환 방법 DTO 사용 방법으로 변경 * Refactor: authServices로 매개변수 이름 수정 * Docs: 내 정보 수정 api 문서 작업 (#108) * Feat(#48): 마이페이지 챌린지, 팀 대시보드 조회 * Refactor(#48): 컨벤션 리팩토링 * Refactor(#48): 컨벤션 리팩토링 * Refactor(#48): 어노테이션 순서 수정 * Feat(#48): 챌린지 이메일로 조회하는 로직 추가, 마이페이지에서 조회하기 로직 추가 * Refactor(#48): 줄바꿈 수정 * Test(#48): 마이페이지 팀 대시보드, 챌린지 조회 테스트코드, 문서 작업 * Test: mypage 수정 테스트 코드 작성(아직 미완성) * Docs: 내 정보 수정 api 문서 작업 * Feat(#106): 팀 문서 전체적인 작업 (#107) * Feat(#106): 팀 문서 전체적인 작업 * Feat(#106): 팀 문서 상세 조회 로직 구현 * Test(#106): 팀 문서 컨트롤러 작성 * Test(#106): 팀 문서 컨트롤러 수정 중.. * Refactor(#106): DTO 정적 팩토링 메서드 이름 변경 * Docs(#106): 팀 문서 관전 api docs 파일로 구현 * Refactor(#106): 카테고리 dto 풀어서 전달 * Refactor(#112): 사용자 사진 반환 값 추가 (#113) * Refactor(#112): 사용자 사진 반환 값 추가 * Refactor(#112): 사용자 사진 반환 값 추가로 인한 테스트 코드 수정 * Refactor(#110): 대시보드 접근 권한 수정, 카테고리 중복 수정 (#111) * Refactor(#110): 대시보드 접근 권한 수정, 카테고리 중복 수정 * Test(#110): 카테고리 중복 수정으로 인한 테스트 코드 수정 * Refactor(#106): 카테고리로 팀문서 조회하는 로직 수정 (#109) * Feat(#48): 마이페이지 챌린지, 팀 대시보드 조회 * Refactor(#48): 컨벤션 리팩토링 * Refactor(#48): 컨벤션 리팩토링 * Refactor(#48): 어노테이션 순서 수정 * Feat(#48): 챌린지 이메일로 조회하는 로직 추가, 마이페이지에서 조회하기 로직 추가 * Refactor(#48): 줄바꿈 수정 * Test(#48): 마이페이지 팀 대시보드, 챌린지 조회 테스트코드, 문서 작업 * Test: mypage 수정 테스트 코드 작성(아직 미완성) * Docs: 내 정보 수정 api 문서 작업 * Test(#106): 팀 문서 post 테스트코드 수정 * Refactor(#106): 카테고리로 팀문서 조회하는 로직 수정 * Docs: teamDocument api 문서 수정 * Test(#106): 팀 문서 post 테스트코드 수정 (#114) * Feat(#48): 마이페이지 챌린지, 팀 대시보드 조회 * Refactor(#48): 컨벤션 리팩토링 * Refactor(#48): 컨벤션 리팩토링 * Refactor(#48): 어노테이션 순서 수정 * Feat(#48): 챌린지 이메일로 조회하는 로직 추가, 마이페이지에서 조회하기 로직 추가 * Refactor(#48): 줄바꿈 수정 * Test(#48): 마이페이지 팀 대시보드, 챌린지 조회 테스트코드, 문서 작업 * Test: mypage 수정 테스트 코드 작성(아직 미완성) * Docs: 내 정보 수정 api 문서 작업 * Test(#106): 팀 문서 post 테스트코드 수정 * Refactor(#106): 카테고리로 팀문서 조회하는 로직 수정 * Docs: teamDocument api 문서 수정 * Test(#106): 팀 문서 post 테스트코드 수정 * Refactor: mypage 챌랜지, 팀 대시보드 조회 페이지네이션 수정 (#115) * Feat(#48): 마이페이지 챌린지, 팀 대시보드 조회 * Refactor(#48): 컨벤션 리팩토링 * Refactor(#48): 컨벤션 리팩토링 * Refactor(#48): 어노테이션 순서 수정 * Feat(#48): 챌린지 이메일로 조회하는 로직 추가, 마이페이지에서 조회하기 로직 추가 * Refactor(#48): 줄바꿈 수정 * Test(#48): 마이페이지 팀 대시보드, 챌린지 조회 테스트코드, 문서 작업 * Test: mypage 수정 테스트 코드 작성(아직 미완성) * Docs: 내 정보 수정 api 문서 작업 * Test(#106): 팀 문서 post 테스트코드 수정 * Refactor(#106): 카테고리로 팀문서 조회하는 로직 수정 * Docs: teamDocument api 문서 수정 * Test(#106): 팀 문서 post 테스트코드 수정 * Refactor: mypage 챌랜지, 팀 대시보드 조회 페이지네이션 수정 * Docs: 팀 대시보드와 챌린지 정보 조회 API 쿼리 정보 추가 * Fix(#110): 404에러 발생 수정 (#118) * Refactor(#110): 대시보드 접근 권한 수정, 카테고리 중복 수정 * Test(#110): 카테고리 중복 수정으로 인한 테스트 코드 수정 * Fix(#110): 404에러 발생 수정 * Fix(#110): 404에러 발생 수정 (#119) * Refactor(#110): 대시보드 접근 권한 수정, 카테고리 중복 수정 * Test(#110): 카테고리 중복 수정으로 인한 테스트 코드 수정 * Fix(#110): 404에러 발생 수정 * Fix(#110): 404에러 발생 수정 * Refactor: 문서 삭제 * Refactor(#10): 팀 대시보드 팀원에 대시보드 생성자 추가 (#125) * Refactor(#110): 대시보드 접근 권한 수정, 카테고리 중복 수정 * Test(#110): 카테고리 중복 수정으로 인한 테스트 코드 수정 * Fix(#110): 404에러 발생 수정 * Fix(#110): 404에러 발생 수정 * Refactor(#10): 팀 대시보드 팀원에 대시보드 생성자 추가 * Test(#10): 팀 대시보드 팀원에 대시보드 생성자 추가로 인한 테스트 코드 수정 (#126) * Refactor(#110): 대시보드 접근 권한 수정, 카테고리 중복 수정 * Test(#110): 카테고리 중복 수정으로 인한 테스트 코드 수정 * Fix(#110): 404에러 발생 수정 * Fix(#110): 404에러 발생 수정 * Refactor(#10): 팀 대시보드 팀원에 대시보드 생성자 추가 * Test(#10): 팀 대시보드 팀원에 대시보드 생성자 추가로 인한 테스트 코드 수정 * Refacotr(#127): 팀원이 팀 초대 수락하면 팀장한테 알람가도록 구현 및 팀 초대 api 로직 수정 (#128) * Feat(#74): 알림 엔티티 구현 * Feat(#74): 알림 레포지토리 구현 * Feat(#74): NotificationInfoResDto 구현 * Feat(#74): NotificationListResDto 구현 * Feat(#74): NotificationNotFoundException 구현 * Feat(#74): service 로직 구현 * Feat(#74): controller 로직 구현 * Feat(#74): spring-boot-starter-web-services 의존성 추가 * Feat(#74): 알림-멤버 매핑 * Feat(#74): 챌린지 참여 할 때 알림가도록 추가 * Feat(#74): 챌린지 생성될때마다 알림가도록 변경 * Style(#74): RequiredArgsConstructor 어노테이션 사용하도록 변경 * Feat(#74):notificationService 추가 * Style(#74):notification 객체 생성 빌더 패턴 방식으로 변경 * Refactor(#74): emitter를 SseEmitterManager 에서 관리하도록 변경 * Style(#74): 불필요한 공백 라인 제거 * Style(#74): 줄바꿈 추가 * Style(#74): 마지막 공백 라인 추가 * Style(#74): SseEmitterManager 추가 * Fix(#74): 챌린지를_개인_대시보드에_추가할_수_있다 테스트 안되는 오류 해결 * Test(#74): NotificationServiceTest 구현 * Feat(#74): 파라미터 name 설정 * Feat(#74): JsonIgnore 어노테이션 삽입 * Feat(#74): isRead 필드 업데이트 메서드 로직 수정 * Test(#74): NotificationController 추가 * Feat(#74): JsonIgnore 어노테이션 삭제 * Fix(#74): Member 필드 삭제 * Test(#74): NotificationController 테스트 구현 * Test(#74): 문서 생성 경로 변경 * Test(#74): 알림 조회 문서 헤더 필드 생성 * Docs(#74): 알림 문서화 * Refactor(#74): 어노테이션 변경 * Refactor(#74): 팀 대시보드 초대 시 알림 메시지 전송 구현 * Refactor(#74): 매직 넘버 상수화 * Test(#74): notificationService 필드 추가 * Feat(#74): 팀원 초대 api 추가 * Refactor(#74): 쿼리스트링으로 입력받도록 변경 및 예외처리 추가 * Test(#74): 팀원 초대 테스트 * Refactor(#74): 팀 대시보드 생성 시 초대 알림 가도록 변경 * Test(#74): 팀 대시보드 생성 시 초대 알림 가도록 변경 * Fix(#74): 충돌 수정 * Refactor(#74): 메서드 분리 * Feat(): 매직 넘버 상수화 * Refactor(#127): 팀원이 팀 초대 수락하면 팀장한테 알람가도록 구현 및 팀 초대 api 로직 수정 * Refacor: 알림 연결 성공시 더미데이터 반환 (#129) * Feat(#74): 알림 엔티티 구현 * Feat(#74): 알림 레포지토리 구현 * Feat(#74): NotificationInfoResDto 구현 * Feat(#74): NotificationListResDto 구현 * Feat(#74): NotificationNotFoundException 구현 * Feat(#74): service 로직 구현 * Feat(#74): controller 로직 구현 * Feat(#74): spring-boot-starter-web-services 의존성 추가 * Feat(#74): 알림-멤버 매핑 * Feat(#74): 챌린지 참여 할 때 알림가도록 추가 * Feat(#74): 챌린지 생성될때마다 알림가도록 변경 * Style(#74): RequiredArgsConstructor 어노테이션 사용하도록 변경 * Feat(#74):notificationService 추가 * Style(#74):notification 객체 생성 빌더 패턴 방식으로 변경 * Refactor(#74): emitter를 SseEmitterManager 에서 관리하도록 변경 * Style(#74): 불필요한 공백 라인 제거 * Style(#74): 줄바꿈 추가 * Style(#74): 마지막 공백 라인 추가 * Style(#74): SseEmitterManager 추가 * Fix(#74): 챌린지를_개인_대시보드에_추가할_수_있다 테스트 안되는 오류 해결 * Test(#74): NotificationServiceTest 구현 * Feat(#74): 파라미터 name 설정 * Feat(#74): JsonIgnore 어노테이션 삽입 * Feat(#74): isRead 필드 업데이트 메서드 로직 수정 * Test(#74): NotificationController 추가 * Feat(#74): JsonIgnore 어노테이션 삭제 * Fix(#74): Member 필드 삭제 * Test(#74): NotificationController 테스트 구현 * Test(#74): 문서 생성 경로 변경 * Test(#74): 알림 조회 문서 헤더 필드 생성 * Docs(#74): 알림 문서화 * Refactor(#74): 어노테이션 변경 * Refactor(#74): 팀 대시보드 초대 시 알림 메시지 전송 구현 * Refactor(#74): 매직 넘버 상수화 * Test(#74): notificationService 필드 추가 * Feat(#74): 팀원 초대 api 추가 * Refactor(#74): 쿼리스트링으로 입력받도록 변경 및 예외처리 추가 * Test(#74): 팀원 초대 테스트 * Refactor(#74): 팀 대시보드 생성 시 초대 알림 가도록 변경 * Test(#74): 팀 대시보드 생성 시 초대 알림 가도록 변경 * Fix(#74): 충돌 수정 * Refactor(#74): 메서드 분리 * Feat(): 매직 넘버 상수화 * Refactor(#127): 팀원이 팀 초대 수락하면 팀장한테 알람가도록 구현 및 팀 초대 api 로직 수정 * Refacor: 알림 연결 성공시 더미데이터 반환 * Refactor: 알림 이름 안보내도록 수정 (#130) * Feat(#74): 알림 엔티티 구현 * Feat(#74): 알림 레포지토리 구현 * Feat(#74): NotificationInfoResDto 구현 * Feat(#74): NotificationListResDto 구현 * Feat(#74): NotificationNotFoundException 구현 * Feat(#74): service 로직 구현 * Feat(#74): controller 로직 구현 * Feat(#74): spring-boot-starter-web-services 의존성 추가 * Feat(#74): 알림-멤버 매핑 * Feat(#74): 챌린지 참여 할 때 알림가도록 추가 * Feat(#74): 챌린지 생성될때마다 알림가도록 변경 * Style(#74): RequiredArgsConstructor 어노테이션 사용하도록 변경 * Feat(#74):notificationService 추가 * Style(#74):notification 객체 생성 빌더 패턴 방식으로 변경 * Refactor(#74): emitter를 SseEmitterManager 에서 관리하도록 변경 * Style(#74): 불필요한 공백 라인 제거 * Style(#74): 줄바꿈 추가 * Style(#74): 마지막 공백 라인 추가 * Style(#74): SseEmitterManager 추가 * Fix(#74): 챌린지를_개인_대시보드에_추가할_수_있다 테스트 안되는 오류 해결 * Test(#74): NotificationServiceTest 구현 * Feat(#74): 파라미터 name 설정 * Feat(#74): JsonIgnore 어노테이션 삽입 * Feat(#74): isRead 필드 업데이트 메서드 로직 수정 * Test(#74): NotificationController 추가 * Feat(#74): JsonIgnore 어노테이션 삭제 * Fix(#74): Member 필드 삭제 * Test(#74): NotificationController 테스트 구현 * Test(#74): 문서 생성 경로 변경 * Test(#74): 알림 조회 문서 헤더 필드 생성 * Docs(#74): 알림 문서화 * Refactor(#74): 어노테이션 변경 * Refactor(#74): 팀 대시보드 초대 시 알림 메시지 전송 구현 * Refactor(#74): 매직 넘버 상수화 * Test(#74): notificationService 필드 추가 * Feat(#74): 팀원 초대 api 추가 * Refactor(#74): 쿼리스트링으로 입력받도록 변경 및 예외처리 추가 * Test(#74): 팀원 초대 테스트 * Refactor(#74): 팀 대시보드 생성 시 초대 알림 가도록 변경 * Test(#74): 팀 대시보드 생성 시 초대 알림 가도록 변경 * Fix(#74): 충돌 수정 * Refactor(#74): 메서드 분리 * Feat(): 매직 넘버 상수화 * Refactor(#127): 팀원이 팀 초대 수락하면 팀장한테 알람가도록 구현 및 팀 초대 api 로직 수정 * Refacor: 알림 연결 성공시 더미데이터 반환 * Refacor: 알림 이름 안보내도록 수정 * Refacor: 알림 이름 안보내도록 수정 * Refacor: 알림 이름 안보내도록 수정 * Refacor(#131): 알림 전체 조회 시 읽은 여부 true로 변경 (#132) * Feat(#74): 알림 엔티티 구현 * Feat(#74): 알림 레포지토리 구현 * Feat(#74): NotificationInfoResDto 구현 * Feat(#74): NotificationListResDto 구현 * Feat(#74): NotificationNotFoundException 구현 * Feat(#74): service 로직 구현 * Feat(#74): controller 로직 구현 * Feat(#74): spring-boot-starter-web-services 의존성 추가 * Feat(#74): 알림-멤버 매핑 * Feat(#74): 챌린지 참여 할 때 알림가도록 추가 * Feat(#74): 챌린지 생성될때마다 알림가도록 변경 * Style(#74): RequiredArgsConstructor 어노테이션 사용하도록 변경 * Feat(#74):notificationService 추가 * Style(#74):notification 객체 생성 빌더 패턴 방식으로 변경 * Refactor(#74): emitter를 SseEmitterManager 에서 관리하도록 변경 * Style(#74): 불필요한 공백 라인 제거 * Style(#74): 줄바꿈 추가 * Style(#74): 마지막 공백 라인 추가 * Style(#74): SseEmitterManager 추가 * Fix(#74): 챌린지를_개인_대시보드에_추가할_수_있다 테스트 안되는 오류 해결 * Test(#74): NotificationServiceTest 구현 * Feat(#74): 파라미터 name 설정 * Feat(#74): JsonIgnore 어노테이션 삽입 * Feat(#74): isRead 필드 업데이트 메서드 로직 수정 * Test(#74): NotificationController 추가 * Feat(#74): JsonIgnore 어노테이션 삭제 * Fix(#74): Member 필드 삭제 * Test(#74): NotificationController 테스트 구현 * Test(#74): 문서 생성 경로 변경 * Test(#74): 알림 조회 문서 헤더 필드 생성 * Docs(#74): 알림 문서화 * Refactor(#74): 어노테이션 변경 * Refactor(#74): 팀 대시보드 초대 시 알림 메시지 전송 구현 * Refactor(#74): 매직 넘버 상수화 * Test(#74): notificationService 필드 추가 * Feat(#74): 팀원 초대 api 추가 * Refactor(#74): 쿼리스트링으로 입력받도록 변경 및 예외처리 추가 * Test(#74): 팀원 초대 테스트 * Refactor(#74): 팀 대시보드 생성 시 초대 알림 가도록 변경 * Test(#74): 팀 대시보드 생성 시 초대 알림 가도록 변경 * Fix(#74): 충돌 수정 * Refactor(#74): 메서드 분리 * Feat(): 매직 넘버 상수화 * Refactor(#127): 팀원이 팀 초대 수락하면 팀장한테 알람가도록 구현 및 팀 초대 api 로직 수정 * Refacor: 알림 연결 성공시 더미데이터 반환 * Refacor: 알림 이름 안보내도록 수정 * Refacor: 알림 이름 안보내도록 수정 * Refacor: 알림 이름 안보내도록 수정 * Refacor(#131): 알림 전체 조회 시 읽은 여부 true로 변경 * Test(#131): 알림 로직 변경에 따른 테스트 코드 수정 (#133) * Feat(#74): 알림 엔티티 구현 * Feat(#74): 알림 레포지토리 구현 * Feat(#74): NotificationInfoResDto 구현 * Feat(#74): NotificationListResDto 구현 * Feat(#74): NotificationNotFoundException 구현 * Feat(#74): service 로직 구현 * Feat(#74): controller 로직 구현 * Feat(#74): spring-boot-starter-web-services 의존성 추가 * Feat(#74): 알림-멤버 매핑 * Feat(#74): 챌린지 참여 할 때 알림가도록 추가 * Feat(#74): 챌린지 생성될때마다 알림가도록 변경 * Style(#74): RequiredArgsConstructor 어노테이션 사용하도록 변경 * Feat(#74):notificationService 추가 * Style(#74):notification 객체 생성 빌더 패턴 방식으로 변경 * Refactor(#74): emitter를 SseEmitterManager 에서 관리하도록 변경 * Style(#74): 불필요한 공백 라인 제거 * Style(#74): 줄바꿈 추가 * Style(#74): 마지막 공백 라인 추가 * Style(#74): SseEmitterManager 추가 * Fix(#74): 챌린지를_개인_대시보드에_추가할_수_있다 테스트 안되는 오류 해결 * Test(#74): NotificationServiceTest 구현 * Feat(#74): 파라미터 name 설정 * Feat(#74): JsonIgnore 어노테이션 삽입 * Feat(#74): isRead 필드 업데이트 메서드 로직 수정 * Test(#74): NotificationController 추가 * Feat(#74): JsonIgnore 어노테이션 삭제 * Fix(#74): Member 필드 삭제 * Test(#74): NotificationController 테스트 구현 * Test(#74): 문서 생성 경로 변경 * Test(#74): 알림 조회 문서 헤더 필드 생성 * Docs(#74): 알림 문서화 * Refactor(#74): 어노테이션 변경 * Refactor(#74): 팀 대시보드 초대 시 알림 메시지 전송 구현 * Refactor(#74): 매직 넘버 상수화 * Test(#74): notificationService 필드 추가 * Feat(#74): 팀원 초대 api 추가 * Refactor(#74): 쿼리스트링으로 입력받도록 변경 및 예외처리 추가 * Test(#74): 팀원 초대 테스트 * Refactor(#74): 팀 대시보드 생성 시 초대 알림 가도록 변경 * Test(#74): 팀 대시보드 생성 시 초대 알림 가도록 변경 * Fix(#74): 충돌 수정 * Refactor(#74): 메서드 분리 * Feat(): 매직 넘버 상수화 * Refactor(#127): 팀원이 팀 초대 수락하면 팀장한테 알람가도록 구현 및 팀 초대 api 로직 수정 * Refacor: 알림 연결 성공시 더미데이터 반환 * Refacor: 알림 이름 안보내도록 수정 * Refacor: 알림 이름 안보내도록 수정 * Refacor: 알림 이름 안보내도록 수정 * Refacor(#131): 알림 전체 조회 시 읽은 여부 true로 변경 * Test(#131): 로직 변경에 따른 테스트 코드 수정 * Refactor(#131): 코드 리펙토링 --------- Co-authored-by: inhooo00 Co-authored-by: giwoong Co-authored-by: choi inho <129029251+inhooo00@users.noreply.github.com> --- build.gradle | 31 ++++++++++++- .../dto/response/TeamDashboardInfoResDto.java | 13 +++--- .../application/TeamDashboardService.java | 21 ++++++--- .../api/NotificationController.java | 6 +-- .../dto/response/NotificationInfoResDto.java | 3 +- .../application/NotificationService.java | 5 +-- .../NotificationCustomRepositoryImpl.java | 15 +++++-- .../notification/util/SseEmitterManager.java | 7 ++- .../auth/api/AuthControllerTest.java | 33 ++++++-------- .../team/api/TeamDashboardControllerTest.java | 4 +- .../application/TeamDashboardServiceTest.java | 6 +-- .../global/restdocs/RestDocsHandler.java | 43 +++++++++++++++++++ .../api/NotificationControllerTest.java | 7 +-- .../application/NotificationServiceTest.java | 6 +-- 14 files changed, 140 insertions(+), 60 deletions(-) create mode 100644 src/test/java/shop/kkeujeok/kkeujeokbackend/global/restdocs/RestDocsHandler.java diff --git a/build.gradle b/build.gradle index 5fd267dc..fd7bb910 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,7 @@ plugins { id 'java' id 'org.springframework.boot' version '3.3.1' id 'io.spring.dependency-management' version '1.1.5' + id 'org.asciidoctor.jvm.convert' version '4.0.2' } group = 'shop.kkeujeok' @@ -17,6 +18,7 @@ configurations { compileOnly { extendsFrom annotationProcessor } + asciidoctorExt } repositories { @@ -30,7 +32,7 @@ dependencies { compileOnly 'org.projectlombok:lombok' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-validation', version: '3.3.2' implementation 'org.springframework.boot:spring-boot-starter-web-services' - + // logback implementation 'com.github.napstr:logback-discord-appender:1.0.0' implementation 'com.github.maricn:logback-slack-appender:1.4.0' @@ -53,8 +55,33 @@ dependencies { annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" + // restdocs + asciidoctorExt 'org.springframework.restdocs:spring-restdocs-asciidoctor:3.0.1' + testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc:3.0.1' + +} +ext { + snippetsDir = file('build/generated-snippets') +} + +test { + outputs.dir snippetsDir +} + +asciidoctor { + inputs.dir snippetsDir + configurations 'asciidoctorExt' + dependsOn test + baseDirFollowsSourceFile() +} + +bootJar { + dependsOn asciidoctor + from("${asciidoctor.outputDir}") { + into 'static/docs' + } } tasks.named('test') { useJUnitPlatform() -} +} \ No newline at end of file diff --git a/src/main/java/shop/kkeujeok/kkeujeokbackend/dashboard/team/api/dto/response/TeamDashboardInfoResDto.java b/src/main/java/shop/kkeujeok/kkeujeokbackend/dashboard/team/api/dto/response/TeamDashboardInfoResDto.java index cdf94b61..8d98ecd5 100644 --- a/src/main/java/shop/kkeujeok/kkeujeokbackend/dashboard/team/api/dto/response/TeamDashboardInfoResDto.java +++ b/src/main/java/shop/kkeujeok/kkeujeokbackend/dashboard/team/api/dto/response/TeamDashboardInfoResDto.java @@ -22,13 +22,16 @@ public static TeamDashboardInfoResDto of(Member member, TeamDashboard dashboard) } public static TeamDashboardInfoResDto detailOf(Member member, TeamDashboard dashboard, double blockProgress) { + List joinMemberInfoResDtos = new java.util.ArrayList<>(); + joinMemberInfoResDtos.add(JoinMemberInfoResDto.from(dashboard.getMember())); + + joinMemberInfoResDtos.addAll(dashboard.getTeamDashboardMemberMappings().stream() + .map(mapping -> JoinMemberInfoResDto.from(mapping.getMember())) + .toList()); + return commonBuilder(member, dashboard) .blockProgress(blockProgress) - .joinMembers(dashboard.getTeamDashboardMemberMappings().stream() - .map(teamDashboardMemberMapping -> { - return JoinMemberInfoResDto.from(teamDashboardMemberMapping.getMember()); - }) - .toList()) + .joinMembers(joinMemberInfoResDtos) .build(); } diff --git a/src/main/java/shop/kkeujeok/kkeujeokbackend/dashboard/team/application/TeamDashboardService.java b/src/main/java/shop/kkeujeok/kkeujeokbackend/dashboard/team/application/TeamDashboardService.java index 11e3e85b..3f6dd30b 100644 --- a/src/main/java/shop/kkeujeok/kkeujeokbackend/dashboard/team/application/TeamDashboardService.java +++ b/src/main/java/shop/kkeujeok/kkeujeokbackend/dashboard/team/application/TeamDashboardService.java @@ -9,7 +9,6 @@ import shop.kkeujeok.kkeujeokbackend.dashboard.exception.DashboardNotFoundException; import shop.kkeujeok.kkeujeokbackend.dashboard.exception.InvalidMemberInviteException; import shop.kkeujeok.kkeujeokbackend.dashboard.exception.UnauthorizedAccessException; -import shop.kkeujeok.kkeujeokbackend.dashboard.personal.domain.PersonalDashboard; import shop.kkeujeok.kkeujeokbackend.dashboard.personal.exception.DashboardAccessDeniedException; import shop.kkeujeok.kkeujeokbackend.dashboard.team.api.dto.request.TeamDashboardSaveReqDto; import shop.kkeujeok.kkeujeokbackend.dashboard.team.api.dto.request.TeamDashboardUpdateReqDto; @@ -30,6 +29,7 @@ public class TeamDashboardService { private static final String TEAM_DASHBOARD_JOIN_MESSAGE = "%s님이 %s 대시보드에 초대하였습니다."; + private static final String TEAM_JOIN_ACCEPT_MESSAGE = "%s님이 초대를 수락하였습니다."; private final TeamDashboardRepository teamDashboardRepository; @@ -133,6 +133,9 @@ public void joinTeam(String email, Long dashboardId) { .orElseThrow(DashboardNotFoundException::new); dashboard.addMember(member); + + String message = String.format(TEAM_JOIN_ACCEPT_MESSAGE, member.getEmail()); + notificationService.sendNotification(dashboard.getMember(), message); } @Transactional @@ -152,17 +155,21 @@ public SearchMemberListResDto searchMembers(String query) { private void inviteMember(Member member, TeamDashboard teamDashboard, List invitedEmails) { for (String email : invitedEmails) { - verifyIsSameEmail(member.getEmail(), email); + try { + verifyIsSameEmail(member.getEmail(), email); - Member inviteReceivedMember = memberRepository.findByEmail(email) - .orElseThrow(MemberNotFoundException::new); + Member inviteReceivedMember = memberRepository.findByEmail(email) + .orElseThrow(MemberNotFoundException::new); - String message = String.format(TEAM_DASHBOARD_JOIN_MESSAGE, member.getName(), - teamDashboard.getTitle()); - notificationService.sendNotification(inviteReceivedMember, message); + String message = String.format(TEAM_DASHBOARD_JOIN_MESSAGE, member.getName(), + teamDashboard.getTitle()); + notificationService.sendNotification(inviteReceivedMember, message); + } catch (MemberNotFoundException ignored) { + } } } + private void verifyIsSameEmail(String email, String otherEmail) { if (email.equals(otherEmail)) { throw new InvalidMemberInviteException(); diff --git a/src/main/java/shop/kkeujeok/kkeujeokbackend/notification/api/NotificationController.java b/src/main/java/shop/kkeujeok/kkeujeokbackend/notification/api/NotificationController.java index 5ca1fa70..a69686a8 100644 --- a/src/main/java/shop/kkeujeok/kkeujeokbackend/notification/api/NotificationController.java +++ b/src/main/java/shop/kkeujeok/kkeujeokbackend/notification/api/NotificationController.java @@ -4,14 +4,12 @@ import org.springframework.data.domain.PageRequest; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import shop.kkeujeok.kkeujeokbackend.global.annotation.CurrentUserEmail; import shop.kkeujeok.kkeujeokbackend.global.template.RspTemplate; -import shop.kkeujeok.kkeujeokbackend.notification.api.dto.response.NotificationInfoResDto; import shop.kkeujeok.kkeujeokbackend.notification.api.dto.response.NotificationListResDto; import shop.kkeujeok.kkeujeokbackend.notification.application.NotificationService; @@ -35,10 +33,10 @@ public RspTemplate findAllNotifications(@CurrentUserEmai notificationService.findAllNotificationsFromMember(email, PageRequest.of(page, size))); } - @GetMapping("/{notificationId}") + /*@GetMapping("/{notificationId}") public RspTemplate findNotificationById( @PathVariable(name = "notificationId") Long notificationId) { return new RspTemplate<>(HttpStatus.OK, "알림 상세 조회 성공", notificationService.findByNotificationId(notificationId)); - } + }*/ } diff --git a/src/main/java/shop/kkeujeok/kkeujeokbackend/notification/api/dto/response/NotificationInfoResDto.java b/src/main/java/shop/kkeujeok/kkeujeokbackend/notification/api/dto/response/NotificationInfoResDto.java index 849013d2..dadf183a 100644 --- a/src/main/java/shop/kkeujeok/kkeujeokbackend/notification/api/dto/response/NotificationInfoResDto.java +++ b/src/main/java/shop/kkeujeok/kkeujeokbackend/notification/api/dto/response/NotificationInfoResDto.java @@ -10,11 +10,12 @@ public record NotificationInfoResDto( Boolean isRead ) { public static NotificationInfoResDto from(Notification notification) { + notification.markAsRead(); + return NotificationInfoResDto.builder() .id(notification.getId()) .message(notification.getMessage()) .isRead(notification.getIsRead()) .build(); } - } diff --git a/src/main/java/shop/kkeujeok/kkeujeokbackend/notification/application/NotificationService.java b/src/main/java/shop/kkeujeok/kkeujeokbackend/notification/application/NotificationService.java index 0d98cb99..1a51f65e 100644 --- a/src/main/java/shop/kkeujeok/kkeujeokbackend/notification/application/NotificationService.java +++ b/src/main/java/shop/kkeujeok/kkeujeokbackend/notification/application/NotificationService.java @@ -15,7 +15,6 @@ import shop.kkeujeok.kkeujeokbackend.notification.api.dto.response.NotificationListResDto; import shop.kkeujeok.kkeujeokbackend.notification.domain.Notification; import shop.kkeujeok.kkeujeokbackend.notification.domain.repository.NotificationRepository; -import shop.kkeujeok.kkeujeokbackend.notification.exception.NotificationNotFoundException; import shop.kkeujeok.kkeujeokbackend.notification.util.SseEmitterManager; @Service @@ -57,14 +56,14 @@ public NotificationListResDto findAllNotificationsFromMember(String email, Pagea return NotificationListResDto.of(notificationList, PageInfoResDto.from(notifications)); } - @Transactional + /*@Transactional public NotificationInfoResDto findByNotificationId(Long notificationId) { Notification notification = notificationRepository.findById(notificationId) .orElseThrow(NotificationNotFoundException::new); notification.markAsRead(); return NotificationInfoResDto.from(notification); - } + }*/ private Member findMemberByEmail(String email) { return memberRepository.findByEmail(email) diff --git a/src/main/java/shop/kkeujeok/kkeujeokbackend/notification/domain/repository/NotificationCustomRepositoryImpl.java b/src/main/java/shop/kkeujeok/kkeujeokbackend/notification/domain/repository/NotificationCustomRepositoryImpl.java index 39521295..663e63a2 100644 --- a/src/main/java/shop/kkeujeok/kkeujeokbackend/notification/domain/repository/NotificationCustomRepositoryImpl.java +++ b/src/main/java/shop/kkeujeok/kkeujeokbackend/notification/domain/repository/NotificationCustomRepositoryImpl.java @@ -24,22 +24,29 @@ public class NotificationCustomRepositoryImpl implements NotificationCustomRepos public Page findAllNotifications(Member member, Pageable pageable) { QNotification notification = QNotification.notification; - long total = Optional.ofNullable( + long total = getTotal(notification, member); + List notifications = getNotifications(notification, member, pageable); + + return new PageImpl<>(notifications, pageable, total); + } + + private long getTotal(QNotification notification, Member member) { + return Optional.ofNullable( queryFactory .select(notification.count()) .from(notification) .where(notification.receiver.eq(member)) .fetchOne() ).orElse(0L); + } - List notifications = queryFactory + private List getNotifications(QNotification notification, Member member, Pageable pageable) { + return queryFactory .selectFrom(notification) .where(notification.receiver.eq(member)) .orderBy(notification.createdAt.desc()) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); - - return new PageImpl<>(notifications, pageable, total); } } diff --git a/src/main/java/shop/kkeujeok/kkeujeokbackend/notification/util/SseEmitterManager.java b/src/main/java/shop/kkeujeok/kkeujeokbackend/notification/util/SseEmitterManager.java index 348a24c9..0e716589 100644 --- a/src/main/java/shop/kkeujeok/kkeujeokbackend/notification/util/SseEmitterManager.java +++ b/src/main/java/shop/kkeujeok/kkeujeokbackend/notification/util/SseEmitterManager.java @@ -9,6 +9,8 @@ @Slf4j @Component public class SseEmitterManager { + private static final String EMITTER_NAME = "notification"; + private static final String DUMMY_MESSAGE = "연결 성공"; private final Map emitters = new ConcurrentHashMap<>(); @@ -20,6 +22,8 @@ public SseEmitter createEmitter(Long memberId) { emitter.onTimeout(() -> emitters.remove(memberId)); emitter.onError((e) -> emitters.remove(memberId)); + sendNotification(memberId, DUMMY_MESSAGE); + return emitter; } @@ -28,7 +32,8 @@ public void sendNotification(Long memberId, String message) { if (emitter != null) { try { - emitter.send(SseEmitter.event().name("notification").data(message)); + emitter.send(SseEmitter.event() + .data(message)); } catch (Exception e) { emitter.completeWithError(e); } diff --git a/src/test/java/shop/kkeujeok/kkeujeokbackend/auth/api/AuthControllerTest.java b/src/test/java/shop/kkeujeok/kkeujeokbackend/auth/api/AuthControllerTest.java index fd6551ab..cacafa18 100644 --- a/src/test/java/shop/kkeujeok/kkeujeokbackend/auth/api/AuthControllerTest.java +++ b/src/test/java/shop/kkeujeok/kkeujeokbackend/auth/api/AuthControllerTest.java @@ -1,14 +1,25 @@ package shop.kkeujeok.kkeujeokbackend.auth.api; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static shop.kkeujeok.kkeujeokbackend.global.restdocs.RestDocsHandler.requestFields; +import static shop.kkeujeok.kkeujeokbackend.global.restdocs.RestDocsHandler.responseFields; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; import org.mockito.MockitoAnnotations; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; -import org.springframework.restdocs.RestDocumentationContextProvider; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; import shop.kkeujeok.kkeujeokbackend.auth.api.dto.request.RefreshTokenReqDto; import shop.kkeujeok.kkeujeokbackend.auth.api.dto.request.TokenReqDto; import shop.kkeujeok.kkeujeokbackend.auth.api.dto.response.MemberLoginResDto; @@ -18,22 +29,6 @@ import shop.kkeujeok.kkeujeokbackend.member.domain.Member; import shop.kkeujeok.kkeujeokbackend.member.domain.SocialType; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; -import static org.springframework.restdocs.headers.HeaderDocumentation.requestHeaders; -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; -import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static shop.kkeujeok.kkeujeokbackend.global.restdocs.RestDocsHandler.requestFields; -import static shop.kkeujeok.kkeujeokbackend.global.restdocs.RestDocsHandler.responseFields; - public class AuthControllerTest extends ControllerTest { private Member member; diff --git a/src/test/java/shop/kkeujeok/kkeujeokbackend/dashboard/team/api/TeamDashboardControllerTest.java b/src/test/java/shop/kkeujeok/kkeujeokbackend/dashboard/team/api/TeamDashboardControllerTest.java index 5cf567a0..8e076c49 100644 --- a/src/test/java/shop/kkeujeok/kkeujeokbackend/dashboard/team/api/TeamDashboardControllerTest.java +++ b/src/test/java/shop/kkeujeok/kkeujeokbackend/dashboard/team/api/TeamDashboardControllerTest.java @@ -18,13 +18,13 @@ import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; import static org.springframework.restdocs.request.RequestDocumentation.queryParameters; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static shop.kkeujeok.kkeujeokbackend.global.restdocs.RestDocsHandler.requestFields; -import static shop.kkeujeok.kkeujeokbackend.global.restdocs.RestDocsHandler.responseFields; import java.util.Collections; import java.util.List; diff --git a/src/test/java/shop/kkeujeok/kkeujeokbackend/dashboard/team/application/TeamDashboardServiceTest.java b/src/test/java/shop/kkeujeok/kkeujeokbackend/dashboard/team/application/TeamDashboardServiceTest.java index 9cc6716b..35c0b859 100644 --- a/src/test/java/shop/kkeujeok/kkeujeokbackend/dashboard/team/application/TeamDashboardServiceTest.java +++ b/src/test/java/shop/kkeujeok/kkeujeokbackend/dashboard/team/application/TeamDashboardServiceTest.java @@ -236,7 +236,7 @@ void setUp() { assertThat(result.title()).isEqualTo("title"); assertThat(result.description()).isEqualTo("description"); assertThat(result.blockProgress()).isEqualTo(0.0); - assertThat(result.joinMembers().size()).isEqualTo(1); + assertThat(result.joinMembers().size()).isEqualTo(2); }); } @@ -257,7 +257,7 @@ void setUp() { assertThat(result.title()).isEqualTo("title"); assertThat(result.description()).isEqualTo("description"); assertThat(result.blockProgress()).isEqualTo(0.0); - assertThat(result.joinMembers().size()).isEqualTo(0); + assertThat(result.joinMembers().size()).isEqualTo(1); }); } @@ -277,4 +277,4 @@ void setUp() { }); } -} \ No newline at end of file +} diff --git a/src/test/java/shop/kkeujeok/kkeujeokbackend/global/restdocs/RestDocsHandler.java b/src/test/java/shop/kkeujeok/kkeujeokbackend/global/restdocs/RestDocsHandler.java new file mode 100644 index 00000000..5a01af5c --- /dev/null +++ b/src/test/java/shop/kkeujeok/kkeujeokbackend/global/restdocs/RestDocsHandler.java @@ -0,0 +1,43 @@ +package shop.kkeujeok.kkeujeokbackend.global.restdocs; + +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; + +import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler; +import org.springframework.restdocs.payload.FieldDescriptor; +import org.springframework.restdocs.payload.PayloadDocumentation; +import org.springframework.restdocs.snippet.Snippet; + +public class RestDocsHandler { + public static RestDocumentationResultHandler createRestDocsHandler(String identifier, Snippet... snippets) { + return document(identifier, + preprocessRequest( + prettyPrint()), + preprocessResponse( + prettyPrint()), + snippets + ); + } + + public static RestDocumentationResultHandler createRestDocsHandlerWithFields( + String identifier, + Snippet requestFieldsSnippet, + Snippet responseFieldsSnippet) { + return document(identifier, + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestFieldsSnippet, + responseFieldsSnippet + ); + } + + public static Snippet requestFields(FieldDescriptor... fields) { + return PayloadDocumentation.requestFields(fields); + } + + public static Snippet responseFields(FieldDescriptor... fields) { + return PayloadDocumentation.responseFields(fields); + } +} diff --git a/src/test/java/shop/kkeujeok/kkeujeokbackend/notification/api/NotificationControllerTest.java b/src/test/java/shop/kkeujeok/kkeujeokbackend/notification/api/NotificationControllerTest.java index a7097eaa..14db02f5 100644 --- a/src/test/java/shop/kkeujeok/kkeujeokbackend/notification/api/NotificationControllerTest.java +++ b/src/test/java/shop/kkeujeok/kkeujeokbackend/notification/api/NotificationControllerTest.java @@ -1,7 +1,6 @@ package shop.kkeujeok.kkeujeokbackend.notification.api; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.when; import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; @@ -13,8 +12,6 @@ import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; -import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; -import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static shop.kkeujeok.kkeujeokbackend.global.restdocs.RestDocsHandler.responseFields; @@ -151,7 +148,7 @@ void setUp(RestDocumentationContextProvider restDocumentation) { .andExpect(status().isOk()); } - @Test + /*@Test @DisplayName("알림 상세 조회에 성공하면 상태코드 200 반환") void 알림_상세_조회에_성공하면_상태코드_200_반환() throws Exception { // given @@ -180,5 +177,5 @@ void setUp(RestDocumentationContextProvider restDocumentation) { )) ) .andExpect(status().isOk()); - } + }*/ } diff --git a/src/test/java/shop/kkeujeok/kkeujeokbackend/notification/application/NotificationServiceTest.java b/src/test/java/shop/kkeujeok/kkeujeokbackend/notification/application/NotificationServiceTest.java index f712e115..5191ce27 100644 --- a/src/test/java/shop/kkeujeok/kkeujeokbackend/notification/application/NotificationServiceTest.java +++ b/src/test/java/shop/kkeujeok/kkeujeokbackend/notification/application/NotificationServiceTest.java @@ -1,7 +1,6 @@ package shop.kkeujeok.kkeujeokbackend.notification.application; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; @@ -26,7 +25,6 @@ import shop.kkeujeok.kkeujeokbackend.notification.api.dto.response.NotificationListResDto; import shop.kkeujeok.kkeujeokbackend.notification.domain.Notification; import shop.kkeujeok.kkeujeokbackend.notification.domain.repository.NotificationRepository; -import shop.kkeujeok.kkeujeokbackend.notification.exception.NotificationNotFoundException; import shop.kkeujeok.kkeujeokbackend.notification.util.SseEmitterManager; @ExtendWith(MockitoExtension.class) @@ -104,7 +102,7 @@ void setUp() { // 어떻게 테스트할 지 고민해보겠습니다.. } - @Test + /*@Test @DisplayName("존재하지 않는 알림을 조회하면 예외가 발생한다") void 존재하지_않는_알림을_조회하면_예외가_발생한다() { // given @@ -115,7 +113,7 @@ void setUp() { // when & then assertThatThrownBy(() -> notificationService.findByNotificationId(nonExistentNotificationId)) .isInstanceOf(NotificationNotFoundException.class); - } + }*/ @Test @DisplayName("회원의 모든 알림을 조회할 수 있다")