Skip to content

Commit

Permalink
Merge pull request #55 from GlowTales/feat/tale
Browse files Browse the repository at this point in the history
동화 생성 API 구현
  • Loading branch information
hayeongKo authored Aug 21, 2024
2 parents c9e0e7f + 0402068 commit bbc90b9
Show file tree
Hide file tree
Showing 10 changed files with 358 additions and 74 deletions.
3 changes: 2 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ dependencies {

implementation 'org.springframework.boot:spring-boot-starter-mustache'


// Json
implementation group: 'org.json', name: 'json', version: '20240303'
//스웨거
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'
}
Expand Down
122 changes: 72 additions & 50 deletions src/main/java/com/example/glowtales/controller/TaleController.java
Original file line number Diff line number Diff line change
@@ -1,38 +1,48 @@
package com.example.glowtales.controller;

import com.example.glowtales.domain.ResultCode;
import com.example.glowtales.dto.Result;
import com.example.glowtales.dto.request.TaleRequest;
import com.example.glowtales.dto.response.tale.*;
import com.example.glowtales.service.MemberService;
import com.example.glowtales.service.PromptService;
import com.example.glowtales.service.TaleService;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;


@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/tale")
@RequestMapping("/api/v1/tales")
@Tag(name = "Tale API", description = "API for managing tales")
public class TaleController {


//#011 동화의 퀴즈와 정답 불러오기
//#013 사용자 학습 언어와 수준 조회 GET
//#014 단일 동화 다국어로 조회 GET
//result 사용해서 응답 형식 통일하기


private final TaleService taleService;
private final MemberService memberService;
private final ObjectMapper objectMapper;

private static final Logger logger = LoggerFactory.getLogger(TaleController.class);
private final PromptService promptService;

@Operation(summary = "#001 전체 동화 상태창 조회", description = "홈 화면에 나타나는 상태를 불러오는 API입니다.")
@GetMapping("/")
Expand All @@ -49,19 +59,19 @@ public ResponseEntity<List<TaleResponseDto>> getUnlearnedTalesByMemberId(@Reques
if (count == null) {
count = -1;//기본값 설정. 제한 없이 모든 동화를 불러옴
}
List<TaleResponseDto> posts = taleService.getUnlearnedTaleByMemberId(accessToken,count);
List<TaleResponseDto> posts = taleService.getUnlearnedTaleByMemberId(accessToken, count);
return ResponseEntity.ok(posts);
}


@Operation(summary = "#007 최근 학습한 동화 전체 조회", description = "최근 학습한 동화를 최신순으로 불러오는 API입니다.")
@GetMapping("/studied")
public ResponseEntity<List<TaleResponseDto>> getStudiedTalesByMemberId(@RequestHeader(value = "Authorization", required = true) String accessToken,@RequestParam(name = "count", required = false) Integer count) {
public ResponseEntity<List<TaleResponseDto>> getStudiedTalesByMemberId(@RequestHeader(value = "Authorization", required = true) String accessToken, @RequestParam(name = "count", required = false) Integer count) {
logger.info("Count value: {}", count);
if (count == null) {
count = -1;//기본값 설정. 제한 없이 모든 동화를 불러옴
}
List<TaleResponseDto> posts = taleService.getStudiedTaleByMemberId(accessToken,count);
List<TaleResponseDto> posts = taleService.getStudiedTaleByMemberId(accessToken, count);
return ResponseEntity.ok(posts);
}

Expand All @@ -72,7 +82,7 @@ public ResponseEntity<List<WordResponseDto>> getWordByMemberId(@RequestHeader(va
if (count == null) {
count = -1;//기본값 설정. 제한 없이 모든 동화를 불러옴
}
List<WordResponseDto> words = taleService.getWordByMemberId(accessToken,count);
List<WordResponseDto> words = taleService.getWordByMemberId(accessToken, count);
return ResponseEntity.ok(words);
}

Expand Down Expand Up @@ -104,9 +114,9 @@ public ResponseEntity<LanguageTaleDetailResponseDto> getTaleBylanguageTaleId(@Re

@Operation(summary = "#015 단일 동화 다국어로 조회", description = "TaleId와 languageId를 통해 단일 동화를 조회하는 API입니다. 동화 생성 후 언어를 바꿀때 사용합니다.1 = 영어 , 2 = 한국어 , 3 = 일본어 , 4 = 중국어")
@GetMapping("/detail/lan")
public ResponseEntity<LanguageTaleDetailResponseDto> getTaleBylanguageTaleIdLanguageId(@RequestHeader(value = "Authorization", required = true) String accessToken, @RequestParam Long taleId,Long languageId) {
public ResponseEntity<LanguageTaleDetailResponseDto> getTaleBylanguageTaleIdLanguageId(@RequestHeader(value = "Authorization", required = true) String accessToken, @RequestParam Long taleId, Long languageId) {
try {
LanguageTaleDetailResponseDto response = taleService.getTaleBylanguageTaleIdLanguageId( accessToken, taleId, languageId);
LanguageTaleDetailResponseDto response = taleService.getTaleBylanguageTaleIdLanguageId(accessToken, taleId, languageId);
return ResponseEntity.ok(response);
} catch (Exception e) {
e.printStackTrace();
Expand All @@ -117,46 +127,58 @@ public ResponseEntity<LanguageTaleDetailResponseDto> getTaleBylanguageTaleIdLang


@Operation(summary = "#008 동화 만들기", description = "동화를 만드는 API입니다.")
@PostMapping("/new")
public ResponseEntity<TaleDetailResponseDto> TaleRequest(@RequestBody TaleRequest request) {

TaleDetailResponseDto responseDto = TaleDetailResponseDto.builder()
.taleId(1L)
.title("재영이와 구름 위의 코끼리") // 예시 제목
.language("Ko") // 예시 언어
.story("여름의 어느 날, 재영이는 시원한 바람을 맞으며 공원에 놀러 갔어.\n" +
"푸른 하늘을 올려다보던 재영이는 구름 속에서 무언가 움직이는 걸 보았어.\n" +
"\"구름 속에 뭐가 있을까?\" 재영이는 호기심이 가득했지.\n" +
"갑자기, 구름이 빵빵 터지면서 커다란 코끼리가 하늘에서 내려왔어!\n" +
"코끼리는 뾰족한 파란 모자를 쓰고 있었고, 하늘을 떠다니며 춤을 추고 있었지.\n" +
"재영이는 눈을 의심하며 \"코끼리가 구름 위에서 춤추고 있어?!\"라고 외쳤어.\n" +
"코끼리는 공중에서 솜사탕처럼 둥둥 떠다니며 재영에게 손을 흔들었어.\n" +
"\"안녕! 난 클라우드코!\" 코끼리가 신나게 인사했어.\n" +
"재영이는 \"클라우드코? 정말 기이한 이름이네!\"라며 웃었어.\n" +
"클라우드코는 유쾌하게 웃으며 \"그래! 난 여름 구름의 특별한 코끼리야!\"라고 했어.\n" +
"재영이는 \"여름에 구름 위에서 뭐 하는 거야?\"라고 물었어.\n" +
"클라우드코는 \"구름 위에서 파티를 열고, 사람들에게 웃음을 주는 게 내 일이야!\"라고 답했어.\n" +
"\"진짜? 그럼 나도 파티에 초대해줘!\" 재영이가 신나게 말했어.\n" +
"클라우드코는 재영을 구름으로 초대하며 \"그럼, 나와 함께 구름 파티를 즐기자!\"라고 했어.\n" +
"재영이는 클라우드코의 등에 올라타서 구름 속으로 올라갔어.\n" +
"구름 속에 도착하자, 다양한 색깔의 구름과 기발한 장식들이 있었어.\n" +
"사람들은 구름 위에서 춤을 추고, 코끼리들이 연주하는 음악에 맞춰 즐기고 있었지.\n" +
"재영이는 구름 위에서 흥겹게 춤을 추며 기분이 좋았어.\n" +
"클라우드코는 재영에게 특별한 구름 음료를 건네며 \"이건 구름에서 만든 음료야!\"라고 했어.\n" +
"재영이는 음료를 마시며 \"이 음료, 너무 맛있어!\"라고 놀라워했어.\n" +
"그때, 구름 위에서 작은 소리가 들렸어. \"도와줘! 나 떨어질 것 같아!\"\n" +
"재영이와 클라우드코는 소리가 나는 쪽으로 달려갔어.\n" +
"작은 구름이 바람에 휘날리며 떨어지려고 하고 있었어.\n" +
"클라우드코는 재영이에게 \"작은 구름을 잡아줘!\"라고 했어.\n" +
"재영이는 용감하게 작은 구름을 잡아서 하늘로 다시 올려보냈어.\n" +
"작은 구름은 감사하며 \"고마워! 이제 안전해!\"라고 말했어.\n" +
"클라우드코는 재영이에게 \"멋진 영웅이네!\"라고 칭찬했어.\n" +
"재영이는 부끄러워하며 \"그냥 작은 도움이었을 뿐이야!\"라고 말했어.\n" +
"파티가 끝나갈 무렵, 클라우드코는 재영이에게 \"이제 돌아갈 시간이야. 하지만 언제든지 구름 속으로 놀러와!\"라고 했어.\n" +
"재영이는 행복하게 고개를 끄덕이며 \"고마워, 클라우드코! 꼭 다시 올게!\"라고 인사하며 구름에서 내려왔어.") // 예시 내용
.build();

return ResponseEntity.status(HttpStatus.OK).body(responseDto);
@PostMapping("/")
public Result createTales(
@RequestBody @Valid TaleRequest taleRequest,
@RequestHeader(value = "Authorization", required = false) String accessToken) {
try {

return new Result(ResultCode.SUCCESS, taleService.createLanguageTales(taleRequest, accessToken));
} catch (Exception e) {
return new Result(ResultCode.FAIL, e.getMessage(), "400");
}
}

// @Operation(summary = "#008 동화 만들기", description = "동화를 만드는 API입니다.")
// @PostMapping("/new")
// public ResponseEntity<TaleDetailResponseDto> TaleRequest(@RequestBody TaleRequest request) {
//
// TaleDetailResponseDto responseDto = TaleDetailResponseDto.builder()
// .taleId(1L)
// .title("재영이와 구름 위의 코끼리") // 예시 제목
// .language("Ko") // 예시 언어
// .story("여름의 어느 날, 재영이는 시원한 바람을 맞으며 공원에 놀러 갔어.\n" +
// "푸른 하늘을 올려다보던 재영이는 구름 속에서 무언가 움직이는 걸 보았어.\n" +
// "\"구름 속에 뭐가 있을까?\" 재영이는 호기심이 가득했지.\n" +
// "갑자기, 구름이 빵빵 터지면서 커다란 코끼리가 하늘에서 내려왔어!\n" +
// "코끼리는 뾰족한 파란 모자를 쓰고 있었고, 하늘을 떠다니며 춤을 추고 있었지.\n" +
// "재영이는 눈을 의심하며 \"코끼리가 구름 위에서 춤추고 있어?!\"라고 외쳤어.\n" +
// "코끼리는 공중에서 솜사탕처럼 둥둥 떠다니며 재영에게 손을 흔들었어.\n" +
// "\"안녕! 난 클라우드코!\" 코끼리가 신나게 인사했어.\n" +
// "재영이는 \"클라우드코? 정말 기이한 이름이네!\"라며 웃었어.\n" +
// "클라우드코는 유쾌하게 웃으며 \"그래! 난 여름 구름의 특별한 코끼리야!\"라고 했어.\n" +
// "재영이는 \"여름에 구름 위에서 뭐 하는 거야?\"라고 물었어.\n" +
// "클라우드코는 \"구름 위에서 파티를 열고, 사람들에게 웃음을 주는 게 내 일이야!\"라고 답했어.\n" +
// "\"진짜? 그럼 나도 파티에 초대해줘!\" 재영이가 신나게 말했어.\n" +
// "클라우드코는 재영을 구름으로 초대하며 \"그럼, 나와 함께 구름 파티를 즐기자!\"라고 했어.\n" +
// "재영이는 클라우드코의 등에 올라타서 구름 속으로 올라갔어.\n" +
// "구름 속에 도착하자, 다양한 색깔의 구름과 기발한 장식들이 있었어.\n" +
// "사람들은 구름 위에서 춤을 추고, 코끼리들이 연주하는 음악에 맞춰 즐기고 있었지.\n" +
// "재영이는 구름 위에서 흥겹게 춤을 추며 기분이 좋았어.\n" +
// "클라우드코는 재영에게 특별한 구름 음료를 건네며 \"이건 구름에서 만든 음료야!\"라고 했어.\n" +
// "재영이는 음료를 마시며 \"이 음료, 너무 맛있어!\"라고 놀라워했어.\n" +
// "그때, 구름 위에서 작은 소리가 들렸어. \"도와줘! 나 떨어질 것 같아!\"\n" +
// "재영이와 클라우드코는 소리가 나는 쪽으로 달려갔어.\n" +
// "작은 구름이 바람에 휘날리며 떨어지려고 하고 있었어.\n" +
// "클라우드코는 재영이에게 \"작은 구름을 잡아줘!\"라고 했어.\n" +
// "재영이는 용감하게 작은 구름을 잡아서 하늘로 다시 올려보냈어.\n" +
// "작은 구름은 감사하며 \"고마워! 이제 안전해!\"라고 말했어.\n" +
// "클라우드코는 재영이에게 \"멋진 영웅이네!\"라고 칭찬했어.\n" +
// "재영이는 부끄러워하며 \"그냥 작은 도움이었을 뿐이야!\"라고 말했어.\n" +
// "파티가 끝나갈 무렵, 클라우드코는 재영이에게 \"이제 돌아갈 시간이야. 하지만 언제든지 구름 속으로 놀러와!\"라고 했어.\n" +
// "재영이는 행복하게 고개를 끄덕이며 \"고마워, 클라우드코! 꼭 다시 올게!\"라고 인사하며 구름에서 내려왔어.") // 예시 내용
// .build();
//
// return ResponseEntity.status(HttpStatus.OK).body(responseDto);
// }
}
15 changes: 12 additions & 3 deletions src/main/java/com/example/glowtales/domain/LanguageTale.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
import com.example.glowtales.converter.YesOrNoConverter;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.sql.Clob;
import java.util.ArrayList;
import java.util.List;

Expand All @@ -27,8 +27,8 @@ public class LanguageTale {
@JoinColumn(name = "tale_id")
private Tale tale;

@Lob
private Clob story;
@Column(columnDefinition = "TEXT")
private String story;

private String title;

Expand All @@ -39,4 +39,13 @@ public class LanguageTale {
@OneToMany(mappedBy = "languageTale", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Quiz> quizList = new ArrayList<>();

@Builder
public LanguageTale(Language language, Tale tale, String story, String title, YesOrNo isLearned, Integer count) {
this.language = language;
this.tale = tale;
this.story = story;
this.title = title;
this.isLearned = isLearned;
this.count = count;
}
}
4 changes: 3 additions & 1 deletion src/main/java/com/example/glowtales/domain/Tale.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,7 @@ public class Tale {
@OneToMany(mappedBy = "tale", cascade = CascadeType.ALL, orphanRemoval = true)
private List<TaleWord> taleWordList = new ArrayList<>();


public Tale(Member member) {
this.member = member;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.example.glowtales.dto.request;

import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.Setter;

Expand All @@ -8,9 +9,13 @@
@Getter
@Setter
public class TaleRequest {
private List<String> keywords;
@NotBlank
private String detail;
@NotBlank
private String mood;
private String characters;
private List<String> characters;
@NotBlank
private String contents;
@NotBlank
private List<String> keywords;
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.example.glowtales.dto.response.tale;

import com.example.glowtales.domain.Language;
import com.example.glowtales.domain.LanguageTale;
import com.example.glowtales.domain.Tale;
import com.example.glowtales.domain.YesOrNo;
import jakarta.persistence.Lob;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -15,12 +17,9 @@
@Setter
public class TaleDetailResponseDto {
private Long taleId;
private Long languageTaleId;
private String title;
private String language;
// @Lob
// private Clob story;

//test 반환용 코드
private String languageName;
private String story;

// @Builder
Expand All @@ -43,12 +42,40 @@ public class TaleDetailResponseDto {
//
// }

//test 객체 반환용 코드
//test 객체 반환용 코드
@Builder
public TaleDetailResponseDto(Long taleId, String title, String language, String story) {
public TaleDetailResponseDto(Long taleId, Long languageTaleId, String title, String languageName, String story) {
this.taleId = taleId;
this.languageTaleId = languageTaleId;
this.title = title;
this.languageName = languageName;
this.story = story;
}

public TaleDetailResponseDto(String title, String languageName, String story) {
this.title = title;
this.language = language;
this.languageName = languageName;
this.story = story;
}

public static TaleDetailResponseDto of(LanguageTale languageTale, Tale tale) {
return TaleDetailResponseDto.builder()
.languageTaleId(languageTale.getId())
.taleId(tale.getId())
.title(languageTale.getTitle())
.languageName(languageTale.getLanguage().getLanguageName())
.story(languageTale.getStory())
.build();
}

public static LanguageTale to(TaleDetailResponseDto taleDetailResponseDto, Tale tale, Language language) {
return LanguageTale.builder()
.language(language)
.tale(tale)
.isLearned(YesOrNo.NO)
.count(0)
.title(taleDetailResponseDto.getTitle())
.story(taleDetailResponseDto.getStory())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@
import com.example.glowtales.domain.Language;
import org.springframework.data.jpa.repository.JpaRepository;

public interface LauguageRepository extends JpaRepository<Language, Long> {
public interface LanguageRepository extends JpaRepository<Language, Long> {
Language findByLanguageName(String languageName);
}
Loading

0 comments on commit bbc90b9

Please sign in to comment.