회의록 템플릿 선택 API 개발

This commit is contained in:
cyjadela
2025-10-24 15:30:05 +09:00
parent cf313259a5
commit 419bab493e
6 changed files with 679 additions and 6 deletions
@@ -123,4 +123,11 @@ public class Meeting {
this.participants.add(participantEmail);
}
}
/**
* 템플릿 적용
*/
public void applyTemplate(String templateId) {
this.templateId = templateId;
}
}
@@ -0,0 +1,44 @@
package com.unicorn.hgzero.meeting.biz.service;
import com.unicorn.hgzero.meeting.biz.domain.Meeting;
import com.unicorn.hgzero.meeting.biz.usecase.in.meeting.ApplyTemplateUseCase;
import com.unicorn.hgzero.meeting.biz.usecase.out.MeetingReader;
import com.unicorn.hgzero.meeting.biz.usecase.out.MeetingWriter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* 회의록 템플릿 적용 서비스
*/
@Service
@RequiredArgsConstructor
@Slf4j
@Transactional
public class ApplyTemplateService implements ApplyTemplateUseCase {
private final MeetingReader meetingReader;
private final MeetingWriter meetingWriter;
@Override
public Meeting applyTemplate(ApplyTemplateCommand command) {
log.debug("템플릿 적용 시작 - meetingId: {}, templateId: {}",
command.meetingId(), command.templateId());
// 회의 조회
Meeting meeting = meetingReader.findById(command.meetingId())
.orElseThrow(() -> new IllegalArgumentException("회의를 찾을 수 없습니다: " + command.meetingId()));
// 템플릿 적용 (회의 도메인에서 처리)
meeting.applyTemplate(command.templateId());
// 회의 정보 업데이트
Meeting updatedMeeting = meetingWriter.save(meeting);
log.debug("템플릿 적용 완료 - meetingId: {}, templateId: {}",
command.meetingId(), command.templateId());
return updatedMeeting;
}
}
@@ -0,0 +1,25 @@
package com.unicorn.hgzero.meeting.biz.usecase.in.meeting;
import com.unicorn.hgzero.meeting.biz.domain.Meeting;
/**
* 회의록 템플릿 적용 UseCase
*/
public interface ApplyTemplateUseCase {
/**
* 회의에 템플릿을 적용
*
* @param command 템플릿 적용 명령
* @return 업데이트된 회의 정보
*/
Meeting applyTemplate(ApplyTemplateCommand command);
/**
* 템플릿 적용 명령
*/
record ApplyTemplateCommand(
String meetingId,
String templateId
) {}
}
@@ -38,6 +38,7 @@ public class MeetingController {
private final GetMeetingUseCase getMeetingUseCase;
private final CancelMeetingUseCase cancelMeetingUseCase;
private final InviteParticipantUseCase inviteParticipantUseCase;
private final ApplyTemplateUseCase applyTemplateUseCase;
/**
* 회의 예약
@@ -112,11 +113,17 @@ public class MeetingController {
log.info("템플릿 적용 요청 - meetingId: {}, templateId: {}", meetingId, request.getTemplateId());
var meetingData = getMeetingUseCase.getMeeting(meetingId);
var meetingData = applyTemplateUseCase.applyTemplate(
new ApplyTemplateUseCase.ApplyTemplateCommand(
meetingId,
request.getTemplateId()
)
);
var meetingDTO = MeetingDTO.from(meetingData);
var response = MeetingResponse.from(meetingDTO);
log.info("템플릿 적용 완료 - meetingId: {}", meetingId);
log.info("템플릿 적용 완료 - meetingId: {}, templateId: {}", meetingId, request.getTemplateId());
return ResponseEntity.ok(ApiResponse.success(response));
}
@@ -17,9 +17,7 @@ import jakarta.validation.constraints.NotBlank;
public class SelectTemplateRequest {
@NotBlank(message = "템플릿 ID는 필수입니다")
@Schema(description = "템플릿 ID", example = "template-001", required = true)
@Schema(description = "템플릿 ID", example = "general", required = true,
allowableValues = {"general", "scrum", "kickoff", "weekly"})
private String templateId;
@Schema(description = "커스터마이징 옵션", example = "섹션 순서 변경 또는 추가 섹션 포함")
private String customization;
}