Skip to content

Commit

Permalink
Merge pull request #7 from JeongeunChoi/feature/#6
Browse files Browse the repository at this point in the history
Feature/#6 Notion Database API 서비스 코드 작성
  • Loading branch information
coke98 authored Sep 20, 2022
2 parents 664b3d6 + 8558ef5 commit 52b9840
Show file tree
Hide file tree
Showing 5 changed files with 181 additions and 13 deletions.
6 changes: 3 additions & 3 deletions src/main/java/com/gdscpknu/gdscpknu/GdscpknuApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
@SpringBootApplication
public class GdscpknuApplication {

public static void main(String[] args) {
SpringApplication.run(GdscpknuApplication.class, args);
}
public static void main(String[] args) {
SpringApplication.run(GdscpknuApplication.class, args);
}

}
18 changes: 18 additions & 0 deletions src/main/java/com/gdscpknu/gdscpknu/domain/Member.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.gdscpknu.gdscpknu.domain;

import lombok.Builder;
import lombok.Getter;

@Getter
public class Member {
private String name;
private String email;
private String role;

@Builder
public Member(String name, String email, String role) {
this.name = name;
this.email = email;
this.role = role;
}
}
44 changes: 44 additions & 0 deletions src/main/java/com/gdscpknu/gdscpknu/notion/GdscNotion.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.gdscpknu.gdscpknu.notion;

import org.jraf.klibnotion.client.Authentication;
import org.jraf.klibnotion.client.ClientConfiguration;
import org.jraf.klibnotion.client.NotionClient;
import org.jraf.klibnotion.client.blocking.BlockingNotionClient;
import org.jraf.klibnotion.client.blocking.BlockingNotionClientUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class GdscNotion {

@Value("${testNotion.introduce.token}")
private String TOKEN;
@Value("${testNotion.introduce.databaseId}")
private String DATABASE_ID;
private final BlockingNotionClient client;

public GdscNotion(BlockingNotionClient client) {
this.client = initClient();
}

public BlockingNotionClient initClient() {
NotionClient notionClient = NotionClient.newInstance(
new ClientConfiguration(
new Authentication(TOKEN)
)
);
return BlockingNotionClientUtils.asBlockingNotionClient(notionClient);
}

public BlockingNotionClient getClient() {
return client;
}

public String getTOKEN() {
return TOKEN;
}

public String getDATABASE_ID() {
return DATABASE_ID;
}
}
97 changes: 97 additions & 0 deletions src/main/java/com/gdscpknu/gdscpknu/service/MemberService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package com.gdscpknu.gdscpknu.service;

import com.gdscpknu.gdscpknu.domain.Member;
import com.gdscpknu.gdscpknu.notion.GdscNotion;
import org.jraf.klibnotion.client.blocking.BlockingNotionClient;
import org.jraf.klibnotion.model.page.Page;
import org.jraf.klibnotion.model.pagination.Pagination;
import org.jraf.klibnotion.model.pagination.ResultPage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Service
public class MemberService {

private final GdscNotion gdscNotion;
private final BlockingNotionClient client;
private List<Member> members;
private List<String> nameList;
private List<String> emailList;
private List<String> roleList;
private ResultPage<Page> memberIntroPage;

@Autowired
public MemberService(GdscNotion gdscNotion) {
this.gdscNotion = gdscNotion;
client = gdscNotion.getClient();
}

public List<Member> getAllMember() {
members = new ArrayList<>();
nameList = new ArrayList<>();
emailList = new ArrayList<>();
roleList = new ArrayList<>();

getMemberIntroPage();

/**
* KlibNotion 라이브러리에서 name, email, role 값을 정규식으로 추출하였음
*/
String resultInString = memberIntroPage.results.toString();
extractName(resultInString);
extractEmail(resultInString);
extractRole(resultInString);
addMember();

return members;
}

private void getMemberIntroPage() {
memberIntroPage = client.getDatabases().queryDatabase(
gdscNotion.getDATABASE_ID(),
null,
null,
new Pagination()
);
}

private void extractName(String resultInString) {
Pattern namePattern = Pattern.compile("(?<=\\(plainText=)(.*?)(?=,)");
Matcher nameMatcher = namePattern.matcher(resultInString);
while (nameMatcher.find()) {
nameList.add(nameMatcher.group());
}
}

private void extractEmail(String resultInString) {
Pattern emailPattern = Pattern.compile("(?<=\\bname=이메일, value=)(.*?)(?=\\))");
Matcher emailMatcher = emailPattern.matcher(resultInString);
while (emailMatcher.find()) {
emailList.add(emailMatcher.group());
}
}

private void extractRole(String resultInString) {
Pattern rolePattern = Pattern.compile("(?<=\\bname=역할, value=SelectOptionImpl\\(name=)(.*?)(?=,)");
Matcher roleMatcher = rolePattern.matcher(resultInString);
while (roleMatcher.find()) {
roleList.add(roleMatcher.group());
}
}

private void addMember() {
for (int i = 0; i < nameList.size(); i++) {
Member member = Member.builder()
.name(nameList.get(i))
.email(emailList.get(i))
.role(roleList.get(i))
.build();
members.add(member);
}
}
}
29 changes: 19 additions & 10 deletions src/test/java/com/gdscpknu/gdscpknu/notion/NotionApiTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,7 @@ public void getRowByEmail() {
}

@Test
void getPlainTexts(){

void getPlainTexts() {
//given
String name = "가나다";
String role = "Core";
Expand All @@ -87,22 +86,32 @@ void getPlainTexts(){

//when
/**
* KlibNotion 라이브러리에서 개별 plainText를 받아올 수 없어 정규식으로 추출하였음
* KlibNotion 라이브러리에서 name, email, role 값을 정규식으로 추출하였음
*/
String resultInString = simpleQueryResultPage.results.toString();
List<String> plainTextList = new ArrayList<>();
// 문자열 중 "(plainText=" ~ "," 범위(이름, 이메일) OR " "name=" ~ "," 범위(역할) 문자열을 추출
Pattern pattern = Pattern.compile("(?<=\\(plainText=)(.*?)(?=,)|(?<=\\(name=)(.*?)(?=,)");
Matcher matcher = pattern.matcher(resultInString);
while (matcher.find()) {
plainTextList.add(matcher.group());
Pattern namePattern = Pattern.compile("(?<=\\(plainText=)(.*?)(?=,)");
Pattern emailPattern = Pattern.compile("(?<=\\bname=이메일, value=)(.*?)(?=\\))");
Pattern rolePattern = Pattern.compile("(?<=\\bname=역할, value=SelectOptionImpl\\(name=)(.*?)(?=,)");
Matcher nameMatcher = namePattern.matcher(resultInString);
Matcher emailMatcher = emailPattern.matcher(resultInString);
Matcher roleMatcher = rolePattern.matcher(resultInString);
while (nameMatcher.find()) {
plainTextList.add(nameMatcher.group());
}
while (emailMatcher.find()) {
plainTextList.add(emailMatcher.group());
}
while (roleMatcher.find()) {
plainTextList.add(roleMatcher.group());
}

//then
assertThat(plainTextList.size()).isEqualTo(notionTable.getMemberNum() * 3);
assertThat(plainTextList.get(0)).isEqualTo(email);
assertThat(plainTextList.get(1)).isEqualTo(role);
assertThat(plainTextList.get(2)).isEqualTo(name);
assertThat(plainTextList.get(0)).isEqualTo(name);
assertThat(plainTextList.get(3)).isEqualTo(email);
assertThat(plainTextList.get(6)).isEqualTo(role);
}

}

0 comments on commit 52b9840

Please sign in to comment.