Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
http.authorizeHttpRequests((auth) -> auth
.requestMatchers( "/login/**", "/oauth2/**", "/oauth2/authorization/**").permitAll()
.requestMatchers("/swagger-ui/**", "/v3/api-docs/**", "/swagger-resources/**", "/webjars/**").permitAll() // Swagger 관련 경로 허용
.requestMatchers("/api/v1/test/users/*").permitAll()
.anyRequest().authenticated());

//세션 설정 : STATELESS
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,32 @@
package com.groom.yummy.controller;

import com.groom.yummy.dto.ResponseDto;
import com.groom.yummy.external.StoreApiClient;
import com.groom.yummy.external.dto.ApiResponse;
import com.groom.yummy.external.dto.StoreListResponse;
import com.groom.yummy.external.dto.StoreRequestDto;
import com.groom.yummy.external.dto.StoreResponseDto;
import com.groom.yummy.store.Category;
import com.groom.yummy.store.StoreService;
import com.groom.yummy.store.dto.StoreApiResponseDto;
import com.groom.yummy.webclient.SomeApiService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Tag(name = "[Store] Store API")
@RestController
@RequestMapping("/api/v1/stores")
@RequiredArgsConstructor
public class StoreController {
private final SomeApiService someApiService;
private final StoreService storeService;
private final StoreApiClient storeApiClient;

@GetMapping("/sync")
public ResponseEntity<ResponseDto<Void>> syncStores(@RequestParam String regionCode) {
Expand All @@ -42,6 +48,24 @@ public ResponseEntity<ResponseDto<Void>> syncStores(@RequestParam String regionC
.body(new ResponseDto<>(null, "가게 데이터 동기화 중 오류 발생"));
}
}
@Operation(summary = "가게 정보 조회", description = "가게 id로 가게를 조회합니다.")
@GetMapping("/{storeId}")
public ResponseEntity<ResponseDto<StoreResponseDto>> getStore(@PathVariable("storeId") Long storeId) {
StoreResponseDto storeResponseDTO = storeApiClient.getStoreByApi(storeId);
return ResponseEntity.ok(ResponseDto.of(storeResponseDTO,"storeId로 가게 조회 성공"));
}

@Operation(summary = "가게 조회", description = "가게들을 정렬 기준에 맞게 조회합니다.")
@GetMapping
public ResponseEntity<ApiResponse<StoreListResponse>> getStoresByFilters(
@RequestParam(name = "category", required = false) Category category,
@RequestParam(name = "regionId", required = false) Long regionId,
@RequestParam(name = "name", required = false) String name,
@RequestParam(name = "page", defaultValue = "1") int page,
@RequestParam(name = "size", defaultValue = "10") int size) {
ApiResponse<StoreListResponse> storeListResponseApiResponse = storeApiClient.getStoresByFilters(category, regionId,name,page,size);
return ResponseEntity.ok(storeListResponseApiResponse);
}
}


Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.groom.yummy.external;

import com.groom.yummy.external.dto.ApiResponse;
import com.groom.yummy.external.dto.StoreListResponse;
import com.groom.yummy.external.dto.StoreResponseDto;
import com.groom.yummy.store.Category;
import lombok.RequiredArgsConstructor;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;

@Service
@RequiredArgsConstructor
public class StoreApiClient {
private final WebClient webClient;

public StoreResponseDto getStoreByApi(Long storeId){
StoreResponseDto storeResponse = webClient.get()
.uri(uriBuilder -> uriBuilder.path("/api/v1/store/{id}")
.build(storeId))
.retrieve()
.bodyToMono(StoreResponseDto.class)
.block();
return storeResponse;
}

public ApiResponse<StoreListResponse> getStoresByFilters(
Category category, Long regionId, String name, int page, int size) {
return webClient.get()
.uri(uriBuilder -> uriBuilder
.path("/api/v1/stores")
.queryParam("category", category)
.queryParam("regionId", regionId)
.queryParam("name", name)
.queryParam("page", page)
.queryParam("size", size)
.build())
.retrieve()
.bodyToMono(new ParameterizedTypeReference<ApiResponse<StoreListResponse>>() {})
.block();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.groom.yummy.external.dto;

public record ApiResponse<T>(
T data,
String message
) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.groom.yummy.external.dto;

public record PaginationInfo(
int page,
int size,
int totalPages,
long totalElements
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.groom.yummy.external.dto;

import java.util.List;


public record StoreListResponse(
List<StoreResponseDto> stores,
PaginationInfo pageable
) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.groom.yummy.external.dto;

import com.groom.yummy.store.Category;
import lombok.Builder;

@Builder
public record StoreRequestDto(
String name,
Category category,
Long regionId
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.groom.yummy.external.dto;

import com.groom.yummy.store.Category;
import lombok.Builder;

@Builder
public record StoreResponseDto(
Long storeId,
String name,
Category category,
Long regionId
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package com.groom.yummy.test;

import com.groom.yummy.dto.ResponseDto;
import com.groom.yummy.jwt.JwtProvider;
import com.groom.yummy.test.dto.SignInDto;
import com.groom.yummy.test.dto.TestUserCreateDto;
import com.groom.yummy.test.dto.TestUserResDto;
import com.groom.yummy.user.User;
import com.groom.yummy.user.UserRepository;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseCookie;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Optional;

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

@Tag(name = "[TestUser] TestUser API")
@RestController
@RequiredArgsConstructor
@Slf4j
@RequestMapping("/api/v1/test/users")
public class TestCreateController {

private final JwtProvider jwtProvider;
private final UserRepository userRepository;

@Operation(summary = "회원가입", description = "회원 가입 할 유저의 정보를 입력합니다. " +
"<br> 회원가입이 완료되면 자동으로 유저의 기본 profile 사진이 등록됩니다." +
"<br> 이후에 유저의 Token 을 통해 profile 사진을 수정할 수 있습니다.")
@PostMapping("/sign-up")
public ResponseEntity<ResponseDto<TestUserResDto>> signUp(@Valid @RequestBody TestUserCreateDto testUserCreateDto){
User user = User.builder()
.email(testUserCreateDto.email())
.nickname(testUserCreateDto.nickname())
.role("ROLE_USER")
.groupJoinCount(0L)
.groupAttendanceCount(0L)
.isDeleted(false)
.build();

user = userRepository.save(user);
TestUserResDto testUserResDto = TestUserResDto.from(user);
return ResponseEntity.status(HttpStatus.CREATED).body(
new ResponseDto<>(
testUserResDto,
"테스트 유저 생성 성공"));
}


@Operation(summary = "로그인", description = "회원 가입 한 유저의 loginId와 password를 입력합니다.")
@PostMapping("/sign-in")
public ResponseEntity<ResponseDto<?>> signIn(@Valid @RequestBody SignInDto signInReqDto){

Optional<User> optionalUser = userRepository.findByEmail(signInReqDto.email());
User user = optionalUser.get();
String accessToken = jwtProvider.createAccessToken(user.getId(), user.getEmail(),user.getNickname(),user.getRole());
ResponseCookie cookie = ResponseCookie.from("Authorization", accessToken)
.httpOnly(true)
.secure(true)
.path("/")
.maxAge(120)
.sameSite("Strict")
.build();

return ResponseEntity.status(HttpStatus.OK)
.header(SET_COOKIE, cookie.toString())
.body(new ResponseDto<>(1, "성공하였습니당."));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.groom.yummy.test.dto;

public record SignInDto(
String email
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.groom.yummy.test.dto;

public record TestUserCreateDto(
String nickname,
String email
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.groom.yummy.test.dto;

import com.groom.yummy.user.User;
import lombok.Builder;

@Builder
public record TestUserResDto(
Long id,
String email,
String nickname,
Long joinCount,
Long participationCount
) {
public static TestUserResDto from(User user){
return TestUserResDto.builder()
.id(user.getId())
.email(user.getEmail())
.nickname(user.getNickname())
.joinCount(user.getGroupJoinCount())
.participationCount(user.getGroupAttendanceCount())
.build();
}
}
2 changes: 1 addition & 1 deletion application/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ spring:

jpa:
hibernate:
ddl-auto: update
ddl-auto: create
show-sql: true
open-in-view: false
properties:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
@ActiveProfiles("test")
@Import({SecurityConfig.class})
@WebMvcTest(controllers = {UserController.class})
@ExtendWith(MockitoExtension.class) // Mockito 확장 사용
class UserControllerTest {

@Autowired
Expand Down
Loading