Skip to content

Commit

Permalink
Main push (#228)
Browse files Browse the repository at this point in the history
* 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 <[email protected]>

* 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 <[email protected]>
Co-authored-by: choi inho <[email protected]>

* 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): 코드 리펙토링

* Refactor(#97): 챌린지 코드 리펙토링 (#135)

* 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(#97): 메서드 분리

* Refacor(#97): 싱글턴 패턴으로 변경

* Test(#97): 싱글턴 패턴으로 변경

* Refacor(#97): cycle 검증을 도메인 계층에서 하도록 변경

* Test(#97): 테스트 코드 오류 수정

* Refactor(#138): 챌린지 생성 시 생성 날짜 자동 주입 및 블록 이름 추가

* Docs(#139): 카테고리 별 검색 문서에 추가 및 쿼리 파라미터 추가 (#140)

* 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(#97): 메서드 분리

* Refacor(#97): 싱글턴 패턴으로 변경

* Test(#97): 싱글턴 패턴으로 변경

* Refacor(#97): cycle 검증을 도메인 계층에서 하도록 변경

* Test(#97): 테스트 코드 오류 수정

* Refactor(#138): 챌린지 생성 시 생성 날짜 자동 주입 및 블록 이름 추가

* Test(#139): 쿼리 파라미터 추가

* Docs(#139): 쿼리 파라미터 추가 및 카테거리 검색 API 추가

* Feature(#141): 이미지 업로드 기능 추가 (#142)

* 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(#97): 메서드 분리

* Refacor(#97): 싱글턴 패턴으로 변경

* Test(#97): 싱글턴 패턴으로 변경

* Refacor(#97): cycle 검증을 도메인 계층에서 하도록 변경

* Test(#97): 테스트 코드 오류 수정

* Refactor(#138): 챌린지 생성 시 생성 날짜 자동 주입 및 블록 이름 추가

* Test(#139): 쿼리 파라미터 추가

* Docs(#139): 쿼리 파라미터 추가 및 카테거리 검색 API 추가

* Feat(#141): 이미지 업로드 기능 추가

* Feat(#141): 의존성 추가

* Test(#141): 이미지 업로드 테스트

* Docs(#141): 문서 업데이트

* Test(#141): 이미지 업로드 테스트

* �Refcator(#141): url 고유하도록 변경 (#143)

* 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(#97): 메서드 분리

* Refacor(#97): 싱글턴 패턴으로 변경

* Test(#97): 싱글턴 패턴으로 변경

* Refacor(#97): cycle 검증을 도메인 계층에서 하도록 변경

* Test(#97): 테스트 코드 오류 수정

* Refactor(#138): 챌린지 생성 시 생성 날짜 자동 주입 및 블록 이름 추가

* Test(#139): 쿼리 파라미터 추가

* Docs(#139): 쿼리 파라미터 추가 및 카테거리 검색 API 추가

* Feat(#141): 이미지 업로드 기능 추가

* Feat(#141): 의존성 추가

* Test(#141): 이미지 업로드 테스트

* Docs(#141): 문서 업데이트

* Test(#141): 이미지 업로드 테스트

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#144): 알림 전체조회 페이지네이션 삭제 (#145)

* 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): 코드 리펙토링

* Refactor(#144): 알림 전체조회 페이지네이션 삭제

* Feat(#146): 모든 알림 읽음으로 표시하는 api 추가 (#147)

* 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): 코드 리펙토링

* Refactor(#144): 알림 전체조회 페이지네이션 삭제

* Feat(#146): 모든 알림 읽음으로 표시하는 api 추가

* Refactor(#148): 챌린지 카테고리 및 키워드 검색 api 하나로 통합 (#149)

* 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(#97): 메서드 분리

* Refacor(#97): 싱글턴 패턴으로 변경

* Test(#97): 싱글턴 패턴으로 변경

* Refacor(#97): cycle 검증을 도메인 계층에서 하도록 변경

* Test(#97): 테스트 코드 오류 수정

* Refactor(#138): 챌린지 생성 시 생성 날짜 자동 주입 및 블록 이름 추가

* Test(#139): 쿼리 파라미터 추가

* Docs(#139): 쿼리 파라미터 추가 및 카테거리 검색 API 추가

* Feat(#141): 이미지 업로드 기능 추가

* Feat(#141): 의존성 추가

* Test(#141): 이미지 업로드 테스트

* Docs(#141): 문서 업데이트

* Test(#141): 이미지 업로드 테스트

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): 불필요한 주석 제거

* Feat: 카테고리와 키워드를 통해 챌린지 검색하는 기능 추가

* Refactor(#148): 챌린지 카테고리 및 키워드 검색 api 하나로 통합

* Refactor(#150): 팀 초대 메시지에 대시보드 아이디 추가 (#151)

* 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): 코드 리펙토링

* Refactor(#144): 알림 전체조회 페이지네이션 삭제

* Feat(#146): 모든 알림 읽음으로 표시하는 api 추가

* Refactor(#150): 팀 초대 메시지에 대시보드 아이디 추가

* Refactor: 마이페이지 내에서 개인 대시보드 조회 기능 추가 & 상대방 프로필은 isPublic이 true인 것만 보이도록 수정 (#152)

* Refactor: 마이페이지 내에서 개인 대시보드 조회 기능 추가 & 상대방 프로필은 isPublic이 true인 것만 보이도록 수정

* Docs: mypage 대시보드 & 챌린지 목록 조회 문서 수정

* Test: mypage 개인 대시보드 확인 로직 추가 수정

* Refactor(#153): 챌린지 상세조회 반환값 수정 (#154)

* 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(#97): 메서드 분리

* Refacor(#97): 싱글턴 패턴으로 변경

* Test(#97): 싱글턴 패턴으로 변경

* Refacor(#97): cycle 검증을 도메인 계층에서 하도록 변경

* Test(#97): 테스트 코드 오류 수정

* Refactor(#138): 챌린지 생성 시 생성 날짜 자동 주입 및 블록 이름 추가

* Test(#139): 쿼리 파라미터 추가

* Docs(#139): 쿼리 파라미터 추가 및 카테거리 검색 API 추가

* Feat(#141): 이미지 업로드 기능 추가

* Feat(#141): 의존성 추가

* Test(#141): 이미지 업로드 테스트

* Docs(#141): 문서 업데이트

* Test(#141): 이미지 업로드 테스트

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): 불필요한 주석 제거

* Feat: 카테고리와 키워드를 통해 챌린지 검색하는 기능 추가

* Refactor(#148): 챌린지 카테고리 및 키워드 검색 api 하나로 통합

* Refactor(#153): 챌린지 상세조회 반환값 수정

* Refactor(#155): 팀 대시보드 중복 참여, 참여하지 않았지만 탈퇴하려는 사용자 예외 처리, 참가자 팀 대시보드 리스트 수정 (#156)

* Refactor(#153): 챌린지 실시간 완료자 반환하도록 수정 (#157)

* 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(#97): 메서드 분리

* Refacor(#97): 싱글턴 패턴으로 변경

* Test(#97): 싱글턴 패턴으로 변경

* Refacor(#97): cycle 검증을 도메인 계층에서 하도록 변경

* Test(#97): 테스트 코드 오류 수정

* Refactor(#138): 챌린지 생성 시 생성 날짜 자동 주입 및 블록 이름 추가

* Test(#139): 쿼리 파라미터 추가

* Docs(#139): 쿼리 파라미터 추가 및 카테거리 검색 API 추가

* Feat(#141): 이미지 업로드 기능 추가

* Feat(#141): 의존성 추가

* Test(#141): 이미지 업로드 테스트

* Docs(#141): 문서 업데이트

* Test(#141): 이미지 업로드 테스트

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): 불필요한 주석 제거

* Feat: 카테고리와 키워드를 통해 챌린지 검색하는 기능 추가

* Refactor(#148): 챌린지 카테고리 및 키워드 검색 api 하나로 통합

* Refactor(#153): 챌린지 상세조회 반환값 수정

* Refactor(#153): 챌린지 실시간 완료자 반환하도록 수정

* Fix(#158): 이전 팀 문서 삭제 (#159)

* Refactor(#153): 챌린지 주기마다 블록이 새로 생성되도록 변경 (#160)

* 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(#97): 메서드 분리

* Refacor(#97): 싱글턴 패턴으로 변경

* Test(#97): 싱글턴 패턴으로 변경

* Refacor(#97): cycle 검증을 도메인 계층에서 하도록 변경

* Test(#97): 테스트 코드 오류 수정

* Refactor(#138): 챌린지 생성 시 생성 날짜 자동 주입 및 블록 이름 추가

* Test(#139): 쿼리 파라미터 추가

* Docs(#139): 쿼리 파라미터 추가 및 카테거리 검색 API 추가

* Feat(#141): 이미지 업로드 기능 추가

* Feat(#141): 의존성 추가

* Test(#141): 이미지 업로드 테스트

* Docs(#141): 문서 업데이트

* Test(#141): 이미지 업로드 테스트

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): 불필요한 주석 제거

* Feat: 카테고리와 키워드를 통해 챌린지 검색하는 기능 추가

* Refactor(#148): 챌린지 카테고리 및 키워드 검색 api 하나로 통합

* Refactor(#153): 챌린지 상세조회 반환값 수정

* Refactor(#153): 챌린지 실시간 완료자 반환하도록 수정

* Refactor(#153): 챌린지 주기마다 블록이 새로 생성되도록 변경

* Refactor(#153): 필요없는 주석 제거

* Fix(#161): 이미지 수정 시 null 반환하는 오류 해결 (#162)

* 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(#97): 메서드 분리

* Refacor(#97): 싱글턴 패턴으로 변경

* Test(#97): 싱글턴 패턴으로 변경

* Refacor(#97): cycle 검증을 도메인 계층에서 하도록 변경

* Test(#97): 테스트 코드 오류 수정

* Refactor(#138): 챌린지 생성 시 생성 날짜 자동 주입 및 블록 이름 추가

* Test(#139): 쿼리 파라미터 추가

* Docs(#139): 쿼리 파라미터 추가 및 카테거리 검색 API 추가

* Feat(#141): 이미지 업로드 기능 추가

* Feat(#141): 의존성 추가

* Test(#141): 이미지 업로드 테스트

* Docs(#141): 문서 업데이트

* Test(#141): 이미지 업로드 테스트

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): 불필요한 주석 제거

* Feat: 카테고리와 키워드를 통해 챌린지 검색하는 기능 추가

* Refactor(#148): 챌린지 카테고리 및 키워드 검색 api 하나로 통합

* Refactor(#153): 챌린지 상세조회 반환값 수정

* Refactor(#153): 챌린지 실시간 완료자 반환하도록 수정

* Refactor(#153): 챌린지 주기마다 블록이 새로 생성되도록 변경

* Refactor(#153): 필요없는 주석 제거

* Refacotr(#161): 이미지 수정 시 null 반환하는 오류 해결

* Fix(#163): 매개변수 순서 수정 (#164)

* 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(#97): 메서드 분리

* Refacor(#97): 싱글턴 패턴으로 변경

* Test(#97): 싱글턴 패턴으로 변경

* Refacor(#97): cycle 검증을 도메인 계층에서 하도록 변경

* Test(#97): 테스트 코드 오류 수정

* Refactor(#138): 챌린지 생성 시 생성 날짜 자동 주입 및 블록 이름 추가

* Test(#139): 쿼리 파라미터 추가

* Docs(#139): 쿼리 파라미터 추가 및 카테거리 검색 API 추가

* Feat(#141): 이미지 업로드 기능 추가

* Feat(#141): 의존성 추가

* Test(#141): 이미지 업로드 테스트

* Docs(#141): 문서 업데이트

* Test(#141): 이미지 업로드 테스트

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): 불필요한 주석 제거

* Feat: 카테고리와 키워드를 통해 챌린지 검색하는 기능 추가

* Refactor(#148): 챌린지 카테고리 및 키워드 검색 api 하나로 통합

* Refactor(#153): 챌린지 상세조회 반환값 수정

* Refactor(#153): 챌린지 실시간 완료자 반환하도록 수정

* Refactor(#153): 챌린지 주기마다 블록이 새로 생성되도록 변경

* Refactor(#153): 필요없는 주석 제거

* Refacotr(#161): 이미지 수정 시 null 반환하는 오류 해결

* Fix(#163): 매개변수 수정

* Feat(#165): 챌린지 탈퇴 api 추가" (#166)

* 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(#97): 메서드 분리

* Refacor(#97): 싱글턴 패턴으로 변경

* Test(#97): 싱글턴 패턴으로 변경

* Refacor(#97): cycle 검증을 도메인 계층에서 하도록 변경

* Test(#97): 테스트 코드 오류 수정

* Refactor(#138): 챌린지 생성 시 생성 날짜 자동 주입 및 블록 이름 추가

* Test(#139): 쿼리 파라미터 추가

* Docs(#139): 쿼리 파라미터 추가 및 카테거리 검색 API 추가

* Feat(#141): 이미지 업로드 기능 추가

* Feat(#141): 의존성 추가

* Test(#141): 이미지 업로드 테스트

* Docs(#141): 문서 업데이트

* Test(#141): 이미지 업로드 테스트

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): 불필요한 주석 제거

* Feat: 카테고리와 키워드를 통해 챌린지 검색하는 기능 추가

* Refactor(#148): 챌린지 카테고리 및 키워드 검색 api 하나로 통합

* Refactor(#153): 챌린지 상세조회 반환값 수정

* Refactor(#153): 챌린지 실시간 완료자 반환하도록 수정

* Refactor(#153): 챌린지 주기마다 블록이 새로 생성되도록 변경

* Refactor(#153): 필요없는 주석 제거

* Refacotr(#161): 이미지 수정 시 null 반환하는 오류 해결

* Fix(#163): 매개변수 수정

* Feat(#165): 챌린지 탈퇴 api 추가

* Fix: 충돌 해결

* Fix: 충돌 해결

* Fix: 충돌 해결

* Fix: 충돌 해결

* Refactor(#168): 블록 디데이 시작날짜부터 계산, 삭제된 블록 진행도 불포함 (#169)

* Fix(#170): 챌린지 생성 안되는 오류 해결" (#171)

* 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(#97): 메서드 분리

* Refacor(#97): 싱글턴 패턴으로 변경

* Test(#97): 싱글턴 패턴으로 변경

* Refacor(#97): cycle 검증을 도메인 계층에서 하도록 변경

* Test(#97): 테스트 코드 오류 수정

* Refactor(#138): 챌린지 생성 시 생성 날짜 자동 주입 및 블록 이름 추가

* Test(#139): 쿼리 파라미터 추가

* Docs(#139): 쿼리 파라미터 추가 및 카테거리 검색 API 추가

* Feat(#141): 이미지 업로드 기능 추가

* Feat(#141): 의존성 추가

* Test(#141): 이미지 업로드 테스트

* Docs(#141): 문서 업데이트

* Test(#141): 이미지 업로드 테스트

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): 불필요한 주석 제거

* Feat: 카테고리와 키워드를 통해 챌린지 검색하는 기능 추가

* Refactor(#148): 챌린지 카테고리 및 키워드 검색 api 하나로 통합

* Refactor(#153): 챌린지 상세조회 반환값 수정

* Refactor(#153): 챌린지 실시간 완료자 반환하도록 수정

* Refactor(#153): 챌린지 주기마다 블록이 새로 생성되도록 변경

* Refactor(#153): 필요없는 주석 제거

* Refacotr(#161): 이미지 수정 시 null 반환하는 오류 해결

* Fix(#163): 매개변수 수정

* Feat(#165): 챌린지 탈퇴 api 추가

* Fix(#170): 챌린지 생성 안되는 오류 해결

* Fix(#170): 챌린지 추가 시 챌린지 블록 생성안되는 오류 해결 (#172)

* 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(#97): 메서드 분리

* Refacor(#97): 싱글턴 패턴으로 변경

* Test(#97): 싱글턴 패턴으로 변경

* Refacor(#97): cycle 검증을 도메인 계층에서 하도록 변경

* Test(#97): 테스트 코드 오류 수정

* Refactor(#138): 챌린지 생성 시 생성 날짜 자동 주입 및 블록 이름 추가

* Test(#139): 쿼리 파라미터 추가

* Docs(#139): 쿼리 파라미터 추가 및 카테거리 검색 API 추가

* Feat(#141): 이미지 업로드 기능 추가

* Feat(#141): 의존성 추가

* Test(#141): 이미지 업로드 테스트

* Docs(#141): 문서 업데이트

* Test(#141): 이미지 업로드 테스트

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): 불필요한 주석 제거

* Feat: 카테고리와 키워드를 통해 챌린지 검색하는 기능 추가

* Refactor(#148): 챌린지 카테고리 및 키워드 검색 api 하나로 통합

* Refactor(#153): 챌린지 상세조회 반환값 수정

* Refactor(#153): 챌린지 실시간 완료자 반환하도록 수정

* Refactor(#153): 챌린지 주기마다 블록이 새로 생성되도록 변경

* Refactor(#153): 필요없는 주석 제거

* Refacotr(#161): 이미지 수정 시 null 반환하는 오류 해결

* Fix(#163): 매개변수 수정

* Feat(#165): 챌린지 탈퇴 api 추가

* Fix(#170): 챌린지 생성 안되는 오류 해결

* Fix(#170): 챌린지 생성 안되는 오류 해결

* Fix(#170): 챌린지 생성 안되는 오류 해결

* Fix(#170): 챌린지 추가 시 챌린지 블록 생성 안되는 오류 해결 (#173)

* 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(#97): 메서드 분리

* Refacor(#97): 싱글턴 패턴으로 변경

* Test(#97): 싱글턴 패턴으로 변경

* Refacor(#97): cycle 검증을 도메인 계층에서 하도록 변경

* Test(#97): 테스트 코드 오류 수정

* Refactor(#138): 챌린지 생성 시 생성 날짜 자동 주입 및 블록 이름 추가

* Test(#139): 쿼리 파라미터 추가

* Docs(#139): 쿼리 파라미터 추가 및 카테거리 검색 API 추가

* Feat(#141): 이미지 업로드 기능 추가

* Feat(#141): 의존성 추가

* Test(#141): 이미지 업로드 테스트

* Docs(#141): 문서 업데이트

* Test(#141): 이미지 업로드 테스트

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): 불필요한 주석 제거

* Feat: 카테고리와 키워드를 통해 챌린지 검색하는 기능 추가

* Refactor(#148): 챌린지 카테고리 및 키워드 검색 api 하나로 통합

* Refactor(#153): 챌린지 상세조회 반환값 수정

* Refactor(#153): 챌린지 실시간 완료자 반환하도록 수정

* Refactor(#153): 챌린지 주기마다 블록이 새로 생성되도록 변경

* Refactor(#153): 필요없는 주석 제거

* Refacotr(#161): 이미지 수정 시 null 반환하는 오류 해결

* Fix(#163): 매개변수 수정

* Feat(#165): 챌린지 탈퇴 api 추가

* Fix(#170): 챌린지 생성 안되는 오류 해결

* Fix(#170): 챌린지 생성 안되는 오류 해결

* Fix(#170): 챌린지 생성 안되는 오류 해결

* Fix(#170): 챌린지 생성 안되는 오류 해결

* Fix(#170): 챌린지 추가 시 챌린지 블록 생성 안되는 오류 해결

* Fix(#170): 챌린지 추가 시 챌린지 블록 생성 안되는 오류 해결

* Refactor: 마이페이지에서 챌린지 조회할 때 참여한 챌린지들 보이도록 수정 (#174)

* Refactor: 마이페이지에서 챌린지 조회할 때 참여한 챌린지들 보이도록 수정

* Docs: 사용하지 않는 문서 삭제

* Refactor: 읽은 여부 false로 반환

* Refactor: 팀 대시보드 참여 사용자 아이디 반환 (#178)

* 챌린지 및 개인대시보드 삭제 시 연관 매핑 테이블도 제거 및 검색 시 역순 반환 (#179)

* 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(#97): 메서드 분리

* Refacor(#97): 싱글턴 패턴으로 변경

* Test(#97): 싱글턴 패턴으로 변경

* Refacor(#97): cycle 검증을 도메인 계층에서 하도록 변경

* Test(#97): 테스트 코드 오류 수정

* Refactor(#138): 챌린지 생성 시 생성 날짜 자동 주입 및 블록 이름 추가

* Test(#139): 쿼리 파라미터 추가

* Docs(#139): 쿼리 파라미터 추가 및 카테거리 검색 API 추가

* Feat(#141): 이미지 업로드 기능 추가

* Feat(#141): 의존성 추가

* Test(#141): 이미지 업로드 테스트

* Docs(#141): 문서 업데이트

* Test(#141): 이미지 업로드 테스트

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): 불필요한 주석 제거

* Feat: 카테고리와 키워드를 통해 챌린지 검색하는 기능 추가

* Refactor(#148): 챌린지 카테고리 및 키워드 검색 api 하나로 통합

* Refactor(#153): 챌린지 상세조회 반환값 수정

* Refactor(#153): 챌린지 실시간 완료자 반환하도록 수정

* Refactor(#153): 챌린지 주기마다 블록이 새로 생성되도록 변경

* Refactor(#153): 필요없는 주석 제거

* Refacotr(#161): 이미지 수정 시 null 반환하는 오류 해결

* Fix(#163): 매개변수 수정

* Feat(#165): 챌린지 탈퇴 api 추가

* Fix(#170): 챌린지 생성 안되는 오류 해결

* Fix(#170): 챌린지 생성 안되는 오류 해결

* Fix(#170): 챌린지 생성 안되는 오류 해결

* Fix(#170): 챌린지 생성 안되는 오류 해결

* Fix(#170): 챌린지 추가 시 챌린지 블록 생성 안되는 오류 해결

* Fix(#170): 챌린지 추가 시 챌린지 블록 생성 안되는 오류 해결

* Refactor: 역순으로 반환하도록 변경

* Refactor(#177): 개인 대시보드 삭제 시 챌린지 매핑 연관관계 제거

* Refactor(#177): 챌린지 삭제 시 챌린지 매핑 연관관계 제거

* Refactor(#177): 챌린지 삭제 시 챌린지 매핑 연관관계 제거

* Refactor(#177): 줄바꿈 수정

* Refactor(#177): 메시지 수정

* Refactor(#177): 개인 대시보드 삭제 시 챌린지 매핑 연관관계 제거

* Refactor: 알림 메시지 수정

* Refactor(#177): 챌린지 검색 및 전체 조회 시 역순으로 반환하도록 변경 (#180)

* 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(#97): 메서드 분리

* Refacor(#97): 싱글턴 패턴으로 변경

* Test(#97): 싱글턴 패턴으로 변경

* Refacor(#97): cycle 검증을 도메인 계층에서 하도록 변경

* Test(#97): 테스트 코드 오류 수정

* Refactor(#138): 챌린지 생성 시 생성 날짜 자동 주입 및 블록 이름 추가

* Test(#139): 쿼리 파라미터 추가

* Docs(#139): 쿼리 파라미터 추가 및 카테거리 검색 API 추가

* Feat(#141): 이미지 업로드 기능 추가

* Feat(#141): 의존성 추가

* Test(#141): 이미지 업로드 테스트

* Docs(#141): 문서 업데이트

* Test(#141): 이미지 업로드 테스트

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): url 고유하도록 변경

* Refactor(#141): 불필요한 주석 제거

* Feat: 카테고리와 키워드를 통해 챌린지 검색하는 기능 추가

* Refactor(#148): 챌린지 카테고리 및 키워드 검색 api 하나로 통합

* Refactor(#153): 챌린지 상세조회 반환값 수정

* Refactor(#153): 챌린지 실시간 완료자 반환하도록 수정

* Refactor(#153): 챌린지 주기마다 블록이 새로 생성되도록 변경

* Refactor(#153): 필요없는 주석 제거

* Refacotr(#161): 이미지 수정 시 null 반환하는 오류 해결

* Fix(#163): 매개변수 수정

* Feat(#165): 챌린지 탈퇴 api 추가

* Fix(#170): 챌린지 생성 안되는 오류 해결

* Fix(#170): 챌린지 생성 안되는 오류 해결

* Fix(#170): 챌린지 생성 안되는 오류 해결

* Fix(#170): 챌린지 생성 안되는 오류 해결

* Fix(#170): 챌린지 추가 시 챌린지 블록 생성 안되는 오류 해결

* Fix(#170): 챌린지 추가 시 챌린지 블록 생성 안되는 오류 해결

* Refactor: 역순으로 반환하도록 변경

* Refactor(#177): 개인 대시보드 삭제 시 챌린지 매핑 연관관계 제거

* Refactor(#177): 챌린지 삭제 시 챌린지 매핑 연관관계 제거

* Refactor(#177): 챌린지 삭제 시 챌린지 매핑 연관관계 제거

* R…
  • Loading branch information
4 people authored Nov 28, 2024
1 parent 3d35844 commit 3c09a8b
Show file tree
Hide file tree
Showing 22 changed files with 753 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -98,4 +98,12 @@ public RspTemplate<Void> deletePermanently(@CurrentUserEmail String email,
"블록 영구 삭제");
}

@DeleteMapping("/permanent")
public RspTemplate<Void> deleteAllPermanently(@CurrentUserEmail String email,
@RequestParam(name = "dashboardId") Long dashboardId) {
blockService.deleteAllPermanently(email, dashboardId);
return new RspTemplate<>(HttpStatus.OK,
"삭제된 블록 영구 삭제(휴지통 비움)");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@
import shop.kkeujeok.kkeujeokbackend.dashboard.domain.Dashboard;
import shop.kkeujeok.kkeujeokbackend.dashboard.domain.repository.DashboardRepository;
import shop.kkeujeok.kkeujeokbackend.dashboard.exception.DashboardNotFoundException;
import shop.kkeujeok.kkeujeokbackend.dashboard.exception.UnauthorizedAccessException;
import shop.kkeujeok.kkeujeokbackend.dashboard.personal.domain.PersonalDashboard;
import shop.kkeujeok.kkeujeokbackend.dashboard.team.domain.TeamDashboard;
import shop.kkeujeok.kkeujeokbackend.global.dto.PageInfoResDto;
import shop.kkeujeok.kkeujeokbackend.member.domain.Member;
import shop.kkeujeok.kkeujeokbackend.member.domain.repository.MemberRepository;
Expand All @@ -50,6 +53,8 @@ public BlockInfoResDto save(String email, BlockSaveReqDto blockSaveReqDto) {
Dashboard dashboard = dashboardRepository.findById(blockSaveReqDto.dashboardId())
.orElseThrow(DashboardNotFoundException::new);

validateDashboardAccess(dashboard, member);

int lastSequence = blockRepository.findLastSequenceByProgress(
member,
dashboard.getId(),
Expand Down Expand Up @@ -81,6 +86,10 @@ private void saveDeadlineNotification(Block block) {
public BlockInfoResDto update(String email, Long blockId, BlockUpdateReqDto blockUpdateReqDto) {
Member member = memberRepository.findByEmail(email).orElseThrow(MemberNotFoundException::new);
Block block = blockRepository.findById(blockId).orElseThrow(BlockNotFoundException::new);
Dashboard dashboard = dashboardRepository.findById(block.getDashboard().getId())
.orElseThrow(DashboardNotFoundException::new);

validateDashboardAccess(dashboard, member);

block.update(blockUpdateReqDto.title(),
blockUpdateReqDto.contents(),
Expand All @@ -98,6 +107,11 @@ public BlockInfoResDto progressUpdate(String email, Long blockId, String progres

Progress progress = parseProgress(progressString);

Dashboard dashboard = dashboardRepository.findById(block.getDashboard().getId())
.orElseThrow(DashboardNotFoundException::new);

validateDashboardAccess(dashboard, member);

block.progressUpdate(progress);

updateChallengeCompletedMemberByProgress(block, member, progress);
Expand Down Expand Up @@ -137,6 +151,10 @@ public BlockInfoResDto findById(String email, Long blockId) {
public void delete(String email, Long blockId) {
Member member = memberRepository.findByEmail(email).orElseThrow(MemberNotFoundException::new);
Block block = blockRepository.findById(blockId).orElseThrow(BlockNotFoundException::new);
Dashboard dashboard = dashboardRepository.findById(block.getDashboard().getId())
.orElseThrow(DashboardNotFoundException::new);

validateDashboardAccess(dashboard, member);

block.statusUpdate();
}
Expand All @@ -146,6 +164,10 @@ public void delete(String email, Long blockId) {
public void changeBlocksSequence(String email, BlockSequenceUpdateReqDto blockSequenceUpdateReqDto) {
Member member = memberRepository.findByEmail(email).orElseThrow(MemberNotFoundException::new);
Long dashboardId = blockSequenceUpdateReqDto.dashboardId();
Dashboard dashboard = dashboardRepository.findById(blockSequenceUpdateReqDto.dashboardId())
.orElseThrow(DashboardNotFoundException::new);

validateDashboardAccess(dashboard, member);

updateBlockSequence(member, blockSequenceUpdateReqDto.notStartedList(), dashboardId, Progress.NOT_STARTED);
updateBlockSequence(member, blockSequenceUpdateReqDto.inProgressList(), dashboardId, Progress.IN_PROGRESS);
Expand All @@ -172,6 +194,10 @@ private void updateBlockSequence(Member member, List<Long> blockIds, Long dashbo
// 삭제된 블록 조회
public BlockListResDto findDeletedBlocks(String email, Long dashboardId, Pageable pageable) {
Member member = memberRepository.findByEmail(email).orElseThrow(MemberNotFoundException::new);
Dashboard dashboard = dashboardRepository.findById(dashboardId).orElseThrow(DashboardNotFoundException::new);

validateDashboardAccess(dashboard, member);

Page<Block> deletedBlocks = blockRepository.findByDeletedBlocks(dashboardId, pageable);

List<BlockInfoResDto> blockInfoResDtoList = deletedBlocks.stream()
Expand All @@ -186,15 +212,58 @@ public BlockListResDto findDeletedBlocks(String email, Long dashboardId, Pageabl
public void deletePermanently(String email, Long blockId) {
Member member = memberRepository.findByEmail(email).orElseThrow(MemberNotFoundException::new);
Block block = blockRepository.findById(blockId).orElseThrow(BlockNotFoundException::new);
Dashboard dashboard = dashboardRepository.findById(block.getDashboard().getId())
.orElseThrow(DashboardNotFoundException::new);

validateDashboardAccess(dashboard, member);

blockRepository.delete(block);
}

// 삭제된 블록 전체 삭제
@Transactional
public void deleteAllPermanently(String email, Long dashboardId) {
Member member = memberRepository.findByEmail(email).orElseThrow(MemberNotFoundException::new);
Dashboard dashboard = dashboardRepository.findById(dashboardId).orElseThrow(DashboardNotFoundException::new);

validateDashboardAccess(dashboard, member);

List<Block> deletedBlocks = blockRepository.findByDeletedBlocks(dashboardId);

blockRepository.deleteAll(deletedBlocks);
}

private Progress parseProgress(String progressString) {
try {
return Progress.valueOf(progressString);
} catch (IllegalArgumentException e) {
throw new InvalidProgressException();
}
}

private void validateDashboardAccess(Dashboard dashboard, Member member) {
if (dashboard instanceof PersonalDashboard) {
validatePersonalDashboardAccess((PersonalDashboard) dashboard, member);
}

if (dashboard instanceof TeamDashboard) {
validateTeamDashboardAccess((TeamDashboard) dashboard, member);
}
}

private void validatePersonalDashboardAccess(PersonalDashboard dashboard, Member member) {
if (!dashboard.getMember().getEmail().equals(member.getEmail())) {
throw new UnauthorizedAccessException();
}
}

private void validateTeamDashboardAccess(TeamDashboard dashboard, Member member) {
boolean isMemberInDashboard = dashboard.getTeamDashboardMemberMappings().stream()
.anyMatch(mapping -> mapping.getMember().equals(member));

if (!dashboard.getMember().equals(member) && !isMemberInDashboard) {
throw new UnauthorizedAccessException();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package shop.kkeujeok.kkeujeokbackend.block.application.util;

import java.time.LocalDateTime;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import shop.kkeujeok.kkeujeokbackend.block.domain.Block;
import shop.kkeujeok.kkeujeokbackend.block.domain.repository.BlockRepository;

@Component
@RequiredArgsConstructor
public class BlockCleanupScheduler {

private final BlockRepository blockRepository;

@Scheduled(cron = "0 0 2 * * ?")
@Transactional
public void deleteOldDeletedBlocks() {
LocalDateTime thirtyDaysAgo = LocalDateTime.now().minusDays(30);
List<Block> blocksToDeletePermanently = blockRepository.findBlocksToDeletePermanently(thirtyDaysAgo);
blockRepository.deleteAll(blocksToDeletePermanently);
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package shop.kkeujeok.kkeujeokbackend.block.domain.repository;

import java.time.LocalDateTime;
import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import shop.kkeujeok.kkeujeokbackend.block.domain.Block;
Expand All @@ -12,4 +14,8 @@ public interface BlockCustomRepository {
int findLastSequenceByProgress(Member member, Long dashboardId, Progress progress);

Page<Block> findByDeletedBlocks(Long dashboardId, Pageable pageable);

List<Block> findByDeletedBlocks(Long dashboardId);

List<Block> findBlocksToDeletePermanently(LocalDateTime thirtyDaysAgo);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static shop.kkeujeok.kkeujeokbackend.block.domain.QBlock.block;

import com.querydsl.jpa.impl.JPAQueryFactory;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
import org.springframework.data.domain.Page;
Expand Down Expand Up @@ -84,4 +85,23 @@ public Page<Block> findByDeletedBlocks(Long dashboardId, Pageable pageable) {

return new PageImpl<>(blocks, pageable, total);
}

@Override
public List<Block> findByDeletedBlocks(Long dashboardId) {
return queryFactory
.selectFrom(block)
.where(block.dashboard.id.eq(dashboardId)
.and(block.status.eq(Status.DELETED)))
.orderBy(block.sequence.desc())
.fetch();
}

@Override
public List<Block> findBlocksToDeletePermanently(LocalDateTime thirtyDaysAgo) {
return queryFactory.selectFrom(block)
.where(block.status.eq(Status.DELETED)
.and(block.updatedAt.before(thirtyDaysAgo)))
.fetch();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
@Builder
public record ChallengeInfoResDto(
Long challengeId,
Long authorId,
String title,
String contents,
Category category,
Expand All @@ -32,6 +33,7 @@ public record ChallengeInfoResDto(
public static ChallengeInfoResDto from(Challenge challenge) {
return ChallengeInfoResDto.builder()
.challengeId(challenge.getId())
.authorId(challenge.getMember().getId())
.title(challenge.getTitle())
.contents(challenge.getContents())
.category(challenge.getCategory())
Expand All @@ -54,6 +56,7 @@ public static ChallengeInfoResDto of(Challenge challenge, boolean isParticipant,
Set<ChallengeCompletedMemberInfoResDto> completedMembers) {
return ChallengeInfoResDto.builder()
.challengeId(challenge.getId())
.authorId(challenge.getMember().getId())
.title(challenge.getTitle())
.contents(challenge.getContents())
.category(challenge.getCategory())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@
@Component
@RequiredArgsConstructor
public class ChallengeBlockStatusUpdateScheduler {

private static final String DAILY_CRON_EXPRESSION = "0 0 0 * * ?";
private static final String CHALLENGE_WITHDRAW_MESSAGE_TEMPLATE = "%s 챌린지가 탈퇴되었습니다.";

private static final String CHALLENGE_CREATED_MESSAGE_TEMPLATE = "%s 챌린지 블록이 생성되었습니다.";
private static final String DEADLINE_DATE_FORMAT = "yyyy.MM.dd 23:59";
private static final int DEADLINE_EXTENSION_DAYS = 1;
Expand All @@ -36,38 +37,73 @@ public class ChallengeBlockStatusUpdateScheduler {
public void createNewChallengeBlocks() {
List<ChallengeMemberMapping> activeMappings = challengeMemberMappingRepository.findActiveMappings();

for (ChallengeMemberMapping mapping : activeMappings) {
if (isNewBlockNeeded(mapping)) {
createNewBlock(mapping);
}
}
activeMappings.stream()
.filter(this::isNewBlockNeeded)
.forEach(this::processMappingForNewBlock);
}

private boolean isNewBlockNeeded(ChallengeMemberMapping mapping) {
return mapping.getChallenge().isActiveToday();
}

private void createNewBlock(ChallengeMemberMapping mapping) {
private void processMappingForNewBlock(ChallengeMemberMapping mapping) {
if (shouldRemoveParticipant(mapping)) {
removeParticipantFromChallenge(mapping);
return;
}
createAndSaveBlock(mapping);
notifyMemberForNewBlock(mapping);
}

private boolean shouldRemoveParticipant(ChallengeMemberMapping mapping) {
PersonalDashboard dashboard = mapping.getPersonalDashboard();
Challenge challenge = mapping.getChallenge();

long existingChallengeBlockCount = dashboard.getBlocks().stream()
.filter(block -> block.getProgress().equals(Progress.NOT_STARTED))
.filter(block -> block.getType().equals(Type.CHALLENGE))
.filter(block -> block.getChallenge().getId().equals(challenge.getId()))
.count();

return existingChallengeBlockCount >= 5;
}

private void removeParticipantFromChallenge(ChallengeMemberMapping mapping) {
Challenge challenge = mapping.getChallenge();
challenge.removeParticipant(mapping);
notifyMemberForWithdrawChallenge(mapping, challenge);
}

private void notifyMemberForWithdrawChallenge(ChallengeMemberMapping mapping, Challenge challenge) {
Member member = mapping.getMember();
String message = String.format(CHALLENGE_WITHDRAW_MESSAGE_TEMPLATE, challenge.getTitle());
notificationService.sendNotification(member, message);
}

private void createAndSaveBlock(ChallengeMemberMapping mapping) {
Block newBlock = Block.builder()
.title(mapping.getChallenge().getTitle())
.contents(mapping.getChallenge().getContents())
.progress(Progress.NOT_STARTED)
.type(Type.CHALLENGE)
.deadLine(LocalDate.now().plusDays(DEADLINE_EXTENSION_DAYS)
.format(DateTimeFormatter.ofPattern(DEADLINE_DATE_FORMAT)))
.deadLine(getFormattedDeadline())
.member(mapping.getMember())
.dashboard(dashboard)
.dashboard(mapping.getPersonalDashboard())
.challenge(mapping.getChallenge())
.build();

blockRepository.save(newBlock);
}

sendChallengeCreatedNotification(mapping.getMember(), mapping.getChallenge());
private String getFormattedDeadline() {
return LocalDate.now()
.plusDays(DEADLINE_EXTENSION_DAYS)
.format(DateTimeFormatter.ofPattern(DEADLINE_DATE_FORMAT));
}

private void sendChallengeCreatedNotification(Member member, Challenge challenge) {
private void notifyMemberForNewBlock(ChallengeMemberMapping mapping) {
Member member = mapping.getMember();
Challenge challenge = mapping.getChallenge();
String message = String.format(CHALLENGE_CREATED_MESSAGE_TEMPLATE, challenge.getTitle());
notificationService.sendNotification(member, message);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import shop.kkeujeok.kkeujeokbackend.dashboard.exception.DashboardDeletedException;
import shop.kkeujeok.kkeujeokbackend.challenge.domain.ChallengeMemberMapping;
import shop.kkeujeok.kkeujeokbackend.challenge.domain.repository.challengeMemberMapping.ChallengeMemberMappingRepository;
import shop.kkeujeok.kkeujeokbackend.dashboard.exception.DashboardDeletedException;
import shop.kkeujeok.kkeujeokbackend.dashboard.exception.DashboardNotFoundException;
import shop.kkeujeok.kkeujeokbackend.dashboard.exception.UnauthorizedAccessException;
import shop.kkeujeok.kkeujeokbackend.dashboard.personal.api.dto.request.PersonalDashboardSaveReqDto;
Expand All @@ -22,7 +22,6 @@
import shop.kkeujeok.kkeujeokbackend.dashboard.personal.domain.repository.PersonalDashboardRepository;
import shop.kkeujeok.kkeujeokbackend.dashboard.personal.exception.DashboardAccessDeniedException;
import shop.kkeujeok.kkeujeokbackend.global.dto.PageInfoResDto;
import shop.kkeujeok.kkeujeokbackend.global.entity.Status;
import shop.kkeujeok.kkeujeokbackend.member.domain.Member;
import shop.kkeujeok.kkeujeokbackend.member.domain.repository.MemberRepository;
import shop.kkeujeok.kkeujeokbackend.member.exception.MemberNotFoundException;
Expand Down Expand Up @@ -85,7 +84,7 @@ public PersonalDashboardInfoResDto findById(String email, Long dashboardId) {
.orElseThrow(DashboardNotFoundException::new);

checkIfDashboardIsDeleted(dashboard);
validateDashboardAccess(dashboard, member);
validateDashboardVisibility(dashboard, member);

double blockProgress = personalDashboardRepository.calculateCompletionPercentage(dashboard.getId());

Expand All @@ -98,6 +97,12 @@ private void checkIfDashboardIsDeleted(PersonalDashboard dashboard) {
}
}

private void validateDashboardVisibility(PersonalDashboard dashboard, Member member) {
if (!dashboard.isPublic()) {
validateDashboardAccess(dashboard, member);
}
}

private void validateDashboardAccess(PersonalDashboard dashboard, Member member) {
if (!dashboard.getMember().equals(member)) {
throw new UnauthorizedAccessException();
Expand Down
Loading

0 comments on commit 3c09a8b

Please sign in to comment.