diff --git a/src/main/java/Capstone/AutoScheduler/global/converter/GeneratorConverter.java b/src/main/java/Capstone/AutoScheduler/global/converter/GeneratorConverter.java index 2c13f98..4cb2e9c 100644 --- a/src/main/java/Capstone/AutoScheduler/global/converter/GeneratorConverter.java +++ b/src/main/java/Capstone/AutoScheduler/global/converter/GeneratorConverter.java @@ -14,6 +14,10 @@ public static Generator toGenerator(GeneratorRequestDTO.CreateGeneratorRequestDT return Generator.builder() .generatorTitle(request.getGeneratorTitle()) .generatorDetail(request.getGeneratorDetail()) + .frames(request.getFrames()) + .mapping(request.getMapping()) + .sourceType(request.getSourceType()) + .webUrl(request.getWebUrl()) .build(); } @@ -21,9 +25,14 @@ public static GeneratorResponseDTO.CreateGeneratorResultDTO toCreateResultDTO(Ge return GeneratorResponseDTO.CreateGeneratorResultDTO.builder() .generatorId(generator.getGeneratorId()) .memberId(generator.getMember().getMemberId()) - .sourceId(generator.getSource().getSourceId()) + .memberName(generator.getMember().getName()) + //.sourceId(generator.getSource().getSourceId()) + .sourceType(generator.getSourceType()) .generatorTitle(generator.getGeneratorTitle()) .generatorDetail(generator.getGeneratorDetail()) + .frames(generator.getFrames()) + .mapping(generator.getMapping()) + .webUrl(generator.getWebUrl()) .build(); } @@ -31,9 +40,14 @@ public static GeneratorResponseDTO.GeneratorDTO toGeneratorDTO(Generator generat return GeneratorResponseDTO.GeneratorDTO.builder() .generatorId(generator.getGeneratorId()) .memberId(generator.getMember().getMemberId()) - .sourceId(generator.getSource().getSourceId()) + .memberName(generator.getMember().getName()) + //.sourceId(generator.getSource().getSourceId()) + .sourceType(generator.getSourceType()) .generatorTitle(generator.getGeneratorTitle()) .generatorDetail(generator.getGeneratorDetail()) + .frames(generator.getFrames()) + .mapping(generator.getMapping()) + .webUrl(generator.getWebUrl()) .build(); } @@ -41,9 +55,14 @@ public static GeneratorResponseDTO.GeneratorPreviewDTO toGeneratorPreviewDTO(Gen return GeneratorResponseDTO.GeneratorPreviewDTO.builder() .generatorId(generator.getGeneratorId()) .memberId(generator.getMember().getMemberId()) - .sourceId(generator.getSource().getSourceId()) + .memberName(generator.getMember().getName()) + //.sourceId(generator.getSource().getSourceId()) + .sourceType(generator.getSourceType()) .generatorTitle(generator.getGeneratorTitle()) .generatorDetail(generator.getGeneratorDetail()) + .frames(generator.getFrames()) + .mapping(generator.getMapping()) + .webUrl(generator.getWebUrl()) .build(); } diff --git a/src/main/java/Capstone/AutoScheduler/global/converter/JsonConverter.java b/src/main/java/Capstone/AutoScheduler/global/converter/JsonConverter.java new file mode 100644 index 0000000..18e45f0 --- /dev/null +++ b/src/main/java/Capstone/AutoScheduler/global/converter/JsonConverter.java @@ -0,0 +1,36 @@ +package Capstone.AutoScheduler.global.converter; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +@Converter +public class JsonConverter implements AttributeConverter>, String> { + + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public String convertToDatabaseColumn(List> attribute) { + try { + return objectMapper.writeValueAsString(attribute); + } catch (JsonProcessingException e) { + throw new IllegalArgumentException("JSON 직렬화 오류", e); + } + } + + @Override + public List> convertToEntityAttribute(String dbData) { + try { + return objectMapper.readValue(dbData, new TypeReference>>() {}); + } catch (IOException e) { + throw new IllegalArgumentException("JSON 역직렬화 오류", e); + } + } +} + diff --git a/src/main/java/Capstone/AutoScheduler/global/domain/entity/Generator.java b/src/main/java/Capstone/AutoScheduler/global/domain/entity/Generator.java index d339365..6655ae3 100644 --- a/src/main/java/Capstone/AutoScheduler/global/domain/entity/Generator.java +++ b/src/main/java/Capstone/AutoScheduler/global/domain/entity/Generator.java @@ -1,12 +1,16 @@ package Capstone.AutoScheduler.global.domain.entity; +import Capstone.AutoScheduler.global.converter.JsonConverter; import Capstone.AutoScheduler.global.domain.common.BaseEntity; +import Capstone.AutoScheduler.global.domain.enums.TypeSource; import jakarta.persistence.*; import lombok.*; + import java.util.ArrayList; import java.util.List; +import java.util.Map; @Entity @Getter @@ -25,9 +29,13 @@ public class Generator extends BaseEntity { @JoinColumn(name = "member_id", nullable = false) private Member member; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "source_id", nullable = false) - private Source source; +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "source_id", nullable = false) +// private Source source; + + @Enumerated(EnumType.STRING) + @Column(name = "source_type", nullable = false, columnDefinition = "varchar(256)") + private TypeSource sourceType; @Column(name = "generator_title", nullable = false, columnDefinition = "varchar(256)") private String generatorTitle; @@ -35,6 +43,25 @@ public class Generator extends BaseEntity { @Column(name = "generator_detail", nullable = false, columnDefinition = "varchar(256)") private String generatorDetail; +// // frames 배열(string) +// @Column(name = "frames", nullable = false, columnDefinition = "TEXT") +// private String frames; +// // mapping 배열(string) +// @Column(name = "mapping", nullable = false, columnDefinition = "TEXT") +// private String mapping; + + // JSON 데이터를 문자열로 저장 + @Convert(converter = JsonConverter.class) + @Column(name = "frames", nullable = false, columnDefinition = "TEXT") + private List> frames; + + @Convert(converter = JsonConverter.class) + @Column(name = "mapping", nullable = false, columnDefinition = "TEXT") + private List> mapping; + + // SourceType web일 경우 해당 URL + @Column(name = "webUrl", nullable = true, columnDefinition = "varchar(512)") + private String webUrl; // 해당 일정 생성기로 생성한 Event 리스트 @OneToMany(mappedBy = "generator", cascade = CascadeType.ALL, orphanRemoval = true) diff --git a/src/main/java/Capstone/AutoScheduler/global/service/GeneratorService/GeneratorCommandService.java b/src/main/java/Capstone/AutoScheduler/global/service/GeneratorService/GeneratorCommandService.java index 79a8efa..893ee5d 100644 --- a/src/main/java/Capstone/AutoScheduler/global/service/GeneratorService/GeneratorCommandService.java +++ b/src/main/java/Capstone/AutoScheduler/global/service/GeneratorService/GeneratorCommandService.java @@ -5,7 +5,7 @@ public interface GeneratorCommandService { // 일정 생성기 저장 - Generator createGenerator(Long memberId, Long sourceId, GeneratorRequestDTO.CreateGeneratorRequestDTO request); + Generator createGenerator(Long memberId, GeneratorRequestDTO.CreateGeneratorRequestDTO request); diff --git a/src/main/java/Capstone/AutoScheduler/global/service/GeneratorService/GeneratorCommandServiceImpl.java b/src/main/java/Capstone/AutoScheduler/global/service/GeneratorService/GeneratorCommandServiceImpl.java index 1e23f49..ef99515 100644 --- a/src/main/java/Capstone/AutoScheduler/global/service/GeneratorService/GeneratorCommandServiceImpl.java +++ b/src/main/java/Capstone/AutoScheduler/global/service/GeneratorService/GeneratorCommandServiceImpl.java @@ -25,13 +25,13 @@ public class GeneratorCommandServiceImpl implements GeneratorCommandService { private final BookmarkCommandService bookmarkCommandService; @Override - public Generator createGenerator(Long memberId, Long sourceId, GeneratorRequestDTO.CreateGeneratorRequestDTO request) { + public Generator createGenerator(Long memberId, GeneratorRequestDTO.CreateGeneratorRequestDTO request) { Generator newGenerator = GeneratorConverter.toGenerator(request); Member getMember = memberRepository.findById(memberId).orElseThrow(() -> new IllegalArgumentException("해당 멤버가 존재하지 않습니다.")); newGenerator.setMember(getMember); - Source getSource = sourceRepository.findById(sourceId).orElseThrow(() -> new IllegalArgumentException("해당 소스가 존재하지 않습니다.")); - newGenerator.setSource(getSource); +// Source getSource = sourceRepository.findById(sourceId).orElseThrow(() -> new IllegalArgumentException("해당 소스가 존재하지 않습니다.")); +// newGenerator.setSource(getSource); Generator savedGenerator = generateRepository.save(newGenerator); diff --git a/src/main/java/Capstone/AutoScheduler/global/web/controller/EventController.java b/src/main/java/Capstone/AutoScheduler/global/web/controller/EventController.java index 67d5d5f..6702e4a 100644 --- a/src/main/java/Capstone/AutoScheduler/global/web/controller/EventController.java +++ b/src/main/java/Capstone/AutoScheduler/global/web/controller/EventController.java @@ -16,6 +16,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.ArrayList; import java.util.List; @RestController @@ -78,4 +79,29 @@ public ApiResponse findEventByMemberAndE return ApiResponse.onSuccess(SuccessStatus.EVENT_OK, EventConverter.toMemberEventPreviewDTO(event)); } +// @PostMapping("/event/multipleEvents/{memberId}/{generatorId}") +// @Operation(summary = "자동 생성된 모든 일정 저장하기", description = "일정 생성기에서 자동 생성된 개별 일정을 모두 저장합니다.") +// public ApiResponse> createIndividualEventsFromList( +// @PathVariable Long memberId, +// @PathVariable Long generatorId, +// @RequestBody List multiEventRequests) { +// +// // 저장된 이벤트 결과를 담을 리스트 +// List createdEvents = new ArrayList<>(); +// +// // 요청된 각 일정 데이터를 처리 +// for (EventRequestDTO.CreateEventRequestDTO request : multiEventRequests) { +// // EventCommandService를 통해 개별 이벤트 생성 +// Event newEvent = eventCommandService.createIndividualEventFromList(memberId, generatorId, request); +// +// // 생성된 이벤트를 DTO로 변환하여 결과 리스트에 추가 +// createdEvents.add(EventConverter.toCreateResultDTO(newEvent)); +// } +// +// // 성공 응답 반환 +// return ApiResponse.onSuccess(SuccessStatus.EVENT_OK, createdEvents); +// } + + + } diff --git a/src/main/java/Capstone/AutoScheduler/global/web/controller/GeneratorController.java b/src/main/java/Capstone/AutoScheduler/global/web/controller/GeneratorController.java index 487f067..d2cb3f0 100644 --- a/src/main/java/Capstone/AutoScheduler/global/web/controller/GeneratorController.java +++ b/src/main/java/Capstone/AutoScheduler/global/web/controller/GeneratorController.java @@ -38,10 +38,10 @@ public class GeneratorController { @Operation(summary = "일정 생성기 생성하기", description = "일정 생성기를 생성합니다.") public ApiResponse generatorCreate( @RequestParam Long memberId, - @RequestParam Long sourceId, + //@RequestParam Long sourceId, @RequestBody GeneratorRequestDTO.CreateGeneratorRequestDTO request ){ - Generator newGenerator = generatorCommandService.createGenerator(memberId, sourceId, request); + Generator newGenerator = generatorCommandService.createGenerator(memberId, request); return ApiResponse.onSuccess( SuccessStatus.GENERATOR_OK, GeneratorConverter.toCreateResultDTO(newGenerator) diff --git a/src/main/java/Capstone/AutoScheduler/global/web/dto/Frame/FrameRequestDTO.java b/src/main/java/Capstone/AutoScheduler/global/web/dto/Frame/FrameRequestDTO.java new file mode 100644 index 0000000..c75d82f --- /dev/null +++ b/src/main/java/Capstone/AutoScheduler/global/web/dto/Frame/FrameRequestDTO.java @@ -0,0 +1,36 @@ +package Capstone.AutoScheduler.global.web.dto.Frame; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FrameRequestDTO { + private Long id; + private List title; + private List date; + private List detail; + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class DateDetailDTO { + private String type; + private Long startBubbleId; + private List childOperations; + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class DetailDTO { + private String type; + private Long startBubbleId; + private List childOperations; + } +} + diff --git a/src/main/java/Capstone/AutoScheduler/global/web/dto/Frame/FrameResponseDTO.java b/src/main/java/Capstone/AutoScheduler/global/web/dto/Frame/FrameResponseDTO.java new file mode 100644 index 0000000..7f07b17 --- /dev/null +++ b/src/main/java/Capstone/AutoScheduler/global/web/dto/Frame/FrameResponseDTO.java @@ -0,0 +1,4 @@ +package Capstone.AutoScheduler.global.web.dto.Frame; + +public class FrameResponseDTO { +} diff --git a/src/main/java/Capstone/AutoScheduler/global/web/dto/Generator/GeneratorRequestDTO.java b/src/main/java/Capstone/AutoScheduler/global/web/dto/Generator/GeneratorRequestDTO.java index a8649b9..58dfacd 100644 --- a/src/main/java/Capstone/AutoScheduler/global/web/dto/Generator/GeneratorRequestDTO.java +++ b/src/main/java/Capstone/AutoScheduler/global/web/dto/Generator/GeneratorRequestDTO.java @@ -1,10 +1,14 @@ package Capstone.AutoScheduler.global.web.dto.Generator; +import Capstone.AutoScheduler.global.domain.enums.TypeSource; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import java.util.List; +import java.util.Map; + public class GeneratorRequestDTO { @Getter @@ -14,5 +18,12 @@ public class GeneratorRequestDTO { public static class CreateGeneratorRequestDTO { private String generatorTitle; private String generatorDetail; + //private String frames; + //private String mapping; + // JSON 데이터를 리스트로 처리 + private List> frames; + private List> mapping; + private TypeSource sourceType; + private String webUrl; } } diff --git a/src/main/java/Capstone/AutoScheduler/global/web/dto/Generator/GeneratorResponseDTO.java b/src/main/java/Capstone/AutoScheduler/global/web/dto/Generator/GeneratorResponseDTO.java index 63a1a39..bea6531 100644 --- a/src/main/java/Capstone/AutoScheduler/global/web/dto/Generator/GeneratorResponseDTO.java +++ b/src/main/java/Capstone/AutoScheduler/global/web/dto/Generator/GeneratorResponseDTO.java @@ -1,11 +1,13 @@ package Capstone.AutoScheduler.global.web.dto.Generator; +import Capstone.AutoScheduler.global.domain.enums.TypeSource; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import java.util.List; +import java.util.Map; public class GeneratorResponseDTO { @@ -16,9 +18,17 @@ public class GeneratorResponseDTO { public static class CreateGeneratorResultDTO { Long generatorId; Long memberId; - Long sourceId; + String memberName; + //Long sourceId; + TypeSource sourceType; String generatorTitle; String generatorDetail; + //String frames; + //String mapping; + // JSON 데이터를 List>로 처리 + List> frames; + List> mapping; + String webUrl; } @Getter @@ -28,9 +38,17 @@ public static class CreateGeneratorResultDTO { public static class GeneratorDTO { Long generatorId; Long memberId; - Long sourceId; + String memberName; + //Long sourceId; + TypeSource sourceType; String generatorTitle; String generatorDetail; + //String frames; + //String mapping; + // JSON 데이터를 List>로 처리 + List> frames; + List> mapping; + String webUrl; } @Getter @@ -40,9 +58,16 @@ public static class GeneratorDTO { public static class GeneratorPreviewDTO { Long generatorId; Long memberId; - Long sourceId; + String memberName; + TypeSource sourceType; String generatorTitle; String generatorDetail; + //String frames; + //String mapping; + // JSON 데이터를 List>로 처리 + List> frames; + List> mapping; + String webUrl; } @Builder