Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified .DS_Store
Binary file not shown.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,4 @@ out/
/.nb-gradle/

### VS Code ###
.vscode/
.vscode/
41 changes: 32 additions & 9 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +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.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') {
Expand Down
33 changes: 33 additions & 0 deletions src/main/java/com/bamboo/log/diary/api/DiaryController.java
Original file line number Diff line number Diff line change
@@ -0,0 +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);
}
}
}
33 changes: 33 additions & 0 deletions src/main/java/com/bamboo/log/diary/domain/Diary.java
Original file line number Diff line number Diff line change
@@ -0,0 +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;

}
29 changes: 29 additions & 0 deletions src/main/java/com/bamboo/log/diary/domain/TodaySummary.java
Original file line number Diff line number Diff line change
@@ -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;

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.bamboo.log.diary.dto.request;

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) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.bamboo.log.diary.dto.response;

import jakarta.validation.constraints.NotEmpty;

import java.time.LocalDateTime;

public record CreateDiaryResponse(@NotEmpty(message = "created shouldn't be empty") LocalDateTime created) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.bamboo.log.diary.repository;

import com.bamboo.log.diary.domain.Diary;
import org.springframework.data.jpa.repository.JpaRepository;

public interface DiaryRepository extends JpaRepository<Diary, Long> {
}
Original file line number Diff line number Diff line change
@@ -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<TodaySummary, Long> {
}
10 changes: 10 additions & 0 deletions src/main/java/com/bamboo/log/diary/service/diary/DiaryService.java
Original file line number Diff line number Diff line change
@@ -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);

}
Original file line number Diff line number Diff line change
@@ -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);
}

}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.bamboo.log.diary.service.mock;

public interface UserService {
boolean existsById(String userId);
}
Original file line number Diff line number Diff line change
@@ -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);
}
Original file line number Diff line number Diff line change
@@ -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("이미지 생성 중에 문제가 발생했습니다.");
}

}

}
14 changes: 14 additions & 0 deletions src/main/java/com/bamboo/log/elice/config/RestTemplateConfig.java
Original file line number Diff line number Diff line change
@@ -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();
}
}
Loading
Loading