Skip to content
Merged
29 changes: 29 additions & 0 deletions src/main/java/stackpot/stackpot/common/util/DateFormatter.java
Original file line number Diff line number Diff line change
@@ -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";
Expand All @@ -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;
}
}



}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@

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.*;
import stackpot.stackpot.apiPayload.ApiResponse;
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;
Expand Down Expand Up @@ -80,4 +82,15 @@ public ResponseEntity<ApiResponse<String>> 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<ApiResponse<String>> updatePotName(
@PathVariable Long pot_id,
@Valid @RequestBody PotNameUpdateRequestDto request
) {
String res = potCommandService.updatePotName(pot_id, request);
return ResponseEntity.ok(ApiResponse.onSuccess(res));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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
""")
Expand Down Expand Up @@ -152,14 +153,5 @@ public ResponseEntity<ApiResponse<Map<String, Object>>> getMyRecruitingPots(
return ResponseEntity.ok(ApiResponse.onSuccess(response));
}

@Operation(summary = "팟 이름 수정 API")
@PatchMapping("/{pot_id}/rename")
public ResponseEntity<ApiResponse<String>> updatePotName(
@PathVariable Long pot_id,
@Valid @RequestBody PotNameUpdateRequestDto request
) {
String res = potCommandService.updatePotName(pot_id, request);
return ResponseEntity.ok(ApiResponse.onSuccess(res));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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<ApiResponse<List<PotMemberInfoResponseDto>>> getPotMembers(
@PathVariable("pot_id") Long potId) {
Expand Down
12 changes: 6 additions & 6 deletions src/main/java/stackpot/stackpot/pot/converter/PotConverter.java
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand All @@ -45,8 +45,8 @@ public PotResponseDto toDto(Pot entity, List<PotRecruitmentDetails> 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())
Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,6 @@
import org.springframework.stereotype.Component;
import stackpot.stackpot.user.entity.enums.Role;


import java.util.Map;

@Component
public class PotMemberConverter{

Expand All @@ -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() : "멤버";
Expand All @@ -57,7 +44,6 @@ public PotMemberAppealResponseDto toDto(PotMember entity) {
.roleName(roleName)
.nickname(nicknameWithRole)
.appealContent(entity.getAppealContent())
.kakaoId(entity.getUser().getKakaoId())
.build();
}

Expand All @@ -69,7 +55,6 @@ public PotMemberInfoResponseDto toKaKaoCreatorDto(PotMember entity) {
.potMemberId(entity.getPotMemberId())
.nickname(nicknameWithRole)
.potRole(entity.getRoleName().name())
.kakaoId(null)
.owner(true)
.build();
}
Expand All @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
public class PotMemberInfoResponseDto {
private Long potMemberId;
private String nickname; // 닉네임 + 역할
private String kakaoId;
private String potRole;
private boolean owner;
}
14 changes: 11 additions & 3 deletions src/main/java/stackpot/stackpot/pot/dto/PotRequestDto.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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<PotRecruitmentRequestDto> recruitmentDetails;
}
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ public NicknameResponseDto createNickname() {
log.debug("사용중인 닉네임 입니다.{}", nickname);
}
}
return new NicknameResponseDto(nickname);
return new NicknameResponseDto(nickname+" 새싹");
}

@Override
Expand Down Expand Up @@ -292,7 +292,7 @@ private String trimNickname(String nickname) {
nickname = nickname.trim();

// 채소 이름 리스트
String[] vegetables = {"버섯", "양파", "브로콜리", "당근"};
String[] vegetables = {"버섯", "양파", "브로콜리", "당근", "새싹"};

for (String vegetable : vegetables) {
if (nickname.contains(" " + vegetable)) {
Expand Down