From 72c4dad7134374c976d01eb51a93b1223f9ca527 Mon Sep 17 00:00:00 2001 From: 10Hyuna Date: Wed, 19 Feb 2025 01:48:07 +0900 Subject: [PATCH 1/6] =?UTF-8?q?Settings:=20=EA=B8=B0=EB=8A=A5=EC=97=90=20?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=9C=20=ED=8F=B4=EB=8D=94=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EA=B5=AC=EC=B6=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 6148 -> 6148 bytes build.gradle | 1 + .../bamboo/log/diary/api/DiaryController.java | 4 ++++ .../com/bamboo/log/diary/domain/Diary.java | 4 ++++ .../diary/dto/request/CreateDiaryRequest.java | 4 ++++ .../dto/response/CreateDiaryResponse.java | 4 ++++ .../log/diary/repository/DiaryRepository.java | 4 ++++ .../log/diary/service/DiaryService.java | 4 ++++ .../log/diary/service/DiaryServiceImpl.java | 4 ++++ 9 files changed, 29 insertions(+) create mode 100644 src/main/java/com/bamboo/log/diary/api/DiaryController.java create mode 100644 src/main/java/com/bamboo/log/diary/domain/Diary.java create mode 100644 src/main/java/com/bamboo/log/diary/dto/request/CreateDiaryRequest.java create mode 100644 src/main/java/com/bamboo/log/diary/dto/response/CreateDiaryResponse.java create mode 100644 src/main/java/com/bamboo/log/diary/repository/DiaryRepository.java create mode 100644 src/main/java/com/bamboo/log/diary/service/DiaryService.java create mode 100644 src/main/java/com/bamboo/log/diary/service/DiaryServiceImpl.java diff --git a/.DS_Store b/.DS_Store index dd46a9923d3511c0ddce67c1cc0fd4f8a0b2c125..5770197c32987a55423285d0d1e1dddc77abfd3b 100644 GIT binary patch delta 71 zcmZoMXfc=|#>B)qu~2NHo+2a1#(>?7j2x4BSc)ezvYy!domGHoW5Wif&Fmcf96)88 Z1v$PmPv#eKB!ku~2NHo+2a9#(>?7iw`g}G4f32VJc>1pWMYH6UAu9z`(HVKNtX6 z3=FIcdJLHiDGaF$iJm$6$w@i+NkCBn1_s7yKpItL5<@9aZ4N^Us!9ekph~03B}|v) z*%>?-Tp4^A0)VFGqN`(kx7mVOo@p~X2R{eUotrl@e`lV|FXG6-$iTn^G=gDsgvc6Z E0A!UiL;wH) diff --git a/build.gradle b/build.gradle index b68e796..0b91e79 100644 --- a/build.gradle +++ b/build.gradle @@ -33,6 +33,7 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + implementation 'org.modelmapper:modelmapper:3.0.0' } tasks.named('test') { diff --git a/src/main/java/com/bamboo/log/diary/api/DiaryController.java b/src/main/java/com/bamboo/log/diary/api/DiaryController.java new file mode 100644 index 0000000..6aedbef --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/api/DiaryController.java @@ -0,0 +1,4 @@ +package com.bamboo.log.diary.api; + +public class DiaryController { +} diff --git a/src/main/java/com/bamboo/log/diary/domain/Diary.java b/src/main/java/com/bamboo/log/diary/domain/Diary.java new file mode 100644 index 0000000..5b556f3 --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/domain/Diary.java @@ -0,0 +1,4 @@ +package com.bamboo.log.diary.domain; + +public class Diary { +} diff --git a/src/main/java/com/bamboo/log/diary/dto/request/CreateDiaryRequest.java b/src/main/java/com/bamboo/log/diary/dto/request/CreateDiaryRequest.java new file mode 100644 index 0000000..5aaff48 --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/dto/request/CreateDiaryRequest.java @@ -0,0 +1,4 @@ +package com.bamboo.log.diary.dto.request; + +public record CreateDiaryRequest() { +} diff --git a/src/main/java/com/bamboo/log/diary/dto/response/CreateDiaryResponse.java b/src/main/java/com/bamboo/log/diary/dto/response/CreateDiaryResponse.java new file mode 100644 index 0000000..13cdbf6 --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/dto/response/CreateDiaryResponse.java @@ -0,0 +1,4 @@ +package com.bamboo.log.diary.dto.response; + +public record CreateDiaryResponse() { +} diff --git a/src/main/java/com/bamboo/log/diary/repository/DiaryRepository.java b/src/main/java/com/bamboo/log/diary/repository/DiaryRepository.java new file mode 100644 index 0000000..977e763 --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/repository/DiaryRepository.java @@ -0,0 +1,4 @@ +package com.bamboo.log.diary.repository; + +public class DiaryRepository { +} diff --git a/src/main/java/com/bamboo/log/diary/service/DiaryService.java b/src/main/java/com/bamboo/log/diary/service/DiaryService.java new file mode 100644 index 0000000..294457e --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/service/DiaryService.java @@ -0,0 +1,4 @@ +package com.bamboo.log.diary.service; + +public interface DiaryService { +} diff --git a/src/main/java/com/bamboo/log/diary/service/DiaryServiceImpl.java b/src/main/java/com/bamboo/log/diary/service/DiaryServiceImpl.java new file mode 100644 index 0000000..d621725 --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/service/DiaryServiceImpl.java @@ -0,0 +1,4 @@ +package com.bamboo.log.diary.service; + +public class DiaryServiceImpl { +} From 0b70c05badae6fa52be8a51fe826f6b6dd016691 Mon Sep 17 00:00:00 2001 From: 10Hyuna Date: Wed, 19 Feb 2025 01:50:05 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20Request=20Form=20DTO=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bamboo/log/diary/dto/request/CreateDiaryRequest.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/bamboo/log/diary/dto/request/CreateDiaryRequest.java b/src/main/java/com/bamboo/log/diary/dto/request/CreateDiaryRequest.java index 5aaff48..084708d 100644 --- a/src/main/java/com/bamboo/log/diary/dto/request/CreateDiaryRequest.java +++ b/src/main/java/com/bamboo/log/diary/dto/request/CreateDiaryRequest.java @@ -1,4 +1,9 @@ package com.bamboo.log.diary.dto.request; -public record CreateDiaryRequest() { +import jakarta.validation.constraints.NotEmpty; + +import java.util.List; + +public record CreateDiaryRequest(@NotEmpty(message = "User's Id shouldn't be empty") String userId, + @NotEmpty(message = "Diary Description shouldn't be empty") String diaryDetail) { } From 1f58a4a6f27dfc3a212a397f87c04b7ff7e30ed2 Mon Sep 17 00:00:00 2001 From: 10Hyuna Date: Wed, 19 Feb 2025 01:50:47 +0900 Subject: [PATCH 3/6] =?UTF-8?q?Feat:=20Response=20Form=20DTO=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bamboo/log/diary/dto/response/CreateDiaryResponse.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/bamboo/log/diary/dto/response/CreateDiaryResponse.java b/src/main/java/com/bamboo/log/diary/dto/response/CreateDiaryResponse.java index 13cdbf6..9e994c0 100644 --- a/src/main/java/com/bamboo/log/diary/dto/response/CreateDiaryResponse.java +++ b/src/main/java/com/bamboo/log/diary/dto/response/CreateDiaryResponse.java @@ -1,4 +1,8 @@ package com.bamboo.log.diary.dto.response; -public record CreateDiaryResponse() { +import jakarta.validation.constraints.NotEmpty; + +import java.time.LocalDateTime; + +public record CreateDiaryResponse(@NotEmpty(message = "created shouldn't be empty") LocalDateTime created) { } From 886f64481b5c39d301a5c284d19796749fa28469 Mon Sep 17 00:00:00 2001 From: 10Hyuna Date: Sun, 23 Feb 2025 23:32:43 +0900 Subject: [PATCH 4/6] =?UTF-8?q?Feat:=20Img=20generator=20=EC=9E=84?= =?UTF-8?q?=EC=8B=9C=20=EC=97=B0=EA=B2=B0=20=EB=A1=9C=EC=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 42 ++++++++--- .../bamboo/log/diary/api/DiaryController.java | 29 ++++++++ .../com/bamboo/log/diary/domain/Diary.java | 29 ++++++++ .../bamboo/log/diary/domain/TodaySummary.java | 29 ++++++++ .../log/diary/repository/DiaryRepository.java | 5 +- .../repository/TodaySummaryRepository.java | 7 ++ .../log/diary/service/DiaryService.java | 4 -- .../log/diary/service/DiaryServiceImpl.java | 4 -- .../log/diary/service/diary/DiaryService.java | 10 +++ .../diary/service/diary/DiaryServiceImpl.java | 70 +++++++++++++++++++ .../diary/service/mock/MockUserService.java | 12 ++++ .../log/diary/service/mock/UserService.java | 5 ++ .../service/summary/TodaySummaryService.java | 11 +++ .../summary/TodaySummaryServiceImpl.java | 46 ++++++++++++ .../log/elice/config/RestTemplateConfig.java | 14 ++++ .../elice/service/ImageGenerationService.java | 58 +++++++++++++++ .../com/bamboo/log/utils/ResponseHandler.java | 51 ++++++++++++++ .../com/bamboo/log/utils/SecurityConfig.java | 23 ++++++ .../bamboo/log/utils/dto/DetailResponse.java | 13 ++++ .../bamboo/log/utils/dto/ResponseForm.java | 21 ++++++ src/main/resources/application.yml | 20 ++++-- 21 files changed, 480 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/bamboo/log/diary/domain/TodaySummary.java create mode 100644 src/main/java/com/bamboo/log/diary/repository/TodaySummaryRepository.java delete mode 100644 src/main/java/com/bamboo/log/diary/service/DiaryService.java delete mode 100644 src/main/java/com/bamboo/log/diary/service/DiaryServiceImpl.java create mode 100644 src/main/java/com/bamboo/log/diary/service/diary/DiaryService.java create mode 100644 src/main/java/com/bamboo/log/diary/service/diary/DiaryServiceImpl.java create mode 100644 src/main/java/com/bamboo/log/diary/service/mock/MockUserService.java create mode 100644 src/main/java/com/bamboo/log/diary/service/mock/UserService.java create mode 100644 src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryService.java create mode 100644 src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryServiceImpl.java create mode 100644 src/main/java/com/bamboo/log/elice/config/RestTemplateConfig.java create mode 100644 src/main/java/com/bamboo/log/elice/service/ImageGenerationService.java create mode 100644 src/main/java/com/bamboo/log/utils/ResponseHandler.java create mode 100644 src/main/java/com/bamboo/log/utils/SecurityConfig.java create mode 100644 src/main/java/com/bamboo/log/utils/dto/DetailResponse.java create mode 100644 src/main/java/com/bamboo/log/utils/dto/ResponseForm.java diff --git a/build.gradle b/build.gradle index 0b91e79..56f4f0e 100644 --- a/build.gradle +++ b/build.gradle @@ -24,16 +24,38 @@ repositories { } dependencies { - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'org.springframework.boot:spring-boot-starter-validation' - developmentOnly 'org.springframework.boot:spring-boot-devtools' - compileOnly 'org.projectlombok:lombok' - runtimeOnly 'com.mysql:mysql-connector-j' - annotationProcessor 'org.projectlombok:lombok' - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher' - implementation 'org.modelmapper:modelmapper:3.0.0' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa:3.0.4' + implementation 'org.springframework.boot:spring-boot-starter-web:3.1.0' + testImplementation 'org.projectlombok:lombok:1.18.26' + compileOnly 'org.projectlombok:lombok:1.18.26' + runtimeOnly 'com.mysql:mysql-connector-j:8.0.32' + annotationProcessor 'org.projectlombok:lombok:1.18.26' + testImplementation 'org.springframework.boot:spring-boot-starter-test:3.1.0' + + implementation 'org.hibernate.validator:hibernate-validator:8.0.1.Final' + implementation 'jakarta.validation:jakarta.validation-api:3.0.2' + + implementation 'com.squareup.okhttp3:okhttp:4.9.3' + + // Spring Doc + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.4' + + // Spring Security + implementation 'org.springframework.boot:spring-boot-starter-security:3.0.4' + + // JWT + implementation 'io.jsonwebtoken:jjwt-api:0.11.5' + implementation 'io.jsonwebtoken:jjwt-impl:0.11.5' + implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5' + + // chatGPT API + implementation 'io.github.flashvayne:chatgpt-spring-boot-starter:1.0.4' + + // JSON 라이브러리 + implementation 'org.json:json:20230227' + + implementation 'org.springframework:spring-test:6.0.6' + testImplementation 'org.springframework.boot:spring-boot-starter-test:3.1.0' } tasks.named('test') { diff --git a/src/main/java/com/bamboo/log/diary/api/DiaryController.java b/src/main/java/com/bamboo/log/diary/api/DiaryController.java index 6aedbef..0b4e1c5 100644 --- a/src/main/java/com/bamboo/log/diary/api/DiaryController.java +++ b/src/main/java/com/bamboo/log/diary/api/DiaryController.java @@ -1,4 +1,33 @@ package com.bamboo.log.diary.api; +import com.bamboo.log.diary.dto.request.CreateDiaryRequest; +import com.bamboo.log.diary.service.diary.DiaryService; +import com.bamboo.log.utils.ResponseHandler; +import com.bamboo.log.utils.dto.ResponseForm; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import io.swagger.v3.oas.annotations.tags.Tag; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/diary") +@Tag(name = "Diary API", description = "일기 관련 API") public class DiaryController { + + private final DiaryService diaryService; + + @Operation(summary = "랜덤 주제 조회") + @PostMapping("/create") + public ResponseEntity lookupRandomTopics(@RequestBody CreateDiaryRequest createDiaryRequest) { + try { + return diaryService.createDiary(createDiaryRequest); + } catch (Exception e) { + return ResponseHandler.create500Error(new ResponseForm(), e); + } + } } diff --git a/src/main/java/com/bamboo/log/diary/domain/Diary.java b/src/main/java/com/bamboo/log/diary/domain/Diary.java index 5b556f3..c820a2c 100644 --- a/src/main/java/com/bamboo/log/diary/domain/Diary.java +++ b/src/main/java/com/bamboo/log/diary/domain/Diary.java @@ -1,4 +1,33 @@ package com.bamboo.log.diary.domain; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Entity +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Table(name = "diaries") public class Diary { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "diary_id") + private Long id; + + @Column(nullable = false) + private String userId; + + @Column(columnDefinition = "TEXT", nullable = false) + private String context; + + @Column(nullable = false) + private LocalDateTime createdAt; + } diff --git a/src/main/java/com/bamboo/log/diary/domain/TodaySummary.java b/src/main/java/com/bamboo/log/diary/domain/TodaySummary.java new file mode 100644 index 0000000..24af228 --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/domain/TodaySummary.java @@ -0,0 +1,29 @@ +package com.bamboo.log.diary.domain; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Builder; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "today_summaries") +public class TodaySummary { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Column(nullable = false) + private Long diaryId; + + @Lob + @Column(columnDefinition = "LONGBLOB", nullable = false) + private byte[] imageData; + +} + diff --git a/src/main/java/com/bamboo/log/diary/repository/DiaryRepository.java b/src/main/java/com/bamboo/log/diary/repository/DiaryRepository.java index 977e763..416db42 100644 --- a/src/main/java/com/bamboo/log/diary/repository/DiaryRepository.java +++ b/src/main/java/com/bamboo/log/diary/repository/DiaryRepository.java @@ -1,4 +1,7 @@ package com.bamboo.log.diary.repository; -public class DiaryRepository { +import com.bamboo.log.diary.domain.Diary; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface DiaryRepository extends JpaRepository { } diff --git a/src/main/java/com/bamboo/log/diary/repository/TodaySummaryRepository.java b/src/main/java/com/bamboo/log/diary/repository/TodaySummaryRepository.java new file mode 100644 index 0000000..4093d83 --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/repository/TodaySummaryRepository.java @@ -0,0 +1,7 @@ +package com.bamboo.log.diary.repository; + +import com.bamboo.log.diary.domain.TodaySummary; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TodaySummaryRepository extends JpaRepository { +} diff --git a/src/main/java/com/bamboo/log/diary/service/DiaryService.java b/src/main/java/com/bamboo/log/diary/service/DiaryService.java deleted file mode 100644 index 294457e..0000000 --- a/src/main/java/com/bamboo/log/diary/service/DiaryService.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.bamboo.log.diary.service; - -public interface DiaryService { -} diff --git a/src/main/java/com/bamboo/log/diary/service/DiaryServiceImpl.java b/src/main/java/com/bamboo/log/diary/service/DiaryServiceImpl.java deleted file mode 100644 index d621725..0000000 --- a/src/main/java/com/bamboo/log/diary/service/DiaryServiceImpl.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.bamboo.log.diary.service; - -public class DiaryServiceImpl { -} diff --git a/src/main/java/com/bamboo/log/diary/service/diary/DiaryService.java b/src/main/java/com/bamboo/log/diary/service/diary/DiaryService.java new file mode 100644 index 0000000..50cb4ac --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/service/diary/DiaryService.java @@ -0,0 +1,10 @@ +package com.bamboo.log.diary.service.diary; + +import com.bamboo.log.diary.dto.request.CreateDiaryRequest; +import org.springframework.http.ResponseEntity; + +public interface DiaryService { + + ResponseEntity createDiary(CreateDiaryRequest createDiaryRequest); + +} diff --git a/src/main/java/com/bamboo/log/diary/service/diary/DiaryServiceImpl.java b/src/main/java/com/bamboo/log/diary/service/diary/DiaryServiceImpl.java new file mode 100644 index 0000000..5c201fd --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/service/diary/DiaryServiceImpl.java @@ -0,0 +1,70 @@ +package com.bamboo.log.diary.service.diary; + +import com.bamboo.log.diary.domain.Diary; +import com.bamboo.log.diary.dto.request.CreateDiaryRequest; +import com.bamboo.log.diary.dto.response.CreateDiaryResponse; +import com.bamboo.log.diary.repository.DiaryRepository; +import com.bamboo.log.diary.repository.TodaySummaryRepository; +import com.bamboo.log.diary.service.mock.UserService; +import com.bamboo.log.diary.service.summary.TodaySummaryService; +import com.bamboo.log.utils.ResponseHandler; +import com.bamboo.log.utils.dto.ResponseForm; +import jakarta.persistence.EntityNotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.IOException; +import java.time.LocalDateTime; + +@Service +@Transactional +@RequiredArgsConstructor +public class DiaryServiceImpl implements DiaryService { + + private final UserService userService; + private final DiaryRepository diaryRepository; + private final TodaySummaryService todaySummaryService; + + @Override + public ResponseEntity createDiary(CreateDiaryRequest createDiaryRequest) { + + // User 객체 검증 로직 + // 해당 User 객체 찾을 수 없을 경우, 에러 반환 + if(userService.existsById(createDiaryRequest.userId())) { + return ResponseHandler.create404Error(new ResponseForm(), new EntityNotFoundException("잘못된 유저 정보입니다.")); + } + + // 해당 시점의 localDateTime 저장 + LocalDateTime localDateTime = LocalDateTime.now(); + + // alice api 연결 함수 호출 + + // 데이터베이스에 저장 + Diary diary = saveDiary(createDiaryRequest, localDateTime); + + byte[] todayImage = todaySummaryService.createTodaySummaryImage(createDiaryRequest.diaryDetail()); + + // todaySummaryImage 데이터베이스에 저장 + try { + todaySummaryService.saveTodaySummaryImage(todayImage, diary.getId()); + } catch (IOException e) { + return ResponseHandler.create500Error(new ResponseForm(), e); + } + + // 201 code 반환 + return ResponseHandler.create201Response(new ResponseForm(), new CreateDiaryResponse(localDateTime)); + } + + private Diary saveDiary(CreateDiaryRequest createDiaryRequest, LocalDateTime localDateTime) { + Diary diary = Diary.builder() + .userId(createDiaryRequest.userId()) + .context(createDiaryRequest.diaryDetail()) + .createdAt(localDateTime) + .build(); + + return diaryRepository.save(diary); + } + +} diff --git a/src/main/java/com/bamboo/log/diary/service/mock/MockUserService.java b/src/main/java/com/bamboo/log/diary/service/mock/MockUserService.java new file mode 100644 index 0000000..86824f2 --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/service/mock/MockUserService.java @@ -0,0 +1,12 @@ +package com.bamboo.log.diary.service.mock; + +import org.springframework.stereotype.Service; + +@Service +public class MockUserService implements UserService { + + @Override + public boolean existsById(String userId) { + return true; + } +} diff --git a/src/main/java/com/bamboo/log/diary/service/mock/UserService.java b/src/main/java/com/bamboo/log/diary/service/mock/UserService.java new file mode 100644 index 0000000..0b37f9a --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/service/mock/UserService.java @@ -0,0 +1,5 @@ +package com.bamboo.log.diary.service.mock; + +public interface UserService { + boolean existsById(String userId); +} diff --git a/src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryService.java b/src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryService.java new file mode 100644 index 0000000..598d786 --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryService.java @@ -0,0 +1,11 @@ +package com.bamboo.log.diary.service.summary; + +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +public interface TodaySummaryService { + + void saveTodaySummaryImage(byte[] image, Long diaryId) throws IOException; + byte[] createTodaySummaryImage(String prompt); +} diff --git a/src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryServiceImpl.java b/src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryServiceImpl.java new file mode 100644 index 0000000..06df2dd --- /dev/null +++ b/src/main/java/com/bamboo/log/diary/service/summary/TodaySummaryServiceImpl.java @@ -0,0 +1,46 @@ +package com.bamboo.log.diary.service.summary; + +import com.bamboo.log.diary.domain.TodaySummary; +import com.bamboo.log.diary.repository.TodaySummaryRepository; +import com.bamboo.log.elice.service.ImageGenerationService; +import com.bamboo.log.utils.ResponseHandler; +import com.bamboo.log.utils.dto.ResponseForm; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Optional; + +@Service +@Transactional +@RequiredArgsConstructor +public class TodaySummaryServiceImpl implements TodaySummaryService { + + private final TodaySummaryRepository todaySummaryRepository; + private final ImageGenerationService imageGenerationService; + + @Override + public void saveTodaySummaryImage(byte[] image, Long diaryId) throws IOException { + TodaySummary todaySummary = TodaySummary.builder() + .diaryId(diaryId) + .imageData(image) + .build(); + + todaySummaryRepository.save(todaySummary); + } + + @Override + public byte[] createTodaySummaryImage(String prompt) { + try { + byte[] imageBytes = imageGenerationService.generateImage(prompt); + + return imageBytes; + } catch (IOException e) { + throw new RuntimeException("이미지 생성 중에 문제가 발생했습니다."); + } + + } + +} diff --git a/src/main/java/com/bamboo/log/elice/config/RestTemplateConfig.java b/src/main/java/com/bamboo/log/elice/config/RestTemplateConfig.java new file mode 100644 index 0000000..0ea3f07 --- /dev/null +++ b/src/main/java/com/bamboo/log/elice/config/RestTemplateConfig.java @@ -0,0 +1,14 @@ +package com.bamboo.log.elice.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } +} diff --git a/src/main/java/com/bamboo/log/elice/service/ImageGenerationService.java b/src/main/java/com/bamboo/log/elice/service/ImageGenerationService.java new file mode 100644 index 0000000..2af0bf5 --- /dev/null +++ b/src/main/java/com/bamboo/log/elice/service/ImageGenerationService.java @@ -0,0 +1,58 @@ +package com.bamboo.log.elice.service; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import okhttp3.*; +import okhttp3.MediaType; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class ImageGenerationService { + + private final RestTemplate restTemplate; + private final String apiKey; + private final String apiUrl; + + public ImageGenerationService(RestTemplate restTemplate, + @Value("${elice.api.key}") String apiKey, + @Value("${elice.api.url}") String apiUrl) { + this.restTemplate = restTemplate; + this.apiKey = apiKey; + this.apiUrl = apiUrl; + } + + public byte[] generateImage(String prompt) throws IOException { + OkHttpClient client = new OkHttpClient(); + + String requestBody = String.format("{\"prompt\":\"%s\",\"style\":\"polaroid\"}", prompt); + + MediaType mediaType = MediaType.parse("application/json"); + RequestBody body = RequestBody.create(requestBody, mediaType); + + Request request = new Request.Builder() + .url(apiUrl) + .post(body) + .addHeader("accept", "application/json") + .addHeader("content-type", "application/json") + .addHeader("Authorization", "Bearer " + apiKey) + .build(); + + Response response = client.newCall(request).execute(); + + if (!response.isSuccessful()) { + throw new IOException("요청 실패: " + response.code()); + } + + byte[] imageBytes = response.body().bytes(); // ✅ 이미지 데이터를 byte[]로 변환 + response.close(); + return imageBytes; + } +} + diff --git a/src/main/java/com/bamboo/log/utils/ResponseHandler.java b/src/main/java/com/bamboo/log/utils/ResponseHandler.java new file mode 100644 index 0000000..c483a50 --- /dev/null +++ b/src/main/java/com/bamboo/log/utils/ResponseHandler.java @@ -0,0 +1,51 @@ +package com.bamboo.log.utils; + +import com.bamboo.log.utils.dto.DetailResponse; +import com.bamboo.log.utils.dto.ResponseForm; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +public class ResponseHandler { + + public static ResponseEntity create500Error(ResponseForm response, Exception e) { + response.of("result", "FAIL"); + response.of("error", DetailResponse.builder().code(500).message(e.getMessage()).build()); + return new ResponseEntity(response, HttpStatus.INTERNAL_SERVER_ERROR); + } + + public static ResponseEntity create400Error(ResponseForm response, Exception e) { + response.of("result", "FAIL"); + response.of("error", DetailResponse.builder().code(400).message(e.getMessage()).build()); + + return new ResponseEntity(response, HttpStatus.BAD_REQUEST); + } + + public static ResponseEntity create404Error(ResponseForm response, Exception e) { + response.of("result", "FAIL"); + response.of("error", DetailResponse.builder().code(404).message(e.getMessage()).build()); + + return new ResponseEntity(response, HttpStatus.NOT_FOUND); + } + + public static ResponseEntity create204Response(ResponseForm response, String message) { + response.of("result", "SUCCESS"); + response.of("code", DetailResponse.builder().code(204).message(message).build()); + + return new ResponseEntity(response, HttpStatus.NO_CONTENT); + } + + public static ResponseEntity create200Response(ResponseForm response, Object object) { + response.of("result", "SUCCESS"); + response.of("code", object); + + return new ResponseEntity(response, HttpStatus.OK); + } + + public static ResponseEntity create201Response(ResponseForm response, Object object) { + response.of("result", "SUCCESS"); + response.of("code", object); + + return new ResponseEntity(response, HttpStatus.CREATED); + } + +} diff --git a/src/main/java/com/bamboo/log/utils/SecurityConfig.java b/src/main/java/com/bamboo/log/utils/SecurityConfig.java new file mode 100644 index 0000000..5d51eb4 --- /dev/null +++ b/src/main/java/com/bamboo/log/utils/SecurityConfig.java @@ -0,0 +1,23 @@ +package com.bamboo.log.utils; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.web.SecurityFilterChain; + +@Configuration +@EnableWebSecurity +public class SecurityConfig { + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http + .csrf(csrf -> csrf.disable()) // CSRF 비활성화 + .authorizeHttpRequests(auth -> auth + .requestMatchers("/api/images/**").permitAll() // 이미지 API 인증 없이 허용 + .anyRequest().authenticated() + ); + + return http.build(); + } +} diff --git a/src/main/java/com/bamboo/log/utils/dto/DetailResponse.java b/src/main/java/com/bamboo/log/utils/dto/DetailResponse.java new file mode 100644 index 0000000..61f22cf --- /dev/null +++ b/src/main/java/com/bamboo/log/utils/dto/DetailResponse.java @@ -0,0 +1,13 @@ +package com.bamboo.log.utils.dto; + +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class DetailResponse { + + private Integer code; + private String message; + +} \ No newline at end of file diff --git a/src/main/java/com/bamboo/log/utils/dto/ResponseForm.java b/src/main/java/com/bamboo/log/utils/dto/ResponseForm.java new file mode 100644 index 0000000..04eccf6 --- /dev/null +++ b/src/main/java/com/bamboo/log/utils/dto/ResponseForm.java @@ -0,0 +1,21 @@ +package com.bamboo.log.utils.dto; + +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +@Getter +public class ResponseForm { + + public ResponseForm() { + response = new HashMap<>(); + } + + public void of(String value1, Object value2) { + response.put(value1, value2); + } + + private Map response; + +} \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 356817f..9fb423e 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,13 +1,25 @@ spring: datasource: - url: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_NAME} - username: ${MYSQL_USERNAME} - password: ${MYSQL_PASSWORD} driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/forrest?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8 + username: root + password: ensharp2005* + jpa: show-sql: true open-in-view: false hibernate: ddl-auto: update properties: - hibernate.dialect: org.hibernate.dialect.MySQL8Dialect \ No newline at end of file + hibernate.dialect: org.hibernate.dialect.MySQL8Dialect + + security: + user: + name: admin + password: admin123 + + +elice: + api: + key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3Mzg4MzQxNDgsIm5iZiI6MTczODgzNDE0OCwia2V5X2lkIjoiZTdmNTUxN2MtYzNlZC00ZmVmLWFkNzYtNTUxZjA3ZDJmMjNiIn0.sMIASpWdac5l3GdIXshb7NnuB-PQlHMFyNurcpu4Cms + url: https://api-cloud-function.elice.io/0133c2f7-9f3f-44b6-a3d6-c24ba8ef4510/generate From 8b51911f00652d9ba06e447a3a01aee441c64e71 Mon Sep 17 00:00:00 2001 From: 10Hyuna Date: Mon, 24 Feb 2025 14:03:40 +0900 Subject: [PATCH 5/6] =?UTF-8?q?application.yml=20=ED=8C=8C=EC=9D=BC=20Git?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 src/main/resources/application.yml diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml deleted file mode 100644 index 9fb423e..0000000 --- a/src/main/resources/application.yml +++ /dev/null @@ -1,25 +0,0 @@ -spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/forrest?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8 - username: root - password: ensharp2005* - - jpa: - show-sql: true - open-in-view: false - hibernate: - ddl-auto: update - properties: - hibernate.dialect: org.hibernate.dialect.MySQL8Dialect - - security: - user: - name: admin - password: admin123 - - -elice: - api: - key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3Mzg4MzQxNDgsIm5iZiI6MTczODgzNDE0OCwia2V5X2lkIjoiZTdmNTUxN2MtYzNlZC00ZmVmLWFkNzYtNTUxZjA3ZDJmMjNiIn0.sMIASpWdac5l3GdIXshb7NnuB-PQlHMFyNurcpu4Cms - url: https://api-cloud-function.elice.io/0133c2f7-9f3f-44b6-a3d6-c24ba8ef4510/generate From a17eab350b0d5891a83590b6ba64217eb5059b62 Mon Sep 17 00:00:00 2001 From: 10Hyuna Date: Mon, 24 Feb 2025 14:15:08 +0900 Subject: [PATCH 6/6] =?UTF-8?q?Settings:=20application.yml=20=ED=99=98?= =?UTF-8?q?=EA=B2=BD=EB=B3=80=EC=88=98=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- .../elice/service/ImageGenerationService.java | 2 +- src/main/resources/application.yml | 23 +++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/application.yml diff --git a/.gitignore b/.gitignore index c2065bc..e48b6be 100644 --- a/.gitignore +++ b/.gitignore @@ -34,4 +34,4 @@ out/ /.nb-gradle/ ### VS Code ### -.vscode/ +.vscode/ \ No newline at end of file diff --git a/src/main/java/com/bamboo/log/elice/service/ImageGenerationService.java b/src/main/java/com/bamboo/log/elice/service/ImageGenerationService.java index 2af0bf5..d7aa11b 100644 --- a/src/main/java/com/bamboo/log/elice/service/ImageGenerationService.java +++ b/src/main/java/com/bamboo/log/elice/service/ImageGenerationService.java @@ -21,7 +21,7 @@ public class ImageGenerationService { private final String apiUrl; public ImageGenerationService(RestTemplate restTemplate, - @Value("${elice.api.key}") String apiKey, + @Value("${elice.api.token}") String apiKey, @Value("${elice.api.url}") String apiUrl) { this.restTemplate = restTemplate; this.apiKey = apiKey; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..317cea6 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,23 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_NAME} + username: ${MYSQL_USERNAME} + password: ${MYSQL_PASSWORD} + + jpa: + show-sql: true + open-in-view: false + hibernate: + ddl-auto: update + properties: + hibernate.dialect: org.hibernate.dialect.MySQL8Dialect + + +elice: + api: + token: ${API_TOKEN} + url: + face: ${FACE_API_URL} + img: ${IMG_API_URL} + chat: ${CHAT_API_URL}