From 7599254886b2eef3ffad8e8814bf42bbbcd5d1d8 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Fri, 15 Oct 2021 00:36:51 +0900 Subject: [PATCH 01/14] refactor: Add learning package and move class files to learning package --- .../constants/ApprovalState.java | 2 +- .../{playground => learning}/constants/Category.java | 2 +- .../java/{playground => learning}/domain/Document.java | 6 +++--- .../domain/DocumentApproval.java | 4 ++-- .../java/{playground => learning}/domain/User.java | 2 +- src/test/java/learning/DocumentTest.java | 10 +++++----- 6 files changed, 13 insertions(+), 13 deletions(-) rename src/main/java/{playground => learning}/constants/ApprovalState.java (88%) rename src/main/java/{playground => learning}/constants/Category.java (89%) rename src/main/java/{playground => learning}/domain/Document.java (97%) rename src/main/java/{playground => learning}/domain/DocumentApproval.java (88%) rename src/main/java/{playground => learning}/domain/User.java (95%) diff --git a/src/main/java/playground/constants/ApprovalState.java b/src/main/java/learning/constants/ApprovalState.java similarity index 88% rename from src/main/java/playground/constants/ApprovalState.java rename to src/main/java/learning/constants/ApprovalState.java index e4f6937..b85e689 100644 --- a/src/main/java/playground/constants/ApprovalState.java +++ b/src/main/java/learning/constants/ApprovalState.java @@ -1,4 +1,4 @@ -package playground.constants; +package learning.constants; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/playground/constants/Category.java b/src/main/java/learning/constants/Category.java similarity index 89% rename from src/main/java/playground/constants/Category.java rename to src/main/java/learning/constants/Category.java index 6880889..e38e766 100644 --- a/src/main/java/playground/constants/Category.java +++ b/src/main/java/learning/constants/Category.java @@ -1,4 +1,4 @@ -package playground.constants; +package learning.constants; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/playground/domain/Document.java b/src/main/java/learning/domain/Document.java similarity index 97% rename from src/main/java/playground/domain/Document.java rename to src/main/java/learning/domain/Document.java index c6cdda0..9cac4dc 100644 --- a/src/main/java/playground/domain/Document.java +++ b/src/main/java/learning/domain/Document.java @@ -1,9 +1,9 @@ -package playground.domain; +package learning.domain; import lombok.Builder; import lombok.Getter; -import playground.constants.ApprovalState; -import playground.constants.Category; +import learning.constants.ApprovalState; +import learning.constants.Category; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/playground/domain/DocumentApproval.java b/src/main/java/learning/domain/DocumentApproval.java similarity index 88% rename from src/main/java/playground/domain/DocumentApproval.java rename to src/main/java/learning/domain/DocumentApproval.java index 9f4c167..3ce369f 100644 --- a/src/main/java/playground/domain/DocumentApproval.java +++ b/src/main/java/learning/domain/DocumentApproval.java @@ -1,8 +1,8 @@ -package playground.domain; +package learning.domain; import lombok.Builder; import lombok.Setter; -import playground.constants.ApprovalState; +import learning.constants.ApprovalState; @Builder @Setter diff --git a/src/main/java/playground/domain/User.java b/src/main/java/learning/domain/User.java similarity index 95% rename from src/main/java/playground/domain/User.java rename to src/main/java/learning/domain/User.java index 5275bb6..67be52c 100644 --- a/src/main/java/playground/domain/User.java +++ b/src/main/java/learning/domain/User.java @@ -1,4 +1,4 @@ -package playground.domain; +package learning.domain; import lombok.Builder; import lombok.Getter; diff --git a/src/test/java/learning/DocumentTest.java b/src/test/java/learning/DocumentTest.java index d58434f..fc762b1 100644 --- a/src/test/java/learning/DocumentTest.java +++ b/src/test/java/learning/DocumentTest.java @@ -2,11 +2,11 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import playground.constants.ApprovalState; -import playground.constants.Category; -import playground.domain.Document; -import playground.domain.DocumentApproval; -import playground.domain.User; +import learning.constants.ApprovalState; +import learning.constants.Category; +import learning.domain.Document; +import learning.domain.DocumentApproval; +import learning.domain.User; import java.util.Arrays; import java.util.Collections; From 7beed5408c8c1146f3b0b9cf2b8b2c4c0e8bc58a Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Fri, 15 Oct 2021 19:27:53 +0900 Subject: [PATCH 02/14] feat: Add data.sql, application.properties --- build.gradle | 4 ++-- src/main/resources/application.properties | 3 +++ src/main/resources/data.sql | 23 +++++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/data.sql diff --git a/build.gradle b/build.gradle index 2061fcd..81f5e45 100644 --- a/build.gradle +++ b/build.gradle @@ -49,10 +49,10 @@ dependencies { testImplementation('org.springframework.boot:spring-boot-starter-test') // JDBC -// implementation 'org.springframework.boot:spring-boot-starter-jdbc' + implementation 'org.springframework.boot:spring-boot-starter-jdbc' // JPA -// implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' // validation // implementation 'org.springframework.boot:spring-boot-starter-validation' diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..c3ab015 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,3 @@ +spring.h2.console.enabled=true +spring.h2.console.path=/h2-console +spring.database.url=jdbc:h2:mem:testdb \ No newline at end of file diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql new file mode 100644 index 0000000..d4b9274 --- /dev/null +++ b/src/main/resources/data.sql @@ -0,0 +1,23 @@ +drop table if exists document; + +create table document +( + id bigint not null auto_increment primary key, + title varchar(255), + category varchar(255), + contents longvarchar, + userid int, + approvalState varchar(255), + userName varchar(255), + categoryText varchar(255), + approvalStateText varchar(255) +); + +insert into document(id, title, category, contents, userid, approvalstate, username, categorytext, approvalstatetext) +values(default, '팀 운영비 사용 정산의 건', 'OPERATING_EXPENSES', '운영비 사용 내역입니다.', 1, 'DRAFTING', '박우빈', '운영비', '기안'); + +insert into document +values(default, '문건2 제목', 'OPERATING_EXPENSES', '문건2 내용', 1, 'DRAFTING', '박우빈', '운영비', '기안'); + +insert into document +values(default, '문건3 제목', 'OPERATING_EXPENSES', '문건3 내용', 1, 'DRAFTING', '박우빈', '운영비', '기안'); \ No newline at end of file From f5fe48f5e86e7931da0ddd820a690058774a4d43 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Fri, 15 Oct 2021 19:43:25 +0900 Subject: [PATCH 03/14] feat: Add db configs to properties, generate docoument, documentcontroller --- .../controller/DocumentController.java | 17 +++++++++++++++ src/main/java/playground/domain/Document.java | 21 +++++++++++++++++++ src/main/resources/application.properties | 9 +++++++- 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 src/main/java/playground/controller/DocumentController.java create mode 100644 src/main/java/playground/domain/Document.java diff --git a/src/main/java/playground/controller/DocumentController.java b/src/main/java/playground/controller/DocumentController.java new file mode 100644 index 0000000..b4fda85 --- /dev/null +++ b/src/main/java/playground/controller/DocumentController.java @@ -0,0 +1,17 @@ +package playground.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import playground.domain.Document; + +@RestController(value = "api") +public class DocumentController { + + @RequestMapping("/documents/{documentId}") + public ResponseEntity getDocument(@PathVariable int documentId) { + + return null; + } +} diff --git a/src/main/java/playground/domain/Document.java b/src/main/java/playground/domain/Document.java new file mode 100644 index 0000000..ede23eb --- /dev/null +++ b/src/main/java/playground/domain/Document.java @@ -0,0 +1,21 @@ +package playground.domain; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class Document { + + private Long id; + private String title; + private String category; + private String contents; + private int userId; + private String approvalState; + private String userName; + private String categoryText; + private String approvalStateText; + + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c3ab015..ccaa154 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,3 +1,10 @@ spring.h2.console.enabled=true spring.h2.console.path=/h2-console -spring.database.url=jdbc:h2:mem:testdb \ No newline at end of file +spring.datasource.hikari.jdbc-url=jdbc:h2:mem:testdb +spring.datasource.username=sa +spring.datasource.password="" + +spring.datasource.hikari.idletimeout=40000 +spring.datasource.hikari.connection-timeout=5000 +spring.datasource.hikari.validation-timeout=10000 +spring.datasource.hikari.max-lifetime=580000 From 2245ddc274f30095d5585537e8f50de4e820b8a6 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Fri, 15 Oct 2021 20:34:40 +0900 Subject: [PATCH 04/14] feat: Add APIs(getdocument, getoutbox) --- .../controller/DocumentController.java | 69 +++++++++++++++++-- .../{Document.java => DocumentDto.java} | 2 +- .../repository/JdbcDocumentRepository.java | 14 ++++ ...DocumentTest.java => DocumentDtoTest.java} | 2 +- 4 files changed, 78 insertions(+), 9 deletions(-) rename src/main/java/playground/domain/{Document.java => DocumentDto.java} (92%) create mode 100644 src/main/java/playground/repository/JdbcDocumentRepository.java rename src/test/java/learning/{DocumentTest.java => DocumentDtoTest.java} (99%) diff --git a/src/main/java/playground/controller/DocumentController.java b/src/main/java/playground/controller/DocumentController.java index b4fda85..11ed550 100644 --- a/src/main/java/playground/controller/DocumentController.java +++ b/src/main/java/playground/controller/DocumentController.java @@ -1,17 +1,72 @@ package playground.controller; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import playground.domain.Document; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.web.bind.annotation.*; +import playground.domain.DocumentDto; + +import java.time.ZonedDateTime; +import java.util.List; + +import static org.springframework.http.ResponseEntity.internalServerError; +import static org.springframework.http.ResponseEntity.ok; @RestController(value = "api") +@EnableAutoConfiguration public class DocumentController { - @RequestMapping("/documents/{documentId}") - public ResponseEntity getDocument(@PathVariable int documentId) { + @Autowired + private JdbcTemplate jdbcTemplate; + + @RequestMapping(value = "/documents/{documentId}", method = RequestMethod.GET) + public ResponseEntity getDocument(@PathVariable String documentId) { + try { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.add("Transfer-Encoding", "chunked"); + headers.setDate(ZonedDateTime.now()); + headers.add("keep-Alive", "timeout=60"); + headers.add("Connection", "keep-Alive"); - return null; + DocumentDto document = jdbcTemplate.queryForObject("SELECT * FROM DOCUMENT WHERE ID = ?", String.class, documentId); + + return ResponseEntity.ok() + .headers(headers) + .body(document); + } catch (Exception e) { + e.printStackTrace(); + return ResponseEntity.internalServerError() + .body(null); + } } + + @RequestMapping(value = "/documents/outbox", method = RequestMethod.GET) + public ResponseEntity> getOutbox(@RequestParam String drafterId) { + try { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.add("Transfer-Encoding", "chunked"); + headers.setDate(ZonedDateTime.now()); + headers.add("keep-Alive", "timeout=60"); + headers.add("Connection", "keep-Alive"); + + List outbox = jdbcTemplate.queryForList("SELECT * FROM DOCUMENT WHERE ID = ? WHERE APPROVALSTATE = 'DRAFTING'", String.class,drafterId); + + return ResponseEntity>.ok() + .headers(headers) + .body(outbox); + } catch (Exception e) { + e.printStackTrace(); + return ResponseEntity>.internalServerError() + .body(null); + } + } + + + + } diff --git a/src/main/java/playground/domain/Document.java b/src/main/java/playground/domain/DocumentDto.java similarity index 92% rename from src/main/java/playground/domain/Document.java rename to src/main/java/playground/domain/DocumentDto.java index ede23eb..3c1a8d5 100644 --- a/src/main/java/playground/domain/Document.java +++ b/src/main/java/playground/domain/DocumentDto.java @@ -5,7 +5,7 @@ @Getter @Setter -public class Document { +public class DocumentDto { private Long id; private String title; diff --git a/src/main/java/playground/repository/JdbcDocumentRepository.java b/src/main/java/playground/repository/JdbcDocumentRepository.java new file mode 100644 index 0000000..0a6fe84 --- /dev/null +++ b/src/main/java/playground/repository/JdbcDocumentRepository.java @@ -0,0 +1,14 @@ +package playground.repository; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +@Repository +public class JdbcDocumentRepository { + + private final JdbcTemplate jdbcTemplate; + + public JdbcDocumentRepository(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} diff --git a/src/test/java/learning/DocumentTest.java b/src/test/java/learning/DocumentDtoTest.java similarity index 99% rename from src/test/java/learning/DocumentTest.java rename to src/test/java/learning/DocumentDtoTest.java index fc762b1..1f9a4ee 100644 --- a/src/test/java/learning/DocumentTest.java +++ b/src/test/java/learning/DocumentDtoTest.java @@ -16,7 +16,7 @@ import static org.assertj.core.api.Assertions.tuple; import static org.junit.jupiter.api.Assertions.assertThrows; -class DocumentTest { +class DocumentDtoTest { @DisplayName("문서 생성하기") @Test From 61250010c1ceba43ea01bb30d30b3388e2de3639 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Fri, 15 Oct 2021 20:45:18 +0900 Subject: [PATCH 05/14] feat: Add ApproveGenerationRequestDto --- .../controller/DocumentController.java | 2 +- .../domain/ApproveGenerationRequestDto.java | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/main/java/playground/domain/ApproveGenerationRequestDto.java diff --git a/src/main/java/playground/controller/DocumentController.java b/src/main/java/playground/controller/DocumentController.java index 11ed550..e445b30 100644 --- a/src/main/java/playground/controller/DocumentController.java +++ b/src/main/java/playground/controller/DocumentController.java @@ -66,7 +66,7 @@ public ResponseEntity> getOutbox(@RequestParam String drafterI } } - + } diff --git a/src/main/java/playground/domain/ApproveGenerationRequestDto.java b/src/main/java/playground/domain/ApproveGenerationRequestDto.java new file mode 100644 index 0000000..188c767 --- /dev/null +++ b/src/main/java/playground/domain/ApproveGenerationRequestDto.java @@ -0,0 +1,25 @@ +package playground.domain; + +import lombok.Builder; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; + +public class ApproveGenerationRequestDto { + + private String title; + private String category; + private String contents; + private int drafterId; + @Setter + private List approverIds = new ArrayList<>(); + + @Builder + private ApproveGenerationRequestDto(String title, String category, String contents, int drafterId) { + this.title = title; + this.category = category; + this.contents = contents; + this.drafterId = drafterId; + } +} From d02bfb2dc55ef7e9ff633681a3b00489048e5ac0 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Fri, 15 Oct 2021 22:50:03 +0900 Subject: [PATCH 06/14] refactor: Modify h2 config --- .../controller/DocumentController.java | 37 +++++++++++-------- .../domain/ApproveGenerationRequestDto.java | 2 + src/main/resources/application.properties | 10 ----- src/main/resources/application.yml | 9 +++++ 4 files changed, 33 insertions(+), 25 deletions(-) delete mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/application.yml diff --git a/src/main/java/playground/controller/DocumentController.java b/src/main/java/playground/controller/DocumentController.java index e445b30..58cba79 100644 --- a/src/main/java/playground/controller/DocumentController.java +++ b/src/main/java/playground/controller/DocumentController.java @@ -3,18 +3,17 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.web.bind.annotation.*; +import playground.domain.ApproveGenerationRequestDto; import playground.domain.DocumentDto; import java.time.ZonedDateTime; import java.util.List; -import static org.springframework.http.ResponseEntity.internalServerError; -import static org.springframework.http.ResponseEntity.ok; - @RestController(value = "api") @EnableAutoConfiguration public class DocumentController { @@ -32,15 +31,12 @@ public ResponseEntity getDocument(@PathVariable String documentId) headers.add("keep-Alive", "timeout=60"); headers.add("Connection", "keep-Alive"); - DocumentDto document = jdbcTemplate.queryForObject("SELECT * FROM DOCUMENT WHERE ID = ?", String.class, documentId); + DocumentDto document = jdbcTemplate.queryForObject("SELECT * FROM DOCUMENT WHERE ID = ?", DocumentDto.class, documentId); - return ResponseEntity.ok() - .headers(headers) - .body(document); + return new ResponseEntity<>(document, headers, HttpStatus.OK); } catch (Exception e) { e.printStackTrace(); - return ResponseEntity.internalServerError() - .body(null); + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); } } @@ -54,19 +50,30 @@ public ResponseEntity> getOutbox(@RequestParam String drafterI headers.add("keep-Alive", "timeout=60"); headers.add("Connection", "keep-Alive"); - List outbox = jdbcTemplate.queryForList("SELECT * FROM DOCUMENT WHERE ID = ? WHERE APPROVALSTATE = 'DRAFTING'", String.class,drafterId); + List outbox = jdbcTemplate.queryForList("SELECT * FROM DOCUMENT WHERE ID = ? WHERE APPROVALSTATE = 'DRAFTING'", DocumentDto.class, drafterId); - return ResponseEntity>.ok() - .headers(headers) - .body(outbox); + return new ResponseEntity<>(outbox, headers, HttpStatus.OK); } catch (Exception e) { e.printStackTrace(); - return ResponseEntity>.internalServerError() - .body(null); + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); } } + @RequestMapping(value = "documents", method = RequestMethod.POST) + public void approveGenerationRequest(@RequestBody ApproveGenerationRequestDto approveGenerationRequest) { + try { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + String title = approveGenerationRequest.getTitle(); + String category = approveGenerationRequest.getCategory(); + String contents = approveGenerationRequest.getContents(); + int drafterId = approveGenerationRequest.getDrafterId(); + jdbcTemplate.update("INSERT INTO DOCUMENT values"); + } catch (Exception e) { + } + } } diff --git a/src/main/java/playground/domain/ApproveGenerationRequestDto.java b/src/main/java/playground/domain/ApproveGenerationRequestDto.java index 188c767..5e8e637 100644 --- a/src/main/java/playground/domain/ApproveGenerationRequestDto.java +++ b/src/main/java/playground/domain/ApproveGenerationRequestDto.java @@ -1,11 +1,13 @@ package playground.domain; import lombok.Builder; +import lombok.Getter; import lombok.Setter; import java.util.ArrayList; import java.util.List; +@Getter public class ApproveGenerationRequestDto { private String title; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index ccaa154..0000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1,10 +0,0 @@ -spring.h2.console.enabled=true -spring.h2.console.path=/h2-console -spring.datasource.hikari.jdbc-url=jdbc:h2:mem:testdb -spring.datasource.username=sa -spring.datasource.password="" - -spring.datasource.hikari.idletimeout=40000 -spring.datasource.hikari.connection-timeout=5000 -spring.datasource.hikari.validation-timeout=10000 -spring.datasource.hikari.max-lifetime=580000 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..ff3f90f --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,9 @@ +spring: + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:test + username: sa + password: + h2: + console: + enabled: true \ No newline at end of file From 60c1aaa7a42d86ed65c2adb487fc4ff184422b4c Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Fri, 5 Nov 2021 23:54:33 +0900 Subject: [PATCH 07/14] refactor: Modify RequestMapping --- src/main/java/playground/controller/DocumentController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/playground/controller/DocumentController.java b/src/main/java/playground/controller/DocumentController.java index 58cba79..e97aafe 100644 --- a/src/main/java/playground/controller/DocumentController.java +++ b/src/main/java/playground/controller/DocumentController.java @@ -14,7 +14,8 @@ import java.time.ZonedDateTime; import java.util.List; -@RestController(value = "api") +@RestController +@RequestMapping("/api") @EnableAutoConfiguration public class DocumentController { From 1ec42dedcc7c7127f9cc6d37631720aaf85c935a Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Fri, 19 Nov 2021 16:57:52 +0900 Subject: [PATCH 08/14] refactor: Add domain classes --- .../controller/DocumentController.java | 2 -- .../domain/ApproveGenerationRequestDto.java | 27 ----------------- .../java/playground/domain/DocumentDto.java | 21 ------------- .../domain/document/ApprovalState.java | 17 +++++++++++ .../playground/domain/document/Category.java | 16 ++++++++++ .../playground/domain/document/Document.java | 30 +++++++++++++++++++ .../domain/document/DocumentApproval.java | 28 +++++++++++++++++ .../java/playground/domain/user/User.java | 23 ++++++++++++++ 8 files changed, 114 insertions(+), 50 deletions(-) delete mode 100644 src/main/java/playground/domain/ApproveGenerationRequestDto.java delete mode 100644 src/main/java/playground/domain/DocumentDto.java create mode 100644 src/main/java/playground/domain/document/ApprovalState.java create mode 100644 src/main/java/playground/domain/document/Category.java create mode 100644 src/main/java/playground/domain/document/Document.java create mode 100644 src/main/java/playground/domain/document/DocumentApproval.java create mode 100644 src/main/java/playground/domain/user/User.java diff --git a/src/main/java/playground/controller/DocumentController.java b/src/main/java/playground/controller/DocumentController.java index e97aafe..536cd97 100644 --- a/src/main/java/playground/controller/DocumentController.java +++ b/src/main/java/playground/controller/DocumentController.java @@ -8,8 +8,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.web.bind.annotation.*; -import playground.domain.ApproveGenerationRequestDto; -import playground.domain.DocumentDto; import java.time.ZonedDateTime; import java.util.List; diff --git a/src/main/java/playground/domain/ApproveGenerationRequestDto.java b/src/main/java/playground/domain/ApproveGenerationRequestDto.java deleted file mode 100644 index 5e8e637..0000000 --- a/src/main/java/playground/domain/ApproveGenerationRequestDto.java +++ /dev/null @@ -1,27 +0,0 @@ -package playground.domain; - -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; - -import java.util.ArrayList; -import java.util.List; - -@Getter -public class ApproveGenerationRequestDto { - - private String title; - private String category; - private String contents; - private int drafterId; - @Setter - private List approverIds = new ArrayList<>(); - - @Builder - private ApproveGenerationRequestDto(String title, String category, String contents, int drafterId) { - this.title = title; - this.category = category; - this.contents = contents; - this.drafterId = drafterId; - } -} diff --git a/src/main/java/playground/domain/DocumentDto.java b/src/main/java/playground/domain/DocumentDto.java deleted file mode 100644 index 3c1a8d5..0000000 --- a/src/main/java/playground/domain/DocumentDto.java +++ /dev/null @@ -1,21 +0,0 @@ -package playground.domain; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class DocumentDto { - - private Long id; - private String title; - private String category; - private String contents; - private int userId; - private String approvalState; - private String userName; - private String categoryText; - private String approvalStateText; - - -} diff --git a/src/main/java/playground/domain/document/ApprovalState.java b/src/main/java/playground/domain/document/ApprovalState.java new file mode 100644 index 0000000..b1712ca --- /dev/null +++ b/src/main/java/playground/domain/document/ApprovalState.java @@ -0,0 +1,17 @@ +package playground.domain.document; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum ApprovalState { + + DRAFTING("기안"), + APPROVED("승인"), + CANCELED("거절"), + ; + + private final String text; + +} diff --git a/src/main/java/playground/domain/document/Category.java b/src/main/java/playground/domain/document/Category.java new file mode 100644 index 0000000..a8f6ed5 --- /dev/null +++ b/src/main/java/playground/domain/document/Category.java @@ -0,0 +1,16 @@ +package playground.domain.document; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum Category { + + OPERATING_EXPENSES("운영비"), + EDUCATION("교육") + ; + + private final String text; + +} diff --git a/src/main/java/playground/domain/document/Document.java b/src/main/java/playground/domain/document/Document.java new file mode 100644 index 0000000..76a6d50 --- /dev/null +++ b/src/main/java/playground/domain/document/Document.java @@ -0,0 +1,30 @@ +package playground.domain.document; + +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class Document { + + private Long id; + + private String title; + private Category category; + private String contents; + + private ApprovalState approvalState; + private Long drafterId; + + @Builder + private Document(Long id, String title, Category category, String contents, ApprovalState approvalState, Long drafterId) { + this.id = id; + this.title = title; + this.category = category; + this.contents = contents; + this.approvalState = approvalState; + this.drafterId = drafterId; + } + +} diff --git a/src/main/java/playground/domain/document/DocumentApproval.java b/src/main/java/playground/domain/document/DocumentApproval.java new file mode 100644 index 0000000..360a77f --- /dev/null +++ b/src/main/java/playground/domain/document/DocumentApproval.java @@ -0,0 +1,28 @@ +package playground.domain.document; + +import lombok.Builder; +import lombok.Getter; + +@Getter +public class DocumentApproval { + + private Long id; + + private Long documentId; + private Long approverId; + + private ApprovalState approvalState; + private Integer approvalOrder; + private String approvalComment; + + @Builder + public DocumentApproval(Long id, Long documentId, Long approverId, ApprovalState approvalState, Integer approvalOrder, String approvalComment) { + this.id = id; + this.documentId = documentId; + this.approverId = approverId; + this.approvalState = approvalState; + this.approvalOrder = approvalOrder; + this.approvalComment = approvalComment; + } + +} diff --git a/src/main/java/playground/domain/user/User.java b/src/main/java/playground/domain/user/User.java new file mode 100644 index 0000000..815d016 --- /dev/null +++ b/src/main/java/playground/domain/user/User.java @@ -0,0 +1,23 @@ +package playground.domain.user; + +import lombok.Builder; +import lombok.Getter; + +@Getter +public class User { + + private Long id; + + private String email; + private String password; + private String name; + + @Builder + public User(Long id, String email, String password, String name) { + this.id = id; + this.email = email; + this.password = password; + this.name = name; + } + +} From 4076358336ff67b3c27bf607c7d84c6af622a0c3 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Fri, 19 Nov 2021 17:11:59 +0900 Subject: [PATCH 09/14] feat: Add service, web documents --- .../repository/JdbcDocumentRepository.java | 14 ------- .../service/document/DocumentService.java | 4 ++ .../document/dto/DocumentResponseDto.java | 40 +++++++++++++++++++ .../web/document/DocumentController.java | 13 ++++++ .../document/dto/DocumentCreateRequest.java | 30 ++++++++++++++ .../document/dto/DocumentOutboxRequest.java | 7 ++++ 6 files changed, 94 insertions(+), 14 deletions(-) delete mode 100644 src/main/java/playground/repository/JdbcDocumentRepository.java create mode 100644 src/main/java/playground/service/document/DocumentService.java create mode 100644 src/main/java/playground/service/document/dto/DocumentResponseDto.java create mode 100644 src/main/java/playground/web/document/DocumentController.java create mode 100644 src/main/java/playground/web/document/dto/DocumentCreateRequest.java create mode 100644 src/main/java/playground/web/document/dto/DocumentOutboxRequest.java diff --git a/src/main/java/playground/repository/JdbcDocumentRepository.java b/src/main/java/playground/repository/JdbcDocumentRepository.java deleted file mode 100644 index 0a6fe84..0000000 --- a/src/main/java/playground/repository/JdbcDocumentRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -package playground.repository; - -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Repository; - -@Repository -public class JdbcDocumentRepository { - - private final JdbcTemplate jdbcTemplate; - - public JdbcDocumentRepository(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } -} diff --git a/src/main/java/playground/service/document/DocumentService.java b/src/main/java/playground/service/document/DocumentService.java new file mode 100644 index 0000000..08d3c35 --- /dev/null +++ b/src/main/java/playground/service/document/DocumentService.java @@ -0,0 +1,4 @@ +package playground.service.document; + +public class DocumentService { +} diff --git a/src/main/java/playground/service/document/dto/DocumentResponseDto.java b/src/main/java/playground/service/document/dto/DocumentResponseDto.java new file mode 100644 index 0000000..5f9a284 --- /dev/null +++ b/src/main/java/playground/service/document/dto/DocumentResponseDto.java @@ -0,0 +1,40 @@ +package playground.service.document.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import playground.domain.document.ApprovalState; +import playground.domain.document.Category; +import playground.domain.document.Document; +import playground.domain.user.User; + +@Getter +@NoArgsConstructor +public class DocumentResponseDto { + + private Long id; + private String title; + private Category category; + private String contents; + private Long userId; + private ApprovalState approvalState; + private String userName; + + public DocumentResponseDto(Document document, User drafter) { + this.id = document.getId(); + this.title = document.getTitle(); + this.category = document.getCategory(); + this.contents = document.getContents(); + this.approvalState = document.getApprovalState(); + + this.userId = drafter.getId(); + this.userName = drafter.getName(); + } + + public String getCategoryText() { + return category.getText(); + } + + public String getApprovalStateText() { + return approvalState.getText(); + } +} diff --git a/src/main/java/playground/web/document/DocumentController.java b/src/main/java/playground/web/document/DocumentController.java new file mode 100644 index 0000000..0c3b4f3 --- /dev/null +++ b/src/main/java/playground/web/document/DocumentController.java @@ -0,0 +1,13 @@ +package playground.web.document; + +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import playground.service.document.DocumentService; + +@RequiredArgsConstructor +@RestController +public class DocumentController { + + +} diff --git a/src/main/java/playground/web/document/dto/DocumentCreateRequest.java b/src/main/java/playground/web/document/dto/DocumentCreateRequest.java new file mode 100644 index 0000000..92a7bcc --- /dev/null +++ b/src/main/java/playground/web/document/dto/DocumentCreateRequest.java @@ -0,0 +1,30 @@ +package playground.web.document.dto; + +import lombok.Getter; +import playground.domain.document.ApprovalState; +import playground.domain.document.Category; +import playground.domain.document.Document; + +import java.util.List; + +@Getter +public class DocumentCreateRequest { + + private String title; + private Category category; + private String contents; + + private Long drafterId; + private List approverIds; + + public Document toEntity() { + return Document.builder() + .title(title) + .category(category) + .contents(contents) + .drafterId(drafterId) + .approvalState(ApprovalState.DRAFTING) + .build(); + } + +} diff --git a/src/main/java/playground/web/document/dto/DocumentOutboxRequest.java b/src/main/java/playground/web/document/dto/DocumentOutboxRequest.java new file mode 100644 index 0000000..71aeaa0 --- /dev/null +++ b/src/main/java/playground/web/document/dto/DocumentOutboxRequest.java @@ -0,0 +1,7 @@ +package playground.web.document.dto; + +public class DocumentOutboxRequest { + + private Long drafterId; //TODO: 2021/11/19 extract userId to loginMember + +} From 498e8ecc9f34e44134256cc594130ddd570ae75d Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Fri, 19 Nov 2021 17:46:18 +0900 Subject: [PATCH 10/14] feat: Add controller methods --- .../dao/document/DocumentApprovalDao.java | 38 ++++++++++ .../playground/dao/document/DocumentDao.java | 76 +++++++++++++++++++ .../document/dto/DocumentTitleResponse.java | 33 ++++++++ .../java/playground/dao/user/UserDao.java | 50 ++++++++++++ .../service/document/DocumentService.java | 61 +++++++++++++++ .../web/document/DocumentController.java | 31 +++++++- .../document/dto/DocumentOutboxRequest.java | 5 ++ 7 files changed, 291 insertions(+), 3 deletions(-) create mode 100644 src/main/java/playground/dao/document/DocumentApprovalDao.java create mode 100644 src/main/java/playground/dao/document/DocumentDao.java create mode 100644 src/main/java/playground/dao/document/dto/DocumentTitleResponse.java create mode 100644 src/main/java/playground/dao/user/UserDao.java diff --git a/src/main/java/playground/dao/document/DocumentApprovalDao.java b/src/main/java/playground/dao/document/DocumentApprovalDao.java new file mode 100644 index 0000000..ee536d7 --- /dev/null +++ b/src/main/java/playground/dao/document/DocumentApprovalDao.java @@ -0,0 +1,38 @@ +package playground.dao.document; + +import lombok.RequiredArgsConstructor; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Repository; +import playground.domain.document.DocumentApproval; + +import java.sql.PreparedStatement; +import java.util.Objects; + +@RequiredArgsConstructor +@Repository +public class DocumentApprovalDao { + + private final JdbcTemplate jdbcTemplate; + + public Long save(DocumentApproval documentApproval) { + String sql = "insert into document_approval(document_id, approver_id, approval_state, approval_order, approval_comment) values(?,?,?,?,?)"; + + KeyHolder keyHolder = new GeneratedKeyHolder(); + jdbcTemplate.update( + connection -> { + PreparedStatement pstmt = connection.prepareStatement(sql, new String[]{"id"}); + pstmt.setLong(1, documentApproval.getDocumentId()); + pstmt.setLong(2, documentApproval.getApproverId()); + pstmt.setString(3, documentApproval.getApprovalState().name()); + pstmt.setInt(4, documentApproval.getApprovalOrder()); + pstmt.setString(5, documentApproval.getApprovalComment()); + return pstmt; + }, + keyHolder + ); + + return Objects.requireNonNull(keyHolder.getKey()).longValue(); + } +} diff --git a/src/main/java/playground/dao/document/DocumentDao.java b/src/main/java/playground/dao/document/DocumentDao.java new file mode 100644 index 0000000..a1e3a52 --- /dev/null +++ b/src/main/java/playground/dao/document/DocumentDao.java @@ -0,0 +1,76 @@ +package playground.dao.document; + +import lombok.RequiredArgsConstructor; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Repository; +import playground.domain.document.ApprovalState; +import playground.domain.document.Category; +import playground.domain.document.Document; + +import java.sql.PreparedStatement; +import java.util.List; +import java.util.Objects; + +@RequiredArgsConstructor +@Repository +public class DocumentDao { + + private final JdbcTemplate jdbcTemplate; + + public Document findById(Long id) { + String sql = "select * from document where id = ?"; + + return jdbcTemplate.queryForObject( + sql, + (rs, rowNum) -> Document.builder() + .id(id) + .title(rs.getString("title")) + .category(Category.valueOf(rs.getString("category"))) + .contents(rs.getString("contents")) + .approvalState(ApprovalState.valueOf(rs.getString("approval_state"))) + .drafterId(rs.getLong("drafter_id")) + .build(), + id + ); + } + + public List findStateDocumentsByDrafterId(Long drafterId, ApprovalState approvalState) { + String sql = "select * from document where drafter_id = ? and approval_state = ?"; + + return jdbcTemplate.query( + sql, + (rs, rowNum) -> Document.builder() + .id(rs.getLong("id")) + .title(rs.getString("title")) + .category(Category.valueOf(rs.getString("category"))) + .approvalState(approvalState) + .drafterId(drafterId) + .build(), + drafterId, + approvalState.name() + ); + } + + public Long save(Document document) { + String sql = "insert into document(title, category, contents, approval_state, drafter_id) values(?,?,?,?,?)"; + + KeyHolder keyHolder = new GeneratedKeyHolder(); + jdbcTemplate.update( + connection -> { + PreparedStatement pstmt = connection.prepareStatement(sql, new String[]{"id"}); + pstmt.setString(1, document.getTitle()); + pstmt.setString(2, document.getCategory().name()); + pstmt.setString(3, document.getContents()); + pstmt.setString(4, document.getApprovalState().name()); + pstmt.setLong(5, document.getDrafterId()); + return pstmt; + }, + keyHolder + ); + + return Objects.requireNonNull(keyHolder.getKey()).longValue(); + } + +} diff --git a/src/main/java/playground/dao/document/dto/DocumentTitleResponse.java b/src/main/java/playground/dao/document/dto/DocumentTitleResponse.java new file mode 100644 index 0000000..36e6aa2 --- /dev/null +++ b/src/main/java/playground/dao/document/dto/DocumentTitleResponse.java @@ -0,0 +1,33 @@ +package playground.dao.document.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import playground.domain.document.ApprovalState; +import playground.domain.document.Category; +import playground.domain.document.Document; + +@Getter +@NoArgsConstructor +public class DocumentTitleResponse { + + private Long id; + private String title; + private Category category; + private ApprovalState approvalState; + + public DocumentTitleResponse(Document document) { + this.id = document.getId(); + this.title = document.getTitle(); + this.category = document.getCategory(); + this.approvalState = document.getApprovalState(); + } + + public String getCategoryText() { + return category.getText(); + } + + public String getApprovalStateText() { + return approvalState.getText(); + } + +} diff --git a/src/main/java/playground/dao/user/UserDao.java b/src/main/java/playground/dao/user/UserDao.java new file mode 100644 index 0000000..aded5f8 --- /dev/null +++ b/src/main/java/playground/dao/user/UserDao.java @@ -0,0 +1,50 @@ +package playground.dao.user; + +import lombok.RequiredArgsConstructor; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; +import playground.domain.user.User; + +import java.util.List; +import java.util.stream.Collectors; + +@RequiredArgsConstructor +@Repository +public class UserDao { + + private final JdbcTemplate jdbcTemplate; + + public User findById(Long id) { + String sql = "select * from user where id = ?"; + + return jdbcTemplate.queryForObject( + sql, + (rs, rowNum) -> User.builder() + .id(id) + .email(rs.getString("email")) + .password(rs.getString("password")) + .name(rs.getString("name")) + .build(), + id + ); + } + + public List findAllByIds(List ids) { + String sql = "select * from user where id in (%s)"; + String inParams = ids.stream() + .map(id -> "?") + .collect(Collectors.joining(",")); + + return jdbcTemplate.query( + String.format(sql, inParams), + (rs, rowNum) -> User.builder() + .id(rs.getLong("id")) + .email(rs.getString("email")) + .password(rs.getString("password")) + .name(rs.getString("name")) + .build(), + ids.toArray() + ); + } + +} diff --git a/src/main/java/playground/service/document/DocumentService.java b/src/main/java/playground/service/document/DocumentService.java index 08d3c35..5bc6abd 100644 --- a/src/main/java/playground/service/document/DocumentService.java +++ b/src/main/java/playground/service/document/DocumentService.java @@ -1,4 +1,65 @@ package playground.service.document; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import playground.dao.document.DocumentApprovalDao; +import playground.dao.document.DocumentDao; +import playground.dao.document.dto.DocumentTitleResponse; +import playground.dao.user.UserDao; +import playground.domain.document.ApprovalState; +import playground.domain.document.Document; +import playground.domain.document.DocumentApproval; +import playground.domain.user.User; +import playground.service.document.dto.DocumentResponseDto; +import playground.web.document.dto.DocumentCreateRequest; +import playground.web.document.dto.DocumentOutboxRequest; + +import java.util.List; +import java.util.stream.Collectors; + +@Transactional(readOnly = true) +@RequiredArgsConstructor +@Service public class DocumentService { + + private final DocumentDao documentDao; + private final DocumentApprovalDao documentApprovalDao; + private final UserDao userDao; + + public List findOutboxDocuments(DocumentOutboxRequest request) { + List outboxDocuments = documentDao.findStateDocumentsByDrafterId(request.getDrafterId(), ApprovalState.DRAFTING); + return convertTitleDtoFrom(outboxDocuments); + } + + public DocumentResponseDto findDocument(Long documentId) { + Document document = documentDao.findById(documentId); + User drafter = userDao.findById(document.getDrafterId()); + + return new DocumentResponseDto(document, drafter); + } + + @Transactional + public void create(DocumentCreateRequest request) { + Document document = request.toEntity(); + Long documentId = documentDao.save(document); + + List approverIds = request.getApproverIds(); + + for (int index = 0; index < approverIds.size(); index++) { + DocumentApproval documentApproval = DocumentApproval.builder() + .documentId(documentId) + .approvalState(ApprovalState.DRAFTING) + .approverId(approverIds.get(index)) + .approvalOrder(index + 1) + .build(); + documentApprovalDao.save(documentApproval); + } + } + + private List convertTitleDtoFrom(List documents) { + return documents.stream() + .map(DocumentTitleResponse::new) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/playground/web/document/DocumentController.java b/src/main/java/playground/web/document/DocumentController.java index 0c3b4f3..f5bd640 100644 --- a/src/main/java/playground/web/document/DocumentController.java +++ b/src/main/java/playground/web/document/DocumentController.java @@ -1,13 +1,38 @@ package playground.web.document; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import playground.dao.document.dto.DocumentTitleResponse; import playground.service.document.DocumentService; +import playground.service.document.dto.DocumentResponseDto; +import playground.web.document.dto.DocumentCreateRequest; +import playground.web.document.dto.DocumentOutboxRequest; + +import java.util.List; @RequiredArgsConstructor @RestController public class DocumentController { - + private final DocumentService documentService; + + @GetMapping("/api/documents/outbox") + public ResponseEntity> findOutboxDocuments(DocumentOutboxRequest requestDto) { + List outboxDocumentDtos = documentService.findOutboxDocuments(requestDto); + return ResponseEntity.ok(outboxDocumentDtos); + } + + @GetMapping("/api/documents/{documentId}") + public ResponseEntity findDocument(@PathVariable Long documentId) { + DocumentResponseDto documentResponseDto = documentService.findDocument(documentId); + return ResponseEntity.ok(documentResponseDto); + } + + @PostMapping("/api/documents") + public ResponseEntity createDocument(@RequestBody DocumentCreateRequest requestDto) { + documentService.create(requestDto); + return ResponseEntity.ok().build(); + } + } diff --git a/src/main/java/playground/web/document/dto/DocumentOutboxRequest.java b/src/main/java/playground/web/document/dto/DocumentOutboxRequest.java index 71aeaa0..5240b07 100644 --- a/src/main/java/playground/web/document/dto/DocumentOutboxRequest.java +++ b/src/main/java/playground/web/document/dto/DocumentOutboxRequest.java @@ -1,5 +1,10 @@ package playground.web.document.dto; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter public class DocumentOutboxRequest { private Long drafterId; //TODO: 2021/11/19 extract userId to loginMember From b4cde2665678488d18ad07b19676bd044c6d4e54 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Fri, 19 Nov 2021 17:46:49 +0900 Subject: [PATCH 11/14] refactor: Modify data.sql --- src/main/resources/data.sql | 63 +++++++++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 16 deletions(-) diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index d4b9274..a3f4a7a 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -1,23 +1,54 @@ -drop table if exists document; +drop table if exists user; +create table user +( + id bigint not null auto_increment primary key, + email varchar(255), + password varchar(255), + name varchar(255) +); +drop table if exists document; create table document ( - id bigint not null auto_increment primary key, - title varchar(255), - category varchar(255), - contents longvarchar, - userid int, - approvalState varchar(255), - userName varchar(255), - categoryText varchar(255), - approvalStateText varchar(255) + id bigint not null auto_increment primary key, + title varchar(255), + category varchar(255), + contents clob, + approval_state varchar(255), + drafter_id bigint +); + +drop table if exists document_approval; +create table document_approval +( + id bigint not null auto_increment primary key, + document_id bigint, + approver_id bigint, + approval_state varchar(255), + approval_order varchar(255), + approval_comment varchar(255) ); -insert into document(id, title, category, contents, userid, approvalstate, username, categorytext, approvalstatetext) -values(default, '팀 운영비 사용 정산의 건', 'OPERATING_EXPENSES', '운영비 사용 내역입니다.', 1, 'DRAFTING', '박우빈', '운영비', '기안'); +insert into user(id, email, password, name) +values (1, 'wbluke@gmail.com', '1234', '박우빈'); + +insert into user(id, email, password, name) +values (2, 'wbluke2@gmail.com', '1234', '닉우빈'); + +insert into document(id, title, category, contents, approval_state, drafter_id) +values (1, '팀 운영비 사용 정산의 건', 'OPERATING_EXPENSES', '운영비 사용 내역입니다.', 'DRAFTING', 1); + +insert into document(id, title, category, contents, approval_state, drafter_id) +values (2, '도서지원비 정산의 건', 'EDUCATION', '도서지원비 사용 내역입니다.', 'DRAFTING', 1); + +insert into document_approval(id, approval_order, approval_state, approver_id, document_id, approval_comment) +values (1, 1, 'APPROVED', 1, 1, null); + +insert into document_approval(id, approval_order, approval_state, approver_id, document_id, approval_comment) +values (2, 2, 'DRAFTING', 2, 1, null); -insert into document -values(default, '문건2 제목', 'OPERATING_EXPENSES', '문건2 내용', 1, 'DRAFTING', '박우빈', '운영비', '기안'); +insert into document_approval(id, approval_order, approval_state, approver_id, document_id, approval_comment) +values (3, 3, 'DRAFTING', 3, 1, null); -insert into document -values(default, '문건3 제목', 'OPERATING_EXPENSES', '문건3 내용', 1, 'DRAFTING', '박우빈', '운영비', '기안'); \ No newline at end of file +insert into document_approval(id, approval_order, approval_state, approver_id, document_id, approval_comment) +values (4, 1, 'APPROVED', 1, 2, '감사합니다.'); From 9497feb781505e61ff34e8f0a87935f8e108cefd Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Fri, 19 Nov 2021 17:51:39 +0900 Subject: [PATCH 12/14] feat: Add http file --- http/document.http | 20 +++++ .../controller/DocumentController.java | 78 ------------------- src/main/resources/application.yml | 2 +- 3 files changed, 21 insertions(+), 79 deletions(-) create mode 100644 http/document.http delete mode 100644 src/main/java/playground/controller/DocumentController.java diff --git a/http/document.http b/http/document.http new file mode 100644 index 0000000..76f6a25 --- /dev/null +++ b/http/document.http @@ -0,0 +1,20 @@ +### document 단건 조회 +GET http://localhost:8080/api/documents/1 + +### document outbox 조회 +GET http://localhost:8080/api/documents/outbox?drafterId=1 + +### document create +POST http://localhost:8080/api/documents +Content-Type: application/json + +{ + "title": "교육비 결재 요청", + "category": "EDUCATION", + "contents": "사외교육비 결재 요청드립니다.", + "drafterId": 1, + "approverIds": [ + 1, + 2 + ] +} diff --git a/src/main/java/playground/controller/DocumentController.java b/src/main/java/playground/controller/DocumentController.java deleted file mode 100644 index 536cd97..0000000 --- a/src/main/java/playground/controller/DocumentController.java +++ /dev/null @@ -1,78 +0,0 @@ -package playground.controller; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.web.bind.annotation.*; - -import java.time.ZonedDateTime; -import java.util.List; - -@RestController -@RequestMapping("/api") -@EnableAutoConfiguration -public class DocumentController { - - @Autowired - private JdbcTemplate jdbcTemplate; - - @RequestMapping(value = "/documents/{documentId}", method = RequestMethod.GET) - public ResponseEntity getDocument(@PathVariable String documentId) { - try { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.add("Transfer-Encoding", "chunked"); - headers.setDate(ZonedDateTime.now()); - headers.add("keep-Alive", "timeout=60"); - headers.add("Connection", "keep-Alive"); - - DocumentDto document = jdbcTemplate.queryForObject("SELECT * FROM DOCUMENT WHERE ID = ?", DocumentDto.class, documentId); - - return new ResponseEntity<>(document, headers, HttpStatus.OK); - } catch (Exception e) { - e.printStackTrace(); - return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); - } - } - - @RequestMapping(value = "/documents/outbox", method = RequestMethod.GET) - public ResponseEntity> getOutbox(@RequestParam String drafterId) { - try { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.add("Transfer-Encoding", "chunked"); - headers.setDate(ZonedDateTime.now()); - headers.add("keep-Alive", "timeout=60"); - headers.add("Connection", "keep-Alive"); - - List outbox = jdbcTemplate.queryForList("SELECT * FROM DOCUMENT WHERE ID = ? WHERE APPROVALSTATE = 'DRAFTING'", DocumentDto.class, drafterId); - - return new ResponseEntity<>(outbox, headers, HttpStatus.OK); - } catch (Exception e) { - e.printStackTrace(); - return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); - } - } - - @RequestMapping(value = "documents", method = RequestMethod.POST) - public void approveGenerationRequest(@RequestBody ApproveGenerationRequestDto approveGenerationRequest) { - try { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - String title = approveGenerationRequest.getTitle(); - String category = approveGenerationRequest.getCategory(); - String contents = approveGenerationRequest.getContents(); - int drafterId = approveGenerationRequest.getDrafterId(); - - jdbcTemplate.update("INSERT INTO DOCUMENT values"); - } catch (Exception e) { - - } - } - -} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index ff3f90f..a681321 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,7 +1,7 @@ spring: datasource: driver-class-name: org.h2.Driver - url: jdbc:h2:mem:test + url: jdbc:h2:mem:playground username: sa password: h2: From c6ed28a5610bcd636e8cd8c61aa742d3033f714b Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Fri, 19 Nov 2021 19:37:13 +0900 Subject: [PATCH 13/14] feat: Add persistence.xml --- src/main/resources/persistence.xml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/resources/persistence.xml diff --git a/src/main/resources/persistence.xml b/src/main/resources/persistence.xml new file mode 100644 index 0000000..24d1b85 --- /dev/null +++ b/src/main/resources/persistence.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + From 57938ab01ca9e50e3954c375e19f44befdb9f3e8 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Fri, 19 Nov 2021 21:17:58 +0900 Subject: [PATCH 14/14] feat: Add jpa annotations, create documentRepository --- src/main/java/playground/PlaygroundApplication.java | 2 ++ .../java/playground/domain/document/Document.java | 7 +++++++ .../playground/domain/document/DocumentApproval.java | 9 +++++++++ src/main/java/playground/domain/user/User.java | 11 +++++++++++ .../playground/jpa/repository/DocumentRepository.java | 11 +++++++++++ src/main/resources/application.yml | 9 --------- src/main/resources/persistence.xml | 5 ++++- 7 files changed, 44 insertions(+), 10 deletions(-) create mode 100644 src/main/java/playground/jpa/repository/DocumentRepository.java delete mode 100644 src/main/resources/application.yml diff --git a/src/main/java/playground/PlaygroundApplication.java b/src/main/java/playground/PlaygroundApplication.java index 3c05485..4aa21ab 100644 --- a/src/main/java/playground/PlaygroundApplication.java +++ b/src/main/java/playground/PlaygroundApplication.java @@ -2,7 +2,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +@EnableJpaAuditing @SpringBootApplication public class PlaygroundApplication { diff --git a/src/main/java/playground/domain/document/Document.java b/src/main/java/playground/domain/document/Document.java index 76a6d50..ee51c9b 100644 --- a/src/main/java/playground/domain/document/Document.java +++ b/src/main/java/playground/domain/document/Document.java @@ -4,16 +4,23 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import javax.persistence.*; + +@Entity +@Table(name = "DOCUMENT") @Getter @NoArgsConstructor public class Document { + @Id + @Column(name = "ID") private Long id; private String title; private Category category; private String contents; + @Enumerated(EnumType.STRING) private ApprovalState approvalState; private Long drafterId; diff --git a/src/main/java/playground/domain/document/DocumentApproval.java b/src/main/java/playground/domain/document/DocumentApproval.java index 360a77f..13599d8 100644 --- a/src/main/java/playground/domain/document/DocumentApproval.java +++ b/src/main/java/playground/domain/document/DocumentApproval.java @@ -2,15 +2,24 @@ import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; +import javax.persistence.*; + +@Entity +@Table(name = "DOCUMENT_APPROVAL") @Getter +@NoArgsConstructor public class DocumentApproval { + @Id + @Column(name = "ID") private Long id; private Long documentId; private Long approverId; + @Enumerated(EnumType.STRING) private ApprovalState approvalState; private Integer approvalOrder; private String approvalComment; diff --git a/src/main/java/playground/domain/user/User.java b/src/main/java/playground/domain/user/User.java index 815d016..2d31ad4 100644 --- a/src/main/java/playground/domain/user/User.java +++ b/src/main/java/playground/domain/user/User.java @@ -2,10 +2,21 @@ import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "USER") @Getter +@NoArgsConstructor public class User { + @Id + @Column(name = "ID") private Long id; private String email; diff --git a/src/main/java/playground/jpa/repository/DocumentRepository.java b/src/main/java/playground/jpa/repository/DocumentRepository.java new file mode 100644 index 0000000..4a00997 --- /dev/null +++ b/src/main/java/playground/jpa/repository/DocumentRepository.java @@ -0,0 +1,11 @@ +package playground.jpa.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import playground.service.document.dto.DocumentResponseDto; + +import java.util.Optional; + +public interface DocumentRepository extends JpaRepository { + + public Optional findById(Long id); +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml deleted file mode 100644 index a681321..0000000 --- a/src/main/resources/application.yml +++ /dev/null @@ -1,9 +0,0 @@ -spring: - datasource: - driver-class-name: org.h2.Driver - url: jdbc:h2:mem:playground - username: sa - password: - h2: - console: - enabled: true \ No newline at end of file diff --git a/src/main/resources/persistence.xml b/src/main/resources/persistence.xml index 24d1b85..9461792 100644 --- a/src/main/resources/persistence.xml +++ b/src/main/resources/persistence.xml @@ -6,13 +6,16 @@ - + + + +