Skip to content

Commit

Permalink
Squashed commit of the following:
Browse files Browse the repository at this point in the history
commit 20a56ef
Merge: 4e1a308 68b64f8
Author: JoJaeHyeon <[email protected]>
Date:   Wed Jan 10 11:52:07 2024 +0900

    Merge pull request #222 from bucket-back/OMCT-408-alarm-sse

    [OMCT-408] emitter 생명주기를 짧게 수정함, securityConfiguration에 subscribe 예외 처리

commit 4e1a308
Merge: aa26c7a 43e60eb
Author: Yiseul Park <[email protected]>
Date:   Mon Jan 8 20:33:35 2024 +0900

    Merge pull request #220 from bucket-back/OMCT-345-test-vote-reader

    [OMCT-345] �VoteReader 단위테스트 추가

commit aa26c7a
Merge: 6b98be2 c7f56ec
Author: JoJaeHyeon <[email protected]>
Date:   Mon Jan 8 16:51:59 2024 +0900

    Merge pull request #218 from bucket-back/OMCT-410--domain-layer-test

    [OMCT-410] jwt,content 단위 테스트, feedReader 상세 조회 테스트

commit c7f56ec
Author: JoJaeHyeon <[email protected]>
Date:   Mon Jan 8 16:49:43 2024 +0900

    test : 기존 memberBuilder 삭제

commit ff18c37
Author: JoJaeHyeon <[email protected]>
Date:   Mon Jan 8 16:49:19 2024 +0900

    test : 피드 상세 조회 로직 memberBuilder 삭제, private메소드 => public메소드 테스트로 수정함

commit 4e67f97
Author: JoJaeHyeon <[email protected]>
Date:   Mon Jan 8 16:49:05 2024 +0900

    test : 피드 상세 조회 로직 memberBuilder 삭제

commit 6b98be2
Merge: 34a1665 675ae43
Author: Yiseul Park <[email protected]>
Date:   Mon Jan 8 16:25:13 2024 +0900

    Merge pull request #221 from bucket-back/OMCT-265-test-member-implemenatation

    [OMCT-265] Meber Implementation 단위테스트 추가

commit 34a1665
Merge: cd96d75 b9b3cfd
Author: ByeongGon Kang <[email protected]>
Date:   Mon Jan 8 15:35:59 2024 +0900

    Merge pull request #175 from bucket-back/OMCT-347-item-addItem-test

    [OMCT-347] 아이템 추가 통합 테스트

commit b9b3cfd
Merge: f2ddfa0 cd96d75
Author: ByeongGon Kang <[email protected]>
Date:   Mon Jan 8 15:35:52 2024 +0900

    Merge branch 'main' into OMCT-347-item-addItem-test

commit cd96d75
Merge: a908fa4 db32aca
Author: JoJaeHyeon <[email protected]>
Date:   Mon Jan 8 15:28:51 2024 +0900

    Merge pull request #219 from bucket-back/OMCT-408-alarm-sse

    [OMCT-408] 알림 전송 로직 수정

commit 674da17
Author: JoJaeHyeon <[email protected]>
Date:   Sun Jan 7 18:45:53 2024 +0900

    refactoring : toString ->  string valueOf 변경

commit 512a75e
Author: JoJaeHyeon <[email protected]>
Date:   Sun Jan 7 18:43:27 2024 +0900

    test : refresh Token 적용으로 인한 단위테스트 수정

commit 7ab802f
Merge: 701973a a908fa4
Author: JoJaeHyeon <[email protected]>
Date:   Sun Jan 7 18:27:56 2024 +0900

    Merge branch 'main' into OMCT-410--domain-layer-test

commit 675ae43
Author: Yiseul Park <[email protected]>
Date:   Sat Jan 6 17:06:47 2024 +0900

    test: 닉네임으로 회원 조회 테스트

commit 3eea6de
Author: Yiseul Park <[email protected]>
Date:   Sat Jan 6 17:04:45 2024 +0900

    test: 이메일로 회원 조회 테스트

commit d745986
Author: Yiseul Park <[email protected]>
Date:   Sat Jan 6 17:04:06 2024 +0900

    test: memberId로 회원 조회 테스트 추가

commit 95626a9
Author: Yiseul Park <[email protected]>
Date:   Sat Jan 6 16:53:28 2024 +0900

    test: MemberModifier 단위테스트 추가

commit 4286f1d
Author: Yiseul Park <[email protected]>
Date:   Sat Jan 6 16:15:21 2024 +0900

    test: MemberRemover 단위테스트 추가

commit e6bbf20
Author: Yiseul Park <[email protected]>
Date:   Sat Jan 6 16:12:12 2024 +0900

    style: 파일 끝 개행 추가

commit 2a218ac
Author: Yiseul Park <[email protected]>
Date:   Sat Jan 6 16:09:53 2024 +0900

    test: 이메일 중복 확인 테스트 추가

commit 8794ff7
Author: Yiseul Park <[email protected]>
Date:   Sat Jan 6 16:08:26 2024 +0900

    test: 닉네임 중복 확인 테스트 추가

commit ba949ac
Author: Yiseul Park <[email protected]>
Date:   Sat Jan 6 15:51:15 2024 +0900

    test: MemberAppender 단위테스트 추가

commit 43e60eb
Author: Yiseul Park <[email protected]>
Date:   Fri Jan 5 22:58:28 2024 +0900

    test: 검색 조건에 맞는 투표 목록 조회 테스트 추가

commit ca8c462
Author: Yiseul Park <[email protected]>
Date:   Fri Jan 5 16:01:11 2024 +0900

    test: 투표 키워드 조회 테스트 추가

commit a908fa4
Merge: 905d439 3266bee
Author: Yiseul Park <[email protected]>
Date:   Fri Jan 5 14:16:10 2024 +0900

    Merge pull request #217 from bucket-back/OMCT-411-refresh-token

    [OMCT-411] 로그인 연장 기능 추가 - Refresh token으로 Access token 재발급

commit 3266bee
Author: Yiseul Park <[email protected]>
Date:   Thu Jan 4 12:25:17 2024 +0900

    refactor: extractClaim 제거하고 extractAllClaim 직접 사용

commit 49e8fae
Author: Yiseul Park <[email protected]>
Date:   Wed Jan 3 15:42:36 2024 +0900

    style: 매개변수 2개 이상 개행

commit 561850b
Author: Yiseul Park <[email protected]>
Date:   Wed Jan 3 15:39:17 2024 +0900

    refactor: 매직넘버 제거

commit cb10734
Author: Yiseul Park <[email protected]>
Date:   Wed Jan 3 15:25:32 2024 +0900

    refactor: 캐시 설정 변경

commit 963cce7
Author: Yiseul Park <[email protected]>
Date:   Tue Jan 2 17:54:11 2024 +0900

    refactor: JWT 토큰 관련 리팩토링

    1. extractAccessTokenUsername -> extractUsername 메서드명 변경
    2. generateAccessToken 메서드에 불필요한 매개변수 제거
    3. isAccessTokenValid, isRefreshTokenValid 커스텀 에러코드를 위한 예외처리
    4. Refresh Token의 밸류값 null 체크문 제거

commit 359cba6
Author: Yiseul Park <[email protected]>
Date:   Tue Jan 2 17:50:09 2024 +0900

    feat: Access Token, Refresh Token 예외 처리 추가

commit 905d439
Merge: badd8a1 517d046
Author: ByeongGon Kang <[email protected]>
Date:   Tue Jan 2 14:06:02 2024 +0900

    Merge pull request #203 from bucket-back/OMCT-271-feed-ranking-redis

    [OMCT-271] 피드 랭킹 기능 추가

commit 701973a
Author: JoJaeHyeon <[email protected]>
Date:   Sun Dec 31 23:19:16 2023 +0900

    test : 인터페이스에 의존하도록 롤백

commit d406cf7
Author: JoJaeHyeon <[email protected]>
Date:   Sun Dec 31 23:15:48 2023 +0900

    test : memberBuilder 생성 로직 추가

commit ae22a55
Author: JoJaeHyeon <[email protected]>
Date:   Sun Dec 31 23:15:34 2023 +0900

    test : 피드 상세 조회 테스트

commit 53584ba
Author: JoJaeHyeon <[email protected]>
Date:   Sun Dec 31 01:18:11 2023 +0900

    chore : 테스트 이름 설명 추가

commit 165fb9f
Author: JoJaeHyeon <[email protected]>
Date:   Sun Dec 31 01:14:54 2023 +0900

    test : 댓글 내용 도메인 테스트

commit 6a0a24b
Author: JoJaeHyeon <[email protected]>
Date:   Sun Dec 31 01:14:41 2023 +0900

    refactor : content 댓글 최소 수 검증 로직 추가

commit 52d6b02
Author: Yiseul Park <[email protected]>
Date:   Sat Dec 30 00:01:12 2023 +0900

    feat: Refresh token으로 Access Token 재발급 기능 추가

commit a22c434
Author: Yiseul Park <[email protected]>
Date:   Fri Dec 29 20:02:35 2023 +0900

    feat: 로그아웃, 회원탈퇴 시 저장해둔 리프레쉬 토큰 삭제

commit 9efe9aa
Author: Yiseul Park <[email protected]>
Date:   Fri Dec 29 17:21:05 2023 +0900

    !BREAKING CHANGE: 리프레쉬 토큰 바디 대신 쿠키로 전달

commit 5ed18db
Author: Yiseul Park <[email protected]>
Date:   Fri Dec 29 16:19:13 2023 +0900

    feat: 로그인 시 리프레쉬 토큰 저장

commit eb24b1d
Author: Yiseul Park <[email protected]>
Date:   Fri Dec 29 16:13:25 2023 +0900

    feat: cache 관련 설정 추가

commit 44d3a8e
Author: Yiseul Park <[email protected]>
Date:   Fri Dec 29 16:11:28 2023 +0900

    chore: Spring cache, caffeine 의존성 추가

commit badd8a1
Merge: 86a6bfe 4e48721
Author: Yiseul Park <[email protected]>
Date:   Fri Dec 29 14:04:53 2023 +0900

    Merge pull request #214 from bucket-back/OMCT-409-limit-vote-participation

    [OMCT-409] 최대 투표자 수를 제한하는 요구사항 추가

commit 86a6bfe
Merge: 7ea011a d4b2b87
Author: JoJaeHyeon <[email protected]>
Date:   Fri Dec 29 01:10:42 2023 +0900

    Merge pull request #215 from bucket-back/OMCT-408-alarm-sse

    [OMCT-408] 댓글 생성에 대한 알림 기능 구현

commit 5fce082
Author: JoJaeHyeon <[email protected]>
Date:   Thu Dec 28 23:54:05 2023 +0900

    refactor : jwt 토큰 검사 로직 수정

commit 35c0fe5
Author: JoJaeHyeon <[email protected]>
Date:   Thu Dec 28 23:53:54 2023 +0900

    test : jwt 토큰 검사 테스트 구현

commit 0dcbe57
Merge: 3874afd 903c93f
Author: JoJaeHyeon <[email protected]>
Date:   Thu Dec 28 00:14:33 2023 +0900

    Merge branch 'main' into OMCT-410--domain-layer-test

commit 7ea011a
Merge: 903c93f 3874afd
Author: JoJaeHyeon <[email protected]>
Date:   Thu Dec 28 00:13:30 2023 +0900

    Merge pull request #213 from bucket-back/OMCT-410--domain-layer-test

    [OMCT-410]  domain validation test 및 refactoring

commit 3084c34
Author: Yiseul Park <[email protected]>
Date:   Wed Dec 27 16:40:33 2023 +0900

    feat: 로그인할 때 리프레쉬 토큰도 함께 반환

commit d7c59f7
Author: Yiseul Park <[email protected]>
Date:   Wed Dec 27 14:31:48 2023 +0900

    refactor: generateToken -> generateAccessToken 메서드명 변경, 매개변수로 memberId 받도록 변경

commit 3874afd
Author: JoJaeHyeon <[email protected]>
Date:   Wed Dec 27 01:20:33 2023 +0900

    chore : 테스트 메세지 변경

commit 4e48721
Author: Yiseul Park <[email protected]>
Date:   Tue Dec 26 15:46:09 2023 +0900

    fix: 최대 투표자수 확인 시 null 체크

commit 94251bd
Author: Yiseul Park <[email protected]>
Date:   Tue Dec 26 14:53:00 2023 +0900

    feat: 투표자 수 제한하는 요구사항 추가

commit 4745a6a
Author: Yiseul Park <[email protected]>
Date:   Tue Dec 26 14:41:10 2023 +0900

    refactor: 로그인된 사용자를 얻을 때 삭제된 회원인지 검증하는 로직 삭제

commit 08f4321
Author: Yiseul Park <[email protected]>
Date:   Tue Dec 26 08:12:42 2023 +0900

    refactor: JWT 토큰 인증할 때 DB에 접근 안하도록 변경

commit 903c93f
Merge: e6a7553 7397954
Author: ByeongGon Kang <[email protected]>
Date:   Thu Dec 21 23:01:07 2023 +0900

    Merge pull request #202 from bucket-back/OMCT-380-feed-modifier-test

    [OMCT-380] 피드 수정 테스트 기능 추가

commit e6a7553
Merge: 1836424 e36fce0
Author: JoJaeHyeon <[email protected]>
Date:   Thu Dec 21 20:33:43 2023 +0900

    Merge pull request #212 from bucket-back/OMCT-352-test-inventory-reader

    [OMCT-352] inventoryReader 테스트 기능 구현

commit 8091ada
Author: JoJaeHyeon <[email protected]>
Date:   Wed Dec 20 01:19:01 2023 +0900

    refactor : bucketInfo 검증 로직 수정

commit 208c497
Author: JoJaeHyeon <[email protected]>
Date:   Wed Dec 20 01:18:43 2023 +0900

    test : bucketInfo 검증 테스트 구현

commit 1992f0a
Author: JoJaeHyeon <[email protected]>
Date:   Wed Dec 20 00:50:43 2023 +0900

    test : feedContent 검증 테스트 구현

commit e36fce0
Author: JoJaeHyeon <[email protected]>
Date:   Tue Dec 19 01:23:48 2023 +0900

    test : reviewBuilder test-fixture 구현

commit 2089843
Merge: 647dc48 1836424
Author: JoJaeHyeon <[email protected]>
Date:   Tue Dec 19 01:19:02 2023 +0900

    Merge branch 'main' into OMCT-352-test-inventory-reader

commit 647dc48
Author: JoJaeHyeon <[email protected]>
Date:   Tue Dec 19 01:14:36 2023 +0900

    test : 마이페이지 테스트 검증 내용 보완, 및 로직 정리

commit c57ca75
Author: JoJaeHyeon <[email protected]>
Date:   Tue Dec 19 01:09:50 2023 +0900

    test : inventoryReader 아이템 목록 조회, 마이페이지 조회 테스트 구현

commit 096051d
Author: JoJaeHyeon <[email protected]>
Date:   Tue Dec 19 01:09:07 2023 +0900

    test : 사용하지 않는 의존성 삭제

commit 8e2a8fe
Author: JoJaeHyeon <[email protected]>
Date:   Mon Dec 18 23:06:13 2023 +0900

    test : inventory 아이템 상세조회

commit 11d321f
Author: JoJaeHyeon <[email protected]>
Date:   Mon Dec 18 23:05:58 2023 +0900

    test : inventory test-fixture 메소드 수정

commit 13e17e4
Merge: 37a31d2 1836424
Author: Yiseul Park <[email protected]>
Date:   Tue Dec 12 07:21:23 2023 +0900

    Merge remote-tracking branch 'origin/main' into OMCT-345-test-vote-reader

commit 517d046
Author: Curry4182 <[email protected]>
Date:   Thu Nov 30 08:41:56 2023 +0900

    feat: hash 기능을 이용하여 big o 1에 탐색할 수 있도록 기능 변경

commit 88a3ce1
Author: Curry4182 <[email protected]>
Date:   Thu Nov 30 08:41:14 2023 +0900

    feat: redis template에서 hash에 대해서도 serializer 할 수 있도록 기능 추가

commit 725748d
Author: Curry4182 <[email protected]>
Date:   Thu Nov 30 07:52:07 2023 +0900

    refactor: 하나의 메서드로 사용할 수 있는 기능은 합치는 리팩토링

commit 275105e
Author: Curry4182 <[email protected]>
Date:   Thu Nov 30 07:42:29 2023 +0900

    refactor: 이미 존재하는 피드 id 인지 확인하고 없으면 생성할 수 있도록 기능 수정

commit 22e9ce9
Author: Curry4182 <[email protected]>
Date:   Thu Nov 30 07:40:54 2023 +0900

    feat: 이미 존재하는 feedId 인지 확인하는 기능 추가

commit eb17b6e
Author: Curry4182 <[email protected]>
Date:   Thu Nov 30 07:25:30 2023 +0900

    feat: 피드 싫어요 할 경우 랭킹이 낮아 지도록 기능 추가

commit 89c6fa3
Author: Curry4182 <[email protected]>
Date:   Thu Nov 30 07:22:05 2023 +0900

    feat: 피드 좋아요 할 경우 랭킹이 오르는 기능 추가

commit a21e46b
Author: Curry4182 <[email protected]>
Date:   Thu Nov 30 06:48:49 2023 +0900

    feat: 피드 상세 조회 할 경우 랭킹이 오르는 기능 추가

commit ce75d6b
Author: Curry4182 <[email protected]>
Date:   Thu Nov 30 06:48:13 2023 +0900

    feat: 피드 랭킹 정보 조회 기능 추가

commit 1c208e6
Author: Curry4182 <[email protected]>
Date:   Thu Nov 30 06:44:42 2023 +0900

    feat: 피드 랭킹 정보를 레디스에 저장 하는 기능 추가

commit f2ddfa0
Author: Curry4182 <[email protected]>
Date:   Thu Nov 30 04:50:40 2023 +0900

    refactor: 테스트 관련 기능을 gradle에 잘 보이도록 수정

commit 1df200e
Author: Curry4182 <[email protected]>
Date:   Thu Nov 30 04:50:04 2023 +0900

    fix: 중요 제약 설정 테이블 삭제 후 다시 복구 되도록 수정

commit f600b8a
Author: Curry4182 <[email protected]>
Date:   Thu Nov 30 04:47:20 2023 +0900

    feat: 테스트 하기전 테이블 삭제 하기 위한 sql 추가

commit 7397954
Author: Curry4182 <[email protected]>
Date:   Thu Nov 30 04:23:46 2023 +0900

    test: 피드 수정 테스트 기능 추가

commit 37a31d2
Author: Yiseul Park <[email protected]>
Date:   Wed Nov 29 14:59:56 2023 +0900

    test: 투표 상세 조회 테스트 추가

commit 0943dc0
Merge: 09e455f d7fceac
Author: JoJaeHyeon <[email protected]>
Date:   Tue Nov 28 11:57:41 2023 +0900

    Merge branch 'main' into OMCT-352-test-inventory-reader

commit 9cf9872
Author: Yiseul Park <[email protected]>
Date:   Mon Nov 27 00:04:35 2023 +0900

    refactor: 투표 상세조회 메서드명 변경

commit 886b86f
Author: Yiseul Park <[email protected]>
Date:   Mon Nov 27 00:02:58 2023 +0900

    test: 투표 엔티티 조회 테스트 추가

commit 70f5a7e
Author: Yiseul Park <[email protected]>
Date:   Sun Nov 26 23:52:35 2023 +0900

    fixture: final 추가, buildMany range 변경

commit e9b1fdd
Author: Curry4182 <[email protected]>
Date:   Sun Nov 26 05:17:03 2023 +0900

     test: 테스트할 필요가 없는 클래스에 Disabled 어노테이션 추가

commit 6e6c37b
Author: Curry4182 <[email protected]>
Date:   Sun Nov 26 04:52:51 2023 +0900

     test: 나의 아이템 추가 통합 테스트

commit 29dd259
Author: Curry4182 <[email protected]>
Date:   Sun Nov 26 04:51:28 2023 +0900

     test: 통합 테스트에 사용되는 IntegrationTest 클래스 추가

commit e9463cf
Author: Curry4182 <[email protected]>
Date:   Sun Nov 26 04:50:42 2023 +0900

     fixture: Item을 데이터베이스에 저장하는 ItemSetup 추가

commit 31cc1d0
Author: Curry4182 <[email protected]>
Date:   Sun Nov 26 04:49:48 2023 +0900

    chore: 도메인에 setup 클래스에서 jpa repository를 사용하기 위한 의존성 추가
  • Loading branch information
HandmadeCloud committed Jan 30, 2024
1 parent 68b64f8 commit a046851
Show file tree
Hide file tree
Showing 83 changed files with 3,130 additions and 141 deletions.
11 changes: 8 additions & 3 deletions bucketback-api/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,21 @@ dependencies {
implementation project(':bucketback-common')
implementation project(':bucketback-infrastructure')

testImplementation(testFixtures(project(':bucketback-domain')))
testImplementation 'org.springframework.boot:spring-boot-starter-test'

//swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'

// jwt
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'

// 테스트 관련
testImplementation(testFixtures(project(':bucketback-domain')))
testImplementation 'org.springframework.boot:spring-boot-starter-test'

// Cache
implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation "com.github.ben-manes.caffeine:caffeine:3.1.8"
}

jar {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@
import com.programmers.bucketback.domains.feed.api.request.FeedUpdateRequest;
import com.programmers.bucketback.domains.feed.api.response.FeedCreateResponse;
import com.programmers.bucketback.domains.feed.api.response.FeedGetByCursorResponse;
import com.programmers.bucketback.domains.feed.api.response.FeedGetRankingResponse;
import com.programmers.bucketback.domains.feed.api.response.FeedGetResponse;
import com.programmers.bucketback.domains.feed.application.FeedService;
import com.programmers.bucketback.domains.feed.application.dto.response.FeedGetRankingServiceResponse;
import com.programmers.bucketback.domains.feed.application.dto.response.FeedGetServiceResponse;
import com.programmers.bucketback.domains.feed.model.FeedCursorSummaryLike;
import com.programmers.bucketback.global.cursor.CursorRequest;
Expand Down Expand Up @@ -111,4 +113,13 @@ public ResponseEntity<FeedGetResponse> getFeed(@PathVariable final Long feedId)

return ResponseEntity.ok(response);
}

@Operation(summary = "피드 랭킹 조회", description = "피드의 랭킹을 조회한다.")
@GetMapping("/ranking")
public ResponseEntity<FeedGetRankingResponse> getFeedRanking() {
FeedGetRankingServiceResponse serviceResponse = feedService.getFeedRanking();
FeedGetRankingResponse response = FeedGetRankingResponse.from(serviceResponse);

return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.programmers.bucketback.domains.feed.api.response;

import java.util.List;

import com.programmers.bucketback.domains.feed.application.dto.response.FeedGetRankingServiceResponse;
import com.programmers.bucketback.redis.feed.model.FeedRankingInfo;

public record FeedGetRankingResponse(
List<FeedRankingInfo> feedRankingInfos
) {

public static FeedGetRankingResponse from(final FeedGetRankingServiceResponse serviceResponse) {
List<FeedRankingInfo> feedRankingInfos = serviceResponse.feedRankingInfos();

return new FeedGetRankingResponse(feedRankingInfos);
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package com.programmers.bucketback.domains.feed.application;

import java.util.List;

import org.springframework.stereotype.Service;

import com.programmers.bucketback.common.cursor.CursorPageParameters;
import com.programmers.bucketback.common.cursor.CursorSummary;
import com.programmers.bucketback.common.model.Hobby;
import com.programmers.bucketback.domains.feed.application.dto.response.FeedGetRankingServiceResponse;
import com.programmers.bucketback.domains.feed.application.dto.response.FeedGetServiceResponse;
import com.programmers.bucketback.domains.feed.implementation.FeedAppender;
import com.programmers.bucketback.domains.feed.implementation.FeedCursorReader;
Expand All @@ -14,11 +17,14 @@
import com.programmers.bucketback.domains.feed.model.FeedCreateServiceRequest;
import com.programmers.bucketback.domains.feed.model.FeedCursorSummaryLike;
import com.programmers.bucketback.domains.feed.model.FeedDetail;
import com.programmers.bucketback.domains.feed.model.FeedInfo;
import com.programmers.bucketback.domains.feed.model.FeedSortCondition;
import com.programmers.bucketback.domains.feed.model.FeedUpdateServiceRequest;
import com.programmers.bucketback.error.BusinessException;
import com.programmers.bucketback.error.ErrorCode;
import com.programmers.bucketback.global.util.MemberUtils;
import com.programmers.bucketback.redis.feed.FeedRedisManager;
import com.programmers.bucketback.redis.feed.model.FeedRankingInfo;

import lombok.RequiredArgsConstructor;

Expand All @@ -32,6 +38,7 @@ public class FeedService {
private final FeedRemover feedRemover;
private final FeedCursorReader feedCursorReader;
private final MemberUtils memberUtils;
private final FeedRedisManager feedRedisManager;

/** 피드 생성 */
public Long createFeed(final FeedCreateServiceRequest request) {
Expand Down Expand Up @@ -83,19 +90,58 @@ public void deleteFeed(final Long feedId) {
public void likeFeed(final Long feedId) {
Long memberId = memberUtils.getCurrentMemberId();
feedAppender.like(memberId, feedId);
changePopularity(feedId, 1);
}

/** 피드 좋아요 취소 */
public void unLikeFeed(final Long feedId) {
Long memberId = memberUtils.getCurrentMemberId();
feedRemover.unlike(memberId, feedId);
changePopularity(feedId, -1);
}

/** 피드 상세 조회 **/
public FeedGetServiceResponse getFeed(final Long feedId) {
final Long memberId = memberUtils.getCurrentMemberId();
final FeedDetail detail = feedReader.readDetail(feedId, memberId);
changePopularity(detail, 1);

return FeedGetServiceResponse.from(detail);
}

private void changePopularity(
final Long feedId,
final int value
) {
if (feedRedisManager.isFeedExist(feedId)) {
feedRedisManager.changePopularity(feedId, value);
return;
}

Long memberId = memberUtils.getCurrentMemberId();
changePopularity(feedReader.readDetail(feedId, memberId), value);
}

private void changePopularity(
final FeedDetail feedDetail,
final int value
) {
FeedInfo feedInfo = feedDetail.feedInfo();

FeedRankingInfo feedRankingInfo = FeedRankingInfo.builder()
.feedId(feedInfo.id())
.feedContent(feedInfo.content())
.hobbyName(feedInfo.hobby())
.bucketName(feedInfo.bucketName())
.likeCount(feedInfo.likeCount())
.build();

feedRedisManager.changePopularity(feedRankingInfo, value);
}

public FeedGetRankingServiceResponse getFeedRanking() {
List<FeedRankingInfo> feedRankingInfos = feedRedisManager.getFeedRanking();

return new FeedGetRankingServiceResponse(feedRankingInfos);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.programmers.bucketback.domains.feed.application.dto.response;

import java.util.List;

import com.programmers.bucketback.redis.feed.model.FeedRankingInfo;

public record FeedGetRankingServiceResponse(
List<FeedRankingInfo> feedRankingInfos
) {
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
package com.programmers.bucketback.domains.member.api;

import static org.springframework.http.HttpHeaders.*;

import java.io.IOException;

import org.springframework.http.ResponseCookie;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
Expand All @@ -21,6 +26,7 @@
import com.programmers.bucketback.domains.member.api.dto.request.MemberSignupRequest;
import com.programmers.bucketback.domains.member.api.dto.request.MemberUpdatePasswordRequest;
import com.programmers.bucketback.domains.member.api.dto.request.MemberUpdateProfileRequest;
import com.programmers.bucketback.domains.member.api.dto.response.AccessTokenResponse;
import com.programmers.bucketback.domains.member.api.dto.response.MemberCheckEmailResponse;
import com.programmers.bucketback.domains.member.api.dto.response.MemberCheckJwtResponse;
import com.programmers.bucketback.domains.member.api.dto.response.MemberCheckNicknameResponse;
Expand All @@ -33,6 +39,7 @@

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;

Expand All @@ -42,6 +49,8 @@
@RequestMapping("/api/members")
public class MemberController {

public static final int COOKIE_AGE_SECONDS = 1209600;

private final MemberService memberService;

@Operation(summary = "JWT 토큰 유효성 체크")
Expand All @@ -63,17 +72,49 @@ public ResponseEntity<Void> signup(@Valid @RequestBody final MemberSignupRequest

@Operation(summary = "로그인", description = "MemberLoginRequest 을 이용하여 로그인을 합니다.")
@PostMapping("/login")
public ResponseEntity<MemberLoginResponse> login(@Valid @RequestBody final MemberLoginRequest request) {
public ResponseEntity<MemberLoginResponse> login(
HttpServletResponse httpServletResponse,
@Valid @RequestBody final MemberLoginRequest request
) {
final MemberLoginServiceResponse serviceResponse = memberService.login(request.toLoginInfo());
final MemberLoginResponse response = MemberLoginResponse.from(serviceResponse);

final ResponseCookie cookie = ResponseCookie.from("refresh-token", serviceResponse.refreshToken())
.maxAge(COOKIE_AGE_SECONDS)
.secure(true)
.httpOnly(true)
.sameSite("None")
.path("/")
.build();
httpServletResponse.addHeader(SET_COOKIE, cookie.toString());

return ResponseEntity.ok(response);
}

@Operation(summary = "로그인 연장", description = "Refresh Token 을 이용하여 Access Token 을 재발급 받습니다.")
@PostMapping("/refresh")
public ResponseEntity<AccessTokenResponse> extendLogin(
@CookieValue("refresh-token") final String refreshToken,
@RequestHeader("Authorization") final String authorizationHeader
) {
final String accessToken = memberService.extendLogin(refreshToken, authorizationHeader);
final AccessTokenResponse response = new AccessTokenResponse(accessToken);

return ResponseEntity.ok(response);
}

@Operation(summary = "로그아웃")
@DeleteMapping("/logout")
public ResponseEntity<Void> logout(@CookieValue("refresh-token") final String refreshToken) {
memberService.logout(refreshToken);

return ResponseEntity.ok().build();
}

@Operation(summary = "회원 탈퇴")
@DeleteMapping("/delete")
public ResponseEntity<Void> deleteMember() {
memberService.deleteMember();
public ResponseEntity<Void> deleteMember(@CookieValue("refresh-token") final String refreshToken) {
memberService.deleteMember(refreshToken);

return ResponseEntity.ok().build();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.programmers.bucketback.domains.member.api.dto.response;

public record AccessTokenResponse(
String accessToken
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
public record MemberLoginResponse(
Long memberId,
String nickname,
String jwtToken
String accessToken
) {
public static MemberLoginResponse from(final MemberLoginServiceResponse serviceResponse) {
return new MemberLoginResponse(
serviceResponse.memberId(),
serviceResponse.nickname(),
serviceResponse.jwtToken()
serviceResponse.accessToken()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,25 @@ public MemberLoginServiceResponse login(
final String nickname = member.getNickname();

securityManager.authenticate(memberId, rawPassword);
final String jwtToken = securityManager.generateToken(member);
final String accessToken = securityManager.generateAccessToken(memberId);
final String refreshToken = securityManager.generateRefreshToken(memberId);

return new MemberLoginServiceResponse(memberId, nickname, jwtToken);
return new MemberLoginServiceResponse(memberId, nickname, accessToken, refreshToken);
}

public String encodePassword(final String password) {
Member.validatePassword(password);
return passwordEncoder.encode(password);
}

public void removeRefreshToken(final String refreshToken) {
securityManager.removeRefreshToken(refreshToken);
}

public String reissueAccessToken(
final String refreshToken,
final String authorizationHeader
) {
return securityManager.reissueAccessToken(refreshToken, authorizationHeader);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,10 +69,21 @@ public MemberLoginServiceResponse login(final LoginInfo loginInfo) {
return memberSecurityManager.login(rawPassword, member);
}

public void deleteMember() {
final Member member = memberUtils.getCurrentMember();
public String extendLogin(
final String refreshToken,
final String authorizationHeader
) {
return memberSecurityManager.reissueAccessToken(refreshToken, authorizationHeader);
}

public void logout(final String refreshToken) {
memberSecurityManager.removeRefreshToken(refreshToken);
}

public void deleteMember(final String refreshToken) {
final Member member = memberUtils.getCurrentMember();
memberRemover.remove(member);
memberSecurityManager.removeRefreshToken(refreshToken);
}

public void updateProfile(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
public record MemberLoginServiceResponse(
Long memberId,
String nickname,
String jwtToken
String accessToken,
String refreshToken
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,18 @@ public record VoteCreateRequest(

@Schema(description = "아이템2 ID", example = "2")
@NotNull(message = "아이템2 ID는 필수 값입니다.")
Long item2Id
Long item2Id,

@Schema(description = "최대 투표자 수", example = "100")
Integer maximumParticipants
) {
public VoteCreateServiceRequest toCreateVoteServiceRequest() {
return VoteCreateServiceRequest.builder()
.hobby(Hobby.fromHobbyValue(hobby))
.content(content)
.item1Id(item1Id)
.item2Id(item2Id)
.maximumParticipants(maximumParticipants)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public void deleteVote(final Long voteId) {

public VoteGetServiceResponse getVote(final Long voteId) {
final Long memberId = memberUtils.getCurrentMemberId();
final VoteDetail detail = voteReader.read(voteId, memberId);
final VoteDetail detail = voteReader.readDetail(voteId, memberId);

return VoteGetServiceResponse.from(detail);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,10 @@ public record VoteCreateServiceRequest(
Hobby hobby,
String content,
Long item1Id,
Long item2Id
Long item2Id,
Integer maximumParticipants
) {
public VoteCreateImplRequest toImplRequest() {
return new VoteCreateImplRequest(hobby, content, item1Id, item2Id);
return new VoteCreateImplRequest(hobby, content, item1Id, item2Id, maximumParticipants);
}
}
Loading

0 comments on commit a046851

Please sign in to comment.