Skip to content

Commit 0f574f9

Browse files
authored
[TB-19] 링크를 통해 접속한 비회원에 대해 영수증 조회 허용 (#24)
1 parent 020d928 commit 0f574f9

File tree

10 files changed

+95
-65
lines changed

10 files changed

+95
-65
lines changed

src/main/java/com/ClubAccount_BE/core/config/SecurityConfig.java

Lines changed: 48 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package com.ClubAccount_BE.core.config;
22

3-
import com.ClubAccount_BE.auth.security.*;
3+
import com.ClubAccount_BE.auth.security.JwtAccessDeniedHandler;
4+
import com.ClubAccount_BE.auth.security.JwtAuthenticationEntryPoint;
5+
import com.ClubAccount_BE.auth.security.JwtAuthenticationProvider;
6+
import com.ClubAccount_BE.auth.security.TokenAuthenticationFilter;
7+
import com.ClubAccount_BE.auth.security.TokenProvider;
48
import com.ClubAccount_BE.user.application.port.in.FindUserUseCase;
59
import lombok.RequiredArgsConstructor;
610
import org.springframework.context.annotation.Bean;
@@ -21,6 +25,7 @@
2125
@RequiredArgsConstructor
2226
@EnableWebSecurity
2327
public class SecurityConfig {
28+
2429
public static final String API_V1_PREFIX = "/api/v1";
2530

2631
private final TokenProvider tokenProvider;
@@ -30,43 +35,46 @@ public class SecurityConfig {
3035
@Bean
3136
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
3237
http
33-
.authorizeHttpRequests(auth -> auth
34-
.requestMatchers(
35-
API_V1_PREFIX + "/users/sign-up/**",
36-
API_V1_PREFIX + "/auth/sign-in",
37-
API_V1_PREFIX + "/auth/token",
38-
API_V1_PREFIX + "/users/{student-number}/validate",
39-
API_V1_PREFIX + "/users/password",
40-
API_V1_PREFIX + "/health",
41-
API_V1_PREFIX + "/users/sign-up/check-duplicate-auth-id",
42-
API_V1_PREFIX + "/email/send",
43-
API_V1_PREFIX + "/email/verify",
44-
API_V1_PREFIX + "/auth/reset-password",
45-
"/api-docs",
46-
"/swagger-custom-ui.html",
47-
"/v3/api-docs",
48-
"/v3/api-docs/**",
49-
"/swagger-ui/**",
50-
"/api-docs/**",
51-
"/swagger-ui.html"
52-
).permitAll()
53-
.anyRequest().authenticated()
54-
)
55-
.csrf(AbstractHttpConfigurer::disable)
56-
.headers(AbstractHttpConfigurer::disable)
57-
.formLogin(AbstractHttpConfigurer::disable)
58-
.httpBasic(AbstractHttpConfigurer::disable)
59-
.rememberMe(AbstractHttpConfigurer::disable)
60-
.logout(AbstractHttpConfigurer::disable)
61-
.exceptionHandling(ex -> ex
62-
.accessDeniedHandler(jwtAccessDeniedHandler)
63-
.authenticationEntryPoint(jwtAuthenticationEntryPoint)
64-
)
65-
.sessionManagement(sess -> sess
66-
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
67-
)
68-
.cors(Customizer.withDefaults())
69-
.addFilterBefore(tokenAuthenticationFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class);
38+
.authorizeHttpRequests(auth -> auth
39+
.requestMatchers(
40+
API_V1_PREFIX + "/users/sign-up/**",
41+
API_V1_PREFIX + "/auth/sign-in",
42+
API_V1_PREFIX + "/auth/token",
43+
API_V1_PREFIX + "/users/{student-number}/validate",
44+
API_V1_PREFIX + "/users/password",
45+
API_V1_PREFIX + "/health",
46+
API_V1_PREFIX + "/users/sign-up/check-duplicate-auth-id",
47+
API_V1_PREFIX + "/email/send",
48+
API_V1_PREFIX + "/email/verify",
49+
API_V1_PREFIX + "/auth/reset-password",
50+
API_V1_PREFIX + "{link}/receipts",
51+
API_V1_PREFIX + "{link}/receipts/{receiptId}",
52+
"/api-docs",
53+
"/swagger-custom-ui.html",
54+
"/v3/api-docs",
55+
"/v3/api-docs/**",
56+
"/swagger-ui/**",
57+
"/api-docs/**",
58+
"/swagger-ui.html"
59+
).permitAll()
60+
.anyRequest().authenticated()
61+
)
62+
.csrf(AbstractHttpConfigurer::disable)
63+
.headers(AbstractHttpConfigurer::disable)
64+
.formLogin(AbstractHttpConfigurer::disable)
65+
.httpBasic(AbstractHttpConfigurer::disable)
66+
.rememberMe(AbstractHttpConfigurer::disable)
67+
.logout(AbstractHttpConfigurer::disable)
68+
.exceptionHandling(ex -> ex
69+
.accessDeniedHandler(jwtAccessDeniedHandler)
70+
.authenticationEntryPoint(jwtAuthenticationEntryPoint)
71+
)
72+
.sessionManagement(sess -> sess
73+
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
74+
)
75+
.cors(Customizer.withDefaults())
76+
.addFilterBefore(tokenAuthenticationFilter(tokenProvider),
77+
UsernamePasswordAuthenticationFilter.class);
7078

7179
return http.build();
7280
}
@@ -78,7 +86,8 @@ public PasswordEncoder passwordEncoder() {
7886
}
7987

8088
@Bean
81-
public AuthenticationManager authenticationManager(JwtAuthenticationProvider jwtAuthenticationProvider) {
89+
public AuthenticationManager authenticationManager(
90+
JwtAuthenticationProvider jwtAuthenticationProvider) {
8291
return new ProviderManager(jwtAuthenticationProvider);
8392
}
8493

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package com.ClubAccount_BE.receipt.adapter.in.web;
22

3-
import com.ClubAccount_BE.core.meta.LoginUser;
43
import com.ClubAccount_BE.core.response.PagingResponse;
54
import com.ClubAccount_BE.receipt.adapter.in.web.api.FindReceiptApi;
65
import com.ClubAccount_BE.receipt.adapter.in.web.dto.response.ReceiptDetailResponse;
76
import com.ClubAccount_BE.receipt.adapter.in.web.dto.response.ReceiptResponse;
87
import com.ClubAccount_BE.receipt.application.port.in.FindReceiptUseCase;
9-
import com.ClubAccount_BE.user.domain.User;
8+
import java.util.UUID;
109
import lombok.RequiredArgsConstructor;
1110
import org.springframework.data.domain.Pageable;
1211
import org.springframework.data.domain.Sort;
@@ -18,24 +17,24 @@
1817

1918
@RestController
2019
@RequiredArgsConstructor
21-
@RequestMapping("/api/v1/receipts")
20+
@RequestMapping("/api/v1")
2221
public class FindReceiptController implements FindReceiptApi {
2322

2423
private final FindReceiptUseCase findReceiptUseCase;
2524

26-
@GetMapping
27-
public PagingResponse<ReceiptResponse> getReceipts(
28-
@LoginUser User user,
25+
@GetMapping("{link}/receipts")
26+
public PagingResponse<ReceiptResponse> getReceiptList(
27+
@PathVariable(value = "link") UUID link,
2928
@PageableDefault(page = 1, sort = "createdAt", direction = Sort.Direction.ASC) Pageable pageable
3029
) {
31-
return findReceiptUseCase.getReceipts(user, pageable);
30+
return findReceiptUseCase.getReceiptList(link, pageable);
3231
}
3332

34-
@GetMapping("/{receiptId}")
33+
@GetMapping("{link}/receipts/{receiptId}")
3534
public ReceiptDetailResponse getReceipt(
36-
@LoginUser User user,
35+
@PathVariable(value = "link") UUID link,
3736
@PathVariable("receiptId") Long receiptId
3837
) {
39-
return findReceiptUseCase.getReceipt(user, receiptId);
38+
return findReceiptUseCase.getReceipt(link, receiptId);
4039
}
4140
}
Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package com.ClubAccount_BE.receipt.adapter.in.web.api;
22

3-
import com.ClubAccount_BE.core.meta.LoginUser;
43
import com.ClubAccount_BE.core.response.PagingResponse;
54
import com.ClubAccount_BE.receipt.adapter.in.web.dto.response.ReceiptDetailResponse;
65
import com.ClubAccount_BE.receipt.adapter.in.web.dto.response.ReceiptResponse;
7-
import com.ClubAccount_BE.user.domain.User;
86
import io.swagger.v3.oas.annotations.Operation;
97
import io.swagger.v3.oas.annotations.tags.Tag;
8+
import java.util.UUID;
109
import org.springframework.data.domain.Pageable;
1110
import org.springframework.data.domain.Sort;
1211
import org.springframework.data.web.PageableDefault;
@@ -16,14 +15,14 @@
1615
public interface FindReceiptApi {
1716

1817
@Operation(summary = "영수증 목록 조회", description = "파싱된 영수증 정보를 조회한다.")
19-
PagingResponse<ReceiptResponse> getReceipts(
20-
@LoginUser User user,
18+
PagingResponse<ReceiptResponse> getReceiptList(
19+
@PathVariable(value = "link") UUID link,
2120
@PageableDefault(page = 1, sort = "createdAt", direction = Sort.Direction.ASC) Pageable pageable
2221
);
2322

2423
@Operation(summary = "영수증 상세 목록 조회", description = "파싱된 영수증 정보를 조회한다.")
2524
ReceiptDetailResponse getReceipt(
26-
@LoginUser User user,
25+
@PathVariable(value = "link") UUID link,
2726
@PathVariable("receiptId") Long receiptId
2827
);
2928
}

src/main/java/com/ClubAccount_BE/receipt/adapter/out/ReceiptRepositoryAdapter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public Long createReceipt(Receipt receipt, List<ReceiptItem> receiptItems) {
3232
}
3333

3434
@Override
35-
public Page<Receipt> getReceipts(User user, Pageable pageable) {
35+
public Page<Receipt> getReceiptList(User user, Pageable pageable) {
3636
return receiptRepository
3737
.findAllByUserId(user.getId(), pageable)
3838
.map(ReceiptMapper::toDomain);

src/main/java/com/ClubAccount_BE/receipt/application/port/in/FindReceiptUseCase.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
import com.ClubAccount_BE.core.response.PagingResponse;
44
import com.ClubAccount_BE.receipt.adapter.in.web.dto.response.ReceiptDetailResponse;
55
import com.ClubAccount_BE.receipt.adapter.in.web.dto.response.ReceiptResponse;
6-
import com.ClubAccount_BE.user.domain.User;
6+
import java.util.UUID;
77
import org.springframework.data.domain.Pageable;
88

99
public interface FindReceiptUseCase {
1010

11-
PagingResponse<ReceiptResponse> getReceipts(User user, Pageable pageable);
11+
PagingResponse<ReceiptResponse> getReceiptList(UUID link, Pageable pageable);
1212

13-
ReceiptDetailResponse getReceipt(User user, Long receiptId);
13+
ReceiptDetailResponse getReceipt(UUID link, Long receiptId);
1414
}

src/main/java/com/ClubAccount_BE/receipt/application/port/out/FindReceiptPort.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
public interface FindReceiptPort {
99

10-
Page<Receipt> getReceipts(User user, Pageable pageable);
10+
Page<Receipt> getReceiptList(User user, Pageable pageable);
1111

1212
Receipt getReceipt(User user, Long receiptId);
1313
}

src/main/java/com/ClubAccount_BE/receipt/application/service/FindReceiptService.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
import com.ClubAccount_BE.receipt.application.port.in.FindReceiptUseCase;
77
import com.ClubAccount_BE.receipt.application.port.out.FindReceiptPort;
88
import com.ClubAccount_BE.receipt.domain.Receipt;
9+
import com.ClubAccount_BE.user.application.port.out.FindUserPort;
910
import com.ClubAccount_BE.user.domain.User;
11+
import java.util.UUID;
1012
import lombok.RequiredArgsConstructor;
1113
import org.springframework.data.domain.Page;
1214
import org.springframework.data.domain.Pageable;
@@ -19,18 +21,23 @@
1921
public class FindReceiptService implements FindReceiptUseCase {
2022

2123
private final FindReceiptPort findReceiptPort;
24+
private final FindUserPort findUserPort;
2225

2326
@Override
24-
public PagingResponse<ReceiptResponse> getReceipts(User user, Pageable pageable) {
27+
public PagingResponse<ReceiptResponse> getReceiptList(UUID link, Pageable pageable) {
28+
29+
User user = findUserPort.getUserByLink(link);
2530
Page<ReceiptResponse> page = findReceiptPort
26-
.getReceipts(user, pageable)
31+
.getReceiptList(user, pageable)
2732
.map(ReceiptResponse::of);
2833

2934
return PagingResponse.of(page);
3035
}
3136

3237
@Override
33-
public ReceiptDetailResponse getReceipt(User user, Long receiptId) {
38+
public ReceiptDetailResponse getReceipt(UUID link, Long receiptId) {
39+
40+
User user = findUserPort.getUserByLink(link);
3441
Receipt receipt = findReceiptPort.getReceipt(user, receiptId);
3542
return ReceiptDetailResponse.of(receipt);
3643
}

src/main/java/com/ClubAccount_BE/user/adapter/out/persistence/UserPersistenceAdapter.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@
99
import com.ClubAccount_BE.user.application.service.update.UpdatePasswordPort;
1010
import com.ClubAccount_BE.user.domain.User;
1111
import com.ClubAccount_BE.user.mapper.UserMapper;
12+
import java.util.UUID;
1213
import lombok.RequiredArgsConstructor;
1314
import org.springframework.stereotype.Component;
1415

1516
@Component
1617
@RequiredArgsConstructor
17-
public class UserPersistenceAdapter implements FindUserPort, SaveUserPort, CheckUserPort, FindUserByEmailPort, UpdatePasswordPort {
18+
public class UserPersistenceAdapter implements FindUserPort, SaveUserPort, CheckUserPort,
19+
FindUserByEmailPort, UpdatePasswordPort {
1820

1921
private final UserRepository userRepository;
2022

@@ -39,6 +41,12 @@ public User getUserById(Long userId) {
3941
.orElseThrow(() -> new IllegalArgumentException("해당 아이디의 사용자를 찾을 수 없습니다."));
4042
}
4143

44+
@Override
45+
public User getUserByLink(UUID link) {
46+
return userRepository.findByRink(link)
47+
.map(UserMapper::toDomain)
48+
.orElseThrow(() -> new IllegalArgumentException("해당 링크의 사용자를 찾을 수 없습니다."));
49+
}
4250

4351
@Override
4452
public boolean checkDuplicateAuthId(String authId) {
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
package com.ClubAccount_BE.user.adapter.out.persistence.repository;
22

33
import com.ClubAccount_BE.user.adapter.out.persistence.entity.UserEntity;
4+
import java.util.Optional;
5+
import java.util.UUID;
46
import org.springframework.data.jpa.repository.JpaRepository;
57
import org.springframework.stereotype.Repository;
68

7-
import java.util.Optional;
8-
99
@Repository
1010
public interface UserRepository extends JpaRepository<UserEntity, Long> {
1111

1212
Optional<UserEntity> getByAuthId(String authId);
13+
1314
Optional<UserEntity> findById(Long userId);
15+
1416
boolean existsByAuthId(String authId);
17+
1518
Optional<UserEntity> findByAuthId(String email);
1619

20+
Optional<UserEntity> findByRink(UUID rink);
1721
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package com.ClubAccount_BE.user.application.port.out;
22

33
import com.ClubAccount_BE.user.domain.User;
4+
import java.util.UUID;
45

56
public interface FindUserPort {
7+
68
User getUserByAuthId(String email);
79

810
User getUserById(Long userId);
11+
12+
User getUserByLink(UUID link);
913
}

0 commit comments

Comments
 (0)