From a1e70f5e20bc4f8ca2251766655eaca6683d2572 Mon Sep 17 00:00:00 2001 From: KTH-96 Date: Wed, 22 Nov 2023 17:38:24 +0900 Subject: [PATCH] =?UTF-8?q?oauth,=20message=20controller=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20(#3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat oauth 로그인 Controller 생성 - moveOauthLoginPage 로그인 페이지로 이동 - oauthLogin 토큰 인가 코드로 토큰 발급받아 넘겨준다 * feat 사용자가 알림을 원하는 정보 받기 - jackson 상속으로 type값에 따라 다른 Dto 생성 * build lombok 추가 * refactor api 파싱 구조 변경 및 변수에 final 추가 - 챗봇 api맞는 구조로 변경 * refactor Json 역직렬화시에 생성자 또는 팩토리 메서드 찾지 못하는 현상 제거 - @JsonCreator로 데이터 파싱 * feat 챗봇 스킬 반환값 만들기 * docs out 폴더 지우기 * test mock mvc를 이용해 Json 데이터 파싱 테스트 작성 * refactor 컨트롤러 이름 및 패키지 구조변경 - 기존 InfoController를 SimpleController로 변경 - api 응답값 수정(SimpleTextContentDto클래스 추가) - test json데이터 수정 * feat text card controller생성 - 응답 예제 추가 * test text card 테스트 추가 * refactor 코드 리펙토링 - method readJsonFile resources 하위 파일 읽는 메소드 변경 - 상수 인터페이스 삭제 --- .gitignore | 1 + api/build.gradle | 13 +++- .../web/controller/SimpleTextController.java | 37 +++++++++ .../web/controller/TextCardController.java | 48 ++++++++++++ .../info/web/dto/request/ActionDto.java | 18 +++++ .../mssage/info/web/dto/request/ParamDto.java | 32 ++++++++ .../web/dto/request/RequestActionDto.java | 18 +++++ .../web/dto/request/skill/WeatherDto.java | 21 +++++ .../web/dto/response/ResponseResultDto.java | 18 +++++ .../info/web/dto/response/TemplateDto.java | 17 +++++ .../simpletext/SimpleTextContentDto.java | 11 +++ .../skill/simpletext/SimpleTextDto.java | 11 +++ .../skill/textcard/TextCardButtonDto.java | 12 +++ .../skill/textcard/TextCardContentDto.java | 20 +++++ .../response/skill/textcard/TextCardDto.java | 11 +++ .../kth/mssage/MessageApplicationTest.java | 8 ++ .../integration/SimpleTextControllerTest.java | 40 ++++++++++ .../integration/TextCardControllerTest.java | 40 ++++++++++ .../info/web/controller/util/JsonReader.java | 17 +++++ .../payload/chatbot-message-request.json | 76 +++++++++++++++++++ .../payload/simple-text-message-response.json | 12 +++ .../payload/text-card-message-response.json | 20 +++++ 22 files changed, 500 insertions(+), 1 deletion(-) create mode 100644 api/src/main/java/com/kth/mssage/info/web/controller/SimpleTextController.java create mode 100644 api/src/main/java/com/kth/mssage/info/web/controller/TextCardController.java create mode 100644 api/src/main/java/com/kth/mssage/info/web/dto/request/ActionDto.java create mode 100644 api/src/main/java/com/kth/mssage/info/web/dto/request/ParamDto.java create mode 100644 api/src/main/java/com/kth/mssage/info/web/dto/request/RequestActionDto.java create mode 100644 api/src/main/java/com/kth/mssage/info/web/dto/request/skill/WeatherDto.java create mode 100644 api/src/main/java/com/kth/mssage/info/web/dto/response/ResponseResultDto.java create mode 100644 api/src/main/java/com/kth/mssage/info/web/dto/response/TemplateDto.java create mode 100644 api/src/main/java/com/kth/mssage/info/web/dto/response/skill/simpletext/SimpleTextContentDto.java create mode 100644 api/src/main/java/com/kth/mssage/info/web/dto/response/skill/simpletext/SimpleTextDto.java create mode 100644 api/src/main/java/com/kth/mssage/info/web/dto/response/skill/textcard/TextCardButtonDto.java create mode 100644 api/src/main/java/com/kth/mssage/info/web/dto/response/skill/textcard/TextCardContentDto.java create mode 100644 api/src/main/java/com/kth/mssage/info/web/dto/response/skill/textcard/TextCardDto.java create mode 100644 api/src/test/java/com/kth/mssage/MessageApplicationTest.java create mode 100644 api/src/test/java/com/kth/mssage/info/web/controller/integration/SimpleTextControllerTest.java create mode 100644 api/src/test/java/com/kth/mssage/info/web/controller/integration/TextCardControllerTest.java create mode 100644 api/src/test/java/com/kth/mssage/info/web/controller/util/JsonReader.java create mode 100644 api/src/test/resources/__files/payload/chatbot-message-request.json create mode 100644 api/src/test/resources/__files/payload/simple-text-message-response.json create mode 100644 api/src/test/resources/__files/payload/text-card-message-response.json diff --git a/.gitignore b/.gitignore index 3e51ac4..2ecd007 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ build/ #intellij .idea +out/ diff --git a/api/build.gradle b/api/build.gradle index b6c2a9a..ac91f0b 100644 --- a/api/build.gradle +++ b/api/build.gradle @@ -1,7 +1,7 @@ plugins { + id 'java' id 'org.springframework.boot' version '3.1.5' id 'io.spring.dependency-management' version '1.1.3' - id 'application' } repositories { @@ -11,5 +11,16 @@ repositories { dependencies { implementation project(':domain') implementation project(':infra') + + annotationProcessor 'org.projectlombok:lombok' + + implementation 'org.projectlombok:lombok' implementation 'org.springframework.boot:spring-boot-starter-web' + + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.boot:spring-boot-test-autoconfigure' +} + +test { + useJUnitPlatform() } diff --git a/api/src/main/java/com/kth/mssage/info/web/controller/SimpleTextController.java b/api/src/main/java/com/kth/mssage/info/web/controller/SimpleTextController.java new file mode 100644 index 0000000..0e7063d --- /dev/null +++ b/api/src/main/java/com/kth/mssage/info/web/controller/SimpleTextController.java @@ -0,0 +1,37 @@ +package com.kth.mssage.info.web.controller; + +import com.kth.mssage.info.web.dto.request.ParamDto; +import com.kth.mssage.info.web.dto.request.RequestActionDto; +import com.kth.mssage.info.web.dto.request.skill.WeatherDto; +import com.kth.mssage.info.web.dto.response.ResponseResultDto; +import com.kth.mssage.info.web.dto.response.TemplateDto; +import com.kth.mssage.info.web.dto.response.skill.simpletext.SimpleTextContentDto; +import com.kth.mssage.info.web.dto.response.skill.simpletext.SimpleTextDto; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +@RequestMapping("/simple-text") +@RestController +public class SimpleTextController { + + @ResponseStatus(value = HttpStatus.OK) + @PostMapping("/message") + public ResponseResultDto requestMessageInfo(@RequestBody RequestActionDto requestActionDto) { + WeatherDto weatherDto = (WeatherDto) requestActionDto.getAction().getParamDto(); + + SimpleTextContentDto textDto = SimpleTextContentDto.builder() + .text(weatherDto.getLocation() + " 날씨가 좋아요") + .build(); + + SimpleTextDto simpleTextDto = SimpleTextDto.builder() + .simpleText(textDto) + .build(); + + TemplateDto templateDto = TemplateDto.builder() + .build(); + + templateDto.addOutput(simpleTextDto); + + return ResponseResultDto.createResultMessage(templateDto); + } +} diff --git a/api/src/main/java/com/kth/mssage/info/web/controller/TextCardController.java b/api/src/main/java/com/kth/mssage/info/web/controller/TextCardController.java new file mode 100644 index 0000000..fbbe015 --- /dev/null +++ b/api/src/main/java/com/kth/mssage/info/web/controller/TextCardController.java @@ -0,0 +1,48 @@ +package com.kth.mssage.info.web.controller; + + +import com.kth.mssage.info.web.dto.request.ParamDto; +import com.kth.mssage.info.web.dto.request.RequestActionDto; +import com.kth.mssage.info.web.dto.request.skill.WeatherDto; +import com.kth.mssage.info.web.dto.response.ResponseResultDto; +import com.kth.mssage.info.web.dto.response.TemplateDto; +import com.kth.mssage.info.web.dto.response.skill.textcard.TextCardButtonDto; +import com.kth.mssage.info.web.dto.response.skill.textcard.TextCardContentDto; +import com.kth.mssage.info.web.dto.response.skill.textcard.TextCardDto; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +@RequestMapping("/text-card") +@RestController +public class TextCardController { + + @ResponseStatus(value = HttpStatus.OK) + @PostMapping("/message") + public ResponseResultDto requestMessageInfo(@RequestBody RequestActionDto requestActionDto) { + WeatherDto weatherDto = (WeatherDto) requestActionDto.getAction().getParamDto(); + + TextCardButtonDto textCardButtonDto = TextCardButtonDto.builder() + .action("webLink") + .label(weatherDto.getLocation() + "보러가기") + .webLinkUrl("https://i.kakao.com/docs/skill-response-format#basiccard") + .build(); + + TextCardContentDto textCardContentDto = TextCardContentDto.builder() + .title("날씨를 보여주는 text card 입니다.") + .description("링크를 누르시면 web으로 이동됩니다.") + .build(); + + textCardContentDto.addButton(textCardButtonDto); + + TextCardDto textCardDto = TextCardDto.builder() + .textCard(textCardContentDto) + .build(); + + TemplateDto templateDto = TemplateDto.builder() + .build(); + + templateDto.addOutput(textCardDto); + + return ResponseResultDto.createResultMessage(templateDto); + } +} diff --git a/api/src/main/java/com/kth/mssage/info/web/dto/request/ActionDto.java b/api/src/main/java/com/kth/mssage/info/web/dto/request/ActionDto.java new file mode 100644 index 0000000..4fe7af2 --- /dev/null +++ b/api/src/main/java/com/kth/mssage/info/web/dto/request/ActionDto.java @@ -0,0 +1,18 @@ +package com.kth.mssage.info.web.dto.request; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class ActionDto { + + private final T paramDto; + + @JsonCreator + public ActionDto(@JsonProperty("params") T paramDto) { + this.paramDto = paramDto; + } +} diff --git a/api/src/main/java/com/kth/mssage/info/web/dto/request/ParamDto.java b/api/src/main/java/com/kth/mssage/info/web/dto/request/ParamDto.java new file mode 100644 index 0000000..4addab0 --- /dev/null +++ b/api/src/main/java/com/kth/mssage/info/web/dto/request/ParamDto.java @@ -0,0 +1,32 @@ +package com.kth.mssage.info.web.dto.request; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeInfo.As; +import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; +import com.kth.mssage.info.web.dto.request.skill.WeatherDto; +import lombok.Getter; +import lombok.experimental.SuperBuilder; + +@JsonTypeInfo( + use = Id.NAME, + include = As.EXISTING_PROPERTY, + property = "type", + visible = true +) +@JsonSubTypes({ + @JsonSubTypes.Type(name = "날씨", value = WeatherDto.class) +}) +@Getter +@SuperBuilder +public class ParamDto { + + private final String type; + + @JsonCreator + public ParamDto(@JsonProperty("type") String type) { + this.type = type; + } +} diff --git a/api/src/main/java/com/kth/mssage/info/web/dto/request/RequestActionDto.java b/api/src/main/java/com/kth/mssage/info/web/dto/request/RequestActionDto.java new file mode 100644 index 0000000..52a0378 --- /dev/null +++ b/api/src/main/java/com/kth/mssage/info/web/dto/request/RequestActionDto.java @@ -0,0 +1,18 @@ +package com.kth.mssage.info.web.dto.request; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class RequestActionDto { + + private final ActionDto action; + + @JsonCreator + public RequestActionDto(@JsonProperty("action") ActionDto action) { + this.action = action; + } +} diff --git a/api/src/main/java/com/kth/mssage/info/web/dto/request/skill/WeatherDto.java b/api/src/main/java/com/kth/mssage/info/web/dto/request/skill/WeatherDto.java new file mode 100644 index 0000000..341a05e --- /dev/null +++ b/api/src/main/java/com/kth/mssage/info/web/dto/request/skill/WeatherDto.java @@ -0,0 +1,21 @@ +package com.kth.mssage.info.web.dto.request.skill; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.kth.mssage.info.web.dto.request.ParamDto; +import lombok.Getter; +import lombok.experimental.SuperBuilder; + +@Getter +@SuperBuilder +public class WeatherDto extends ParamDto { + + private final String location; + + @JsonCreator + public WeatherDto(@JsonProperty("type") String type, + @JsonProperty("location") String location) { + super(type); + this.location = location; + } +} diff --git a/api/src/main/java/com/kth/mssage/info/web/dto/response/ResponseResultDto.java b/api/src/main/java/com/kth/mssage/info/web/dto/response/ResponseResultDto.java new file mode 100644 index 0000000..dfd2c88 --- /dev/null +++ b/api/src/main/java/com/kth/mssage/info/web/dto/response/ResponseResultDto.java @@ -0,0 +1,18 @@ +package com.kth.mssage.info.web.dto.response; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class ResponseResultDto { + + private final String version = "2.0"; + private final TemplateDto template; + + public static ResponseResultDto createResultMessage(TemplateDto templateDto) { + return ResponseResultDto.builder() + .template(templateDto) + .build(); + } +} diff --git a/api/src/main/java/com/kth/mssage/info/web/dto/response/TemplateDto.java b/api/src/main/java/com/kth/mssage/info/web/dto/response/TemplateDto.java new file mode 100644 index 0000000..ba9dfef --- /dev/null +++ b/api/src/main/java/com/kth/mssage/info/web/dto/response/TemplateDto.java @@ -0,0 +1,17 @@ +package com.kth.mssage.info.web.dto.response; + +import java.util.ArrayList; +import java.util.List; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class TemplateDto { + + private final List outputs = new ArrayList<>(); + + public void addOutput(T output) { + this.outputs.add(output); + } +} diff --git a/api/src/main/java/com/kth/mssage/info/web/dto/response/skill/simpletext/SimpleTextContentDto.java b/api/src/main/java/com/kth/mssage/info/web/dto/response/skill/simpletext/SimpleTextContentDto.java new file mode 100644 index 0000000..6daf1c1 --- /dev/null +++ b/api/src/main/java/com/kth/mssage/info/web/dto/response/skill/simpletext/SimpleTextContentDto.java @@ -0,0 +1,11 @@ +package com.kth.mssage.info.web.dto.response.skill.simpletext; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class SimpleTextContentDto { + + private final String text; +} diff --git a/api/src/main/java/com/kth/mssage/info/web/dto/response/skill/simpletext/SimpleTextDto.java b/api/src/main/java/com/kth/mssage/info/web/dto/response/skill/simpletext/SimpleTextDto.java new file mode 100644 index 0000000..a36906f --- /dev/null +++ b/api/src/main/java/com/kth/mssage/info/web/dto/response/skill/simpletext/SimpleTextDto.java @@ -0,0 +1,11 @@ +package com.kth.mssage.info.web.dto.response.skill.simpletext; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class SimpleTextDto { + + private final SimpleTextContentDto simpleText; +} diff --git a/api/src/main/java/com/kth/mssage/info/web/dto/response/skill/textcard/TextCardButtonDto.java b/api/src/main/java/com/kth/mssage/info/web/dto/response/skill/textcard/TextCardButtonDto.java new file mode 100644 index 0000000..fea1d81 --- /dev/null +++ b/api/src/main/java/com/kth/mssage/info/web/dto/response/skill/textcard/TextCardButtonDto.java @@ -0,0 +1,12 @@ +package com.kth.mssage.info.web.dto.response.skill.textcard; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class TextCardButtonDto { + private final String action; + private final String label; + private final String webLinkUrl; +} diff --git a/api/src/main/java/com/kth/mssage/info/web/dto/response/skill/textcard/TextCardContentDto.java b/api/src/main/java/com/kth/mssage/info/web/dto/response/skill/textcard/TextCardContentDto.java new file mode 100644 index 0000000..87c4e65 --- /dev/null +++ b/api/src/main/java/com/kth/mssage/info/web/dto/response/skill/textcard/TextCardContentDto.java @@ -0,0 +1,20 @@ +package com.kth.mssage.info.web.dto.response.skill.textcard; + +import lombok.Builder; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +@Getter +@Builder +public class TextCardContentDto { + + private final String title; + private final String description; + private final List buttons = new ArrayList<>(); + + public void addButton(TextCardButtonDto textCardButtonDto) { + this.buttons.add(textCardButtonDto); + } +} diff --git a/api/src/main/java/com/kth/mssage/info/web/dto/response/skill/textcard/TextCardDto.java b/api/src/main/java/com/kth/mssage/info/web/dto/response/skill/textcard/TextCardDto.java new file mode 100644 index 0000000..6a06611 --- /dev/null +++ b/api/src/main/java/com/kth/mssage/info/web/dto/response/skill/textcard/TextCardDto.java @@ -0,0 +1,11 @@ +package com.kth.mssage.info.web.dto.response.skill.textcard; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class TextCardDto { + + private final TextCardContentDto textCard; +} diff --git a/api/src/test/java/com/kth/mssage/MessageApplicationTest.java b/api/src/test/java/com/kth/mssage/MessageApplicationTest.java new file mode 100644 index 0000000..96f96c2 --- /dev/null +++ b/api/src/test/java/com/kth/mssage/MessageApplicationTest.java @@ -0,0 +1,8 @@ +package com.kth.mssage; + +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class MessageApplicationTest { + +} diff --git a/api/src/test/java/com/kth/mssage/info/web/controller/integration/SimpleTextControllerTest.java b/api/src/test/java/com/kth/mssage/info/web/controller/integration/SimpleTextControllerTest.java new file mode 100644 index 0000000..85e38e5 --- /dev/null +++ b/api/src/test/java/com/kth/mssage/info/web/controller/integration/SimpleTextControllerTest.java @@ -0,0 +1,40 @@ +package com.kth.mssage.info.web.controller.integration; + +import com.kth.mssage.info.web.controller.util.JsonReader; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@AutoConfigureMockMvc +@SpringBootTest +class SimpleTextControllerTest { + + @Autowired + private MockMvc mockMvc; + + private String jsonRequest; + private String jsonResponse; + + @BeforeEach + public void setup() throws Exception { + jsonRequest = JsonReader.readJsonFile("__files/payload/chatbot-message-request.json"); + jsonResponse = JsonReader.readJsonFile("__files/payload/simple-text-message-response.json"); + } + + @Test + public void testSimpleTextController() throws Exception { + mockMvc.perform(post("/simple-text/message") + .contentType(MediaType.APPLICATION_JSON) + .content(jsonRequest)) + .andExpect(status().isOk()) + .andExpect(content().json(jsonResponse)); + } +} diff --git a/api/src/test/java/com/kth/mssage/info/web/controller/integration/TextCardControllerTest.java b/api/src/test/java/com/kth/mssage/info/web/controller/integration/TextCardControllerTest.java new file mode 100644 index 0000000..a0e70e6 --- /dev/null +++ b/api/src/test/java/com/kth/mssage/info/web/controller/integration/TextCardControllerTest.java @@ -0,0 +1,40 @@ +package com.kth.mssage.info.web.controller.integration; + +import com.kth.mssage.info.web.controller.util.JsonReader; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@AutoConfigureMockMvc +@SpringBootTest +class TextCardControllerTest { + + @Autowired + private MockMvc mockMvc; + + private String jsonRequest; + private String jsonResponse; + + @BeforeEach + public void setup() throws Exception { + jsonRequest = JsonReader.readJsonFile("__files/payload/chatbot-message-request.json"); + jsonResponse = JsonReader.readJsonFile("__files/payload/text-card-message-response.json"); + } + + @Test + public void testTextCardController() throws Exception { + mockMvc.perform(post("/text-card/message") + .contentType(MediaType.APPLICATION_JSON) + .content(jsonRequest)) + .andExpect(status().isOk()) + .andExpect(content().json(jsonResponse)); + } +} diff --git a/api/src/test/java/com/kth/mssage/info/web/controller/util/JsonReader.java b/api/src/test/java/com/kth/mssage/info/web/controller/util/JsonReader.java new file mode 100644 index 0000000..0686aac --- /dev/null +++ b/api/src/test/java/com/kth/mssage/info/web/controller/util/JsonReader.java @@ -0,0 +1,17 @@ +package com.kth.mssage.info.web.controller.util; + + +import org.springframework.core.io.ClassPathResource; +import org.springframework.util.FileCopyUtils; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +public class JsonReader { + + public static String readJsonFile(String fileName) throws IOException { + ClassPathResource classPathResource = new ClassPathResource(fileName); + byte[] bytes = FileCopyUtils.copyToByteArray(classPathResource.getInputStream()); + return new String(bytes, StandardCharsets.UTF_8); + } +} diff --git a/api/src/test/resources/__files/payload/chatbot-message-request.json b/api/src/test/resources/__files/payload/chatbot-message-request.json new file mode 100644 index 0000000..658d681 --- /dev/null +++ b/api/src/test/resources/__files/payload/chatbot-message-request.json @@ -0,0 +1,76 @@ +{ + "bot": { + "id": "<봇 id>", + "name": "<봇 이름>" + }, + "intent": { + "id": "<블록 id>", + "name": "지식+", + "extra": { + "reason": { + "code": 1, + "message": "OK" + }, + "knowledge": { + "responseType": "skill", + "matchedKnowledges": [ + { + "categories": [ + "<카테고리 1>", + "<카테고리 2>", + "<카테고리 3>", + "<카테고리 4>" + ], + "question": "<질문>", + "answer": "<답변>", + "imageUrl": "<이미지 url>", + "landingUrl": "<랜딩 url>" + }, + { + "categories": [ + "<카테고리 1>", + "<카테고리 2>", + "<카테고리 3>", + "<카테고리 4>" + ], + "question": "<질문>", + "answer": "<답변>", + "imageUrl": "<이미지 url>", + "landingUrl": "<랜딩 url>" + } + ] + } + } + }, + "action": { + "id": "<액션 id>", + "name": "<액션 이름>", + "params": { + "type": "날씨", + "location": "사용자가 원하는 위치" + }, + "detailParams": {}, + "clientExtra": {} + }, + "userRequest": { + "block": { + "id": "<블록 id>", + "name": "<블록 이름>" + }, + "user": { + "id": "<사용자 botUserKey>", + "type": "botUserKey", + "properties": { + "botUserKey": "<사용자 botUserKey>" + } + }, + "utterance": "<사용자 발화>", + "params": { + "surface": "BuilderBotTest", + "ignoreMe": "true" + }, + "lang": "ko", + "timezone": "Asia/Seoul" + }, + "contexts": [] +} diff --git a/api/src/test/resources/__files/payload/simple-text-message-response.json b/api/src/test/resources/__files/payload/simple-text-message-response.json new file mode 100644 index 0000000..fe9708c --- /dev/null +++ b/api/src/test/resources/__files/payload/simple-text-message-response.json @@ -0,0 +1,12 @@ +{ + "version": "2.0", + "template": { + "outputs": [ + { + "simpleText": { + "text": "사용자가 원하는 위치 날씨가 좋아요" + } + } + ] + } +} diff --git a/api/src/test/resources/__files/payload/text-card-message-response.json b/api/src/test/resources/__files/payload/text-card-message-response.json new file mode 100644 index 0000000..bd99160 --- /dev/null +++ b/api/src/test/resources/__files/payload/text-card-message-response.json @@ -0,0 +1,20 @@ +{ + "version": "2.0", + "template": { + "outputs": [ + { + "textCard": { + "title": "날씨를 보여주는 text card 입니다.", + "description": "링크를 누르시면 web으로 이동됩니다.", + "buttons": [ + { + "action": "webLink", + "label": "사용자가 원하는 위치보러가기", + "webLinkUrl": "https://i.kakao.com/docs/skill-response-format#basiccard" + } + ] + } + } + ] + } +}