From 50410bfc82e69c2401c801acad693881ace82007 Mon Sep 17 00:00:00 2001 From: LivingLikeKrillin <143606756+LivingLikeKrillin@users.noreply.github.com> Date: Sun, 15 Mar 2026 17:55:45 +0900 Subject: [PATCH] fix: add @Schema examples to Swagger response DTOs and update CORS/naming MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add @Schema(example) to 15 response DTOs for Swagger example value display - Fix MusicData inner class visibility (static → public static) - Add @Schema(type="string") to Duration field for correct Swagger rendering - Rename "아바타 표정 목록 조회" → "아바타 얼굴 목록 조회" - Add https://api.pfplay.xyz to CORS allowed origins Co-Authored-By: Claude Opus 4.6 (1M context) --- .../application/dto/dj/DjWithProfileDto.java | 9 ++++++- .../dto/partyroom/LinkEnterDto.java | 14 ++++++----- .../dto/playback/AggregationDto.java | 8 +++++- .../application/dto/playback/PlaybackDto.java | 13 +++++----- .../dto/playback/PlaybackHistoryDto.java | 7 +++--- .../dto/playback/ReactionHistoryDto.java | 6 ++--- .../dto/result/CrewProfileSummaryResult.java | 15 +++++------ .../dto/result/PartyroomSummaryResult.java | 9 ++++--- .../application/dto/CrewSetupDto.java | 25 ++++++++++--------- .../application/dto/CurrentDjDto.java | 4 ++- .../partyview/application/dto/DisplayDto.java | 3 ++- .../config/security/SecurityConfig.java | 3 ++- .../response/QueryMusicSearchResponse.java | 11 ++++---- .../in/web/UserAvatarQueryController.java | 2 +- .../application/dto/result/MyInfoResult.java | 11 ++++---- .../dto/shared/ActivitySummaryDto.java | 6 ++++- .../application/dto/shared/AvatarBodyDto.java | 21 ++++++++-------- .../application/dto/shared/AvatarFaceDto.java | 9 ++++++- 18 files changed, 107 insertions(+), 69 deletions(-) diff --git a/app/src/main/java/com/pfplaybackend/api/party/application/dto/dj/DjWithProfileDto.java b/app/src/main/java/com/pfplaybackend/api/party/application/dto/dj/DjWithProfileDto.java index 0d547917..973f4303 100644 --- a/app/src/main/java/com/pfplaybackend/api/party/application/dto/dj/DjWithProfileDto.java +++ b/app/src/main/java/com/pfplaybackend/api/party/application/dto/dj/DjWithProfileDto.java @@ -1,3 +1,10 @@ package com.pfplaybackend.api.party.application.dto.dj; -public record DjWithProfileDto(long crewId, long orderNumber, String nickname, String avatarIconUri) {} +import io.swagger.v3.oas.annotations.media.Schema; + +public record DjWithProfileDto( + @Schema(example = "1") long crewId, + @Schema(example = "1") long orderNumber, + @Schema(example = "DJ_Master") String nickname, + @Schema(example = "https://cdn.pfplay.xyz/avatar/icon/1.png") String avatarIconUri +) {} diff --git a/app/src/main/java/com/pfplaybackend/api/party/application/dto/partyroom/LinkEnterDto.java b/app/src/main/java/com/pfplaybackend/api/party/application/dto/partyroom/LinkEnterDto.java index f781241d..7a394c6f 100644 --- a/app/src/main/java/com/pfplaybackend/api/party/application/dto/partyroom/LinkEnterDto.java +++ b/app/src/main/java/com/pfplaybackend/api/party/application/dto/partyroom/LinkEnterDto.java @@ -1,14 +1,16 @@ package com.pfplaybackend.api.party.application.dto.partyroom; +import io.swagger.v3.oas.annotations.media.Schema; + public record LinkEnterDto( - long partyroomId, - String title, - String introduction, + @Schema(example = "1") long partyroomId, + @Schema(example = "Friday Night Party") String title, + @Schema(example = "Welcome to the party!") String introduction, PlaybackSummary playback, - long crewCount + @Schema(example = "5") long crewCount ) { public record PlaybackSummary( - String name, - String thumbnailImage + @Schema(example = "Never Gonna Give You Up") String name, + @Schema(example = "https://i.ytimg.com/vi/dQw4w9WgXcQ/default.jpg") String thumbnailImage ) {} } diff --git a/app/src/main/java/com/pfplaybackend/api/party/application/dto/playback/AggregationDto.java b/app/src/main/java/com/pfplaybackend/api/party/application/dto/playback/AggregationDto.java index 116c1c16..c5eb1371 100644 --- a/app/src/main/java/com/pfplaybackend/api/party/application/dto/playback/AggregationDto.java +++ b/app/src/main/java/com/pfplaybackend/api/party/application/dto/playback/AggregationDto.java @@ -1,3 +1,9 @@ package com.pfplaybackend.api.party.application.dto.playback; -public record AggregationDto(int likeCount, int dislikeCount, int grabCount) {} +import io.swagger.v3.oas.annotations.media.Schema; + +public record AggregationDto( + @Schema(example = "10") int likeCount, + @Schema(example = "2") int dislikeCount, + @Schema(example = "5") int grabCount +) {} diff --git a/app/src/main/java/com/pfplaybackend/api/party/application/dto/playback/PlaybackDto.java b/app/src/main/java/com/pfplaybackend/api/party/application/dto/playback/PlaybackDto.java index 761fa657..a0132502 100644 --- a/app/src/main/java/com/pfplaybackend/api/party/application/dto/playback/PlaybackDto.java +++ b/app/src/main/java/com/pfplaybackend/api/party/application/dto/playback/PlaybackDto.java @@ -2,18 +2,19 @@ import com.pfplaybackend.api.common.domain.value.Duration; import com.querydsl.core.annotations.QueryProjection; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.NoArgsConstructor; @NoArgsConstructor @Data public class PlaybackDto { - private long id; - private String linkId; - private String name; - private Duration duration; - private String thumbnailImage; - private long endTime; + @Schema(example = "1") private long id; + @Schema(example = "dQw4w9WgXcQ") private String linkId; + @Schema(example = "Never Gonna Give You Up") private String name; + @Schema(type = "string", example = "3:33") private Duration duration; + @Schema(example = "https://i.ytimg.com/vi/dQw4w9WgXcQ/default.jpg") private String thumbnailImage; + @Schema(example = "1700000000000") private long endTime; @QueryProjection public PlaybackDto(long id, String linkId, String name, Duration duration, String thumbnailImage) { diff --git a/app/src/main/java/com/pfplaybackend/api/party/application/dto/playback/PlaybackHistoryDto.java b/app/src/main/java/com/pfplaybackend/api/party/application/dto/playback/PlaybackHistoryDto.java index 4010b0b3..98fa85e5 100644 --- a/app/src/main/java/com/pfplaybackend/api/party/application/dto/playback/PlaybackHistoryDto.java +++ b/app/src/main/java/com/pfplaybackend/api/party/application/dto/playback/PlaybackHistoryDto.java @@ -1,10 +1,11 @@ package com.pfplaybackend.api.party.application.dto.playback; import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; public record PlaybackHistoryDto( - @JsonProperty("musicName") String trackName, - String nickname, - String avatarIconUri + @JsonProperty("musicName") @Schema(example = "Never Gonna Give You Up") String trackName, + @Schema(example = "DJ_Master") String nickname, + @Schema(example = "https://cdn.pfplay.xyz/avatar/icon/1.png") String avatarIconUri ) { } diff --git a/app/src/main/java/com/pfplaybackend/api/party/application/dto/playback/ReactionHistoryDto.java b/app/src/main/java/com/pfplaybackend/api/party/application/dto/playback/ReactionHistoryDto.java index 2fbd19ed..287118d9 100644 --- a/app/src/main/java/com/pfplaybackend/api/party/application/dto/playback/ReactionHistoryDto.java +++ b/app/src/main/java/com/pfplaybackend/api/party/application/dto/playback/ReactionHistoryDto.java @@ -6,9 +6,9 @@ @Schema(description = "재생 리액션 히스토리") public record ReactionHistoryDto( - @Schema(description = "좋아요 여부") boolean isLiked, - @Schema(description = "싫어요 여부") boolean isDisliked, - @Schema(description = "그랩 여부") boolean isGrabbed + @Schema(description = "좋아요 여부", example = "false") boolean isLiked, + @Schema(description = "싫어요 여부", example = "false") boolean isDisliked, + @Schema(description = "그랩 여부", example = "false") boolean isGrabbed ) { public static ReactionHistoryDto empty() { return new ReactionHistoryDto(false, false, false); diff --git a/app/src/main/java/com/pfplaybackend/api/party/application/dto/result/CrewProfileSummaryResult.java b/app/src/main/java/com/pfplaybackend/api/party/application/dto/result/CrewProfileSummaryResult.java index c7333039..a91ace54 100644 --- a/app/src/main/java/com/pfplaybackend/api/party/application/dto/result/CrewProfileSummaryResult.java +++ b/app/src/main/java/com/pfplaybackend/api/party/application/dto/result/CrewProfileSummaryResult.java @@ -2,17 +2,18 @@ import com.pfplaybackend.api.user.application.dto.shared.ActivitySummaryDto; import com.pfplaybackend.api.user.application.dto.shared.ProfileSummaryDto; +import io.swagger.v3.oas.annotations.media.Schema; import java.util.List; public record CrewProfileSummaryResult( - Long crewId, - String nickname, - String introduction, - String avatarBodyUri, - int combinePositionX, - int combinePositionY, - String avatarFaceUri, + @Schema(example = "1") Long crewId, + @Schema(example = "DJ_Master") String nickname, + @Schema(example = "Music lover") String introduction, + @Schema(example = "https://cdn.pfplay.xyz/avatar/body/default.png") String avatarBodyUri, + @Schema(example = "0") int combinePositionX, + @Schema(example = "0") int combinePositionY, + @Schema(example = "https://cdn.pfplay.xyz/avatar/face/smile.png") String avatarFaceUri, List activitySummaries ) { public static CrewProfileSummaryResult from(Long crewId, ProfileSummaryDto dto) { diff --git a/app/src/main/java/com/pfplaybackend/api/party/application/dto/result/PartyroomSummaryResult.java b/app/src/main/java/com/pfplaybackend/api/party/application/dto/result/PartyroomSummaryResult.java index 493284f3..42ead733 100644 --- a/app/src/main/java/com/pfplaybackend/api/party/application/dto/result/PartyroomSummaryResult.java +++ b/app/src/main/java/com/pfplaybackend/api/party/application/dto/result/PartyroomSummaryResult.java @@ -1,11 +1,12 @@ package com.pfplaybackend.api.party.application.dto.result; import com.pfplaybackend.api.party.application.dto.dj.DjWithProfileDto; +import io.swagger.v3.oas.annotations.media.Schema; public record PartyroomSummaryResult( - String title, - String introduction, - String linkDomain, - int playbackTimeLimit, + @Schema(example = "Friday Night Party") String title, + @Schema(example = "Welcome to the party!") String introduction, + @Schema(example = "abc123") String linkDomain, + @Schema(example = "300") int playbackTimeLimit, DjWithProfileDto currentDj ) {} diff --git a/app/src/main/java/com/pfplaybackend/api/partyview/application/dto/CrewSetupDto.java b/app/src/main/java/com/pfplaybackend/api/partyview/application/dto/CrewSetupDto.java index dbd052a1..08a3d74f 100644 --- a/app/src/main/java/com/pfplaybackend/api/partyview/application/dto/CrewSetupDto.java +++ b/app/src/main/java/com/pfplaybackend/api/partyview/application/dto/CrewSetupDto.java @@ -4,20 +4,21 @@ import com.pfplaybackend.api.party.domain.entity.data.CrewData; import com.pfplaybackend.api.party.domain.enums.GradeType; import com.pfplaybackend.api.user.application.dto.shared.ProfileSettingDto; +import io.swagger.v3.oas.annotations.media.Schema; public record CrewSetupDto( - long crewId, - GradeType gradeType, - String nickname, - AvatarCompositionType avatarCompositionType, - String avatarBodyUri, - String avatarFaceUri, - String avatarIconUri, - int combinePositionX, - int combinePositionY, - double offsetX, - double offsetY, - double scale + @Schema(example = "1") long crewId, + @Schema(example = "CLUBBER") GradeType gradeType, + @Schema(example = "DJ_Master") String nickname, + @Schema(example = "COMBINE") AvatarCompositionType avatarCompositionType, + @Schema(example = "https://cdn.pfplay.xyz/avatar/body/default.png") String avatarBodyUri, + @Schema(example = "https://cdn.pfplay.xyz/avatar/face/smile.png") String avatarFaceUri, + @Schema(example = "https://cdn.pfplay.xyz/avatar/icon/1.png") String avatarIconUri, + @Schema(example = "0") int combinePositionX, + @Schema(example = "0") int combinePositionY, + @Schema(example = "0.0") double offsetX, + @Schema(example = "0.0") double offsetY, + @Schema(example = "1.0") double scale ) { public static CrewSetupDto from(CrewData crew, ProfileSettingDto p) { return new CrewSetupDto(crew.getId(), crew.getGradeType(), diff --git a/app/src/main/java/com/pfplaybackend/api/partyview/application/dto/CurrentDjDto.java b/app/src/main/java/com/pfplaybackend/api/partyview/application/dto/CurrentDjDto.java index 1726e333..067976d2 100644 --- a/app/src/main/java/com/pfplaybackend/api/partyview/application/dto/CurrentDjDto.java +++ b/app/src/main/java/com/pfplaybackend/api/partyview/application/dto/CurrentDjDto.java @@ -1,3 +1,5 @@ package com.pfplaybackend.api.partyview.application.dto; -public record CurrentDjDto(long crewId) {} +import io.swagger.v3.oas.annotations.media.Schema; + +public record CurrentDjDto(@Schema(example = "1") long crewId) {} diff --git a/app/src/main/java/com/pfplaybackend/api/partyview/application/dto/DisplayDto.java b/app/src/main/java/com/pfplaybackend/api/partyview/application/dto/DisplayDto.java index 0a21c325..8c82c59c 100644 --- a/app/src/main/java/com/pfplaybackend/api/partyview/application/dto/DisplayDto.java +++ b/app/src/main/java/com/pfplaybackend/api/partyview/application/dto/DisplayDto.java @@ -1,9 +1,10 @@ package com.pfplaybackend.api.partyview.application.dto; import com.pfplaybackend.api.party.application.dto.playback.PlaybackDto; +import io.swagger.v3.oas.annotations.media.Schema; public record DisplayDto( - boolean playbackActivated, + @Schema(example = "true") boolean playbackActivated, PlaybackDto playback, ReactionDto reaction, CurrentDjDto currentDj diff --git a/common/src/main/java/com/pfplaybackend/api/common/config/security/SecurityConfig.java b/common/src/main/java/com/pfplaybackend/api/common/config/security/SecurityConfig.java index 6a60e4be..c2ac9542 100644 --- a/common/src/main/java/com/pfplaybackend/api/common/config/security/SecurityConfig.java +++ b/common/src/main/java/com/pfplaybackend/api/common/config/security/SecurityConfig.java @@ -63,7 +63,8 @@ public CorsConfigurationSource corsConfigurationSource() { "http://localhost:3000", "http://localhost:8080", "http://admin.pfplay.xyz", - "https://pfplay.xyz")); + "https://pfplay.xyz", + "https://api.pfplay.xyz")); configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS")); configuration.setAllowedHeaders(List.of("*")); configuration.setAllowCredentials(true); diff --git a/playlist/src/main/java/com/pfplaybackend/api/playlist/adapter/in/web/payload/response/QueryMusicSearchResponse.java b/playlist/src/main/java/com/pfplaybackend/api/playlist/adapter/in/web/payload/response/QueryMusicSearchResponse.java index 10f2cd02..9dc2800d 100644 --- a/playlist/src/main/java/com/pfplaybackend/api/playlist/adapter/in/web/payload/response/QueryMusicSearchResponse.java +++ b/playlist/src/main/java/com/pfplaybackend/api/playlist/adapter/in/web/payload/response/QueryMusicSearchResponse.java @@ -1,6 +1,7 @@ package com.pfplaybackend.api.playlist.adapter.in.web.payload.response; import com.pfplaybackend.api.playlist.application.dto.search.SearchResultDto; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.Data; import lombok.Getter; @@ -26,10 +27,10 @@ public static QueryMusicSearchResponse from(SearchResultDto searchMusicResultDto @Getter @Builder - static class MusicData { - private String videoId; - private String videoTitle; - private String runningTime; - private String thumbnailUrl; + public static class MusicData { + @Schema(example = "dQw4w9WgXcQ") private String videoId; + @Schema(example = "Rick Astley - Never Gonna Give You Up") private String videoTitle; + @Schema(example = "3:33") private String runningTime; + @Schema(example = "https://i.ytimg.com/vi/dQw4w9WgXcQ/default.jpg") private String thumbnailUrl; } } \ No newline at end of file diff --git a/user/src/main/java/com/pfplaybackend/api/user/adapter/in/web/UserAvatarQueryController.java b/user/src/main/java/com/pfplaybackend/api/user/adapter/in/web/UserAvatarQueryController.java index 98e8ec77..10ce480f 100644 --- a/user/src/main/java/com/pfplaybackend/api/user/adapter/in/web/UserAvatarQueryController.java +++ b/user/src/main/java/com/pfplaybackend/api/user/adapter/in/web/UserAvatarQueryController.java @@ -34,7 +34,7 @@ public ResponseEntity>> getMyAllAvatarBodi return ResponseEntity.ok().body(ApiCommonResponse.success(avatarBodies)); } - @Operation(summary = "아바타 표정 목록 조회", description = "사용 가능한 아바타 표정(얼굴) 리소스 목록을 조회합니다. 게스트와 회원 모두 조회 가능합니다.") + @Operation(summary = "아바타 얼굴 목록 조회", description = "사용 가능한 아바타 얼굴 리소스 목록을 조회합니다. 게스트와 회원 모두 조회 가능합니다.") @SecurityRequirement(name = "cookieAuth") @PreAuthorize("hasAnyRole('ROLE_GUEST', 'ROLE_MEMBER')") @GetMapping("/me/profile/avatar/faces") diff --git a/user/src/main/java/com/pfplaybackend/api/user/application/dto/result/MyInfoResult.java b/user/src/main/java/com/pfplaybackend/api/user/application/dto/result/MyInfoResult.java index dde868de..a5a0c8ca 100644 --- a/user/src/main/java/com/pfplaybackend/api/user/application/dto/result/MyInfoResult.java +++ b/user/src/main/java/com/pfplaybackend/api/user/application/dto/result/MyInfoResult.java @@ -2,15 +2,16 @@ import com.pfplaybackend.api.common.enums.AuthorityTier; import com.pfplaybackend.api.user.domain.entity.data.UserAccountData; +import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDate; public record MyInfoResult( - String uid, - String email, - AuthorityTier authorityTier, - boolean profileUpdated, - LocalDate registrationDate + @Schema(example = "550e8400-e29b-41d4-a716-446655440000") String uid, + @Schema(example = "user@gmail.com") String email, + @Schema(example = "FM") AuthorityTier authorityTier, + @Schema(example = "true") boolean profileUpdated, + @Schema(example = "2025-01-15") LocalDate registrationDate ) { public static MyInfoResult from(UserAccountData user) { return new MyInfoResult( diff --git a/user/src/main/java/com/pfplaybackend/api/user/application/dto/shared/ActivitySummaryDto.java b/user/src/main/java/com/pfplaybackend/api/user/application/dto/shared/ActivitySummaryDto.java index c7fd46cc..ea5293f4 100644 --- a/user/src/main/java/com/pfplaybackend/api/user/application/dto/shared/ActivitySummaryDto.java +++ b/user/src/main/java/com/pfplaybackend/api/user/application/dto/shared/ActivitySummaryDto.java @@ -1,5 +1,9 @@ package com.pfplaybackend.api.user.application.dto.shared; import com.pfplaybackend.api.user.domain.enums.ActivityType; +import io.swagger.v3.oas.annotations.media.Schema; -public record ActivitySummaryDto(ActivityType activityType, int score) {} +public record ActivitySummaryDto( + @Schema(example = "DJ_POINT") ActivityType activityType, + @Schema(example = "150") int score +) {} diff --git a/user/src/main/java/com/pfplaybackend/api/user/application/dto/shared/AvatarBodyDto.java b/user/src/main/java/com/pfplaybackend/api/user/application/dto/shared/AvatarBodyDto.java index a0b98f61..59a87f57 100644 --- a/user/src/main/java/com/pfplaybackend/api/user/application/dto/shared/AvatarBodyDto.java +++ b/user/src/main/java/com/pfplaybackend/api/user/application/dto/shared/AvatarBodyDto.java @@ -2,6 +2,7 @@ import com.pfplaybackend.api.user.domain.entity.data.AvatarBodyResourceData; import com.pfplaybackend.api.user.domain.enums.ObtainmentType; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.Data; import lombok.Getter; @@ -12,16 +13,16 @@ @Builder(toBuilder = true) @ToString public class AvatarBodyDto { - private Long id; - private final String name; - private final String resourceUri; - private final ObtainmentType obtainableType; - private final int obtainableScore; - private final boolean combinable; - private final boolean defaultSetting; - private final boolean available; - private final int combinePositionX; - private final int combinePositionY; + @Schema(example = "1") private Long id; + @Schema(example = "default_body") private final String name; + @Schema(example = "https://cdn.pfplay.xyz/avatar/body/default.png") private final String resourceUri; + @Schema(example = "BASIC") private final ObtainmentType obtainableType; + @Schema(example = "0") private final int obtainableScore; + @Schema(example = "true") private final boolean combinable; + @Schema(example = "true") private final boolean defaultSetting; + @Schema(example = "true") private final boolean available; + @Schema(example = "0") private final int combinePositionX; + @Schema(example = "0") private final int combinePositionY; public static AvatarBodyDto create(AvatarBodyResourceData avatarBodyResource) { return AvatarBodyDto.builder() diff --git a/user/src/main/java/com/pfplaybackend/api/user/application/dto/shared/AvatarFaceDto.java b/user/src/main/java/com/pfplaybackend/api/user/application/dto/shared/AvatarFaceDto.java index d9a76ed7..0a89e749 100644 --- a/user/src/main/java/com/pfplaybackend/api/user/application/dto/shared/AvatarFaceDto.java +++ b/user/src/main/java/com/pfplaybackend/api/user/application/dto/shared/AvatarFaceDto.java @@ -1,3 +1,10 @@ package com.pfplaybackend.api.user.application.dto.shared; -public record AvatarFaceDto(long id, String name, String resourceUri, boolean available) {} +import io.swagger.v3.oas.annotations.media.Schema; + +public record AvatarFaceDto( + @Schema(example = "1") long id, + @Schema(example = "smile") String name, + @Schema(example = "https://cdn.pfplay.xyz/avatar/face/smile.png") String resourceUri, + @Schema(example = "true") boolean available +) {}