Skip to content

Commit

Permalink
메인으로 머지하겠습니다 리뷰x (#466)
Browse files Browse the repository at this point in the history
* chore: 버전 2.0.0으로 업데이트

* feat: 빈 검색어를 입력하면 빈 리스트가 조회되도로 수정함 (#358)

* Feat/#355 댓글 작성 및 삭제 기능 구현 (#362)

* feat: PostSlice 테스트에 기본 생성자 추가

* feat: 댓글, 댓글 이미지 클래스 생성

* feat: 댓글 작성 api 구현

* feat: 댓글 삭제 api 구현

* test: 테스트 케이스 추가

* feat: prod-test용 properties 파일에 firebase 파일 경로 추가

* feat: flyway용 sql 파일 작성

* feat: 댓글 작성, 삭제 rest docs 문서화

* feat: CommentImageInfo에 Where 어노테이션 추가

* test: truncate.sql 에 새로 추가된 테이블들도 truncate 하도록 추가

* refactor: 클래스명과 필드명을 같지 않도록 수정
- SonarLint 권장사항: 둘이 같으면 헷갈리고 유지보수하기 불편

* docs: 게시글 삭제시 고려해야 할 사항 todo 추가

* docs: 게시글 삭제시 고려해야 할 사항 todo 추가 2

* Refactor/#342 코드 최적화 (#352)

* refactor: 기본생성자에 리플렉션을 통해 Member를 만드는 테스트 서포트 클래스를 사용하도록 변경

* refactor: 테스트에서만 사용하는 AllArgsConstructor 삭제

* refactor: 5개짜리 args를 가진 생성자를 MemberTest 이외에는 사용하지 못하도록 제거

* refactor: Member 안에서만 사용하는 생성자의 접근자를 private으로 변경

* refactor: != 대신 Objects.nonNull을 사용

* refactor: Member 생성자에 validate 로직 추가

* fix: 자동으로 생성하는 소셜 계정의 email, password, nickname이 유효하게 생성되도록 변경

* refactor: TestMemberBuilder를 support 패키지로 옮기고, 오픈된 생성자를 사용해 객체를 만들도록 변경

* refactor: 테스터 사용 코드 정리

---------

Co-authored-by: jyeost <[email protected]>

* feat/#356 댓글뷰구현 (#369)

* feat: 댓글 작성 뷰 구현

* feat: 로그인 여부와 작성자 여부에 따라 댓글 작성 layout의 visible 구현

* feat: 댓글 아이템을 구현한다

* feat: 댓글 리사이클러뷰를 구현한다

* refactor: 파일명 수정

* feat: 갤러리에서 사진 첨부하도록 구현

* refactor: view 분리 및 뷰 크기 수정
- 로그인 하지 않으면 로그인으로 이동하도록 수정

* Feat/#372 댓글만 조회하는 API 구현 (#373)

* feat: 응답 dto 클래스 생성

* feat: 댓글만 조회 api 구현

* test: 댓글만 조회 테스트 작성

* docs: rest docs 문서화

* refactor: 파일의 urL을 만들어주는 부분을 캡슐화

* feat: 댓글 수도 같이 조회할 수 있도록 api 수정

* fix: 반환할 이미지가 없을 때 예외가 발생하는 버그 수정

* refactor: primitive 타입으로 수정

* refactor: 메서드 네이밍 수정

* feat: 게시글이 존재하는지 확인하는 기능 추가
- 게시글 상세페이지에서 게시글이 삭제된 경우 빈 리스트가 반환되어 버리면 댓글이 모두 증발해버려 사용자가 깜짝 놀랄 수 있기 때문에 게시글이 삭제되었다는 예외코드와 메세지를 반환한다.

* refactor: response의 nickName을 nickname으로 변경 (#380)

* fix: 이미지 값이 null로 들어오는 경우 처리 (#382)

* Fix/#368 회원정보수정 준비중 (#374)

* refactor: 테스트 서버 구분을 위해 url 변수를 이용하도록 수정

* feat: 회원 정보 수정 클릭 시 준비 중이라는 메시지 출력 구현

- makeSnackbar 확장함수 적용 안된 부분들도 추가 적용했음!

* feat: 로그아웃 시 하단 메뉴 (내가쓴글, 로그아웃, 회원정보, 알람설정, 탈퇴) 전체가 안 보이도록 수정

* refactor: 로그인 여부에 따른 뷰 처리 로직 간결화

* feat: 핫게시글 정책에 댓글 가중치를 추가한다.

* fix: 테스트 깨지는 것 수정

* refactor: test 메서드명 뒤바뀐 것 수정

* fix: 댓글 글자수 제한을 게시글 글자수 제한과 동일하도록 수정 (#389)

* fix: 댓글 글자수 제한을 게시글 글자수 제한과 동일하도록 수정

* refactor: 포멧팅

* Feat/#375 댓글 수를 조회하고 스크랩수는 제거한다 (#377)

* refactor: Post 패키지에 들어있는 dto들을 하위의 request, response 패키지로 로 분리

* feat: 게시글 api 응답들에서 scrapCount, isScrap 필드 제거

* feat: 게시글 조회시 게시글에 달린 댓글수가 반영되어 조회되는 기능 구현

* refactor: DB에서 게시글을 조회할 때, 댓글 수도 같이 조회되도록 수정

* refactor: 안쓰는 메서드 제거

* fix: 삭제된 댓글은 빼고 댓글 수가 조회되도록 수정

* fix: nickName을 nickname으로 수정

* refactor: dto 네이밍 구체화

* refactor: 테스트 코드에서 통합 테스트용 api를 IntegrationFixture 클래스 하위로 이동

* refactor: todo 삭제

* refactor: count 쿼리 살짝 수정

* fix: 핫 게시글 조회 정책 변경으로 인한 깨지는 테스트 수정 (#395)

* Feat/#387 댓글 신고기능 (#390)

* feat: 신고 api를 수정하고, 댓글도 신고할 수 있도록 한다

* feat: 로컬에서 flyway가 충돌나는 것을 막기 위한 bean을 등록한다.

* feat: 바뀐 신고 도메인에 대해 flyway update 문서를 작성한다

* test: 댓글 신고 테스트 케이스 추가

* refactor: flyway 설정 파일 삭제

* feat: reporter lazy loading으로 수정

* refactor: request에서 reportType을 문자열로 받아오고 service에서 타입을 찾아오도록 수정함

* refactor: flyway 버전 수정

* refactor: 바뀐 코드에 맞게 테스트와 로직 수정

* feat: 이미지 파일 도메인 환경변수 설정 (#397)

* Feat/#345 회원 정보 암호화 (#391)

* refactor: tokenGenerator 인터페이스로 분리

* chore: 사용하지 않는 import 제거

* feat: 비밀번호 암호화 기능 구현

* feat: 회원 가입 및 로그인 시 비밀번호 암호화 기능 적용

* feat: 비밀번호 암호화 적용할 때, 검증 로직 추가

* refactor: 토큰 로직 수정

* test: 필요없는 코드 제거

* refactor: 소셜 로그인시 기존 회원가입에 사용하는 검증 제거

* chore: 사용하지 않는 Import 제거

* refactor: 변수 인라인 적용

* refactor: 제거해야할 메소드에 주석 추가

* refactor: 메소드 추출 및 헷갈리는 static 변수 수정

* test: EdonymyeonException -> BusinessLogicException 바꾼거 수정

* Fix/#367 카카오톡 로그인 오류 (#388)

* fix: 카카오톡 계정 로그인 오류 해결

- Manifest>kakao scheme에 local.properties 값의 "" 가 포함된 키 값이 전달되는 문제

* fix: dev merge 후 SerialName이 달라서 바뀐 문제 해결

* Feat/#335 알림 설정 기능 구현 (#371)

* refactor: 기본생성자에 리플렉션을 통해 Member를 만드는 테스트 서포트 클래스를 사용하도록 변경

* fix: 뿌리부터 망한 setting 도메인 제거

* feat: Setting 도메인 설계 후, 동일한 type의 설정과 관련된 요구사항 구현

* feat: 다른 타입의 설정과 관련된 요구사항 구현

* feat: 알림 관련 설정 API 구현

* fix: git conflict 해결

* refactor: activate, deactivate 후속 작업들을 전략 패턴으로 분리

* refactor: member 객체를 파라미터로 받는 toggleSetting 메서드의 접근자를 private로 바꾸어 외부에 비공개

* refactor: 알림 설정에 대한 설명을 필드 대신 주석으로 표현

* docs: 각 전략의 내용을 javadoc 주석으로 설명

* test: git rebase 과정에서 사라진 테스트코드 복구

* fix: Setting 도메인과 관련해 잘못 명시된 코드 수정

* refactor: Category 클래스명을 명확하게 변경

* fix: 소셜 방식으로 회원가입한 이후에도 설정 초기화 작업을 수행하도록 변경

* refactor: toggleSetting() 메서드를 가독성있게 최적화

* refactor: 팀과의 상의 결과 불필요한 설정 항목과 설정 전략 삭제

* refactor: SettingType 값을 class에서 enum으로 변경

* refactor: setting 도메인 flyway 적용

* docs: 추가한 API를 restdocs를 사용해 문서화

* fix: flyway에 제약 조건 이름 추가

* fix: 애플리케이션 실행 profile 복구

* refactor: Manager 인터페이스를 추상 클래스로 바꾸고, Manager들의 공통적인 검증 작업은 그 추상 클래스에서 진행하도록 변경

* fix: early return 부재로 발생한 버그 해결

* refactor: repository의 패키지 이동

* refactor: 테스트에서 매직 값 대신 상수를 사용

* feat: 핫게시글 정책에 댓글 가중치를 추가한다.

* fix: 테스트 깨지는 것 수정

* refactor: test 메서드명 뒤바뀐 것 수정

* fix: 댓글 글자수 제한을 게시글 글자수 제한과 동일하도록 수정 (#389)

* fix: 댓글 글자수 제한을 게시글 글자수 제한과 동일하도록 수정

* refactor: 포멧팅

* Feat/#375 댓글 수를 조회하고 스크랩수는 제거한다 (#377)

* refactor: Post 패키지에 들어있는 dto들을 하위의 request, response 패키지로 로 분리

* feat: 게시글 api 응답들에서 scrapCount, isScrap 필드 제거

* feat: 게시글 조회시 게시글에 달린 댓글수가 반영되어 조회되는 기능 구현

* refactor: DB에서 게시글을 조회할 때, 댓글 수도 같이 조회되도록 수정

* refactor: 안쓰는 메서드 제거

* fix: 삭제된 댓글은 빼고 댓글 수가 조회되도록 수정

* fix: nickName을 nickname으로 수정

* refactor: dto 네이밍 구체화

* refactor: 테스트 코드에서 통합 테스트용 api를 IntegrationFixture 클래스 하위로 이동

* refactor: todo 삭제

* refactor: count 쿼리 살짝 수정

* fix: 핫 게시글 조회 정책 변경으로 인한 깨지는 테스트 수정 (#395)

* Feat/#387 댓글 신고기능 (#390)

* feat: 신고 api를 수정하고, 댓글도 신고할 수 있도록 한다

* feat: 로컬에서 flyway가 충돌나는 것을 막기 위한 bean을 등록한다.

* feat: 바뀐 신고 도메인에 대해 flyway update 문서를 작성한다

* test: 댓글 신고 테스트 케이스 추가

* refactor: flyway 설정 파일 삭제

* feat: reporter lazy loading으로 수정

* refactor: request에서 reportType을 문자열로 받아오고 service에서 타입을 찾아오도록 수정함

* refactor: flyway 버전 수정

* refactor: 바뀐 코드에 맞게 테스트와 로직 수정

* feat: 이미지 파일 도메인 환경변수 설정 (#397)

* Feat/#345 회원 정보 암호화 (#391)

* refactor: tokenGenerator 인터페이스로 분리

* chore: 사용하지 않는 import 제거

* feat: 비밀번호 암호화 기능 구현

* feat: 회원 가입 및 로그인 시 비밀번호 암호화 기능 적용

* feat: 비밀번호 암호화 적용할 때, 검증 로직 추가

* refactor: 토큰 로직 수정

* test: 필요없는 코드 제거

* refactor: 소셜 로그인시 기존 회원가입에 사용하는 검증 제거

* chore: 사용하지 않는 Import 제거

* refactor: 변수 인라인 적용

* refactor: 제거해야할 메소드에 주석 추가

* refactor: 메소드 추출 및 헷갈리는 static 변수 수정

* test: EdonymyeonException -> BusinessLogicException 바꾼거 수정

* Fix/#367 카카오톡 로그인 오류 (#388)

* fix: 카카오톡 계정 로그인 오류 해결

- Manifest>kakao scheme에 local.properties 값의 "" 가 포함된 키 값이 전달되는 문제

* fix: dev merge 후 SerialName이 달라서 바뀐 문제 해결

* refactor: 기본생성자에 리플렉션을 통해 Member를 만드는 테스트 서포트 클래스를 사용하도록 변경

* feat: Setting 도메인 설계 후, 동일한 type의 설정과 관련된 요구사항 구현

* fix: git conflict 해결

* fix: 중복으로 존재하는 SettingRepository 제거

---------

Co-authored-by: jyeost <[email protected]>
Co-authored-by: Sung Chaeyeon <[email protected]>
Co-authored-by: LeeGeonHo <[email protected]>
Co-authored-by: Sujin Kim <[email protected]>

* feat: 내가 쓴 글 조회시 댓글수, 조회수도 반영되도록 추가 (#401)

* feat: 내가 쓴 글 조회시 댓글수, 조회수도 반영되도록 추가

* refactor: 썸네일 가져오는 부분 캡슐화

* test: 썸네일 테스트 추가

* refactor: 썸네일이 있는지 확인하는 메서드 분리

* Feat/#370 댓글기능 서버와연동 (#402)

* refactor: uri -> File로 만드는 함수들 common 패키지에서 하도록 수정

* feat: 댓글 작성 서버와 연동

* feat: comment ui모댈과 data model 생성

* feat: 댓글 삭제 기능 서버와 연동

* refactor: reactionCount 타입 변경 및 필요없는 변수 삭제

* feat: 댓글 조회 서버와 연동

* feat: 댓글 신고 기능 서버와 연동

* refactor: api 명세에 맞게 타입 수정

* feat: 로그인을 하지 않으면 신고를 하지 못하도록 구현

* refactor: image가 선택되지 않은 경우 서버에 null 전달하도록 수정

* refactor: 테스트 서버 구분을 위해 url 변수를 이용하도록 수정

* refactor: api에 맞게 변수명 수정

* refactor: 댓글과 상세글을 전부 다 받아올때까지 로딩이 되도록 수정

* refactor: 키보드 내리는 함수 common 패키지로 이동

* feat: 리사이클러뷰 어댑터 연결 및 listener 연결

* feat: 댓글 작성 후 키보드가 사라지고 화면에 맨 하단으로 이동하도록 구현

* refactor: 글 작성자도 댓글 달 수 있도록 수정

* refactor: 명세에 맞게 api 수정

* refactor: 여백 수정

* refactor: 이중 리사이클러뷰가 되지 않도록 수정

* refactor: 날짜 표시 수정

* refactor: 댓글 작성하면 화면이 맨 하단으로 이동하도록 수정

* feat: 댓글 작성후 이미지도 보이지 않도록 구현

* refactor: api 명세에 맞게 수정

* refactor: 댓글 수 반영

* fix: 비동기로 인해 발생하는 comment 개수 오류 해결

* test: api 맞게 테스트 수정

* refactor: 불필요한 주석 제거

* refactor: 로그인 하지 않으면 신고 후 로그인하라고 스낵바 보이도록 수정

* feat: 신고 접수 시 스낵바에 접수 되었다고 보여주는 기능 추가

* Feat/#400 내가쓴글 개선 (#412)

* fix: api 수정사항에 맞게 반영 (scrap 관련)

* refactor: id 수정

- 커스텀뷰 id _ctv로 하기로 했는데.. 다들 prv_로 작성하셨길래.. 다수의 의견에 맞게 수정하였습니당

* feat: my post item 뷰 수정

- 조회수, 댓글수 보이도록 추가
- 확정일자 유무에 따라 이미지 위치 달라지는 문제 개선

* refactor: 이름 변경

- 내가 쓴 글 > 내가 쓴 글 및 소비/절약 확정

* feat: 내가 쓴 글에 조회수,댓글수 보이도록 api 연동

* fix: 뷰가 겹쳐 보이는 문제 해결

- 크기 비율로 지정해줌

* refactor: uk, fk 이름 수정 (#404)

* refactor: uk, fk 이름 수정

* refactor: 파일 버전 수정

* refactor: 파일 오타 수정

* feat: check 제약조건 이름 수정 쿼리 추가

* Feat/#378 게시글 soft delete (#406)

* test: 게시글이 신고되어도 게시글을 삭제하는 기능 테스트 작성

* feat: flyway baseline fk 이름 수정 테스트

* feat: post와 postImageInfo에 soft delete 도입

* feat: 게시글이 삭제될 때, 댓글도 삭제되는 기능 구현

* refactor: 게시글 수정시 삭제되는 이미지들을 soft delete

* refactor: 댓글 삭제 쿼리 개수 줄이기

* refactor: flyway 파일 버전 수정

* fix: 게시글 삭제시 댓글의 이미지가 deleted 컬럼이 true로 바뀌지 않던 이슈 수정 (#417)

* fix: 게시글 삭제시 댓글의 이미지가 deleted 컬럼이 true로 바뀌지 않던 이슈 수정

* docs: 주석 제거 및 todo 추가

* Feat/#407 알림 구현 (#408)

* feat: 댓글이 남겨지면 글 작성자에게 알림을 발송하는 기능 구현

* feat: 소비/절약 확정을 하지 않은 게시글의 작성자를 전부 찾아내는 Repository 기능 구현

* feat: 소비/절약 확정을 하지 않은 게시글의 작성자에게 오후 8시마다 알림을 보내는 기능 구현

* feat: 사용자가 알림을 받겠다는 설정을 했을 경우에만 알림을 발송하는 기능 구현

* fix: 추가된 기능으로 인해 깨지는 테스트 고치기

* fix: 노트북 상황에 따라 테스트가 깨지지 않도록 스케줄러 테스트 설정을 변경

* refactor: 알림 발송 작업을 비동기로 진행

* refactor: 무의미한 스케줄러 테스트를 그냥 삭제

* refactor: CommentSavingEvent의 이름을 자연스럽게 변경

* refactor: early return 코드 추가

* refactor: 상대적으로 쿼리 비용이 적은 작업을 조건문의 앞에 배치

* refactor: 메서드 오버로딩을 활용해 메서드의 뎁스 줄이기

* refactor: 도메인 객체가 DTO를 모르게 하기

* refactor: 스케줄러 cron 식 이해할 수 있게 주석 달아놓기

* feat: 알림을 보낼 게시글이 삭제된 경우 / 알림을 받을 회원이 탈퇴한 경우 알림을 발송하지 않는 기능 + 게시글이 삭제되면 관련 알림 내역을 삭제하는 기능 구현

* refactor: 겹치는 테스트 의존성을 필드로 이동

* refactor: 테스트에서 누락된 알림 발송 실패 상황을 추가

* fix: merge conflict 해결

* test: 게시글 삭제시 그와 관련된 알림 내역도 함께 삭제하는 테스트 추가

* docs: notificationService의 각 작업 내용을 javadocs로 설명

* fix: 내가 쓴 글 조회에서 댓글수가 제대로 조회 안되는 버그 수정 (#426)

* Fix/#423 삭제된게시글 무한로딩 (#424)

* refactor: 에러 처리에 대한 핸들링 공통함수로 추출

* refactor: 제목이 길면 제목 잘리지 않도록 수정

* refactor: 글이 삭제된 글이면 다이얼로그 보여주도록 수정

* feat: 전체 게시물 swipe 시 refresh되도록 수정

* fix: floatingButton refreshlayout에 가려져 보이지 않던 오류 수정

* refactor: 댓글 닉네임 길이 수정

* refactor: alertDialog에서 DialogFragment로 변경

* Feat #353 알림기능 (#413)

* feat: 알림을 읽었을 때, 알림을 통해 조회하는 여부 Api 통해 호츌

* feat: 내가 쓴글 알림을 읽었을 때, 알림을 통해 조회하는 여부 Api 통해 호츌

* feat: 알람 설정 기능 추가

* chore: string 위치 수정

* test: 테스트 오류 수정

* fix: 타입 수정

* fix: response명 변경

* fix: response명 변경

* fix: 알림 아이콘 변경

* chore: 로그제거

* feat: 알림 읽음 여부 색상구분 추가

* feat: 알림페이지에서 알림을 읽었을 때 읽음 API 로직 추가

* refactor: uk, fk 이름 수정 (#404)

* refactor: uk, fk 이름 수정

* refactor: 파일 버전 수정

* refactor: 파일 오타 수정

* feat: check 제약조건 이름 수정 쿼리 추가

* Feat/#378 게시글 soft delete (#406)

* test: 게시글이 신고되어도 게시글을 삭제하는 기능 테스트 작성

* feat: flyway baseline fk 이름 수정 테스트

* feat: post와 postImageInfo에 soft delete 도입

* feat: 게시글이 삭제될 때, 댓글도 삭제되는 기능 구현

* refactor: 게시글 수정시 삭제되는 이미지들을 soft delete

* refactor: 댓글 삭제 쿼리 개수 줄이기

* refactor: flyway 파일 버전 수정

* fix: 게시글 삭제시 댓글의 이미지가 deleted 컬럼이 true로 바뀌지 않던 이슈 수정 (#417)

* fix: 게시글 삭제시 댓글의 이미지가 deleted 컬럼이 true로 바뀌지 않던 이슈 수정

* docs: 주석 제거 및 todo 추가

* Feat/#407 알림 구현 (#408)

* feat: 댓글이 남겨지면 글 작성자에게 알림을 발송하는 기능 구현

* feat: 소비/절약 확정을 하지 않은 게시글의 작성자를 전부 찾아내는 Repository 기능 구현

* feat: 소비/절약 확정을 하지 않은 게시글의 작성자에게 오후 8시마다 알림을 보내는 기능 구현

* feat: 사용자가 알림을 받겠다는 설정을 했을 경우에만 알림을 발송하는 기능 구현

* fix: 추가된 기능으로 인해 깨지는 테스트 고치기

* fix: 노트북 상황에 따라 테스트가 깨지지 않도록 스케줄러 테스트 설정을 변경

* refactor: 알림 발송 작업을 비동기로 진행

* refactor: 무의미한 스케줄러 테스트를 그냥 삭제

* refactor: CommentSavingEvent의 이름을 자연스럽게 변경

* refactor: early return 코드 추가

* refactor: 상대적으로 쿼리 비용이 적은 작업을 조건문의 앞에 배치

* refactor: 메서드 오버로딩을 활용해 메서드의 뎁스 줄이기

* refactor: 도메인 객체가 DTO를 모르게 하기

* refactor: 스케줄러 cron 식 이해할 수 있게 주석 달아놓기

* feat: 알림을 보낼 게시글이 삭제된 경우 / 알림을 받을 회원이 탈퇴한 경우 알림을 발송하지 않는 기능 + 게시글이 삭제되면 관련 알림 내역을 삭제하는 기능 구현

* refactor: 겹치는 테스트 의존성을 필드로 이동

* refactor: 테스트에서 누락된 알림 발송 실패 상황을 추가

* fix: merge conflict 해결

* test: 게시글 삭제시 그와 관련된 알림 내역도 함께 삭제하는 테스트 추가

* docs: notificationService의 각 작업 내용을 javadocs로 설명

* fix: 내가 쓴 글 조회에서 댓글수가 제대로 조회 안되는 버그 수정 (#426)

* fix: 알림 읽었을 때 색상 변경

* fix: 알림색상 변경

---------

Co-authored-by: Sung Chaeyeon <[email protected]>
Co-authored-by: 백여우 <[email protected]>

* feat: 상세페이지에 refreshlayout 추가 (#429)

* Feat/#366 네트워크 오류대응 (#411)

* refactor: api 명세에 맞게 수정

* feat: 네트워크 상태 sealed class로 저장

* feat: BaseViewModel 생성해서 네트워크 에러에 대한 처리 구현

* feat: 에러시 스낵바 보여주도록 BaseActivity와 BaseFragment 생성

* refactor: BaseActivity와 BaseFragment 연결

* refactor: baseActivity와 baseViewModel 연동

* refactor: 이중 스크롤 막기 (#422)

* refactor: 이중 스크롤 막기

* refactor: 기기마다 화면 대응을 위해 wrap_content로 하고 아이템 개수를 5개로 제한을 두도록 수정

* update android-cd

* Fix:437_alarm bug (#438)

* fix: postId가 null인 경우 처리

* fix: 알림페이지 스크롤 버그 수정

* Update android-ci-workflow.yml

* Update android-ci-workflow.yml

* Update android-ci-workflow.yml

* Update android-ci-workflow.yml

* feat: 헤더 이름 세션에 맞게 수정 (#442)

- api에 로그인 정보를 담아 보낼 때는 Cookie
- 로그인 후 세션을 받을 때는 Set-Cookie

* Fix/#376 배포 이전 버전의 restdocs 문서가 조회되는 이슈 수정 (#431)

* docs: 잘못된 표기 수정

* chore: 빌드 파일에서 restDocs 설정 수정

* feat: 테스트용 문구 추가

* chore: 빌드 파일 띄어쓰기 원상복구

* chore: 빌드 파일 수정

* docs: 문서 제목 수정

* fix: 게시글 수정시 npe 해결 (#451)

* #427 알림 버그 해결하기(4가지) (#430)

* fix: 버그 1 - 자신이 작성한 게시글에 자신이 댓글을 남길 때도 알림을 보내는 버그 해결

* fix: 버그 2 - 로그아웃한 사용자의 디바이스 토큰이 비활성화되지 않는 버그 해결

* fix: 버그 3 - 소비/절약확정이 완료된 게시글에 대한 추천/비추천 알림을 보내지 않도록 개선

* fix: 테스트 truncate.sql 파일에 DEVICE 테이블 초기화 코드 추가

* fix: 버그 4 - 로그아웃한 사용자에게 알림은 보내지 않지만 알림 기록은 남아있어야 한다

* fix: 버그 5 - 탈퇴한 회원에 대한 알림기록이 DB에 계속 저장되는 버그 해결

* refactor: isPostConfirmed() 메서드를 ConsumptionService로 이동하기

* refactor: 불필요한 로그 제거

* fix: 버그 6 - REMIND 알림이 가지 않는 버그 해결

* test: 테스트Commit - 리마인드 기능 시험을 위해 스케줄러 시간 조정

* test: 테스트Commit - 리마인드 기능 시험을 위해 스케줄러 시간 조정

* fix: 리마인드 스케줄링 시간을 오후 8시로 복구

* docs: AuthService에 주석 남겨두기

* fix: 하나의 디바이스가 여러 계정에 걸쳐 활성화되어, 다수의 계정에 대한 알림이 발송되는 버그 해결

* feat: 현재로부터 31일 이내로 작성된 게시글에 대해서만 리마인드 알림을 발송하는 기능 추가

* Refactor/#409 session 로그인 (#414)

* refactor: 기존 basic 인증에서 session으로 로그인 방식 수정

* fix: MembeId가 없을 때도 분기 처리 추가

* build: session 설정 추가

* test: 테스트에 세션 로그인 적용

* test: dev에 새로 추가된 테스트 수정

* build: 필요없는 설정 제거

* test: 로그아웃(세션 만료) 이후, 기존 session으로 로그인시 예외처리 확인하는 테스트 코드 작성

* refactor: 필요없는 null 체크 제거

* refactor: 만료기간 30일로 변경

* docs: docs에 필요없는 헤더 삭제

* test: 잘못된 테스트 제거

* test: 게시글 상세 조회에서 Authorization 헤더 제거

* docs: api 문서에 사용하지 않는 Authorization 헤더 제거

* test: session 적용

* test: session 적용

* test: 실패하는 테스트 변경

* test: 실패하는 테스트 변경

* Refactor/#418 회원 프로필 삭제 로직 수정  (#420)

* refactor: 회원 프로필 로직 수정

- 회원 탈퇴 기능을 auth 패키지로 이동 (사진 삭제 부분만 member쪽에서 하도록)
- 이미지 삭제는 트랜잭션이 커밋 후 되도록 (+ 비동기 처리되도록)

* refactor: 회원 탈퇴 네이밍 변경

* refactor: 필드 순서 변경

* test: 사용하지 않는 코드 제거

* test: 테스트 시, 비동기 로직 실행 완료되도록 기다리는 코드 작성

* Feat/#439 백엔드 버저닝 (#452)

* feat: 버저닝 뼈대 구현

* feat: 버저닝 도입

* refactor: 불필요한 코드 제거

* feat: header에 버저닝 적용 (#453)

* feat: header에 버저닝 적용

* refactor: 버전 수정

* hotfix: 서버 api version 연동 누락된 헤더 추가

* chore: 버전코드 변경

* chore: 버전코드 변경

---------

Co-authored-by: 김지현 <[email protected]>
Co-authored-by: Sung Chaeyeon <[email protected]>
Co-authored-by: 백여우 <[email protected]>
Co-authored-by: 로피 <[email protected]>
Co-authored-by: Sujin Kim <[email protected]>
Co-authored-by: LeeGeonHo <[email protected]>
  • Loading branch information
7 people authored Sep 27, 2023
1 parent f47a7c2 commit a8b7ad4
Show file tree
Hide file tree
Showing 309 changed files with 7,887 additions and 2,432 deletions.
23 changes: 23 additions & 0 deletions .github/workflows/android-ci-workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,29 @@ jobs:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_ANDROID_CI_WEBHOOK_URL }} # required
if: failure()

- name: Get current date
id: date
run: echo "::set-output name=date::$(date +'%Y-%m-%d')"

- name: Build APK
run: bash ./gradlew assembleDebug --stacktrace

- run: './gradlew assembleDebug'
- uses: MeilCli/slack-upload-file@v1
with:
slack_token: ${{ secrets.ANDROID_CD_BOT_KEY }}
channels: ${{ secrets.ANDROID_CD_CHANNEL_NAME }}
file_path: 'android/app/build/outputs/apk/debug/app-debug.apk'
file_name: 'app-debug.apk'
file_type: 'apk'
initial_comment: '${{ github.ref }} 테스트 앱 슬랙 배포 성공'

- name: 테스트용 apk artifact 업로드
uses: actions/upload-artifact@v1
with:
name: app-slack-debug.apk
path: android/app/build/outputs/apk/debug/app-debug.apk

# Gradle 캐시 제거
- name: Cleanup Gradle Cache
if: always()
Expand Down
7 changes: 4 additions & 3 deletions android/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ android {
applicationId = "app.edonymyeon"
minSdk = 28
targetSdk = 33
versionCode = 7
versionName = "2.0.0"
versionCode = 11
versionName = "1.0.0"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

Expand All @@ -44,7 +44,8 @@ android {
localProperties.getProperty("APP_BASE_URL"),
)

manifestPlaceholders["KAKAO_NATIVE_KEY"] = localProperties.getProperty("KAKAO_NATIVE_KEY")
val kakaoNativeKey = localProperties.getProperty("KAKAO_NATIVE_KEY")
manifestPlaceholders["KAKAO_NATIVE_KEY"] = kakaoNativeKey.substring(1, kakaoNativeKey.length - 1)
}

buildTypes {
Expand Down
2 changes: 1 addition & 1 deletion android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@

<data
android:host="oauth"
android:scheme="@{KAKAO_NATIVE_KEY}" />
android:scheme="${KAKAO_NATIVE_KEY}" />
</intent-filter>
</activity>
</application>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.app.edonymyeon.data.common

import org.json.JSONObject
import retrofit2.Response

fun <T : Any> createCustomThrowableFromResponse(result: Response<T>): CustomThrowable {
val errorResponse = result.errorBody()?.string()
val json = errorResponse?.let { JSONObject(it) }
val errorMessage = json?.getString("errorMessage") ?: ""
val errorCode = json?.getInt("errorCode") ?: 0
return CustomThrowable(errorCode, errorMessage)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.app.edonymyeon.data.common

sealed class FetchState {
object BadInternet : FetchState()
object ParseError : FetchState()
object WrongConnection : FetchState()

object Fail : FetchState()
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
package com.app.edonymyeon.data.datasource.post

import com.app.edonymyeon.data.dto.request.PostEditorRequest
import com.app.edonymyeon.data.dto.response.CommentsResponse
import com.app.edonymyeon.data.dto.response.PostDetailResponse
import com.app.edonymyeon.data.dto.response.PostEditorResponse
import com.app.edonymyeon.data.dto.response.Posts
import retrofit2.Response
import java.io.File

interface PostDataSource {
suspend fun getPostDetail(postId: Long): Response<PostDetailResponse>
suspend fun getPostDetail(
postId: Long,
notificationId: Long,
): Response<PostDetailResponse>

suspend fun deletePost(postId: Long): Response<Unit>
suspend fun getPosts(size: Int, page: Int): Response<Posts>

Expand All @@ -25,4 +30,17 @@ interface PostDataSource {
): Response<PostEditorResponse>

suspend fun getHotPosts(): Response<Posts>

suspend fun getComments(postId: Long): Response<CommentsResponse>

suspend fun postComment(
id: Long,
image: File?,
comment: String,
): Response<Unit>

suspend fun deleteComment(
postId: Long,
commentId: Long,
): Response<Unit>
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.app.edonymyeon.data.datasource.post

import com.app.edonymyeon.data.dto.request.PostEditorRequest
import com.app.edonymyeon.data.dto.response.CommentsResponse
import com.app.edonymyeon.data.dto.response.PostDetailResponse
import com.app.edonymyeon.data.dto.response.PostEditorResponse
import com.app.edonymyeon.data.dto.response.Posts
Expand All @@ -18,8 +19,11 @@ class PostRemoteDataSource : PostDataSource {
private val postService: PostService =
RetrofitClient.getInstance().create(PostService::class.java)

override suspend fun getPostDetail(postId: Long): Response<PostDetailResponse> {
return postService.getPost(postId)
override suspend fun getPostDetail(
postId: Long,
notificationId: Long,
): Response<PostDetailResponse> {
return postService.getPost(postId, notificationId)
}

override suspend fun deletePost(postId: Long): Response<Unit> {
Expand Down Expand Up @@ -69,6 +73,22 @@ class PostRemoteDataSource : PostDataSource {
return postService.getHotPosts()
}

override suspend fun getComments(postId: Long): Response<CommentsResponse> {
return postService.getComments(postId)
}

override suspend fun postComment(id: Long, image: File?, comment: String): Response<Unit> {
val requestFile = image?.asRequestBody("image/*".toMediaTypeOrNull())
val multipartFile =
requestFile?.let { MultipartBody.Part.createFormData("image", image.name, it) }
val requestBody = comment.createRequestBody()
return postService.postComment(id, if (image == null) null else multipartFile, requestBody)
}

override suspend fun deleteComment(postId: Long, commentId: Long): Response<Unit> {
return postService.deleteComment(postId, commentId)
}

private fun List<String>.generateMultiPartFromUrl() =
this.map {
val requestBody = it.createRequestBody()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.app.edonymyeon.data.datasource.preference

import com.app.edonymyeon.data.dto.request.NotificationPreferenceRequest
import com.app.edonymyeon.data.dto.response.NotificationPreferenceResponse
import retrofit2.Response

interface PreferenceDataSource {
suspend fun getNotificationPreference(): Response<NotificationPreferenceResponse>
suspend fun saveNotificationPreference(notificationPreferenceRequest: NotificationPreferenceRequest):
Response<NotificationPreferenceResponse>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.app.edonymyeon.data.datasource.preference

import com.app.edonymyeon.data.dto.request.NotificationPreferenceRequest
import com.app.edonymyeon.data.dto.response.NotificationPreferenceResponse
import com.app.edonymyeon.data.service.PreferenceService
import com.app.edonymyeon.data.service.client.RetrofitClient
import retrofit2.Response

class PreferenceRemoteDataSource : PreferenceDataSource {
private val preferenceService =
RetrofitClient.getInstance().create(PreferenceService::class.java)

override suspend fun getNotificationPreference(): Response<NotificationPreferenceResponse> {
return preferenceService.getNotificationPreference()
}

override suspend fun saveNotificationPreference(notificationPreferenceRequest: NotificationPreferenceRequest): Response<NotificationPreferenceResponse> {
return preferenceService.saveNotificationPreference(notificationPreferenceRequest)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import com.app.edonymyeon.data.dto.response.ProfileResponse
import retrofit2.Response

interface ProfileDataSource {
suspend fun getMyPosts(page: Int): Response<MyPostsResponse>
suspend fun getMyPosts(page: Int, notificationId: Long): Response<MyPostsResponse>
suspend fun postPurchaseConfirm(
id: Long,
purchaseConfirmRequest: PurchaseConfirmRequest,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ class ProfileRemoteDataSource : ProfileDataSource {
private val profileService: ProfileService =
RetrofitClient.getInstance().create(ProfileService::class.java)

override suspend fun getMyPosts(page: Int): Response<MyPostsResponse> {
return profileService.getMyPost(20, page)
override suspend fun getMyPosts(page: Int, notificationId: Long): Response<MyPostsResponse> {
return profileService.getMyPost(20, page, notificationId)
}

override suspend fun postPurchaseConfirm(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.app.edonymyeon.data.dto

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class CommentDataModel(
@SerialName("id") val id: Long,
@SerialName("image") val image: String?,
@SerialName("comment") val comment: String,
@SerialName("isWriter") val isWriter: Boolean,
@SerialName("createdAt") val createdAt: String,
@SerialName("writer") val writerNickNameDataModel: WriterNickNameDataModel,
)
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ data class NotificationDataModel(
@SerialName("navigateTo")
val navigateTo: String,
@SerialName("postId")
val postId: Long,
val postId: Long?,
@SerialName("read")
val read: Boolean,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.app.edonymyeon.data.dto

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class NotificationPreferenceDataModel(
@SerialName("preferenceType")
val preferenceType: String,
@SerialName("enabled")
val enabled: Boolean,
)
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,4 @@ import kotlinx.serialization.Serializable
data class ReactionCountDataModel(
@SerialName("viewCount") val viewCount: Int,
@SerialName("commentCount") val commentCount: Int,
@SerialName("scrapCount") val scrapCount: Int,
)
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class WriterNickNameDataModel(@SerialName("nickName") val nickName: String)
data class WriterNickNameDataModel(@SerialName("nickname") val nickName: String)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.app.edonymyeon.data.dto.request

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class NotificationPreferenceRequest(
@SerialName("preferenceType")
val preferenceType: String,
)
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import kotlinx.serialization.Serializable

@Serializable
data class ReportRequest(
@SerialName("postId") val postId: Long,
@SerialName("reportId") val reportId: Int,
@SerialName("type") val type: String,
@SerialName("referenceId") val commentId: Long,
@SerialName("reportCategoryId") val reportId: Int,
@SerialName("content") val content: String?,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.app.edonymyeon.data.dto.response

import com.app.edonymyeon.data.dto.CommentDataModel
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class CommentsResponse(
@SerialName("commentCount")
val commentCount: Int,
@SerialName("comments")
val comments: List<CommentDataModel>,
)
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.app.edonymyeon.data.dto.response

import com.app.edonymyeon.data.dto.ConsumptionDataModel
import com.app.edonymyeon.data.dto.ReactionCountDataModel
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

Expand All @@ -12,4 +13,5 @@ data class MyPostResponse(
@SerialName("content") val content: String,
@SerialName("createdAt") val createdAt: String,
@SerialName("consumption") val consumption: ConsumptionDataModel,
@SerialName("reactionCount") val reactionCount: ReactionCountDataModel,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.app.edonymyeon.data.dto.response

import com.app.edonymyeon.data.dto.NotificationPreferenceDataModel
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class NotificationPreferenceResponse(
@SerialName("notifications")
val notifications: List<NotificationPreferenceDataModel>,
)
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,5 @@ data class PostDetailResponse(
@SerialName("downCount") val downCount: Int,
@SerialName("isUp") val isUp: Boolean,
@SerialName("isDown") val isDown: Boolean,
@SerialName("isScrap") val isScrap: Boolean,
@SerialName("isWriter") val isWriter: Boolean,
)
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.app.edonymyeon.data.repository

import com.app.edonymyeon.data.common.CustomThrowable
import com.app.edonymyeon.data.common.createCustomThrowableFromResponse
import com.app.edonymyeon.data.datasource.auth.AuthDataSource
import com.app.edonymyeon.data.dto.LoginDataModel
import com.app.edonymyeon.data.dto.request.LogoutRequest
Expand Down Expand Up @@ -43,21 +44,19 @@ class AuthRepositoryImpl(
val result = authRemoteDataSource.login(LoginDataModel(email, password, deviceToken))

return if (result.isSuccessful) {
authLocalDataSource.setAuthToken(result.headers()["Authorization"] as String)
authLocalDataSource.setAuthToken(result.headers()["Set-Cookie"] as String)
Result.success(result.body() ?: Unit)
} else {
val errorResponse = result.errorBody()?.string()
val json = errorResponse?.let { JSONObject(it) }
val errorMessage = json?.getString("errorMessage") ?: ""
Result.failure(CustomThrowable(result.code(), errorMessage))
val customThrowable = createCustomThrowableFromResponse(result)
Result.failure(customThrowable)
}
}

override suspend fun loginByKakao(accessToken: String, deviceToken: String): Result<Unit> {
val result = authRemoteDataSource.loginByKakao(TokenRequest(accessToken, deviceToken))

return if (result.isSuccessful) {
authLocalDataSource.setAuthToken(result.headers()["Authorization"] as String)
authLocalDataSource.setAuthToken(result.headers()["Set-Cookie"] as String)
Result.success(result.body() ?: Unit)
} else {
val errorResponse = result.errorBody()?.string()
Expand Down
Loading

0 comments on commit a8b7ad4

Please sign in to comment.