Skip to content

Commit

Permalink
Chore: Merge prod from dev (#104)
Browse files Browse the repository at this point in the history
* ✨ Feat: 도메인 생성 #31  (#34)

* Feat: User 도메인 생성

* Feat: Member 도메인 생성

* Feat: Team 도메인 생성

* Feat: Scrum 도메인 생성

* Feat: 도메인 상태 관리

* ✨ [Feature/#2] - boiler plate 추가 (#37)

* Feat: dependency 추가 및 정리

* Feat: global dto -> ResponseDto, ExceptionDto 생성

* Feat: ErrorCode 지정, CommonException 생성

* Feat: Global Exception Handler 추가

* Feat: Custom Annotation 생성

* Feat: UserId annotation -> interceptor, resolver 추가

* Feat: annotation 적용

* Feat: response status code 일치해주는 interceptor 생성

* Feat: 문자열 파편화 방지 클래스 생성

* ✨ [Feature/#3] - Spring Security 적용하기 (#39)

* Chore: json dependency 추가

* Feat: authentication filter, exception filter 생성

* Feat: authentication manager, provider 생성

* Feat: CustomUserDetailService 생성

* Feat: login handler 추가

* Feat: logout handler 추가

* Feat: exception handler 추가

* Feat: spring security info 생성

* Feat: 쿠키 유틸 생성

* Feat: 헤더 유틸 생성

* Feat: jwt util 생성

* Feat: Security Config 설정

* Feat: Token Dto 생성

* Feat: user repository -> security용 조회 로직 생성

* Feat: Passowrd Encoder 등록

* Feat: Spring Security 등록

* fix: Credential 업데이트

* ✨ [Feat/#3] - Spring Security api test (#43)

* Chore: json dependency 추가

* Feat: authentication filter, exception filter 생성

* Feat: authentication manager, provider 생성

* Feat: CustomUserDetailService 생성

* Feat: login handler 추가

* Feat: logout handler 추가

* Feat: exception handler 추가

* Feat: spring security info 생성

* Feat: 쿠키 유틸 생성

* Feat: 헤더 유틸 생성

* Feat: jwt util 생성

* Feat: Security Config 설정

* Feat: Token Dto 생성

* Feat: user repository -> security용 조회 로직 생성

* Feat: Passowrd Encoder 등록

* Feat: Spring Security 등록

* Chore: api path 수정

* Feat: refresh token update 추가

* Chore: api path 수정

* Chore: response json 수정

* Feat: 회원가입, reissue api 생성

* ✨ [ Feature /#4 ] - QuestionList API 구현 (#45)

* feat: QuestionList API 구현

* feat: TeamRepository 생성

* ✨ [Feature/#5] - 웹과 연동하기 discord action 구현 (#46)

* Chore: discord token 추가

* Chore: jda dependency 추가

* Feat: builder 추가, 칼럼 수정

* Feat: leader 추가 로직 생성

* Feat: user 조회 로직 추가

* Feat: 생성 로직 추가

* Feat: jda 적용, slash command 추가

* Feat: 웹과 연동하기 명령어 액션 추가

* Chore: discord token 추가 (#47)

* Chore: discord token 추가 (#48)

* 🐛 [Fix/#6] - user, team 예외처리 추가 (#50)

* Chore: discord token 추가

* Feat: 팀 구분용 칼럼 추가, builder 수정

* Feat: 조회 로직 추가

* Chore: 주석 추가, 약간의 최적화

* Feat: Team 유일성 부여

* ✨ [Feature/#7] - discord slash command, 질문하기 (#52)

* Chore: discord token 추가

* Feat: Question column 추가

* Feat: code 관련 조회 로직 추가

* Chore: 서비스 단 조회 로직 추가

* Feat: generate code 로직 생성

* Feat: 질문하기 slash command 추가

* Feat: slash command action 추가

* 🐛  [Fix/#4] - 팀 작업 기록 페이지 API 구현 (#55)

* feat: QuestionList API 구현

* feat: TeamRepository 생성

* fix: questionDtoList의 길이를 재는 것으로 수정

* feat: 팀 멤버 목록 조회 API 구현

* fix: 멤버가 존재하는지 예외처리

* refactor: 메소드 이름 수정 findByReceiverAndStatus => findAllByReceiverAndStatus

* feat: 팀원들의 작업 목록 서비스, 팀 작업 척도 서비스 구현

* refactor: Repository의 메소드 수정에 따른 메소드 수정

* feat: 팀 작업 척도 서비스 구현

* ✨ [Feature/#9] - discord '답변하기' command 생성 (#57)

* Chore: discord token 추가

* Feat: builder 추가

* Feat: Answer Repository 생성

* Feat: question status update 로직 생성

* Feat: Answer 생성 로직 추가

* Feat: question 조회, 수정 서비스 로직 추가

* Feat: NOT_FOUND_QUESTION error 추가

* Feat: 답변하기 slash commnad 추가

* Feat: slash command action 추가

* ✨ [Feature/#10] - discord 업무 시간 파악 (#59)

* Chore: discord token 추가

* Feat: builder 추가

* Feat: errorcode 추가

* Feat: 업무 중인 작업 조회 로직 추가

* Feat: Scrum 상태에 따른 조회 추가

* Feat: DB 조회 로직 적용

* Feat: 업무 시작 하기 slash command 추가

* Feat: 업무 시작 답변 action 추가

* ✨ [Feature/#8] - 질문 목록 페이지 API 구현 (#60)

* feat: 전체 프로젝트 목록 API

* feat: 질문 남기기 API 구현

* feat: Member 연결

* feat: 답변 남기기 API 구현

* feat: 질문 목록(받은 질문) API 구현

* feat: 질문 목록(보낸 질문) API 구현

* fix: 사용하지 않는 라이브러리 삭제

* 🐛 [!HOTFIX] - 오류 수정 (#61)

* Chore: discord token 추가

* Hotfix: api path 수정

* Fix: db 구조 변경에 따른 builder 수정

* Fix: db 구조 변경에 따른 builder 수정

* ✨ [Feature/#12] - discord command 업무 종료 (#64)

* Chore: discord token 추가

* Hotfix: api path 수정

* Fix: db 구조 변경에 따른 builder 수정

* Fix: db 구조 변경에 따른 builder 수정

* Chore: member 업무 기본값 추가

* Chore: error code 추가

* Feat: 누적 업무 시간, 업무 종료시 데이터 업데이트 로직 추가

* Chore: 조회 로직 추가

* Feat: 업무 시간 관련 update 서비스 로직 생성

* Feat: 업무 종료 slash command 추가

* Feat: 업무 종료시 이벤트 처리 로직 생성

* ✨ [Feature/#11] - 작업 기록 API 구현 (#65)

* feat: 스크럼 타임라인 API 구현

* fix: 필요없는 코드 삭제

* fix: 예외처리 코드 오류 수정

* feat: 프로젝트 팀 정보(상세) API 구현

* feat: 팀 권한 조회 API 구현

* feat: 권한 수정 API 구현

* fix: 프로젝트 Public 여부를 Team에서 Member에서 관리 (#67)

* ✨ [Feature] - 나의 대시보드 API #13 (#69)

* fix: 프로젝트 Public 여부를 Team에서 Member에서 관리

* feat: 프로필 정보 조회 API 구현

* feat: 프로필 정보 수정 API 구현

* fix: 프로젝트 팀 정보(상세)의 Dto 이름 수정

* feat: 참여 프로젝트 목록 API 구현

* feat: 프로젝트 공개 여부 전환 API 구현

* feat: 개인 프로젝트 기여도 API 구현

* ✨ [Feature/#14] - discord command 스크럼 종료 (#71)

* Chore: discord token 추가

* Hotfix: api path 수정

* Fix: db 구조 변경에 따른 builder 수정

* Fix: db 구조 변경에 따른 builder 수정

* Feat: gpt api용 request, response dto 생성

* Feat: 스크럼 종료 시 데이터 업데이트 로직 작성

* Feat: using gpt api 서비스 로직 작성

* Chore: 코드 수정

* Feat: slash command 추가

* Feat: slash command action 추가

* ✨ [Feature/#15] - 동료 평가 API 구현 (#72)

* feat: 동료 평가 조회 API 구현

* fix: 동료 평가 조회 로직 수정

* feat: 동료 평가 작성 API 구현

* ✨ [Feature/#17] - discord command 프로젝트 종료 (#75)

* Chore: discord token 추가

* Hotfix: api path 수정

* Fix: db 구조 변경에 따른 builder 수정

* Fix: db 구조 변경에 따른 builder 수정

* Feat: 프로젝트 상태 변경 로직 추가

* Feat: 프로젝트 종료, slash command 생성

* Feat: 프로젝트 종료, event 처리

* ✨ [Feature/#18] - 팀 관리 API 구현 (#76)

* feat: 업무 시간 상세 조회 API 구현

* feat: 업무 시간 상세 수정 API 구현

* ✨ [Feature/#19] - discord command 서버 최신화 적용 (#79)

* Chore: discord token 추가

* Hotfix: api path 수정

* Fix: db 구조 변경에 따른 builder 수정

* Fix: db 구조 변경에 따른 builder 수정

* Feat: Team information 최신화 로직 추가

* Feat: 서버 최신화 slash command 추가

* Feat: 서버 최신화 slash command action 추가

* ✨ [Feature/#20] - 작업 척도 API (#80)

* fix: uri path 수정

* feat: 개인 작업 척도 API 구현

* fix: uri 경로 수정

* feat: 개인 전체 프로젝트 작업 척도 API 구현

* 🎨 [Refactor/#21] - discord command 질문 & 답변하기 완료  (#83)

* Chore: discord token 추가

* Hotfix: api path 수정

* Fix: db 구조 변경에 따른 builder 수정

* Fix: db 구조 변경에 따른 builder 수정

* Refactor: Quetion 저장 로직 변경

* Refactor: 예외처리 추가, 로직 변경점 적용

* 🎨 [Refactor/#22] - discord command 업무시작 & 업무종료  (#85)

* Chore: discord token 추가

* Hotfix: api path 수정

* Fix: db 구조 변경에 따른 builder 수정

* Fix: db 구조 변경에 따른 builder 수정

* Refactor: discord bot 예외처리 추가

* Refactor: 코드 리팩토링, 변경점 적용

* feat: 프로젝트 R&R 작성 및 수정 (#87)

* chore: 크레덴셜 수정 (#89)

* ✨ [Feature/#23] discord command '파트 입력' (#91)

* Chore: discord token 추가

* Hotfix: api path 수정

* Fix: db 구조 변경에 따른 builder 수정

* Fix: db 구조 변경에 따른 builder 수정

* Feat: EPart 매칭 로직 작성

* Feat: 팀원의 파트를 입력하는 로직 생성

* Feat: slash command 추가

* Feat: action 추가, 예외처리 추가

* 🐛 [FIX/#26] - 테스트에서 확인된 오류 수정 (#93)

* chore: 크레덴셜 수정

* fix: API URI 수정

* fix: Builder 수정

* fix: Transactional 추가

* 🐛 [!HOTFIX] 업무 시간 상세 수정 API 오류 (#95)

* chore: 크레덴셜 수정

* fix: 업무시간 상세 수정 API 오류 해결

* 🐛 [!HOTFIX] 동료 평가 조회 API (#97)

* chore: 크레덴셜 수정

* fix: 업무시간 상세 수정 API 오류 해결

* fix: 동료 평가 조회 API 수정

* 🐛 [!HOTFIX] R&R 작성 API (#99)

* chore: 크레덴셜 수정

* fix: 업무시간 상세 수정 API 오류 해결

* fix: 동료 평가 조회 API 수정

* fix: R&R 작성 API 수정

* ✨ [Feature/#34] - 크레덴셜 수정 반영 (#103)

* chore: 크레덴셜 수정

* fix: 업무시간 상세 수정 API 오류 해결

* fix: 동료 평가 조회 API 수정

* fix: R&R 작성 API 수정

* feat: Query parameter 예외 처리 코드

* feat: 받은 요청 리스트, 보낸 요청 리스트 쿼리파라미터 추가

* feat: 프로젝트 리스트 쿼리 파라미터 추가

* fix: endAt => startAt으로 변경

* feat: 팀원 작업 리스트 쿼리 파라미터 추가

---------

Co-authored-by: Lim jeong woo <[email protected]>
  • Loading branch information
JeongHeumChoi and dlawjddn authored Mar 22, 2024
1 parent f60c2ce commit ce6f82d
Show file tree
Hide file tree
Showing 9 changed files with 79 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,21 @@ public ResponseDto<?> listWaitingQuestion(@UserId Long userId, @PathVariable Lon
}

@GetMapping("/teams/{teamsId}/questions/received")
public ResponseDto<?> listReceivedQuestion(@UserId Long userId, @PathVariable Long teamsId) {
return ResponseDto.ok(questionService.listReceivedQuestion(userId, teamsId, Boolean.TRUE));
public ResponseDto<?> listReceivedQuestion(
@UserId Long userId,
@PathVariable Long teamsId,
@RequestParam String sort
) {
return ResponseDto.ok(questionService.listReceivedQuestion(userId, teamsId, Boolean.TRUE, sort));
}

@GetMapping("/teams/{teamsId}/questions/sent")
public ResponseDto<?> listSentQuestion(@UserId Long userId, @PathVariable Long teamsId) {
return ResponseDto.ok(questionService.listReceivedQuestion(userId, teamsId, Boolean.FALSE));
public ResponseDto<?> listSentQuestion(
@UserId Long userId,
@PathVariable Long teamsId,
@RequestParam String sort
) {
return ResponseDto.ok(questionService.listReceivedQuestion(userId, teamsId, Boolean.FALSE, sort));
}

@PostMapping("/teams/{teamsId}/questions")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,13 @@ public ResponseDto<?> getTeamList(@UserId Long userId) {
return ResponseDto.ok(teamService.getTeamList(userId));
}

@GetMapping("/teams/retrieve-list")
public ResponseDto<?> listProgressingTeam(@UserId Long userId) {
return ResponseDto.ok(teamService.listProgressingTeam(userId));
@GetMapping("/teams/members/{membersId}/retrieve-list")
public ResponseDto<?> listRetrieveTeam(
@UserId Long userId,
@PathVariable Long membersId,
@RequestParam String sort
) {
return ResponseDto.ok(teamService.listRetrieveTeam(userId, membersId, sort));
}

@GetMapping("/teams/{teamsId}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,12 @@ public class WorkController {
private final WorkService workService;

@GetMapping("/teams/{teamsId}/works")
public ResponseDto<?> listMemberWork(@UserId Long userId, @PathVariable Long teamsId) {
return ResponseDto.ok(workService.listMemberWork(userId, teamsId));
public ResponseDto<?> listMemberWork(
@UserId Long userId,
@PathVariable Long teamsId,
@RequestParam String sort
) {
return ResponseDto.ok(workService.listMemberWork(userId, teamsId, sort));
}

@GetMapping("/teams/{teamsId}/works/ranking")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public enum ErrorCode {
INVALID_CREATE_PEER_REVIEW_OTHER(40010, HttpStatus.BAD_REQUEST, "해당 사용자(멤버)는 이미 리뷰를 작성하였습니다."),
INVALID_CREATE_PEER_REVIEW_SELF(40010, HttpStatus.BAD_REQUEST, "자신에게 리뷰를 작성할 수 없습니다."),
INVALID_CREATE_PEER_REVIEW_TO_OTHER_TEAM_MEMBER(40011, HttpStatus.BAD_REQUEST, "다른 팀의 멤버에게 리뷰를 작성할 수 없습니다."),
INVALID_QUERY_PARAMETER(40012, HttpStatus.BAD_REQUEST, "유효하지 않는 쿼리 파라미터입니다."),

//401
INVALID_HEADER_VALUE(40100, HttpStatus.UNAUTHORIZED, "올바르지 않은 헤더값입니다."),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public interface MemberRepository extends JpaRepository<Member, Long> {
Boolean existsByUser(User user);
Boolean existsByUserAndTeam(User user, Team team);
List<Member> findAllByTeam(Team team);
List<Member> findAllByTeamAndPart(Team team, EPart part);
List<Member> findAllByTeamOrderByTotalMinuteDesc(Team team);
List<Member> findAllByUser(User user);
Optional<Member> findByTeamAndUser(Team team, User user);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public interface QuestionRepository extends JpaRepository<Question, Long> {
@EntityGraph(attributePaths = {"sender"})
Optional<Question> findByCodeAndStatus(String code, EQuestionStatus status);
List<Question> findAllByReceiverAndStatus(Member member, EQuestionStatus eQuestionStatus);
List<Question> findAllBySenderAndStatus(Member member, EQuestionStatus eQuestionStatus);
List<Question> findAllByReceiver(Member member);
List<Question> findAllBySender(Member member);
boolean existsByCode(String code);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,17 +76,31 @@ public QuestionListDto listWaitingQuestion(Long userId, Long teamsId) {
return QuestionListDto.of(questionDtoList, questionDtoList.size());
}

public QuestionRetrieveSetListDto listReceivedQuestion(Long userId, Long teamsId, Boolean isReceived) {

public QuestionRetrieveSetListDto listReceivedQuestion(
Long userId,
Long teamsId,
Boolean isReceived,
String sort
) {
User currentUser = userRepository.findById(userId)
.orElseThrow(() -> new CommonException(ErrorCode.NOT_FOUND_USER));
Team team = teamRepository.findById(teamsId)
.orElseThrow(() -> new CommonException(ErrorCode.NOT_FOUND_TEAM));
Member member = memberRepository.findByTeamAndUser(team, currentUser)
.orElseThrow(() -> new CommonException(ErrorCode.NOT_FOUND_MEMBER));

List<Question> questionList = isReceived ? questionRepository .findAllByReceiver(member)
: questionRepository.findAllBySender(member);
List<Question> questionList;
switch (sort) {
case "all" -> questionList = isReceived ? questionRepository.findAllByReceiver(member)
: questionRepository.findAllBySender(member);
case "completed" -> questionList = isReceived ?
questionRepository.findAllByReceiverAndStatus(member, EQuestionStatus.FINISH) :
questionRepository.findAllBySenderAndStatus(member, EQuestionStatus.FINISH);
case "pending" -> questionList = isReceived ?
questionRepository.findAllByReceiverAndStatus(member, EQuestionStatus.WAITING_ANSWER) :
questionRepository.findAllBySenderAndStatus(member, EQuestionStatus.WAITING_ANSWER);
default -> throw new CommonException(ErrorCode.INVALID_QUERY_PARAMETER);
}
List<QuestionRetrieveSetDto> questionRetrieveSetDtoList = new ArrayList<>();
for (Question question : questionList) {
Optional<Answer> answer = answerRepository.findByQuestion(question);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.time.LocalDate;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

@Slf4j
@Service
Expand Down Expand Up @@ -94,12 +95,26 @@ public TeamListDto getTeamList(Long userId) {
);
}

public TeamRetrieveListDto listProgressingTeam(Long userId) {
public TeamRetrieveListDto listRetrieveTeam(Long userId, Long membersId, String sort) {

User currentUser = userRepository.findById(userId)
.orElseThrow(() -> new CommonException(ErrorCode.NOT_FOUND_USER));
List<Member> memberList = memberRepository.findAllByUser(currentUser);
List<TeamRetrieveDto> teamRetrieveDtoList = memberList.stream()
Member targetMember = memberRepository.findById(membersId)
.orElseThrow(() -> new CommonException(ErrorCode.NOT_FOUND_MEMBER));
User targetUser = targetMember.getUser();
List<Member> memberList = memberRepository.findAllByUser(targetUser);

Stream<Member> memberStream;
switch (sort) {
case "all" -> memberStream = memberList.stream();
case "complete" -> memberStream = memberList.stream()
.filter(member -> member.getTeam().getStatus().equals(EProjectStatus.FINISH));
case "progress" -> memberStream = memberList.stream()
.filter(member -> member.getTeam().getStatus().equals(EProjectStatus.IN_PROGRESS));
case "peer" -> memberStream = memberList.stream()
.filter(member -> member.getTeam().getStatus().equals(EProjectStatus.PEER_REVIEW));
default -> throw new CommonException(ErrorCode.INVALID_QUERY_PARAMETER);
}

List<TeamRetrieveDto> teamRetrieveDtoList = memberStream
.map(member -> TeamRetrieveDto.of(
member.getTeam().getId(),
member.getTeam().getName(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import goormthon.team28.startup_valley.domain.*;
import goormthon.team28.startup_valley.dto.request.WorkTimeDto;
import goormthon.team28.startup_valley.dto.response.*;
import goormthon.team28.startup_valley.dto.type.EPart;
import goormthon.team28.startup_valley.exception.CommonException;
import goormthon.team28.startup_valley.exception.ErrorCode;
import goormthon.team28.startup_valley.repository.*;
Expand Down Expand Up @@ -51,7 +52,7 @@ public Optional<Work> findNotOverWork(Scrum scrum, Member member){
return workRepository.findByScrumAndOwnerAndEndAtIsNull(scrum, member);
}

public WorkListDto listMemberWork(Long userId, Long teamsId) {
public WorkListDto listMemberWork(Long userId, Long teamsId, String sort) {

User currentUser = userRepository.findById(userId)
.orElseThrow(() -> new CommonException(ErrorCode.NOT_FOUND_USER));
Expand All @@ -62,7 +63,16 @@ public WorkListDto listMemberWork(Long userId, Long teamsId) {
if (!memberRepository.existsByUserAndTeam(currentUser, team))
throw new CommonException(ErrorCode.NOT_FOUND_MEMBER);

List<Member> memberList = memberRepository.findAllByTeam(team);
List<Member> memberList;
switch (sort) {
case "all" -> memberList = memberRepository.findAllByTeam(team);
case "front" -> memberList = memberRepository.findAllByTeamAndPart(team, EPart.FRONTEND);
case "back" -> memberList = memberRepository.findAllByTeamAndPart(team, EPart.BACKEND);
case "pm" -> memberList = memberRepository.findAllByTeamAndPart(team, EPart.PM);
case "design" -> memberList = memberRepository.findAllByTeamAndPart(team, EPart.DESIGN);
default -> throw new CommonException(ErrorCode.INVALID_QUERY_PARAMETER);
}

List<WorkDto> workDtoList = new ArrayList<>();
for (Member member : memberList) {
List<Work> workList = workRepository.findAllByOwner(member);
Expand All @@ -73,7 +83,7 @@ public WorkListDto listMemberWork(Long userId, Long teamsId) {
member.getPart(),
member.getUser().getProfileImage(),
work.getContent(),
work.getEndAt()
work.getStartAt()
))
.toList());
}
Expand Down

0 comments on commit ce6f82d

Please sign in to comment.