Giter Site home page Giter Site logo

20th-web-team-1-be's People

Contributors

kang-jisu avatar suubinkim avatar toastmeister1 avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar

20th-web-team-1-be's Issues

bug: API 중복요청 방지

버그 설명

스크린샷 2022-07-24 오후 10 14 33

  • 회원가입 중에 버튼 '따닥' 너무빨리눌렸을 때 회원가입이 2번 되어서 duplicate error발생

기대 동작

  • 추가 처리 필요

추가 사항

Add any other context about the problem here.

fix: 이전, 다음 메세지 순서 변경

목적

이전, 다음 메세지 순서 변경

작업 내용

  • 메세지 목록이 최신순이라 현재 이전, 다음 메세지 아이디와 반대로 되야 보기 좋음
  • (제일 최근에 온 , 맨 위에 있는 메세지 상세보기 조회시 이전 메세지는 없고 다음 메세지가 있어야함)

참고 사항

메세지함 & 서랍메뉴 API

목적

메세지함, 서랍메뉴 관련 API

작업 내용

  • 메세지 폴더 이동
  • 메세지 즐겨찾기 설정
  • 서랍메뉴 - 나에게온 메세지 목록 -> 메세지 목록 조회
  • 서랍메뉴 - 즐겨찾기 메세지 목록
    ++
  • 메세지 읽었을때 읽음 여부 변경
  • 메세지 dto에 작성일자/시간 추가

참고 사항

  • 메시지 엔티티에 발신자 수신자 삭제 여부 필드 필요
  • 개별 API 필요 작업
    • 입력값 검증
    • ApiResponse 수정
    • 테스트코드 생성
      • 메세지 폴더 이동
      • 메세지 즐겨찾기 설정
      • 서랍메뉴 - 즐겨찾기 메세지 목록

[bugfix] CORS에러 수정

버그 설명

2022-07-09 18:45:19.906 ERROR 87468 --- [nio-8080-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.yapp.betree.exception.BetreeException: JWT 토큰 파싱에 실패했습니다.: 헤더에 토큰이 존재하지 않습니다.] with root cause

com.yapp.betree.exception.BetreeException: JWT 토큰 파싱에 실패했습니다.: 헤더에 토큰이 존재하지 않습니다.
	at com.yapp.betree.interceptor.TokenInterceptor.lambda$preHandle$0(TokenInterceptor.java:36) ~[classes!/:na]
	at java.util.Optional.orElseThrow(Optional.java:290) ~[na:1.8.0_292]
	at com.yapp.betree.interceptor.TokenInterceptor.preHandle(TokenInterceptor.java:36) ~[classes!/:na]
	at org.springframework.web.servlet.HandlerExecutionChain.applyPreHandle(HandlerExecutionChain.java:148) ~[spring-webmvc-5.3.13.jar!/:5.3.13]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1062) ~[spring-webmvc-5.3.13.jar!/:5.3.13]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.13.jar!/:5.3.13]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.13.jar!/:5.3.13]
	at org.springframework.web.servlet.FrameworkServlet.doOptions(FrameworkServlet.java:945) ~[spring-webmvc-5.3.13.jar!/:5.3.13]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:690) ~[tomcat-embed-core-9.0.55.jar!/:na]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.13.jar!/:5.3.13]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.55.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.55.jar!/:na]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.13.jar!/:5.3.13]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.13.jar!/:5.3.13]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.55.jar!/:na]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.13.jar!/:5.3.13]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.13.jar!/:5.3.13]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.55.jar!/:na]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.13.jar!/:5.3.13]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.13.jar!/:5.3.13]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) [tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) [tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) [tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) [tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) [tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) [tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) [tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722) [tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) [tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) [tomcat-embed-core-9.0.55.jar!/:na]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.55.jar!/:na]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_292]

CORS 에러 -> 아마 CORS preflight 옵션 요청시에 헤더 토큰 검증이 있어서 에러나는 것 같음

기대 동작

  • localhost3000에서 요청 가능해야함

현재 동작

  • CORS 에러

해결

tokenInterceptor preflight 처리 (options 메서드일때 토큰 검증 제외)

스크린샷

추가 사항

Add any other context about the problem here.

[fix] 로그인/비로그인 유저 처리

목적

로그인/비로그인 유저 처리

작업 내용

  • 비로그인 유저 사용가능한 API 인터섭터에서 조건문으로 예외처리
  • 비로그인/로그인 유저 구분 필요한 경우 컨트롤러 수정
  • 메시지에 비로그인유저가 어떻게 저장될지 수정 필요

참고 사항

현아님 코멘트 
4. 비회원은 로그인 하지 않아도 물 주기와 나무 구경(메시지(=열매) 조회)을 할 수 있습니다. 그래서 지금 그려주신 플로우는 아니구요. 비회원 유저가 물 주기 클릭하면, 메시지 작성 화면으로 이동하게 됩니다. 
// 시작하기 버튼이나, 알림/나무숲/메시지 탭을 클릭하면 '로그인해야 한다'는 얼럿이 뜨고, 확인 클릭 시 카카오로 시작하기 페이지로 이동하게 되는 플로우입니다. (이건 피그마에서 수정해놓거나 프로토타입 만들 때 반영해서 더 쉽게 이해하실 수 있도록 해두겠습니다.)

비로그인 상태에서 할 수 있는 기능 정리해 공유드립니다.

비로그인 상태에서 할 수 있는 기능 : 물 주기 / 나무 조회(나무 클릭) / 메시지 조회(열매 클릭)

그 외, 시작하기 버튼이나, 알림/나무숲/메시지 탭 클릭 시, "로그인해야 한다는 얼럿 > 확인 클릭 > 카카오로 시작하기 페이지로 이동" 플로우입니다.

[fix] 폴더 최대 생성 개수 4개 제한처리

목적

폴더(나무) 최대 개수 4개로 제한됨

작업 내용

  • 폴더 생성할때 전체 개수 4개를 넘지 않는지 확인하는 로직 필요할 듯

참고 사항

  • 기본폴더 포함해서 4개인지 ?

카카오 로그인/회원가입

목적

카카오 간편로그인을 이용하여 비트리 회원가입, 로그인 구현

작업 내용

  • 토큰으로 유저 정보 획득 (토큰 header에 담아 요청)
  • 회원가입 유무 확인
    • 회원아니라면 회원가입+기본폴더생성
  • jwt토큰 발급 로그인 완료
  • 이후 요층에서 jwt 토큰 검증 처리

참고 사항

  • WebClient vs RestTemplate

    • 비동기식/동기식 선택도 가능하고 앞으로 권장되는게 WebClient라 선택
  • 시나리오 작성

  • 테스트코드

  • 프론트 redirect uri 설정필요

bug: 프론트엔드 로컬에서 요청시 처리

버그 설명

로컬에서 요청할 때 쿠키설정이 안돼서 로그인이 안되는 오류

기대 동작

현재 동작

  • 127.0.0.1로 요청올 때 처리했는데 실제 배포서버도 127.0.0.1이라서 로컬요청이라는거 처리가 안되는 것 같음
  • 다른방법 찾아서 처리 필요

스크린샷

스크린샷 2022-07-24 오후 11 40 48

추가 사항

Add any other context about the problem here.

기본 폴더, 유저 데이터 생성

목적

메시지 CRUD를 위한 기본 폴더, 유저 데이터 생성 및 레파지토리 생성

작업 내용

  • 레파지토리 생성
  • 데이터 생성용 테스트 코드 생성

참고 사항

  • 테스트코드 삭제 필요

[docs] 4차 테스트서버 배포사항

목적

다음 API 서버 테스트 배포까지 API 변경된 사항 리스트업
다음 배포는 7/9 이후 예정

기간

2022.07.05 (화) ~ 2022.07.09 (토)

작업 내용

구분 변경 내용 관련 API PR 담당 기타
수정 - 로그인 관련 API HttpMethod GET->POST로 변경 GET->POST /api/signin, GET->POST /api/refresh-token  #57 강지수
추가 - 로그아웃 API 구현 POST /api/logout  #57 강지수 로그아웃시 헤더에 httpOnly로 들어있는 refreshToken 쿠키 삭제됨
추가 - 메세지 읽음 처리 PUT /api/messages/alreadyRead  #49 김수빈
추가 - 유저 정보 조회 GET /api/users/info  #53 김수빈
추가 - 유저 닉네임 변경 PUT /api/users/nickname  #53 김수빈
추가 - 메세지 상세 조회 GET /api/messages/{messageId}  #56 김수빈
추가 - 폴더(나무) 삭제 DELETE /api/forest/{treeId}  #61 강지수 기본폴더는 삭제 불가

참고 사항

  • 내부 구현 말고 API 스펙상 변경되는 request, responseDTO, API 추가 내역 작업내용에 정리하고 배포 다시 할때 디코 일반에 전달

fix: 알림 나무 갱신 설정

목적

알림 나무 갱신 자동 설정 추가

작업 내용

  • 1시간마다 자동 갱신 -> 나중에는 하루마다로
  • 메시지 선택할 때 앞에서부터 불러오는게 아니고 shuffle해서 가져오는거로 변경

참고 사항

나무, 나무숲 API 설계

목적

프론트엔드와 통신할 기본 API 설계 (SPRINT 1)

작업 내용

  • 나무숲
  • 나무

참고 사항

  • 테스트용 요청 api, 응답 상태코드 결정
  • wiki

[fix] 읽음 여부 API 응답 값 변경

목적

알림나무 페이지에서 언리드 메시지 개수 처리를 위한 읽음 여부 응답 값 변경

작업 내용

  • 이미 읽은건데 재 요청시 false, 처음 읽음 처리 된 거면 true 리턴 (204 no content -> 200 true/false)

참고 사항

알림나무 API 설계

목적

프론트엔드와 통신할 기본 API 설계 (SPRINT 1)

작업 내용

  • 알림나무

참고 사항

  • 테스트용 요청 api, 응답 상태코드 결정

[docs] README 수정

목적

리드미 수정

작업 내용

  • git flow
  • 코딩 컨벤션
  • 배포 방법
  • 프로젝트 설명

참고 사항

테스트 배포 변경사항 정리

목적

다음 API 서버 테스트 배포까지 API 변경된 사항 리스트업
다음 배포는 7/4 밤에 PR merge후 예정

기간

2022.06.26 (월) ~ 2022.07.04 (월)

작업 내용

구분 변경 내용 관련 API PR 담당 기타
수정  - TreeRequestDto.name 최대 글자수 20->10자로 변경, 에러메시지 수정 POST /api/forest,PUT /api/forest/treeId  #35 강지수
수정  비로그인 유저 헤더에 토큰 없이도 요청할 수 있게 api 수정  GET /api/forest GET /api/forest/{treeId} POST /api/messages  #38    강지수
추가 메세지 읽음 처리 API 추가  PUT /api/messages/alreadyRead #34 #49  김수빈, 강지수 알림나무 갱신에도 반영
 수정 request 파라미터명 변경 messageIdList -> messageIds  PUT /api/messages/opening #34   김수빈
 수정 TreeResponseDto에 열매타입 추가  GET /api/forest   #48 강지수 영민님건의
 수정  응답값 void -> (Long) id 성공시 변경된 treeId 반환 PUT /api/forest/{treeId}   #48   강지수 영민님건의
 수정  알림나무 url /api/notice->/api/notices로 변경 GET /api/notices GET /api/notices/batch  #49   강지수
 수정  알림나무 조회 파라미터 userId -> X (헤더 토큰에서 로그인유저 정보얻어 사용하도록 변경) GET /api/notices   #49   강지수

참고 사항

  • 내부 구현 말고 API 스펙상 변경되는 request, responseDTO, API 추가 내역 작업내용에 정리하고 배포 다시 할때 디코 일반에 전달

[bug] cors withCredentials 허용 설정

버그 설명

프론트 쪽에서 withCredentials: true 를 통해 쿠키를 포함해서 api 요청을 보내니 다시 cors 에러가 나옴

기대 동작

  • 프론트 쪽에서 withCredentials: true 를 통해 쿠키를 포함해서 api 요청 보냈을 때 성공

현재 동작

스크린샷 2022-07-10 오후 6 29 47

해결

public class WebConfig implements WebMvcConfigurer {

    private final JwtTokenProvider jwtTokenProvider;

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOriginPatterns("*")
                .allowedMethods("*")
                .allowCredentials(true)
                .maxAge(3000);
    }

WebConfig에 .allowCredentials(true)추가 -> 그러면 기존 allowedOrigins("*")로 와일드카드 지정을 할 수 없어서 allowedOriginPatterns로 변경

[fix] 열매 타입 수정

목적

디자인 기획에 맞춰 열매 타입 수정하기

작업 내용

  • 복숭아 -> 딸기

참고 사항

fix: 즐겨찾기 메세지 상세 조회 추가

목적

즐겨찾기 메세지 상세 조회 추가

작업 내용

  • 메세지 상세조회시 즐겨찾기한 메세지일때는 이전,다음 메세지도 즐겨찾기 메세지만 나오도록 수정

참고 사항

[feat] 서랍메뉴 - 나무 공개 설정

목적

서랍메뉴 - 나무 공개 비공개 여부 설정

작업 내용

  • 나무 공개 설정 api
  • 나무 숲 조회시 본인 여부에 따라 공개 폴더 조회

참고 사항

  • 2차

[fix] 유저 이미지 랜덤 저장

목적

처음 로그인 유저 이미지 랜덤 저장

작업 내용

  • DB에 유저 저장 시 기본 이미지 중 하나 랜덤으로 저장 (기본 이미지 6개)

참고 사항

  • 처음 이미지 저장 후 변경 불가능

Swagger 적용

목적

API 자동 문서화

작업 내용

  • 스웨거 기본 설정
  • 헤더 설정(JWT)

[bug] 나무상세조회시 주인이 조회할때 404 오류

버그 설명

  • 나무상세조회시
handleBetreeException[ErrorResponse(status=404, code=T001, message=나무가 존재하지 않습니다.: treeId = 332, errors=null)]

기대 동작

  • userId == loginUserId인경우에는 비공개폴더이어도 올바르게 조회가 되어야한다

현재 동작

  • 404 오류가 나고있음

재현 방법

  • Long ==비교가 128?이상부터는 안될것

스크린샷

스크린샷 2022-07-18 오전 12 17 31

추가 사항

수정필요

유저 엔티티 필드이름 수정

목적

유저엔티티 필드 nickName -> nickname 변경하면 좋을것같아요 ..!

작업 내용

  • 지금 PR 있는거 다 끝나면 한번에 처리

참고 사항

응답 형식[성공, 실패(전역 예외 처리)]

목적

성공시 응답 형식 고민 필요
전역 예외처리 및 예외 발생시 응답형식 통일을 위한 핸들링 필요

성공

  • 성공 HttpStatus 코드
  • api 요청에 맞는 필요한 응답 값 (생성된 엔티티 id 또는 ResponseDto 또는 void)
  • 추가할것?

실패

작업 내용

  • RuntimeException을 상속받은 BetreeException 클래스 생성
  • ErrorCode, ErrorResponse, GlobalExcpetionHandler 등 생성
  • 상태코드 / (에러코드) / 에러메시지

참고 사항

  • ErrorCode.java
@Getter
@RequiredArgsConstructor
public enum ErrorCode {

    // Common
    INVALID_INPUT_VALUE(400, "C001", "Invalid input value"),
    INTERNAL_SERVER_ERROR(500, "C002", "Internal server error"),
    METHOD_NOT_ALLOWED(405, "C003", "Method not allowed"),


    // Member
    MEMBER_NOT_FOUND(404, "M001", "회원을 찾을 수 없습니다."),
    ;

    private final int status;
    private final String code;
    private final String message;
}

이런식으로 예외 상황에 맞게 구분해서 HttpStatus, Code, Message 생성하면됨

새로운 예외 핸들러 생성 방식

  • GlobalExceptionHandler.java
  1. 적절한 에러 코드 지정 - 주로 Common or 특정 예외 코드
  2. ErrorResponse 생성 - e.getMessage() 그대로 또는 적절하게 변형
  3. getResponseEntity(errorCode, er, " 예외 이름 ") 메서드를 이용해 반환
    // 예시 - header에 required 필드에 값이 들어오지 않은 경우
    @ExceptionHandler(value = MissingRequestHeaderException.class)
    public ResponseEntity<ErrorResponse> handleMissingRequestHeaderException(Exception e) {
        ErrorCode errorCode = ErrorCode.INVALID_INPUT_VALUE;
        ErrorResponse er = getErrorResponse(e.getMessage(), errorCode);
        return getResponseEntity(errorCode, er, "handleMissingRequestHeaderException"); // 로그 출력, 공통 응답형식 생성
    }

테스트 및 API 문서 생성

  • 컨트롤러, 서비스 테스트 필요

    • 서비스 테스트
      • 해당 상황일 때 특정 Exception이 발생하는지 -> assertThatThrownBy 이용
    • 컨트롤러 테스트
      • mockMvc로 올바른 예외처리된 응답이 반환되는지
      •  .andExpect(status().isInternalServerError())
         .andExpect(jsonPath("code").value("C002"))
  • 테스트 완료시 스웨거 문서 작성을 위해 컨트롤러에 @ApiResponses 작성 필요

    • 예시
      • image
      • image

[fix] 5차 논의사항

목적

7/15 논의사항 정리

작업 내용

  • 유저 프로필 이미지 1,2,3,4 값만 가지고 있다가 보내주는것으로 결정 -> 프론트에서 숫자에 맞는 이미지 가지고있는거 보여줄것
    • 익명유저는 "name":"익명" , "image":""
    • betree 메시지는 "1"로 일단 보냄
  • 유저 url 백엔드에서는 ""로 보내주는것으로 결정 -> 프론트 나무숲 조회 Url 그대로 사용하기로함
  • 메시지 읽음처리할때 음수로오는 id 처리 필요
    • 알림나무에서 줄어들지 않고있음
    • -1 findbyid에서 null에러나는게 아니라 그냥 읽은거로 처리하도록 변경
  • 메시지 prevId, nextId 조회하면 해당 폴더가아니고 전체폴더기준으로 prev,next조회되는 오류 처리필요
  • 폴더에서 기본나무 안보여지도록 처리 필요

참고 사항

  • 2차 스펙중 친구 제외하고 자잘한거랑, 테스트할때 안되는거 위주로 다음주동안 구현하기로 (금요일까지)

[fix] 유저 접속 URL 생성

목적

로그인 유저마다 고유한 접속 URL 필요

작업 내용

  • 고유한 url 생성하는 로직 필요

참고 사항

fix: 이전, 다음 메세지 조회 로직 수정

목적

폴더 내 메세지 상세와 즐겨찾기 메세지 상세 구분 필요

작업 내용

  • 고민중..

참고 사항

  • 현재는 특정 폴더내 메세지 이전,다음 조회하다가 즐겨찾기 메세지 순서가 되면 그 이후로는 즐겨찾기 메세지만을 조회함

[feat] 메세지 삭제

목적

메세지 삭제

작업 내용

  • 받은 사람, 보낸 사람 삭제 여부 필드 추가
  • 받은 사람, 보낸 사람 삭제 여부 둘 다 true 일 때는 db에서 삭제
  • 메세지 목록 조회시 삭제 여부 조건 추가
  • 삭제된 메세지 상세 조회 시도시 예외처리

참고 사항

알림나무 API

목적

매일 갱신되는 8개의 칭찬메시지가 생성되는 알림나무 API를 구현한다.

개발 내용 정리 -> 잘못적은 부분 수정 필요

  • 비트리가 제공하는 기본 명언, 칭찬메시지는 Enum이나 전역 값으로 최소 8개 만들어둔다. -> 일단 메시지 id를 음수로 해서 디비에서 말고 하드코딩된 코드안에서 가져오도록 함.
  • 안읽은 메시지 , 즐겨찾기한 메시지, 비트리 제공 메시지 로 알림나무 열매 8개를 만든다.
    • 먼저 안읽은 메시지가 8개 이상이면 그중에 8개를 뽑는다.
    • 안읽은 메시지가 8개 이하이면 즐겨찾기한 메시지로 (안읽은메시지 + 즐겨찾기 메시지 ) 8개를 채운다.
    • 그래도 8개가 안되면 비트리 제공 메시지로 8개를 만든다.
    • 배치 적용하기 전에는 수동 갱신 API를 만들어서 유저마다 알림나무 열매를 새로 만들어 DB에 메시지 id 8개 리스트를 저장한다.

NoticeTree Entity

  • 메시지 읽으면 unreadMessage -> readMessages로 이동 필요
  • unreadMessages, readMessages에는 messageId를 ","로 구분한 String 값이 들어감 (1,2,3,4,5,6)(7,8)
  • userId 저장

참고 사항

  • 알림나무 읽지않은 메시지 개수 -> 전체 메시지 or 8개 뭐였는지? -> 전체메시지
  • 알림나무페이지에서 안읽고 메시지함으로 읽어버리면 알림나무에는 읽음처리되는지 아닌지 ? -> 읽음처리됨

알림나무용 DB 테이블 생성 -> 메시지 id가 8개 들어감 (8개보다 적거나 많을 수 없음)
읽은 메시지 id 처리하는 필드 필요.

[feat] 회원 탈퇴, loginUser 검증 (TBD)

목적

회원 탈퇴 기능과 탈퇴 이후에 loginUser 검증 필요성 (회원 탈퇴이후에도 accessToken에 1시간동안은 탈퇴된 회원도 그냥 토큰으로 정보가 남아있을 수가 있다)

작업 내용

  • 회원 탈퇴
  • UserHandlerMethodArgumentResolver 이나 아니면 LoginUser를 받아와 사용하는 앞단에서 통일되게 userId에 맞는 유저가 존재하는지 여부를 확인해야할 것 같다.
  • 회원탈퇴 기능이 없을 때 까지는 괜찮을 거 같기도하고 ,, 지금은 어떤데서는 서비스에서 userRepository.findById, 아니면 메시지조회에서는 messageRepository.findByMessageIdAndUserId 이런식으로 찾고있어서 userid에 해당하지 않으면 찾아지는게 없거나 예외처리가 되고있긴함

참고 사항

  • loginUser.getId 로 받아온 userId가 존재하는지 처리를 나중에 통일되게 하도록 바꾸면 좋을 것 같네요,, 일단은 그냥 이슈에만 남겨둘게요

나무, 나무숲, 물주기 추가작업

목적

나무, 나무숲, 물주기 추가작업

작업 내용 (개별)

  • 입력값 검증
  • ApiResponse 수정
  • 테스트코드 생성

참고 사항

  • 유저 나무숲 조회 -> 전체조회랑 하나로 합칠예정
  • 유저 나무숲 전체 조회 NEW
    • 자기에게 물주기 할 때 나무숲 리스트 받아서 선택해야해서 API 추가했습니다
    • 테스트코드
  • 유저 상세 나무숲
    • 테스트코드
  • 유저 나무 추가
    • 나무 이름 글자수 20자 제한(몇자 제한 정해보기),
    • 나무 DEFAULT폴더로 생성 제한
    • 테스트코드
  • 유저 나무 편집
    • 나무 이름 글자수 20자 제한
    • 나무 DEFAULT 폴더로 변경 제한, DEFAULT폴더 다른 타입으로 변경 제한
  • 물주기
    • 테스트코드
  • 메시지함 목록
  • 메시지 공개여부 설정(열매맺기)
  • 알림나무 메시지 리스트

고민

  • 유저 나무 편집
    • default 나무 편집에 대해서 어떻게 처리해줘야하는지? -> default 열매타입인 경우 딱 하나 무조건 존재하도록 하고, 수정 / 삭제 불가능하게함. 다른 폴더가 default로 타입 변경도 불가능
  • 물주기
    • 상대방 default 나무 값 프론트에서 어떻게 전달해줄지 -> folderId가 비어있으면 default로 인식하도록
    • 비로그인 사용자에 대한 경우 처리 -> 일단 boolean isLogin으로 변경 -> 1차 구현에서는 모두 로그인된 사용자로 처리
    • 내가 나한테 보낼때도 익명여부를 설정하는지? or 가능한지? -> 가능함

DB 엔티티 생성

목적

DB 기본 엔티티 생성

작업 내용

  • User
  • Message
  • Folder

참고 사항

[infra] AWS 배포환경 설정

목적

AWS 배포환경 설정

작업 내용

  • ec2, rds 생성
  • ci/cid github action

참고 사항

  • 배포할만한 api 모두 구현한 뒤에 인스턴스 생성 (요금,개발 우선순위 고려)

[fix] 프론트엔드 건의사항 반영

목적

프론트엔드 건의사항 반영

forest-controller

  1. GET /api/forest (유저 나무숲 조회)
  • Response
    • 200
      • 각 나무 데이터 객체에 포함될 것
        • 나무 아이디
        • 나무 이름
        • 나무 열매 종류 ( 필요 ! )

2. POST /api/forest (유저 나무 추가) - 이미 되어있는 것 같음

  1. PUT /api/forest/{treeId} (유저 나무 편집)
  • Response
    • 200
      • 편집된 유저의 나무 아이디 반환 ( 필요하다고 생각 !

message-controller
POST - /api/message (물주기)

  • Prameters
    • requestDto
      • folderId, receiverId 에 대한 description 이 필요 해보입니다 !

작업 내용

  • 유저 나무숲 조회 나무 열매 종류 추가
  • 유저 나무 편집 나무 아이디 반환
  • 물주기 DTO 설명 추가

참고 사항

  • 유저 나무숲 조회 API 추가는 안하기로 결정

[docs] 5차 배포사항

목적

다음 API 서버 테스트 배포까지 API 변경된 사항 리스트업

기간

2022.07.10 (화) ~ 2022.07.16 (일)

작업 내용

구분 변경 내용 관련 API PR 담당 기타
추가 - 나무숲 공개 API GET /api/forest/opening  #72 김수빈
수정 - 나무숲 조회 API 응답값에 default 나무는 조회되지 않도록 수정, opening여부(폴더 공개여부) 추가 GET /api/forest  #82 #77 강지수
수정 - senderProfileImageUrl , userImage 값 서버의 이미지 path로 수정 /image/v1/user_{}.png 형식  #77 강지수
수정 - UserResponseDto.url 항상 ""반환하도록 수정 GET /api/users/info  #77 강지수
수정 - 메시지 읽음 API 음수 메시지도 읽음처리되도록 수정 PUT /api/messages/alreadyRead #77 강지수

이미지 주소

  • 서버주소/image/v1/user_1.png
  • 서버주소/image/v1/user_2.png
  • 서버주소/image/v1/user_3.png
  • 서버주소/image/v1/user_4.png
  • 서버주소/image/v1/user_unknwon.png : 익명
  • 서버주소/image/v1/user_betree.png : 비트리 편지

참고 사항

  • 내부 구현 말고 API 스펙상 변경되는 request, responseDTO, API 추가 내역 작업내용에 정리하고 배포 다시 할때 디코 일반에 전달

[feat] 로그아웃

목적

로그아웃

작업 내용

  • 로그아웃 구현
    • refreshToken db에 해당 user에 대한 값 삭제
    • cookie 초기화

참고 사항

  • cookie에 대한 처리 테스트

[bug] Authorization 헤더 리액트에 노출안되는 오류

버그 설명

프론트에 Authorization Header에 jwt accessToken을 담아서 전달하는데 리액트에 노출 안됨

기대 동작

  • Authorization 응답 헤더에 jwt 토큰 노출

현재 동작

  • postman이나 개발자모드 네트워크 탭에서는 보이는데 react 응답에 보이지 않음

해결방법

  • WebConfig exposeHeader

참고 문서

나무, 나무숲 API

목적

나무 숲, 나무 관련 API (조회, 등록, 편집, 삭제)

작업 내용

  • 유저 나무숲 조회
  • 유저 상세 나무 조회
  • 나무 추가
  • 나무 편집
  • 테스트 케이스

참고 사항

  • controller에서 토큰 처리 과정 필요
  • 예외처리, 응답 값 형식 설정 필요

[bug] 변경한 닉네임으로 유저 정보 조회 실패

버그 설명

  • 유저 닉네임 변경 후 유저 정보 조회를 하면 변경된 닉네임이 아닌 그 전 닉네임이 조회

기대 동작

  • 변경된 닉네임으로 유저 정보 조회

현재 동작

  • 변경된 닉네임이 아닌 그 전 닉네임이 조회

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.