diff --git a/src/main/java/stackpot/stackpot/common/util/DateFormatter.java b/src/main/java/stackpot/stackpot/common/util/DateFormatter.java index fc9a961..6324d3a 100644 --- a/src/main/java/stackpot/stackpot/common/util/DateFormatter.java +++ b/src/main/java/stackpot/stackpot/common/util/DateFormatter.java @@ -1,10 +1,14 @@ package stackpot.stackpot.common.util; +import java.time.LocalDate; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; public class DateFormatter { private DateFormatter() {} + private static final DateTimeFormatter INPUT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + private static final DateTimeFormatter OUTPUT_FORMATTER = DateTimeFormatter.ofPattern("yyyy.MM"); private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy.MM.dd"); public static String dotFormatter(java.time.LocalDate date) { return (date != null) ? date.format(DATE_FORMATTER) : "N/A"; @@ -15,4 +19,29 @@ public static String koreanFormatter(java.time.LocalDateTime date) { return (date != null) ? date.format(DATE_TIME_FORMATTER) : "N/A"; } + + + public static String format(String dateStr) { + if (dateStr == null || dateStr.isBlank()) return null; + try { + LocalDate date = LocalDate.parse(dateStr, INPUT_FORMATTER); + return date.format(DATE_FORMATTER); + } catch (DateTimeParseException e) { + return dateStr; + } + } + + // yyyy.MM 형식 변환 + public static String formatToMonth(String dateStr) { + if (dateStr == null || dateStr.isBlank()) return null; + try { + LocalDate date = LocalDate.parse(dateStr, INPUT_FORMATTER); + return date.format(OUTPUT_FORMATTER); + } catch (DateTimeParseException e) { + return dateStr; + } + } + + + } diff --git a/src/main/java/stackpot/stackpot/pot/controller/MyPotController.java b/src/main/java/stackpot/stackpot/pot/controller/MyPotController.java index 2b83f62..37bfea0 100644 --- a/src/main/java/stackpot/stackpot/pot/controller/MyPotController.java +++ b/src/main/java/stackpot/stackpot/pot/controller/MyPotController.java @@ -2,6 +2,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -9,6 +10,7 @@ import stackpot.stackpot.badge.dto.CompletedPotBadgeResponseDto; import stackpot.stackpot.pot.dto.AppealContentDto; import stackpot.stackpot.pot.dto.OngoingPotResponseDto; +import stackpot.stackpot.pot.dto.PotNameUpdateRequestDto; import stackpot.stackpot.pot.service.pot.MyPotService; import stackpot.stackpot.pot.service.pot.PotCommandService; import java.util.List; @@ -80,4 +82,15 @@ public ResponseEntity> patchDelegate(@PathVariable("pot_id") String responseMessage = myPotService.patchDelegate(potId, memberId); return ResponseEntity.ok(ApiResponse.onSuccess(responseMessage)); } + + @Operation(summary = "팟 이름 수정 API") + @PatchMapping("/{pot_id}/rename") + public ResponseEntity> updatePotName( + @PathVariable Long pot_id, + @Valid @RequestBody PotNameUpdateRequestDto request + ) { + String res = potCommandService.updatePotName(pot_id, request); + return ResponseEntity.ok(ApiResponse.onSuccess(res)); + } + } diff --git a/src/main/java/stackpot/stackpot/pot/controller/PotController.java b/src/main/java/stackpot/stackpot/pot/controller/PotController.java index d5ffc77..33fe622 100644 --- a/src/main/java/stackpot/stackpot/pot/controller/PotController.java +++ b/src/main/java/stackpot/stackpot/pot/controller/PotController.java @@ -36,6 +36,7 @@ public class PotController { @Operation(summary = "팟 생성 API", description = """ - potStatus: RECRUITING / ONGOING / COMPLETED + - potStartDate, potEndDate: yyyy.MM 형식 (예: 2025.08) - potModeOfOperation: ONLINE / OFFLINE / HYBRID - Role: FRONTEND / BACKEND / DESIGN / PLANNING """) @@ -152,14 +153,5 @@ public ResponseEntity>> getMyRecruitingPots( return ResponseEntity.ok(ApiResponse.onSuccess(response)); } - @Operation(summary = "팟 이름 수정 API") - @PatchMapping("/{pot_id}/rename") - public ResponseEntity> updatePotName( - @PathVariable Long pot_id, - @Valid @RequestBody PotNameUpdateRequestDto request - ) { - String res = potCommandService.updatePotName(pot_id, request); - return ResponseEntity.ok(ApiResponse.onSuccess(res)); - } } diff --git a/src/main/java/stackpot/stackpot/pot/controller/PotMemberController.java b/src/main/java/stackpot/stackpot/pot/controller/PotMemberController.java index 2f3d228..720e790 100644 --- a/src/main/java/stackpot/stackpot/pot/controller/PotMemberController.java +++ b/src/main/java/stackpot/stackpot/pot/controller/PotMemberController.java @@ -25,7 +25,7 @@ public class PotMemberController { private final PotMemberCommandService potMemberCommandService; private final PotMemberQueryService potMemberQueryService; - @Operation(summary = "팟 멤버 정보 (KAKAOID, 닉네임) 조회 API") + @Operation(summary = "팟 멤버 정보 조회 API") @GetMapping public ResponseEntity>> getPotMembers( @PathVariable("pot_id") Long potId) { diff --git a/src/main/java/stackpot/stackpot/pot/converter/PotConverter.java b/src/main/java/stackpot/stackpot/pot/converter/PotConverter.java index a0acc7b..67eae43 100644 --- a/src/main/java/stackpot/stackpot/pot/converter/PotConverter.java +++ b/src/main/java/stackpot/stackpot/pot/converter/PotConverter.java @@ -30,8 +30,8 @@ public class PotConverter{ public Pot toEntity(PotRequestDto requestDto, User user) { return Pot.builder() .potName(requestDto.getPotName()) - .potStartDate(requestDto.getPotStartDate()) - .potEndDate(requestDto.getPotEndDate()) + .potStartDate(String.valueOf(requestDto.getPotStartDate())) + .potEndDate(String.valueOf(requestDto.getPotEndDate())) .potRecruitmentDeadline(requestDto.getPotRecruitmentDeadline()) .potLan(requestDto.getPotLan()) .potContent(requestDto.getPotContent()) @@ -45,8 +45,8 @@ public PotResponseDto toDto(Pot entity, List recruitmentD return PotResponseDto.builder() .potId(entity.getPotId()) .potName(entity.getPotName()) - .potStartDate(entity.getPotStartDate()) - .potEndDate(entity.getPotEndDate()) + .potStartDate(DateFormatter.format(entity.getPotStartDate())) + .potEndDate(DateFormatter.format(entity.getPotEndDate())) .potRecruitmentDeadline(entity.getPotRecruitmentDeadline()) .potLan(entity.getPotLan()) .potContent(entity.getPotContent()) @@ -94,8 +94,8 @@ public CompletedPotResponseDto toCompletedPotResponseDto(Pot pot, String formatt return CompletedPotResponseDto.builder() .potId(pot.getPotId()) .potName(pot.getPotName()) - .potStartDate(pot.getPotStartDate()) - .potEndDate(pot.getPotEndDate()) + .potStartDate(DateFormatter.format(pot.getPotStartDate())) + .potEndDate(DateFormatter.format(pot.getPotEndDate())) .potRecruitmentDeadline(pot.getPotRecruitmentDeadline()) .potLan(pot.getPotLan()) .members(formattedMembers) diff --git a/src/main/java/stackpot/stackpot/pot/converter/PotDetailConverter.java b/src/main/java/stackpot/stackpot/pot/converter/PotDetailConverter.java index 201a72b..0921d76 100644 --- a/src/main/java/stackpot/stackpot/pot/converter/PotDetailConverter.java +++ b/src/main/java/stackpot/stackpot/pot/converter/PotDetailConverter.java @@ -44,8 +44,8 @@ public PotDetailResponseDto toPotDetailResponseDto(User user, Pot pot, String re .isOwner(isOwner) .potId(pot.getPotId()) .potName(pot.getPotName()) - .potStartDate(pot.getPotStartDate()) - .potEndDate(pot.getPotEndDate()) + .potStartDate(DateFormatter.formatToMonth(pot.getPotStartDate())) + .potEndDate(DateFormatter.formatToMonth(pot.getPotEndDate())) .potRecruitmentDeadline(pot.getPotRecruitmentDeadline()) .potLan(pot.getPotLan()) .potStatus(pot.getPotStatus()) diff --git a/src/main/java/stackpot/stackpot/pot/converter/PotMemberConverter.java b/src/main/java/stackpot/stackpot/pot/converter/PotMemberConverter.java index 715037f..b0b59bd 100644 --- a/src/main/java/stackpot/stackpot/pot/converter/PotMemberConverter.java +++ b/src/main/java/stackpot/stackpot/pot/converter/PotMemberConverter.java @@ -10,9 +10,6 @@ import org.springframework.stereotype.Component; import stackpot.stackpot.user.entity.enums.Role; - -import java.util.Map; - @Component public class PotMemberConverter{ @@ -26,16 +23,6 @@ public PotMember toEntity(User user, Pot pot, PotApplication application, Boolea .appealContent(null) .build(); } - public PotMember toCreatorEntity(User user, Pot pot, Role role) { - return PotMember.builder() - .user(user) - .pot(pot) - .potApplication(null) - .roleName(role) - .owner(true) - .appealContent(null) - .build(); - } public PotMemberAppealResponseDto toDto(PotMember entity) { String roleName = entity.getRoleName() != null ? entity.getRoleName().name() : "멤버"; @@ -57,7 +44,6 @@ public PotMemberAppealResponseDto toDto(PotMember entity) { .roleName(roleName) .nickname(nicknameWithRole) .appealContent(entity.getAppealContent()) - .kakaoId(entity.getUser().getKakaoId()) .build(); } @@ -69,7 +55,6 @@ public PotMemberInfoResponseDto toKaKaoCreatorDto(PotMember entity) { .potMemberId(entity.getPotMemberId()) .nickname(nicknameWithRole) .potRole(entity.getRoleName().name()) - .kakaoId(null) .owner(true) .build(); } @@ -93,7 +78,6 @@ public PotMemberInfoResponseDto toKaKaoMemberDto(PotMember entity) { return PotMemberInfoResponseDto.builder() .potMemberId(entity.getPotMemberId()) .nickname(nicknameWithRole) - .kakaoId(entity.getUser().getKakaoId()) .owner(false) .potRole(roleName) .build(); diff --git a/src/main/java/stackpot/stackpot/pot/dto/PotMemberInfoResponseDto.java b/src/main/java/stackpot/stackpot/pot/dto/PotMemberInfoResponseDto.java index ddf0e68..4eb6167 100644 --- a/src/main/java/stackpot/stackpot/pot/dto/PotMemberInfoResponseDto.java +++ b/src/main/java/stackpot/stackpot/pot/dto/PotMemberInfoResponseDto.java @@ -9,7 +9,6 @@ public class PotMemberInfoResponseDto { private Long potMemberId; private String nickname; // 닉네임 + 역할 - private String kakaoId; private String potRole; private boolean owner; } diff --git a/src/main/java/stackpot/stackpot/pot/dto/PotRequestDto.java b/src/main/java/stackpot/stackpot/pot/dto/PotRequestDto.java index 0e53ba0..d62f88a 100644 --- a/src/main/java/stackpot/stackpot/pot/dto/PotRequestDto.java +++ b/src/main/java/stackpot/stackpot/pot/dto/PotRequestDto.java @@ -1,5 +1,6 @@ package stackpot.stackpot.pot.dto; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.persistence.Column; import jakarta.validation.constraints.NotBlank; import lombok.Builder; @@ -16,27 +17,34 @@ public class PotRequestDto { @NotBlank(message = "팟 이름은 필수입니다.") + @Schema(description = "팟 이름", example = "스터디용 백엔드 프로젝트") private String potName; + @Schema(description = "팟 시작 날짜 (yyyy.MM)", example = "2025.08") private String potStartDate; + @Schema(description = "팟 종료 날짜 (yyyy.MM)", example = "2025.10") private String potEndDate; + @Schema(description = "모집 마감일 (yyyy-MM-dd)", example = "2025-08-18") private LocalDate potRecruitmentDeadline; + @Schema(description = "팟 역할", example = "BACKEND") private Role potRole; @NotBlank(message = "사용 언어는 필수입니다.") + @Schema(description = "사용 언어", example = "Java") private String potLan; + @Schema(description = "팟 설명", example = "이 프로젝트는 REST API 서버를 구현하는 것을 목표로 합니다.") private String potContent; -// @NotBlank(message = "팟 상태는 필수입니다.") -// private String potStatus; - + @Schema(description = "운영 방식", example = "ONLINE") private String potModeOfOperation; + @Schema(description = "팟 요약", example = "백엔드 중심의 API 개발 스터디 프로젝트") private String potSummary; + @Schema(description = "모집 역할 리스트") private List recruitmentDetails; } diff --git a/src/main/java/stackpot/stackpot/user/service/UserCommandServiceImpl.java b/src/main/java/stackpot/stackpot/user/service/UserCommandServiceImpl.java index 094591a..a2e1656 100644 --- a/src/main/java/stackpot/stackpot/user/service/UserCommandServiceImpl.java +++ b/src/main/java/stackpot/stackpot/user/service/UserCommandServiceImpl.java @@ -253,7 +253,7 @@ public NicknameResponseDto createNickname() { log.debug("사용중인 닉네임 입니다.{}", nickname); } } - return new NicknameResponseDto(nickname); + return new NicknameResponseDto(nickname+" 새싹"); } @Override @@ -292,7 +292,7 @@ private String trimNickname(String nickname) { nickname = nickname.trim(); // 채소 이름 리스트 - String[] vegetables = {"버섯", "양파", "브로콜리", "당근"}; + String[] vegetables = {"버섯", "양파", "브로콜리", "당근", "새싹"}; for (String vegetable : vegetables) { if (nickname.contains(" " + vegetable)) {