diff --git a/src/main/java/EatPic/spring/domain/card/controller/CardController.java b/src/main/java/EatPic/spring/domain/card/controller/CardController.java index 9df0228..a15cc7e 100644 --- a/src/main/java/EatPic/spring/domain/card/controller/CardController.java +++ b/src/main/java/EatPic/spring/domain/card/controller/CardController.java @@ -12,6 +12,7 @@ import EatPic.spring.domain.card.repository.CardRepository; import EatPic.spring.domain.card.service.CardService; import EatPic.spring.domain.comment.dto.CommentResponseDTO; +import EatPic.spring.domain.user.dto.response.UserResponseDTO; import EatPic.spring.domain.user.entity.User; import EatPic.spring.domain.user.service.UserService; import EatPic.spring.global.common.ApiResponse; @@ -21,6 +22,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; @@ -30,10 +33,13 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +@Controller @RestController @RequiredArgsConstructor @RequestMapping("/api/cards") @@ -44,27 +50,15 @@ public class CardController { //픽카드 생성하기 부분에서 같은 날짜에, 같은 mealtype으로 픽카드 등록되지 않도록 수정해야함 @PostMapping(value = "", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - @Operation(summary = "픽카드 생성하기 (픽카드 기록 작성)", description = "픽카드를 생성할 때 호출되는 api") - public ApiResponse createCard( + @Operation(summary = "픽카드 생성하기 (픽카드 기록 + 이미지 작성)", description = "기록 부분 string으로 받아서 JSON 파싱을 합니다.") + public ApiResponse createCard( HttpServletRequest req, - @RequestParam("request") String requestJson, - @RequestPart(value = "cardImageFile", required = false) MultipartFile cardImageFile) { - - CardCreateRequest.CreateCardRequest request; - try { - ObjectMapper objectMapper = new ObjectMapper(); - request = objectMapper.readValue(requestJson, CardCreateRequest.CreateCardRequest.class); - } catch (JsonProcessingException e) { - throw new GeneralException(ErrorStatus.REQUEST_BODY_INVALID); - } - - //Long userId = 1L; - User user = userService.getLoginUser(req); + @RequestPart(value = "cardImageFile", required = false) MultipartFile cardImageFile, + @Valid @RequestPart(value = "request") CardCreateRequest.CreateCardRequest request + ) { + User user = userService.getLoginUser(req); - if (cardImageFile == null || cardImageFile.isEmpty()) { - throw new GeneralException(ErrorStatus.IMAGE_REQUIRED); - } - CardResponse.CreateCardResponse response = cardService.createNewCard(request, user, cardImageFile); + CardResponse.CreateCardResponse response = cardService.createNewCard(req, request, user, cardImageFile); return ApiResponse.onSuccess(response); } diff --git a/src/main/java/EatPic/spring/domain/card/dto/request/CardCreateRequest.java b/src/main/java/EatPic/spring/domain/card/dto/request/CardCreateRequest.java index 3733b03..3a1c613 100644 --- a/src/main/java/EatPic/spring/domain/card/dto/request/CardCreateRequest.java +++ b/src/main/java/EatPic/spring/domain/card/dto/request/CardCreateRequest.java @@ -24,32 +24,36 @@ public class CardCreateRequest { public static class CreateCardRequest { @JsonProperty("isShared") + @Schema(description = "피드 공개 여부 (true = 공개, false = 비공개)", example = "true") private Boolean isShared; - @JsonProperty("latitude") + @JsonProperty("locationText") + @Schema(description = "장소 이름 텍스트", example = "서울특별시 성북구 정릉동") + private String locationText; + + @Schema(description = "위도", example = "37.5665") private BigDecimal latitude; - @JsonProperty("longitude") + @Schema(description = "경도", example = "126.9780") private BigDecimal longitude; - // 파일(cardImageFile)을 별도로 -// @JsonProperty("cardImageUrl") -// private String cardImageUrl; + @Schema(description = "레시피 내용", example = "야채, 아보카도, 소스 조합으로 구성된 샐러드입니다.") + private String recipe; - @JsonProperty("recipeUrl") + @Schema(description = "레시피 링크 URL", example = "https://example.com/recipe/123") private String recipeUrl; - @JsonProperty("memo") + @Schema(description = "나의 메모", example = "오늘은 샐러드를 먹었습니다~ 아보카도를 많이 넣었어요") private String memo; - @JsonProperty("recipe") - private String recipe; - @JsonProperty("meal") @JsonFormat(shape = JsonFormat.Shape.STRING) + @Schema(description = "식사 유형 (Enum: BREAKFAST, LUNCH, DINNER 등)", example = "LUNCH") private Meal meal; // Enum 매핑 시 대소문자 주의 - private List hashtags; // 사용자가 선택/생성한 해시태그 목록 (이름 기준) + @JsonProperty("hashtags") + @Schema(description = "사용자가 선택/생성한 해시태그 목록 (이름 기준)", example = "[\"샐러드\", \"건강식\"]") + private List hashtags; // 해시태그 목록 } diff --git a/src/main/java/EatPic/spring/domain/card/service/CardService.java b/src/main/java/EatPic/spring/domain/card/service/CardService.java index 49ebe4c..0209715 100644 --- a/src/main/java/EatPic/spring/domain/card/service/CardService.java +++ b/src/main/java/EatPic/spring/domain/card/service/CardService.java @@ -9,13 +9,14 @@ import EatPic.spring.domain.card.dto.response.CardResponse.TodayCardResponse; import EatPic.spring.domain.user.entity.User; import jakarta.servlet.http.HttpServletRequest; +import org.apache.http.protocol.HTTP; import org.springframework.web.multipart.MultipartFile; import java.util.List; public interface CardService { - CardResponse.CreateCardResponse createNewCard(CardCreateRequest.CreateCardRequest request, User user, MultipartFile cardImageFile); + CardResponse.CreateCardResponse createNewCard(HttpServletRequest req, CardCreateRequest.CreateCardRequest request, User user, MultipartFile cardImageFile); CardDetailResponse getCardDetail(Long cardId, Long userId); CardFeedResponse getCardFeed(Long cardId, Long userId); void deleteCard(Long cardId, Long userId); diff --git a/src/main/java/EatPic/spring/domain/card/service/CardServiceImpl.java b/src/main/java/EatPic/spring/domain/card/service/CardServiceImpl.java index 1be96ab..d744ab9 100644 --- a/src/main/java/EatPic/spring/domain/card/service/CardServiceImpl.java +++ b/src/main/java/EatPic/spring/domain/card/service/CardServiceImpl.java @@ -20,6 +20,7 @@ import EatPic.spring.domain.hashtag.entity.Hashtag; import EatPic.spring.domain.reaction.entity.Reaction; import EatPic.spring.domain.reaction.repository.ReactionRepository; +import EatPic.spring.domain.user.dto.response.UserResponseDTO; import EatPic.spring.domain.user.entity.User; import EatPic.spring.domain.user.repository.UserRepository; import EatPic.spring.domain.user.service.UserBadgeService; @@ -95,10 +96,9 @@ private void connectHashtagsToCard(Card card, List hashtags, User user) // s3 설정 private final AmazonS3Manager s3Manager; - @Override @Transactional - public CardResponse.CreateCardResponse createNewCard(CardCreateRequest.CreateCardRequest request, User user, MultipartFile cardImageFile) { + public CardResponse.CreateCardResponse createNewCard(HttpServletRequest req, CardCreateRequest.CreateCardRequest request, User user, MultipartFile cardImageFile) { Long userId = user.getId();