Skip to content

Commit 4717411

Browse files
committed
[FEAT] Swagger 적용, User Id 업데이트 미적용 부분 반영
1 parent 170fb89 commit 4717411

15 files changed

+121
-25
lines changed

src/main/java/com/spoony/spoony_server/adapter/auth/in/web/AuthController.java

+3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.spoony.spoony_server.application.auth.port.in.SignInUseCase;
88
import com.spoony.spoony_server.global.auth.constant.AuthConstant;
99
import com.spoony.spoony_server.global.dto.ResponseDTO;
10+
import io.swagger.v3.oas.annotations.Operation;
1011
import jakarta.validation.Valid;
1112
import jakarta.validation.constraints.NotBlank;
1213
import lombok.RequiredArgsConstructor;
@@ -25,6 +26,7 @@ public class AuthController {
2526
private final RefreshUseCase refreshUseCase;
2627

2728
@PostMapping("/signin")
29+
@Operation(summary = "회원가입 API", description = "소셜 로그인 회원가입 API, Token Set 발급")
2830
public ResponseEntity<ResponseDTO<UserTokenDTO>> signIn(
2931
@NotBlank @RequestHeader(AuthConstant.AUTHORIZATION_HEADER) final String platformToken,
3032
@Valid @RequestBody final UserLoginDTO userLoginDTO
@@ -33,6 +35,7 @@ public ResponseEntity<ResponseDTO<UserTokenDTO>> signIn(
3335
}
3436

3537
@PostMapping("/refresh")
38+
@Operation(summary = "토큰 재발급 API", description = "Refresh Token을 통한 토큰 재발급 API, Token Set 발급")
3639
public ResponseEntity<ResponseDTO<JwtTokenDTO>> refreshAccessToken(
3740
@NotBlank @RequestHeader(AuthConstant.AUTHORIZATION_HEADER) String refreshToken
3841
) {
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
package com.spoony.spoony_server.adapter.dto.place;
22

3-
public record PlaceCheckRequestDTO(long userId, Double latitude, Double longitude) {
3+
public record PlaceCheckRequestDTO(Double latitude, Double longitude) {
44
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
package com.spoony.spoony_server.adapter.dto.spoon;
22

3-
public record ScoopPostRequestDTO(long userId, long postId) {
3+
public record ScoopPostRequestDTO(long postId) {
44
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
package com.spoony.spoony_server.adapter.dto.zzim;
22

3-
public record ZzimPostAddRequestDTO(long userId, long postId) {
3+
public record ZzimPostAddRequestDTO(long postId) {
44
}

src/main/java/com/spoony/spoony_server/adapter/in/web/feed/FeedController.java

+7-4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.spoony.spoony_server.global.auth.annotation.UserId;
66
import com.spoony.spoony_server.global.dto.ResponseDTO;
77
import com.spoony.spoony_server.adapter.dto.post.FeedListResponseDTO;
8+
import io.swagger.v3.oas.annotations.Operation;
89
import lombok.RequiredArgsConstructor;
910
import org.springframework.http.HttpStatus;
1011
import org.springframework.http.ResponseEntity;
@@ -18,10 +19,12 @@ public class FeedController {
1819
private final FeedGetUseCase feedGetUseCase;
1920

2021
@GetMapping("/{categoryId}")
21-
public ResponseEntity<ResponseDTO<FeedListResponseDTO>> getFeedListByUserId(@UserId Long userId,
22-
@PathVariable long categoryId,
23-
@RequestParam(name = "query") String locationQuery,
24-
@RequestParam(name = "sortBy") String sortBy) {
22+
@Operation(summary = "피드 조회 API", description = "사용자의 피드를 카테고리 단위로 조회하는 API")
23+
public ResponseEntity<ResponseDTO<FeedListResponseDTO>> getFeedListByUserId(
24+
@UserId Long userId,
25+
@PathVariable long categoryId,
26+
@RequestParam(name = "query") String locationQuery,
27+
@RequestParam(name = "sortBy") String sortBy) {
2528
FeedGetCommand command = new FeedGetCommand(userId, categoryId, locationQuery, sortBy);
2629
FeedListResponseDTO feedListResponse = feedGetUseCase.getFeedListByUserId(command);
2730
return ResponseEntity.status(HttpStatus.OK).body(ResponseDTO.success(feedListResponse));

src/main/java/com/spoony/spoony_server/adapter/in/web/location/LocationController.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.spoony.spoony_server.application.port.in.location.LocationSearchUseCase;
55
import com.spoony.spoony_server.global.dto.ResponseDTO;
66
import com.spoony.spoony_server.adapter.dto.location.LocationResponseListDTO;
7+
import io.swagger.v3.oas.annotations.Operation;
78
import lombok.RequiredArgsConstructor;
89
import org.springframework.http.HttpStatus;
910
import org.springframework.http.ResponseEntity;
@@ -20,7 +21,9 @@ public class LocationController {
2021
private final LocationSearchUseCase locationSearchUseCase;
2122

2223
@GetMapping("/search")
23-
public ResponseEntity<ResponseDTO<LocationResponseListDTO>> searchLocations(@RequestParam String query) {
24+
@Operation(summary = "지역 검색 API", description = "검색어를 통해 지역(구, 동, 역)을 검색하는 API")
25+
public ResponseEntity<ResponseDTO<LocationResponseListDTO>> searchLocations(
26+
@RequestParam String query) {
2427
LocationSearchCommand command = new LocationSearchCommand(query);
2528
LocationResponseListDTO locationResponseListDTO = locationSearchUseCase.searchLocationsByQuery(command);
2629
return ResponseEntity.status(HttpStatus.OK).body(ResponseDTO.success(locationResponseListDTO));

src/main/java/com/spoony/spoony_server/adapter/in/web/place/PlaceController.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
import com.spoony.spoony_server.application.port.command.place.PlaceGetCommand;
55
import com.spoony.spoony_server.application.port.in.place.PlaceDuplicateCheckUseCase;
66
import com.spoony.spoony_server.application.port.in.place.PlaceSearchUseCase;
7+
import com.spoony.spoony_server.global.auth.annotation.UserId;
78
import com.spoony.spoony_server.global.dto.ResponseDTO;
89
import com.spoony.spoony_server.adapter.dto.place.PlaceCheckRequestDTO;
910
import com.spoony.spoony_server.adapter.dto.place.PlaceCheckResponseDTO;
1011
import com.spoony.spoony_server.adapter.dto.place.PlaceListResponseDTO;
12+
import io.swagger.v3.oas.annotations.Operation;
1113
import lombok.RequiredArgsConstructor;
1214
import org.springframework.http.HttpStatus;
1315
import org.springframework.http.ResponseEntity;
@@ -22,6 +24,7 @@ public class PlaceController {
2224
private final PlaceDuplicateCheckUseCase placeDuplicateCheckUseCase;
2325

2426
@GetMapping(value = "/search")
27+
@Operation(summary = "장소 검색 API", description = "검색어를 통해 특정 음식점을 검색하는 API")
2528
public ResponseEntity<ResponseDTO<PlaceListResponseDTO>> getPlaceList(
2629
@RequestParam(name = "query") String query,
2730
@RequestParam(name = "display", required = false, defaultValue = "5") int display) {
@@ -31,10 +34,12 @@ public ResponseEntity<ResponseDTO<PlaceListResponseDTO>> getPlaceList(
3134
}
3235

3336
@PostMapping("/check")
37+
@Operation(summary = "장소 중복 확인 API", description = "중복 등록된 장소가 존재하는지 확인하는 API")
3438
public ResponseEntity<ResponseDTO<PlaceCheckResponseDTO>> checkDuplicatePlace(
39+
@UserId Long userId,
3540
@RequestBody PlaceCheckRequestDTO placeCheckRequestDTO) {
3641
PlaceCheckCommand command = new PlaceCheckCommand(
37-
placeCheckRequestDTO.userId(),
42+
userId,
3843
placeCheckRequestDTO.latitude(),
3944
placeCheckRequestDTO.longitude()
4045
);

src/main/java/com/spoony/spoony_server/adapter/in/web/post/PostController.java

+20-5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import com.spoony.spoony_server.adapter.dto.post.PostResponseDTO;
1515
import com.spoony.spoony_server.adapter.dto.spoon.ScoopPostRequestDTO;
1616
import com.spoony.spoony_server.adapter.dto.zzim.PostCreateRequestDTO;
17+
import io.swagger.v3.oas.annotations.Operation;
18+
import io.swagger.v3.oas.annotations.Parameter;
1719
import lombok.RequiredArgsConstructor;
1820
import org.springframework.http.HttpStatus;
1921
import org.springframework.http.MediaType;
@@ -35,17 +37,25 @@ public class PostController {
3537
private final PostScoopPostUseCase postScoopPostUseCase;
3638

3739
@GetMapping("/{postId}")
38-
public ResponseEntity<ResponseDTO<PostResponseDTO>> getPost(@UserId Long userId, @PathVariable long postId) {
40+
@Operation(summary = "게시물 조회 API", description = "특정 게시물의 상세 정보를 조회하는 API")
41+
public ResponseEntity<ResponseDTO<PostResponseDTO>> getPost(
42+
@UserId Long userId,
43+
@PathVariable long postId) {
3944
PostGetCommand command = new PostGetCommand(postId, userId);
4045
PostResponseDTO postResponse = postGetUseCase.getPostById(command);
4146
return ResponseEntity.status(HttpStatus.OK).body(ResponseDTO.success(postResponse));
4247
}
4348

4449
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
50+
@Operation(summary = "게시물 등록 API", description = "새로운 게시물을 등록하는 API")
4551
public ResponseEntity<ResponseDTO<Void>> createPost(
4652
@UserId Long userId,
47-
@RequestPart("data") PostCreateRequestDTO postCreateRequestDTO,
48-
@RequestPart("photos") List<MultipartFile> photos
53+
@RequestPart("data")
54+
@Parameter(description = "게시물 생성 요청 데이터 (JSON 형식)")
55+
PostCreateRequestDTO postCreateRequestDTO,
56+
@RequestPart("photos")
57+
@Parameter(description = "게시물에 첨부할 사진 리스트 (이미지 파일)")
58+
List<MultipartFile> photos
4959
) throws IOException {
5060
PostPhotoSaveCommand photoSaveCommand = new PostPhotoSaveCommand(photos);
5161
List<String> photoUrlList = postCreateUseCase.savePostImages(photoSaveCommand);
@@ -70,20 +80,25 @@ public ResponseEntity<ResponseDTO<Void>> createPost(
7080
}
7181

7282
@GetMapping("/categories")
83+
@Operation(summary = "전체 카테고리 정보 조회 API", description = "전체 카테고리 정보를 조회하는 API")
7384
public ResponseEntity<ResponseDTO<CategoryMonoListResponseDTO>> getAllCategories() {
7485
CategoryMonoListResponseDTO categoryMonoListResponseDTO = postGetCategoriesUseCase.getAllCategories();
7586
return ResponseEntity.status(HttpStatus.OK).body(ResponseDTO.success(categoryMonoListResponseDTO));
7687
}
7788

7889
@GetMapping("/categories/food")
90+
@Operation(summary = "음식 카테고리 정보 조회 API", description = "음식 카테고리 정보를 조회하는 API")
7991
public ResponseEntity<ResponseDTO<CategoryMonoListResponseDTO>> getFoodCategories() {
8092
CategoryMonoListResponseDTO categoryMonoListResponseDTO = postGetCategoriesUseCase.getFoodCategories();
8193
return ResponseEntity.status(HttpStatus.OK).body(ResponseDTO.success(categoryMonoListResponseDTO));
8294
}
8395

8496
@PostMapping("/scoop")
85-
public ResponseEntity<ResponseDTO<Void>> scoopPost(@RequestBody ScoopPostRequestDTO scoopPostRequestDTO) {
86-
PostScoopPostCommand command = new PostScoopPostCommand(scoopPostRequestDTO.userId(), scoopPostRequestDTO.postId());
97+
@Operation(summary = "특정 게시물 떠먹기 API", description = "특정 게시물을 떠먹는 API")
98+
public ResponseEntity<ResponseDTO<Void>> scoopPost(
99+
@UserId Long userId,
100+
@RequestBody ScoopPostRequestDTO scoopPostRequestDTO) {
101+
PostScoopPostCommand command = new PostScoopPostCommand(userId, scoopPostRequestDTO.postId());
87102
postScoopPostUseCase.scoopPost(command);
88103
return ResponseEntity.status(HttpStatus.OK).body(ResponseDTO.success(null));
89104
}

src/main/java/com/spoony/spoony_server/adapter/in/web/report/ReportController.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.spoony.spoony_server.application.port.in.report.ReportCreateUseCase;
55
import com.spoony.spoony_server.global.dto.ResponseDTO;
66
import com.spoony.spoony_server.adapter.dto.report.ReportRequestDTO;
7+
import io.swagger.v3.oas.annotations.Operation;
78
import lombok.RequiredArgsConstructor;
89
import org.springframework.http.HttpStatus;
910
import org.springframework.http.ResponseEntity;
@@ -16,9 +17,13 @@
1617
@RequiredArgsConstructor
1718
@RequestMapping("/api/v1/report")
1819
public class ReportController {
20+
1921
public final ReportCreateUseCase reportCreateUseCase;
22+
2023
@PostMapping
21-
public ResponseEntity<ResponseDTO<Void>> createReport(@RequestBody ReportRequestDTO reportRequestDTO) {
24+
@Operation(summary = "사용자 신고 API", description = "특정 게시물과 그 작성자를 신고하는 API")
25+
public ResponseEntity<ResponseDTO<Void>> createReport(
26+
@RequestBody ReportRequestDTO reportRequestDTO) {
2227
ReportCreateCommand command = new ReportCreateCommand(
2328
reportRequestDTO.postId(),
2429
reportRequestDTO.userId(),

src/main/java/com/spoony/spoony_server/adapter/in/web/spoon/SpoonController.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.spoony.spoony_server.global.auth.annotation.UserId;
66
import com.spoony.spoony_server.global.dto.ResponseDTO;
77
import com.spoony.spoony_server.adapter.dto.spoon.SpoonResponseDTO;
8+
import io.swagger.v3.oas.annotations.Operation;
89
import lombok.RequiredArgsConstructor;
910
import org.springframework.http.HttpStatus;
1011
import org.springframework.http.ResponseEntity;
@@ -21,7 +22,9 @@ public class SpoonController {
2122
private final SpoonGetUseCase spoonGetUseCase;
2223

2324
@GetMapping
24-
public ResponseEntity<ResponseDTO<SpoonResponseDTO>> getSpoonBalance(@UserId Long userId) {
25+
@Operation(summary = "스푼 개수 조회 API", description = "특정 사용자의 스푼 개수를 조회하는 API")
26+
public ResponseEntity<ResponseDTO<SpoonResponseDTO>> getSpoonBalance(
27+
@UserId Long userId) {
2528
SpoonGetCommand command = new SpoonGetCommand(userId);
2629
SpoonResponseDTO spoonResponseDTO = spoonGetUseCase.getAmountById(command);
2730
return ResponseEntity.status(HttpStatus.OK).body(ResponseDTO.success(spoonResponseDTO));

src/main/java/com/spoony/spoony_server/adapter/in/web/user/UserController.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.spoony.spoony_server.global.auth.annotation.UserId;
66
import com.spoony.spoony_server.global.dto.ResponseDTO;
77
import com.spoony.spoony_server.adapter.dto.user.UserResponseDTO;
8+
import io.swagger.v3.oas.annotations.Operation;
89
import lombok.RequiredArgsConstructor;
910
import org.springframework.http.HttpStatus;
1011
import org.springframework.http.ResponseEntity;
@@ -21,7 +22,9 @@ public class UserController {
2122
private final UserGetUseCase userGetUseCase;
2223

2324
@GetMapping
24-
public ResponseEntity<ResponseDTO<UserResponseDTO>> getUserInfo(@UserId Long userId) {
25+
@Operation(summary = "사용자 정보 조회 API", description = "특정 사용자의 상세 정보를 조회하는 API")
26+
public ResponseEntity<ResponseDTO<UserResponseDTO>> getUserInfo(
27+
@UserId Long userId) {
2528
UserGetCommand command = new UserGetCommand(userId);
2629
UserResponseDTO userResponseDTO = userGetUseCase.getUserInfo(command);
2730
return ResponseEntity.status(HttpStatus.OK).body(ResponseDTO.success(userResponseDTO));

src/main/java/com/spoony/spoony_server/adapter/in/web/zzim/ZzimPostController.java

+21-6
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.spoony.spoony_server.adapter.dto.zzim.ZzimPostAddRequestDTO;
1010
import com.spoony.spoony_server.adapter.dto.zzim.ZzimCardListResponseDTO;
1111
import com.spoony.spoony_server.adapter.dto.zzim.ZzimFocusListResponseDTO;
12+
import io.swagger.v3.oas.annotations.Operation;
1213
import lombok.RequiredArgsConstructor;
1314
import org.springframework.http.HttpStatus;
1415
import org.springframework.http.ResponseEntity;
@@ -24,38 +25,52 @@ public class ZzimPostController {
2425
private final ZzimDeleteUseCase zzimRemoveUseCase;
2526

2627
@PostMapping
27-
public ResponseEntity<ResponseDTO<Void>> addZzimPost(@RequestBody ZzimPostAddRequestDTO zzimPostAddRequestDTO) {
28+
@Operation(summary = "북마크 추가 API", description = "북마크에 새로운 게시물을 추가하는 API")
29+
public ResponseEntity<ResponseDTO<Void>> addZzimPost(
30+
@UserId Long userId,
31+
@RequestBody ZzimPostAddRequestDTO zzimPostAddRequestDTO) {
2832
ZzimAddCommand command = new ZzimAddCommand(
29-
zzimPostAddRequestDTO.userId(),
33+
userId,
3034
zzimPostAddRequestDTO.postId()
3135
);
3236
zzimAddUseCase.addZzimPost(command);
3337
return ResponseEntity.status(HttpStatus.OK).body(ResponseDTO.success(null));
3438
}
3539

3640
@GetMapping
37-
public ResponseEntity<ResponseDTO<ZzimCardListResponseDTO>> getZzimCardList(@UserId Long userId) {
41+
@Operation(summary = "북마크 조회 API", description = "북마크 장소 리스트를 조회하는 API")
42+
public ResponseEntity<ResponseDTO<ZzimCardListResponseDTO>> getZzimCardList(
43+
@UserId Long userId) {
3844
ZzimGetCardCommand command = new ZzimGetCardCommand(userId);
3945
ZzimCardListResponseDTO zzimCardListResponse = zzimGetUseCase.getZzimCardList(command);
4046
return ResponseEntity.status(HttpStatus.OK).body(ResponseDTO.success(zzimCardListResponse));
4147
}
4248

4349
@GetMapping("/{placeId}")
44-
public ResponseEntity<ResponseDTO<ZzimFocusListResponseDTO>> getZzimFocusList(@UserId Long userId, @PathVariable long placeId) {
50+
@Operation(summary = "특정 장소의 북마크 리스트 조회 API", description = "특정 장소의 북마크 장소 리스트를 조회하는 API")
51+
public ResponseEntity<ResponseDTO<ZzimFocusListResponseDTO>> getZzimFocusList(
52+
@UserId Long userId,
53+
@PathVariable long placeId) {
4554
ZzimGetFocusCommand command = new ZzimGetFocusCommand(userId, placeId);
4655
ZzimFocusListResponseDTO zzimFocusListResponse = zzimGetUseCase.getZzimFocusList(command);
4756
return ResponseEntity.status(HttpStatus.OK).body(ResponseDTO.success(zzimFocusListResponse));
4857
}
4958

5059
@GetMapping("/location/{locationId}")
51-
public ResponseEntity<ResponseDTO<ZzimCardListResponseDTO>> getZzimLocationCardList(@UserId Long userId, @PathVariable long locationId) {
60+
@Operation(summary = "특정 지역의 북마크 조회 API", description = "특정 지역의 북마크 장소 리스트를 조회하는 API")
61+
public ResponseEntity<ResponseDTO<ZzimCardListResponseDTO>> getZzimLocationCardList(
62+
@UserId Long userId,
63+
@PathVariable long locationId) {
5264
ZzimGetLocationCardCommand command = new ZzimGetLocationCardCommand(userId, locationId);
5365
ZzimCardListResponseDTO zzimCardListResponse = zzimGetUseCase.getZzimByLocation(command);
5466
return ResponseEntity.status(HttpStatus.OK).body(ResponseDTO.success(zzimCardListResponse));
5567
}
5668

5769
@DeleteMapping("/{postId}")
58-
public ResponseEntity<ResponseDTO<Void>> deleteZzim(@UserId Long userId, @PathVariable long postId) {
70+
@Operation(summary = "북마크 삭제 API", description = "북마크에서 특정 게시물을 삭제하는 API")
71+
public ResponseEntity<ResponseDTO<Void>> deleteZzim(
72+
@UserId Long userId,
73+
@PathVariable long postId) {
5974
ZzimDeleteCommand command = new ZzimDeleteCommand(userId, postId);
6075
zzimRemoveUseCase.deleteZzim(command);
6176
return ResponseEntity.status(HttpStatus.OK).body(ResponseDTO.success(null));

src/main/java/com/spoony/spoony_server/global/auth/filter/JwtAuthenticationFilter.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ private String resolveToken(HttpServletRequest request) {
5555
@Override
5656
protected boolean shouldNotFilter(HttpServletRequest request) {
5757
String requestURI = request.getRequestURI();
58-
return requestURI.startsWith("/api/v1/auth/signin") || requestURI.startsWith("/api/v1/auth/refresh");
58+
return requestURI.startsWith("/api/v1/auth/signin")
59+
|| requestURI.startsWith("/api/v1/auth/refresh")
60+
|| requestURI.startsWith("/swagger-ui")
61+
|| requestURI.startsWith("/v3/api-docs");
5962
}
6063
}

src/main/java/com/spoony/spoony_server/global/config/SecurityConfig.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ public class SecurityConfig {
2626

2727
private static final List<String> AUTH_WHITE_LIST = List.of(
2828
"/api/v1/auth/signin",
29-
"/api/v1/auth/refresh"
29+
"/api/v1/auth/refresh",
30+
"/swagger-ui/**",
31+
"/v3/api-docs/**"
3032
);
3133

3234
@Bean
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.spoony.spoony_server.global.config;
2+
3+
import io.swagger.v3.oas.models.OpenAPI;
4+
import io.swagger.v3.oas.models.info.Info;
5+
import io.swagger.v3.oas.models.Components;
6+
import io.swagger.v3.oas.models.security.SecurityRequirement;
7+
import io.swagger.v3.oas.models.security.SecurityScheme;
8+
import org.springframework.context.annotation.Bean;
9+
import org.springframework.context.annotation.Configuration;
10+
11+
@Configuration
12+
public class SwaggerConfig {
13+
@Bean
14+
public OpenAPI openAPI() {
15+
return new OpenAPI()
16+
.components(new Components()
17+
.addSecuritySchemes("BearerAuth", securityScheme()))
18+
.addSecurityItem(new SecurityRequirement().addList("BearerAuth"))
19+
.info(apiInfo());
20+
}
21+
22+
private SecurityScheme securityScheme() {
23+
return new SecurityScheme()
24+
.name("BearerAuth")
25+
.type(SecurityScheme.Type.HTTP)
26+
.scheme("bearer")
27+
.bearerFormat("JWT");
28+
}
29+
30+
private Info apiInfo() {
31+
return new Info()
32+
.title("Spoony API Docs")
33+
.description("API documentation for Spoony using Swagger UI.")
34+
.version("1.0.0");
35+
}
36+
}

0 commit comments

Comments
 (0)