From 62dea1a6f460263bd1258d1686b44bf33adf14a1 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Sun, 22 Jan 2023 13:44:27 +0100 Subject: [PATCH 01/57] change pom.xml and service-contract-api.yaml and generate api and model to target files --- .../pom.xml | 12 +++++++- .../main/resources/service-contract-api.yaml | 29 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/api-first-development-service-api-contract/pom.xml b/api-first-development-service-api-contract/pom.xml index 4285d89..4579873 100644 --- a/api-first-development-service-api-contract/pom.xml +++ b/api-first-development-service-api-contract/pom.xml @@ -45,6 +45,16 @@ validation-api 2.0.1.Final + + io.swagger.core.v3 + swagger-annotations + 2.2.6 + + + org.apache.tomcat + tomcat-annotations-api + 9.0.16 + @@ -52,7 +62,7 @@ io.swagger.codegen.v3 swagger-codegen-maven-plugin - 3.0.37 + 3.0.36 diff --git a/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml b/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml index 09716d3..3a05a83 100644 --- a/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml +++ b/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml @@ -8,4 +8,33 @@ info: servers: - url: 'http://localhost:8080' paths: + /library/books: + get: + summary: This is summary + tags: + - "Library" + description: This is a description + operationId: getAllBooksInLibrary + responses: + "200": + description: This means its ok + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Book' + +components: + schemas: + Book: + description: This is the book model + type: object + properties: + name: + description: The name of book + type: string + bookAuthor: + description: name of author + type: string From b70c6b631132547465da0720865f55782e87e0e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csaba=20Vad=C3=A1sz?= Date: Sun, 22 Jan 2023 14:29:14 +0100 Subject: [PATCH 02/57] Create README.md --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..1a6f620 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# api-first-development +Contract first development using Swagger API + +Part 1 - The Setup (https://www.youtube.com/watch?v=69P7p...) +Part 2 - Editing the YAML file (https://www.youtube.com/watch?v=TyWDJ...) +Part 3 - POST requests (https://www.youtube.com/watch?v=vVoYT...) +Part 4 - Path Parameters (https://www.youtube.com/watch?v=TAVon...) From ac66648f349f2499abfc1210e1c89936292a9738 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csaba=20Vad=C3=A1sz?= Date: Sun, 22 Jan 2023 14:29:45 +0100 Subject: [PATCH 03/57] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 1a6f620..fea99ae 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,9 @@ Contract first development using Swagger API Part 1 - The Setup (https://www.youtube.com/watch?v=69P7p...) + Part 2 - Editing the YAML file (https://www.youtube.com/watch?v=TyWDJ...) + Part 3 - POST requests (https://www.youtube.com/watch?v=vVoYT...) + Part 4 - Path Parameters (https://www.youtube.com/watch?v=TAVon...) From 98228654a51d0d84797b73de4e641025852b5407 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csaba=20Vad=C3=A1sz?= Date: Sun, 22 Jan 2023 14:30:33 +0100 Subject: [PATCH 04/57] Update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fea99ae..69d74a1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# api-first-development +# api-first-development i.e. Contract First Development Contract first development using Swagger API Part 1 - The Setup (https://www.youtube.com/watch?v=69P7p...) @@ -8,3 +8,7 @@ Part 2 - Editing the YAML file (https://www.youtube.com/watch?v=TyWDJ...) Part 3 - POST requests (https://www.youtube.com/watch?v=vVoYT...) Part 4 - Path Parameters (https://www.youtube.com/watch?v=TAVon...) + +Dependencies & plugin pastebin: https://pastebin.com/gdiMqhwW + +Yaml file pastebin: https://pastebin.com/GhKSVbaw From 78fd3821e4e6dd4262fdc70d48dbc538bf86cc3e Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Sun, 22 Jan 2023 14:34:28 +0100 Subject: [PATCH 05/57] refactor README.md --- README.md | 5 ++++- img/img.png | Bin 0 -> 10915 bytes 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 img/img.png diff --git a/README.md b/README.md index 69d74a1..4349c92 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ +![img.png](img/img.png) + # api-first-development i.e. Contract First Development -Contract first development using Swagger API + +## Contract first development using Swagger API Part 1 - The Setup (https://www.youtube.com/watch?v=69P7p...) diff --git a/img/img.png b/img/img.png new file mode 100644 index 0000000000000000000000000000000000000000..542c22809d32a4c01187a7cd90c3e3a8099fb297 GIT binary patch literal 10915 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 Date: Sun, 22 Jan 2023 14:36:23 +0100 Subject: [PATCH 06/57] refactor README.md --- README.md | 2 +- img/img.png => img.png | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename img/img.png => img.png (100%) diff --git a/README.md b/README.md index 4349c92..2bbd6ae 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![img.png](img/img.png) +![img.png](img.png) # api-first-development i.e. Contract First Development diff --git a/img/img.png b/img.png similarity index 100% rename from img/img.png rename to img.png From 81dcc5480c216a30912fcebf61db58d358856848 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Sun, 22 Jan 2023 14:38:57 +0100 Subject: [PATCH 07/57] refactor README.md --- README.md | 2 +- img.png => img/img.png | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename img.png => img/img.png (100%) diff --git a/README.md b/README.md index 2bbd6ae..4349c92 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![img.png](img.png) +![img.png](img/img.png) # api-first-development i.e. Contract First Development diff --git a/img.png b/img/img.png similarity index 100% rename from img.png rename to img/img.png From 8eb9b2cd851071d05bbba1f95d335b487ab71a92 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Sun, 22 Jan 2023 16:02:08 +0100 Subject: [PATCH 08/57] create setup for operating basis --- .../pom.xml | 3 --- api-first-development-service/pom.xml | 6 ++++++ .../controller/BookController.java | 15 +++++++++++++++ pom.xml | 9 +++++++++ 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java diff --git a/api-first-development-service-api-contract/pom.xml b/api-first-development-service-api-contract/pom.xml index 4579873..3b932a0 100644 --- a/api-first-development-service-api-contract/pom.xml +++ b/api-first-development-service-api-contract/pom.xml @@ -23,13 +23,11 @@ org.springframework.boot spring-boot-starter-web - io.swagger swagger-annotations 1.6.2 - io.swagger swagger-models @@ -39,7 +37,6 @@ com.fasterxml.jackson.core jackson-annotations - javax.validation validation-api diff --git a/api-first-development-service/pom.xml b/api-first-development-service/pom.xml index 4aecd01..4f5f202 100644 --- a/api-first-development-service/pom.xml +++ b/api-first-development-service/pom.xml @@ -80,6 +80,12 @@ 3.8.1 test + + com.csaba79coder + api-first-development-service-api-contract + 0.0.1-SNAPSHOT + compile + diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java new file mode 100644 index 0000000..705d22f --- /dev/null +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java @@ -0,0 +1,15 @@ +package com.csaba79coder.apifirstdevelopment.controller; + +import com.csaba79coder.api.LibraryApi; +import com.csaba79coder.models.Book; +import org.springframework.http.ResponseEntity; + +import java.util.List; + +public class BookController implements LibraryApi { + + @Override + public ResponseEntity> getAllBooksInLibrary() { + return null; + } +} diff --git a/pom.xml b/pom.xml index e2de91b..c2111a6 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,15 @@ 17 + + + + com.csaba79coder + api-first-development + 0.0.1-SNAPSHOT + + + scm:git:git@github.com:Csaba79-coder/api-first-development HEAD From f101b5dcaca329b3ea92c475b8f493b44da4090d Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Sun, 22 Jan 2023 16:13:59 +0100 Subject: [PATCH 09/57] delete unused package and main from contract module --- .../src/main/java/com/csaba79coder/App.java | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 api-first-development-service-api-contract/src/main/java/com/csaba79coder/App.java diff --git a/api-first-development-service-api-contract/src/main/java/com/csaba79coder/App.java b/api-first-development-service-api-contract/src/main/java/com/csaba79coder/App.java deleted file mode 100644 index 8888bf1..0000000 --- a/api-first-development-service-api-contract/src/main/java/com/csaba79coder/App.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.csaba79coder; - -/** - * Hello world! - * - */ -public class App -{ - public static void main( String[] args ) - { - System.out.println( "Hello World!" ); - } -} From ddd0b186bb8fc69277884f5318f7522492a147a5 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Sun, 22 Jan 2023 17:48:42 +0100 Subject: [PATCH 10/57] update contract for Book entity --- .../pom.xml | 5 + .../main/resources/service-contract-api.yaml | 176 ++++++++++++++++-- .../controller/BookController.java | 25 ++- 3 files changed, 185 insertions(+), 21 deletions(-) diff --git a/api-first-development-service-api-contract/pom.xml b/api-first-development-service-api-contract/pom.xml index 3b932a0..889c6be 100644 --- a/api-first-development-service-api-contract/pom.xml +++ b/api-first-development-service-api-contract/pom.xml @@ -52,6 +52,11 @@ tomcat-annotations-api 9.0.16 + + org.assertj + assertj-core + 3.23.1 + diff --git a/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml b/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml index 3a05a83..38e9de3 100644 --- a/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml +++ b/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml @@ -8,33 +8,175 @@ info: servers: - url: 'http://localhost:8080' paths: - /library/books: + /books: + put: + tags: + - book + summary: Update an existing book + description: Update an existing book by Id + operationId: updateBook + requestBody: + description: Update an existent book in the store + content: + application/json: + schema: + $ref: '#/components/schemas/Book' + required: true + responses: + '200': + description: Successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/Book' + '400': + description: Invalid ID supplied + '404': + description: Book not found + '405': + description: Validation exception + post: + tags: + - book + summary: Add a new book to the store + description: Add a new book to the store + operationId: addBook + requestBody: + description: Create a new book in the store + content: + application/json: + schema: + $ref: '#/components/schemas/Book' + required: true + responses: + '201': + description: Successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/Book' + '405': + description: Invalid input + /books/{bookId}: get: - summary: This is summary tags: - - "Library" - description: This is a description - operationId: getAllBooksInLibrary + - book + summary: Find book by ID + description: Returns a single book + operationId: getBookById + parameters: + - name: bookId + in: path + description: ID of book to return + required: true + schema: + format: uuid + type: string responses: - "200": - description: This means its ok + '200': + description: successful operation content: application/json: schema: - type: array - items: - $ref: '#/components/schemas/Book' - + $ref: '#/components/schemas/Book' + '400': + description: Invalid ID supplied + '404': + description: Book not found + delete: + tags: + - book + summary: Deletes a book + description: delete a book + operationId: deleteBook + parameters: + - name: api_key + in: header + description: '' + required: false + schema: + type: string + - name: bookId + in: path + description: ID of book to return + required: true + schema: + format: uuid + type: string + responses: + '204': + description: successful operation components: schemas: Book: - description: This is the book model type: object properties: - name: - description: The name of book + id: + description: Id of book entity + type: string + format: uuid + example: '3a8ea9f1-1a95-4caf-932f-2f988052933b' + createdBy: + description: User id who created book entity + type: string + format: uuid + example: '3a8ea9f1-1a95-4caf-932f-2f988052933b' + updatedBy: + description: User id who updated book entity + type: string + format: uuid + example: '3a8ea9f1-1a95-4caf-932f-2f988052933b' + createdAt: + description: Creation time of book entity + type: string + format: timestamp + example: '2019-01-21T05:47:08.644' + updatedAt: + description: Updated time of book entity + type: string + format: timestamp + example: '2019-01-21T05:47:08.644' + title: + description: Title of book entity + type: string + example: 'Cat Among the Pigeons' + isbn: + description: ISBN number of the book (13 characters) + type: number + example: 9780671557003 + genre: + description: Genre of the book entity + type: string + example: DETECTIVE_FICTION + enum: + - DETECTIVE FICTION + - NOVEL + - MYSTERY + - THRILLER + - HORROR + - HISTORICAL + - ROMANCE + - WESTERN + - BILDUNGSROMAN + - SCIENCE_FICTION + - FICTION + - FANTASY + - MAGICAL_REALISM + - REALIST_LITERATURE + - OTHER + status: + description: Status of the book type: string - bookAuthor: - description: name of author + example: SOLD + enum: + - AVAILABLE + - PENDING + - SOLD + availability: + description: Status of book availability type: string - + example: AVAILABLE + enum: + - AVAILABLE + - ARCHIVE + - DELETED diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java index 705d22f..b8708b5 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java @@ -1,15 +1,32 @@ package com.csaba79coder.apifirstdevelopment.controller; -import com.csaba79coder.api.LibraryApi; +import com.csaba79coder.api.BooksApi; import com.csaba79coder.models.Book; import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; -import java.util.List; +import java.util.UUID; -public class BookController implements LibraryApi { +@Controller +public class BookController implements BooksApi { @Override - public ResponseEntity> getAllBooksInLibrary() { + public ResponseEntity addBook(Book body) { + return null; + } + + @Override + public ResponseEntity deleteBook(UUID bookId, String apiKey) { + return null; + } + + @Override + public ResponseEntity getBookById(UUID bookId) { + return null; + } + + @Override + public ResponseEntity updateBook(Book body) { return null; } } From 68cc0d98024ea3a8a9af6ecddd4ec576d1cc1393 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Sun, 22 Jan 2023 18:45:44 +0100 Subject: [PATCH 11/57] add tags to contract --- .../src/main/resources/service-contract-api.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml b/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml index 38e9de3..f7df379 100644 --- a/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml +++ b/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml @@ -7,6 +7,9 @@ info: email: csabavadasz79@gmail.com servers: - url: 'http://localhost:8080' +tags: + - name: book + paths: /books: put: From 0eb4aa0ecae55802229a07bf28458a69828f124a Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Sun, 22 Jan 2023 19:02:29 +0100 Subject: [PATCH 12/57] refactor contract for rendering list of books, and only input parameter in delete endpoint is id! --- .../main/resources/service-contract-api.yaml | 59 +++++++++++++------ .../controller/BookController.java | 10 +++- 2 files changed, 48 insertions(+), 21 deletions(-) diff --git a/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml b/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml index f7df379..86015a6 100644 --- a/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml +++ b/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml @@ -12,28 +12,27 @@ tags: paths: /books: - put: + get: tags: - book - summary: Update an existing book - description: Update an existing book by Id - operationId: updateBook - requestBody: - description: Update an existent book in the store - content: - application/json: - schema: - $ref: '#/components/schemas/Book' - required: true + summary: Render all books + description: Show all books from database + operationId: renderAllBooks responses: '200': description: Successful operation content: application/json: schema: - $ref: '#/components/schemas/Book' + type: array + items: + $ref: '#/components/schemas/Book' '400': - description: Invalid ID supplied + description: Bad request + '401': + description: Unauthorized + '403': + description: Forbidden '404': description: Book not found '405': @@ -86,6 +85,33 @@ paths: description: Invalid ID supplied '404': description: Book not found + put: + tags: + - book + summary: Update an existing book + description: Update an existing book by Id + operationId: updateBook + parameters: + - name: bookId + in: path + description: ID of book to return + required: true + schema: + format: uuid + type: string + responses: + '200': + description: Successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/Book' + '400': + description: Invalid ID supplied + '404': + description: Book not found + '405': + description: Validation exception delete: tags: - book @@ -93,12 +119,6 @@ paths: description: delete a book operationId: deleteBook parameters: - - name: api_key - in: header - description: '' - required: false - schema: - type: string - name: bookId in: path description: ID of book to return @@ -109,6 +129,7 @@ paths: responses: '204': description: successful operation + components: schemas: Book: diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java index b8708b5..a0ad8ce 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java @@ -5,6 +5,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; +import java.util.List; import java.util.UUID; @Controller @@ -16,7 +17,7 @@ public ResponseEntity addBook(Book body) { } @Override - public ResponseEntity deleteBook(UUID bookId, String apiKey) { + public ResponseEntity deleteBook(UUID bookId) { return null; } @@ -26,7 +27,12 @@ public ResponseEntity getBookById(UUID bookId) { } @Override - public ResponseEntity updateBook(Book body) { + public ResponseEntity> renderAllBooks() { + return null; + } + + @Override + public ResponseEntity updateBook(UUID bookId) { return null; } } From 6dd3781658897e998856cd3b31304b92d1891832 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Sun, 22 Jan 2023 19:21:37 +0100 Subject: [PATCH 13/57] change @Controller -> @RestController (as it is API endpoint!) in BookController --- .../apifirstdevelopment/controller/BookController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java index a0ad8ce..491c928 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java @@ -3,12 +3,12 @@ import com.csaba79coder.api.BooksApi; import com.csaba79coder.models.Book; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.UUID; -@Controller +@RestController public class BookController implements BooksApi { @Override From 387f8498f4103d444e415d480c3e4e18c0a77fbc Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Sun, 22 Jan 2023 21:00:34 +0100 Subject: [PATCH 14/57] add Book model to body in case of update method! --- .../src/main/resources/service-contract-api.yaml | 7 +++++++ .../apifirstdevelopment/controller/BookController.java | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml b/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml index 86015a6..17f81db 100644 --- a/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml +++ b/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml @@ -99,6 +99,13 @@ paths: schema: format: uuid type: string + requestBody: + description: Create a new book in the store + content: + application/json: + schema: + $ref: '#/components/schemas/Book' + required: true responses: '200': description: Successful operation diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java index 491c928..2f43dc1 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java @@ -32,7 +32,7 @@ public ResponseEntity> renderAllBooks() { } @Override - public ResponseEntity updateBook(UUID bookId) { + public ResponseEntity updateBook(UUID bookId, Book body) { return null; } } From d0e8e03c1c56d8038b202d524e9bb12b80222963 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 08:48:12 +0100 Subject: [PATCH 15/57] add Book model to body in case of update method! --- doc/task.adoc | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 doc/task.adoc diff --git a/doc/task.adoc b/doc/task.adoc new file mode 100644 index 0000000..235096a --- /dev/null +++ b/doc/task.adoc @@ -0,0 +1,17 @@ += Good to know + +Video with explanation for contract first development + +Part 1 - The Setup (https://www.youtube.com/watch?v=69P7p...) + +Part 2 - Editing the YAML file (https://www.youtube.com/watch?v=TyWDJ...) + +Part 3 - POST requests (https://www.youtube.com/watch?v=vVoYT...) + +Part 4 - Path Parameters (https://www.youtube.com/watch?v=TAVon...) + +''' + +Dependencies & plugin pastebin: https://pastebin.com/gdiMqhwW + +Yaml file pastebin: https://pastebin.com/GhKSVbaw \ No newline at end of file From f2adb6e1c7d353619e7dbefc30d504ec596f46f3 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 08:53:09 +0100 Subject: [PATCH 16/57] additional infos to README.md --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 4349c92..c7b97e3 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,14 @@ ## Contract first development using Swagger API -Part 1 - The Setup (https://www.youtube.com/watch?v=69P7p...) +Backend part of the project! -Part 2 - Editing the YAML file (https://www.youtube.com/watch?v=TyWDJ...) +Using: http://localhost:8080 for the project! -Part 3 - POST requests (https://www.youtube.com/watch?v=vVoYT...) +In service see as follows: -Part 4 - Path Parameters (https://www.youtube.com/watch?v=TAVon...) +Database in case of dev and prod: MyQL Server (environment variables set for project, pls. user your own!) -Dependencies & plugin pastebin: https://pastebin.com/gdiMqhwW +Variables: DB_PORT, DB_URL, DB_USER, DB_PASSWORD -Yaml file pastebin: https://pastebin.com/GhKSVbaw +In case of test: H2 in memory database used (see application.properties for setup under test folder) \ No newline at end of file From f409ddf3027ef53307f7e188e8f182d83483f73c Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 08:53:32 +0100 Subject: [PATCH 17/57] adding CrossOrigin annotation for BookController.java --- .../apifirstdevelopment/controller/BookController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java index 2f43dc1..e006742 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java @@ -3,12 +3,14 @@ import com.csaba79coder.api.BooksApi; import com.csaba79coder.models.Book; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.UUID; @RestController +@CrossOrigin(value = "http://localhost:8080") public class BookController implements BooksApi { @Override From fecd38d7fcd8eee931da304a3da5cb2d48ce4eee Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 08:55:43 +0100 Subject: [PATCH 18/57] correct grammar in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c7b97e3..e70a326 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,6 @@ In service see as follows: Database in case of dev and prod: MyQL Server (environment variables set for project, pls. user your own!) -Variables: DB_PORT, DB_URL, DB_USER, DB_PASSWORD +Environment Variables as follows: DB_PORT, DB_URL, DB_USER, DB_PASSWORD In case of test: H2 in memory database used (see application.properties for setup under test folder) \ No newline at end of file From 1b0d16224e1c375cfd1471c69c1076a57a8446ce Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 09:05:06 +0100 Subject: [PATCH 19/57] additional info to README --- README.md | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index e70a326..98b44e6 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,27 @@ ## Contract first development using Swagger API -Backend part of the project! +## Dependencies -Using: http://localhost:8080 for the project! +- Java Development Kit - JDK 11 -In service see as follows: +## Backend -Database in case of dev and prod: MyQL Server (environment variables set for project, pls. user your own!) +- Using: http://localhost:8080 for the project! -Environment Variables as follows: DB_PORT, DB_URL, DB_USER, DB_PASSWORD +## General setup -In case of test: H2 in memory database used (see application.properties for setup under test folder) \ No newline at end of file +- In service see as follows: + + - Database in case of dev and prod: MyQL Server (environment variables set for project, pls. user your own!) + + - In case of test: H2 in memory database used (see application.properties for setup under test folder) + +- Environment Variables as follows: + +| Name | Value | Remark | Extra remark | +|--------------------|--------------|-------------------|----------------------------------------------------------| +| DB_PORT | 3306 | default | | +| DB_URL | no such info | pls use your own! | | +| DB_USER | root | default | | +| DB_PASSWORD | no such info | pls use your own! | [MYSQL Installation Guide](https://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/) | \ No newline at end of file From 5c40ff63bedfd2135306f693fe61d35a79f8cd10 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 09:06:07 +0100 Subject: [PATCH 20/57] additional info to README --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 98b44e6..b830d8b 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,9 @@ - Using: http://localhost:8080 for the project! -## General setup + +### General setup (Guide) + - In service see as follows: From 73286db6b15ea14125a3a4b7dab8818ccc9cd8d0 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 09:06:42 +0100 Subject: [PATCH 21/57] additional info to README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b830d8b..9f56fb0 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ ## Dependencies -- Java Development Kit - JDK 11 +- Java Development Kit - JDK 17 ## Backend From 4fcd805d3cc61b18bcdde27a771701a419027cb2 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 11:41:28 +0100 Subject: [PATCH 22/57] change contract (models) and implement api in RestController --- .../main/resources/service-contract-api.yaml | 96 +++++++++++++++++-- .../controller/BookController.java | 12 ++- 2 files changed, 96 insertions(+), 12 deletions(-) diff --git a/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml b/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml index 17f81db..6614e6e 100644 --- a/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml +++ b/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml @@ -26,7 +26,7 @@ paths: schema: type: array items: - $ref: '#/components/schemas/Book' + $ref: '#/components/schemas/BookModel' '400': description: Bad request '401': @@ -48,7 +48,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/Book' + $ref: '#/components/schemas/NewBookModel' required: true responses: '201': @@ -56,7 +56,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/Book' + $ref: '#/components/schemas/BookModel' '405': description: Invalid input /books/{bookId}: @@ -80,7 +80,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/Book' + $ref: '#/components/schemas/BookModel' '400': description: Invalid ID supplied '404': @@ -104,7 +104,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/Book' + $ref: '#/components/schemas/ModifiedBookModel' required: true responses: '200': @@ -112,7 +112,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/Book' + $ref: '#/components/schemas/BookModel' '400': description: Invalid ID supplied '404': @@ -139,7 +139,42 @@ paths: components: schemas: - Book: + NewBookModel: + type: object + properties: + title: + description: Title of book entity + type: string + example: 'Cat Among the Pigeons' + isbn: + description: ISBN number of the book (13 characters) + type: number + example: 9780671557003 + genre: + description: Genre of the book entity + type: string + example: DETECTIVE_FICTION + enum: + - DETECTIVE FICTION + - NOVEL + - MYSTERY + - THRILLER + - HORROR + - HISTORICAL + - ROMANCE + - WESTERN + - BILDUNGSROMAN + - SCIENCE_FICTION + - FICTION + - FANTASY + - MAGICAL_REALISM + - REALIST_LITERATURE + - OTHER + required: + - title + - isbn + - genre + BookModel: type: object properties: id: @@ -211,3 +246,50 @@ components: - AVAILABLE - ARCHIVE - DELETED + ModifiedBookModel: + type: object + properties: + title: + description: Title of book entity + type: string + example: 'Cat Among the Pigeons' + isbn: + description: ISBN number of the book (13 characters) + type: number + example: 9780671557003 + genre: + description: Genre of the book entity + type: string + example: DETECTIVE_FICTION + enum: + - DETECTIVE FICTION + - NOVEL + - MYSTERY + - THRILLER + - HORROR + - HISTORICAL + - ROMANCE + - WESTERN + - BILDUNGSROMAN + - SCIENCE_FICTION + - FICTION + - FANTASY + - MAGICAL_REALISM + - REALIST_LITERATURE + - OTHER + status: + description: Status of the book + type: string + example: SOLD + enum: + - AVAILABLE + - PENDING + - SOLD + availability: + description: Status of book availability + type: string + example: AVAILABLE + enum: + - AVAILABLE + - ARCHIVE + - DELETED \ No newline at end of file diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java index e006742..580d722 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java @@ -1,7 +1,9 @@ package com.csaba79coder.apifirstdevelopment.controller; import com.csaba79coder.api.BooksApi; -import com.csaba79coder.models.Book; +import com.csaba79coder.models.BookModel; +import com.csaba79coder.models.ModifiedBookModel; +import com.csaba79coder.models.NewBookModel; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RestController; @@ -14,7 +16,7 @@ public class BookController implements BooksApi { @Override - public ResponseEntity addBook(Book body) { + public ResponseEntity addBook(NewBookModel body) { return null; } @@ -24,17 +26,17 @@ public ResponseEntity deleteBook(UUID bookId) { } @Override - public ResponseEntity getBookById(UUID bookId) { + public ResponseEntity getBookById(UUID bookId) { return null; } @Override - public ResponseEntity> renderAllBooks() { + public ResponseEntity> renderAllBooks() { return null; } @Override - public ResponseEntity updateBook(UUID bookId, Book body) { + public ResponseEntity updateBook(UUID bookId, ModifiedBookModel body) { return null; } } From 27ec361c6ecdf4c991d4695ad713441446f421a9 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 11:41:52 +0100 Subject: [PATCH 23/57] refactor: rename xml config file --- .../db/changelog/setup/{liquibase-config-log.xml => log.xml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename api-first-development-service/src/main/resources/db/changelog/setup/{liquibase-config-log.xml => log.xml} (100%) diff --git a/api-first-development-service/src/main/resources/db/changelog/setup/liquibase-config-log.xml b/api-first-development-service/src/main/resources/db/changelog/setup/log.xml similarity index 100% rename from api-first-development-service/src/main/resources/db/changelog/setup/liquibase-config-log.xml rename to api-first-development-service/src/main/resources/db/changelog/setup/log.xml From c1438f3be2ec2db42e23f0e7f863cb8cfdb25079 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 14:58:12 +0100 Subject: [PATCH 24/57] refactor enum value (due to mistype) --- .../src/main/resources/service-contract-api.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml b/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml index 6614e6e..c7a2fa5 100644 --- a/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml +++ b/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml @@ -215,7 +215,7 @@ components: type: string example: DETECTIVE_FICTION enum: - - DETECTIVE FICTION + - DETECTIVE_FICTION - NOVEL - MYSTERY - THRILLER From 30f9dbeafaf4a5504c3f81ca181e527db1b17560 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 14:59:17 +0100 Subject: [PATCH 25/57] implement book.xml database changelog (liquibase config) --- .../resources/db/changelog/setup/book.xml | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 api-first-development-service/src/main/resources/db/changelog/setup/book.xml diff --git a/api-first-development-service/src/main/resources/db/changelog/setup/book.xml b/api-first-development-service/src/main/resources/db/changelog/setup/book.xml new file mode 100644 index 0000000..2ffdd61 --- /dev/null +++ b/api-first-development-service/src/main/resources/db/changelog/setup/book.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From aa7e01a32e0a844278879fe425e493dbbe65907d Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 15:00:08 +0100 Subject: [PATCH 26/57] setup in db.changelog-master.xml to run book.xml when starting the project --- .../src/main/resources/db/changelog/db.changelog-master.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api-first-development-service/src/main/resources/db/changelog/db.changelog-master.xml b/api-first-development-service/src/main/resources/db/changelog/db.changelog-master.xml index 7ded8a3..4eca524 100644 --- a/api-first-development-service/src/main/resources/db/changelog/db.changelog-master.xml +++ b/api-first-development-service/src/main/resources/db/changelog/db.changelog-master.xml @@ -7,4 +7,7 @@ + + + \ No newline at end of file From 040ce7aceb0841d8a78d5e63242f1de774f78169 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 15:01:06 +0100 Subject: [PATCH 27/57] create enums: Availability, Status and Genre (for Book entity) --- .../apifirstdevelopment/value/Availability.java | 5 +++++ .../com/csaba79coder/apifirstdevelopment/value/Genre.java | 6 ++++++ .../com/csaba79coder/apifirstdevelopment/value/Status.java | 5 +++++ 3 files changed, 16 insertions(+) create mode 100644 api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/value/Availability.java create mode 100644 api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/value/Genre.java create mode 100644 api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/value/Status.java diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/value/Availability.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/value/Availability.java new file mode 100644 index 0000000..4fc22bc --- /dev/null +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/value/Availability.java @@ -0,0 +1,5 @@ +package com.csaba79coder.apifirstdevelopment.value; + +public enum Availability { + AVAILABLE, ARCHIVE, DELETED +} diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/value/Genre.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/value/Genre.java new file mode 100644 index 0000000..32bd9e3 --- /dev/null +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/value/Genre.java @@ -0,0 +1,6 @@ +package com.csaba79coder.apifirstdevelopment.value; + +public enum Genre { + DETECTIVE_FICTION, NOVEL, MYSTERY, THRILLER, HORROR, HISTORICAL, ROMANCE, WESTERN, BILDUNGSROMAN, + SCIENCE_FICTION, FICTION, FANTASY, MAGICAL_REALISM, REALIST_LITERATURE, OTHER +} diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/value/Status.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/value/Status.java new file mode 100644 index 0000000..29feae5 --- /dev/null +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/value/Status.java @@ -0,0 +1,5 @@ +package com.csaba79coder.apifirstdevelopment.value; + +public enum Status { + AVAILABLE, PENDING, SOLD +} From d02b672636ef3edff74b10dc16cb6a6b137374d6 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 15:01:32 +0100 Subject: [PATCH 28/57] create BaseEntity with uuid --- .../apifirstdevelopment/entity/BaseEntity.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/BaseEntity.java diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/BaseEntity.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/BaseEntity.java new file mode 100644 index 0000000..31658ae --- /dev/null +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/BaseEntity.java @@ -0,0 +1,15 @@ +package com.csaba79coder.apifirstdevelopment.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Id; +import jakarta.persistence.MappedSuperclass; + +import java.util.UUID; + +@MappedSuperclass +public class BaseEntity { + + @Id + @Column(name = "id", nullable = false) + private UUID id = UUID.randomUUID(); +} From 4aced19a428ef264d66b6878463d4092be895d8d Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 15:02:12 +0100 Subject: [PATCH 29/57] create Book entity with required fields regarding api contract yaml file and regarding book.xml config --- .../apifirstdevelopment/entity/Book.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/Book.java diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/Book.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/Book.java new file mode 100644 index 0000000..216ccb7 --- /dev/null +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/Book.java @@ -0,0 +1,58 @@ +package com.csaba79coder.apifirstdevelopment.entity; + +import com.csaba79coder.apifirstdevelopment.value.Availability; +import com.csaba79coder.apifirstdevelopment.value.Genre; +import com.csaba79coder.apifirstdevelopment.value.Status; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jdk.jfr.Timestamp; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.hibernate.annotations.Where; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Entity +@Getter +@Setter +@ToString +@NoArgsConstructor +@Where(clause = "availability != 'DELETED'") +public class Book extends BaseEntity { + + @Column(name = "created_by", nullable = false) + private UUID createdBy = UUID.fromString("3a8ea9f1-1a95-4caf-932f-2f988052933b"); + + @Column(name = "updated_by", nullable = false) + private UUID updatedBy = UUID.fromString("9e91103b-ef57-4d61-983c-28dfdd7e332a"); + + @Timestamp + @Column(name = "created_at", nullable = false) + private LocalDateTime createdAt = LocalDateTime.now(); + + @Timestamp + @Column(name = "updated_at", nullable = false) + private LocalDateTime updatedAt = LocalDateTime.now(); + @Column(name = "title", nullable = false) + private String title; + + @Column(name = "isbn", nullable = false, unique = true, length = 13) + private Long isbn; + + @Column(name = "genre", nullable = false) + @Enumerated(EnumType.STRING) + private Genre genre = Genre.OTHER; + + @Column(name = "status", nullable = false) + @Enumerated(EnumType.STRING) + private Status status = Status.AVAILABLE; + + @Column(name = "availability", nullable = false) + @Enumerated(EnumType.STRING) + private Availability availability = Availability.AVAILABLE; +} From a2c647373799cefe790d8500ec8076c8ea33230b Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 15:05:04 +0100 Subject: [PATCH 30/57] adding ISBN 13 validator --- .../util/ISBN13Validator.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/util/ISBN13Validator.java diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/util/ISBN13Validator.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/util/ISBN13Validator.java new file mode 100644 index 0000000..2a284d9 --- /dev/null +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/util/ISBN13Validator.java @@ -0,0 +1,37 @@ +package com.csaba79coder.apifirstdevelopment.util; + +public class ISBN13Validator { + + public static boolean validISBN(Long isbnLong) { + String isbn = String.valueOf(isbnLong); + if (isbn == null) { + return false; + } + if (isbn.startsWith("-")) { + return false; + } + isbn = isbn.replaceAll( "-", "" ); + if ( isbn.length() != 13 ) { + return false; + } + try { + int tot = 0; + for (int i = 0; i < 12; i++) { + int digit = Integer.parseInt( isbn.substring( i, i + 1 ) ); + tot += (i % 2 == 0) ? digit : digit * 3; + } + int checksum = 10 - (tot % 10); + if ( checksum == 10 ) { + checksum = 0; + } + return checksum == Integer.parseInt( isbn.substring( 12 ) ); + } + catch (NumberFormatException nfe) { + return false; + } + } + + private ISBN13Validator() { + + } +} From a0b9966dba01126c4f95b5636e3d82aff1d45f86 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 15:06:45 +0100 Subject: [PATCH 31/57] adding ISBN 13 validator test --- .../util/ISBN13ValidatorTest.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 api-first-development-service/src/test/java/com/csaba79coder/apifirstdevelopment/util/ISBN13ValidatorTest.java diff --git a/api-first-development-service/src/test/java/com/csaba79coder/apifirstdevelopment/util/ISBN13ValidatorTest.java b/api-first-development-service/src/test/java/com/csaba79coder/apifirstdevelopment/util/ISBN13ValidatorTest.java new file mode 100644 index 0000000..5e7b80a --- /dev/null +++ b/api-first-development-service/src/test/java/com/csaba79coder/apifirstdevelopment/util/ISBN13ValidatorTest.java @@ -0,0 +1,50 @@ +package com.csaba79coder.apifirstdevelopment.util; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.BDDAssertions.then; + +class ISBN13ValidatorTest { + + @Test + void validISBN() { + boolean isValid = ISBN13Validator.validISBN(9788845292613L); + then(isValid) + .isTrue(); + } + + @Test + void invalidISBN() { + boolean isValid = ISBN13Validator.validISBN(999L); + then(isValid) + .isFalse(); + } + + @Test + void nullISBN() { + boolean isValid = ISBN13Validator.validISBN(null); + then(isValid) + .isFalse(); + } + + @Test + void zeroISBN() { + boolean isValid = ISBN13Validator.validISBN(0L); + then(isValid) + .isFalse(); + } + + @Test + void negativeNonValidISBN() { + boolean isValid = ISBN13Validator.validISBN(-112L); + then(isValid) + .isFalse(); + } + + @Test + void negativeValidISBN() { + boolean isValid = ISBN13Validator.validISBN(-9780425175477L); + then(isValid) + .isFalse(); + } +} \ No newline at end of file From 6c9436b7cf7abbf38f8e4e991fa4ecdced35f7b1 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 15:08:10 +0100 Subject: [PATCH 32/57] rename method in ISBN Validator and Test --- .../apifirstdevelopment/util/ISBN13Validator.java | 2 +- .../util/ISBN13ValidatorTest.java | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/util/ISBN13Validator.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/util/ISBN13Validator.java index 2a284d9..173612f 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/util/ISBN13Validator.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/util/ISBN13Validator.java @@ -2,7 +2,7 @@ public class ISBN13Validator { - public static boolean validISBN(Long isbnLong) { + public static boolean isValidISBN(Long isbnLong) { String isbn = String.valueOf(isbnLong); if (isbn == null) { return false; diff --git a/api-first-development-service/src/test/java/com/csaba79coder/apifirstdevelopment/util/ISBN13ValidatorTest.java b/api-first-development-service/src/test/java/com/csaba79coder/apifirstdevelopment/util/ISBN13ValidatorTest.java index 5e7b80a..2a29538 100644 --- a/api-first-development-service/src/test/java/com/csaba79coder/apifirstdevelopment/util/ISBN13ValidatorTest.java +++ b/api-first-development-service/src/test/java/com/csaba79coder/apifirstdevelopment/util/ISBN13ValidatorTest.java @@ -8,42 +8,42 @@ class ISBN13ValidatorTest { @Test void validISBN() { - boolean isValid = ISBN13Validator.validISBN(9788845292613L); + boolean isValid = ISBN13Validator.isValidISBN(9788845292613L); then(isValid) .isTrue(); } @Test void invalidISBN() { - boolean isValid = ISBN13Validator.validISBN(999L); + boolean isValid = ISBN13Validator.isValidISBN(999L); then(isValid) .isFalse(); } @Test void nullISBN() { - boolean isValid = ISBN13Validator.validISBN(null); + boolean isValid = ISBN13Validator.isValidISBN(null); then(isValid) .isFalse(); } @Test void zeroISBN() { - boolean isValid = ISBN13Validator.validISBN(0L); + boolean isValid = ISBN13Validator.isValidISBN(0L); then(isValid) .isFalse(); } @Test void negativeNonValidISBN() { - boolean isValid = ISBN13Validator.validISBN(-112L); + boolean isValid = ISBN13Validator.isValidISBN(-112L); then(isValid) .isFalse(); } @Test void negativeValidISBN() { - boolean isValid = ISBN13Validator.validISBN(-9780425175477L); + boolean isValid = ISBN13Validator.isValidISBN(-9780425175477L); then(isValid) .isFalse(); } From bbd49cf723d50f8dcc159e5e53eac4873959fc6c Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 15:20:17 +0100 Subject: [PATCH 33/57] creating BookRepository --- .../persistence/BookRepository.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/persistence/BookRepository.java diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/persistence/BookRepository.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/persistence/BookRepository.java new file mode 100644 index 0000000..5d6c57b --- /dev/null +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/persistence/BookRepository.java @@ -0,0 +1,11 @@ +package com.csaba79coder.apifirstdevelopment.persistence; + +import com.csaba79coder.apifirstdevelopment.entity.Book; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.UUID; + +@Repository +public interface BookRepository extends JpaRepository { +} From f86c5b968d9f116813170abc7e35567d0a99c05d Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 15:21:21 +0100 Subject: [PATCH 34/57] creating BookService --- .../apifirstdevelopment/service/BookService.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java new file mode 100644 index 0000000..9eab7f1 --- /dev/null +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java @@ -0,0 +1,8 @@ +package com.csaba79coder.apifirstdevelopment.service; + +import org.springframework.stereotype.Service; + +@Service +public class BookService { + +} From b789b0906a06c1d9cf86f29e35111e85557dc1d2 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 15:22:49 +0100 Subject: [PATCH 35/57] implementing dependency injection (using Lombok annotation) --- .../apifirstdevelopment/controller/BookController.java | 5 +++++ .../apifirstdevelopment/service/BookService.java | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java index 580d722..bf488ba 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java @@ -1,9 +1,11 @@ package com.csaba79coder.apifirstdevelopment.controller; import com.csaba79coder.api.BooksApi; +import com.csaba79coder.apifirstdevelopment.service.BookService; import com.csaba79coder.models.BookModel; import com.csaba79coder.models.ModifiedBookModel; import com.csaba79coder.models.NewBookModel; +import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RestController; @@ -13,8 +15,11 @@ @RestController @CrossOrigin(value = "http://localhost:8080") +@RequiredArgsConstructor public class BookController implements BooksApi { + private final BookService bookService; + @Override public ResponseEntity addBook(NewBookModel body) { return null; diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java index 9eab7f1..dbdc65d 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java @@ -1,8 +1,13 @@ package com.csaba79coder.apifirstdevelopment.service; +import com.csaba79coder.apifirstdevelopment.persistence.BookRepository; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @Service +@RequiredArgsConstructor public class BookService { + private final BookRepository bookRepository; + } From 7d9891f7492b3e9fc2a15cc10c9018be13b7714f Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 15:31:52 +0100 Subject: [PATCH 36/57] create ErrorCode enum for Exception handling --- .../csaba79coder/apifirstdevelopment/value/ErrorCode.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/value/ErrorCode.java diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/value/ErrorCode.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/value/ErrorCode.java new file mode 100644 index 0000000..ab3d27e --- /dev/null +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/value/ErrorCode.java @@ -0,0 +1,5 @@ +package com.csaba79coder.apifirstdevelopment.value; + +public enum ErrorCode { + ERROR_CODE_001, ERROR_CODE_002 +} From be829de2e854dcc24628dc36b8ec8841425533a4 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 15:40:17 +0100 Subject: [PATCH 37/57] create ControllerExceptionHandler --- .../exception/ControllerExceptionHandler.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/exception/ControllerExceptionHandler.java diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/exception/ControllerExceptionHandler.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/exception/ControllerExceptionHandler.java new file mode 100644 index 0000000..bc1117b --- /dev/null +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/exception/ControllerExceptionHandler.java @@ -0,0 +1,32 @@ +package com.csaba79coder.apifirstdevelopment.exception; + +import com.csaba79coder.apifirstdevelopment.value.ErrorCode; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import java.util.InputMismatchException; +import java.util.Map; +import java.util.NoSuchElementException; + +import static com.csaba79coder.apifirstdevelopment.value.ErrorCode.ERROR_CODE_001; +import static com.csaba79coder.apifirstdevelopment.value.ErrorCode.ERROR_CODE_002; + +@ControllerAdvice +public class ControllerExceptionHandler { + + @ExceptionHandler(value = {NoSuchElementException.class}) + public ResponseEntity handleNoSuchElementException(NoSuchElementException ex) { + return new ResponseEntity<>(responseBodyWithMessage(ERROR_CODE_001, ex.getMessage()), HttpStatus.NOT_FOUND); + } + + @ExceptionHandler(value = {InputMismatchException.class}) + public ResponseEntity handleInvalidInputException(InputMismatchException ex) { + return new ResponseEntity<>(responseBodyWithMessage(ERROR_CODE_002, ex.getMessage()), HttpStatus.BAD_REQUEST); + } + + private String responseBodyWithMessage(ErrorCode code, String message) { + return Map.of(code, message).toString(); + } +} From 2e4515d8581497acc6fd3ce2d31090ce4150db69 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 15:46:57 +0100 Subject: [PATCH 38/57] implementing deleteBookById (service, controller) and implement findBookById(UUID id) in repository --- .../controller/BookController.java | 3 ++- .../persistence/BookRepository.java | 3 +++ .../service/BookService.java | 22 +++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java index bf488ba..71a2b1f 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java @@ -27,7 +27,8 @@ public ResponseEntity addBook(NewBookModel body) { @Override public ResponseEntity deleteBook(UUID bookId) { - return null; + bookService.deleteAnExistingBookById(bookId); + return ResponseEntity.status(204).build(); } @Override diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/persistence/BookRepository.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/persistence/BookRepository.java index 5d6c57b..38b0b42 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/persistence/BookRepository.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/persistence/BookRepository.java @@ -4,8 +4,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Optional; import java.util.UUID; @Repository public interface BookRepository extends JpaRepository { + + Optional findBookById(UUID id); } diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java index dbdc65d..a636296 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java @@ -1,13 +1,35 @@ package com.csaba79coder.apifirstdevelopment.service; +import com.csaba79coder.apifirstdevelopment.entity.Book; import com.csaba79coder.apifirstdevelopment.persistence.BookRepository; +import com.csaba79coder.models.BookModel; +import com.csaba79coder.models.NewBookModel; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.NoSuchElementException; +import java.util.UUID; + @Service @RequiredArgsConstructor +@Slf4j public class BookService { private final BookRepository bookRepository; + public BookModel addNewBook(NewBookModel newModel) { + + return null; + } + + public void deleteAnExistingBookById(UUID id) { + Book book = bookRepository.findBookById(id) + .orElseThrow(() -> { + String message = String.format("Book with id: %s was not found", id); + log.info(message); + return new NoSuchElementException(message); + }); + bookRepository.delete(book); + } } From 622efa27ef261c646da08feb9a88777a213cfce6 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 16:32:48 +0100 Subject: [PATCH 39/57] implementing first the log API and model in the contract --- .../main/resources/service-contract-api.yaml | 77 ++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git a/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml b/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml index c7a2fa5..c3d5beb 100644 --- a/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml +++ b/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml @@ -9,6 +9,7 @@ servers: - url: 'http://localhost:8080' tags: - name: book + - name: log paths: /books: @@ -136,6 +137,54 @@ paths: responses: '204': description: successful operation + /logs: + get: + tags: + - log + summary: Render all logs + description: Show all logs from database + operationId: renderAllLogs + responses: + '200': + description: Successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/LogModel' + '400': + description: Bad request + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Book not found + '405': + description: Validation exception + post: + tags: + - log + summary: Add a new log to the database + description: Add a new log to the database + operationId: addLog + requestBody: + description: Create a new log in the database + content: + application/json: + schema: + $ref: '#/components/schemas/NewLogModel' + required: true + responses: + '201': + description: Successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/LogModel' + '405': + description: Invalid input components: schemas: @@ -292,4 +341,30 @@ components: enum: - AVAILABLE - ARCHIVE - - DELETED \ No newline at end of file + - DELETED + NewLogModel: + type: object + properties: + logMessage: + description: Log message + type: string + example: "{ERROR_CODE_001=Book with id: 4bc34bbf-6278-4586-9e62-429bc41edcf5 was not found}" + required: + - logMessage + LogModel: + type: object + properties: + id: + description: Id of log entity + type: string + format: uuid + example: '3a8ea9f1-1a95-4caf-932f-2f988052933b' + logMessage: + description: Log message + type: string + example: "{ERROR_CODE_001=Book with id: 4bc34bbf-6278-4586-9e62-429bc41edcf5 was not found}" + loggedAt: + description: Creation time of log + type: string + format: timestamp + example: '2019-01-21T05:47:08.644' \ No newline at end of file From 8b8377f796a03d927da7fbe63d370764aa9a016e Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 16:34:07 +0100 Subject: [PATCH 40/57] creating schema in log.xml (liquibase config!) --- .../src/main/resources/db/changelog/db.changelog-master.xml | 1 + .../src/main/resources/db/changelog/setup/log.xml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/api-first-development-service/src/main/resources/db/changelog/db.changelog-master.xml b/api-first-development-service/src/main/resources/db/changelog/db.changelog-master.xml index 4eca524..d44691f 100644 --- a/api-first-development-service/src/main/resources/db/changelog/db.changelog-master.xml +++ b/api-first-development-service/src/main/resources/db/changelog/db.changelog-master.xml @@ -9,5 +9,6 @@ + \ No newline at end of file diff --git a/api-first-development-service/src/main/resources/db/changelog/setup/log.xml b/api-first-development-service/src/main/resources/db/changelog/setup/log.xml index f9a70d1..71ad5e0 100644 --- a/api-first-development-service/src/main/resources/db/changelog/setup/log.xml +++ b/api-first-development-service/src/main/resources/db/changelog/setup/log.xml @@ -9,10 +9,10 @@ - + - + From 5faf5e6baee7d35310f8f61276465a8f1aecec5a Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 16:34:32 +0100 Subject: [PATCH 41/57] creating Log entity --- .../apifirstdevelopment/entity/Log.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/Log.java diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/Log.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/Log.java new file mode 100644 index 0000000..79f6a06 --- /dev/null +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/Log.java @@ -0,0 +1,28 @@ +package com.csaba79coder.apifirstdevelopment.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import jdk.jfr.Timestamp; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +import java.time.LocalDateTime; + +@Entity +@Getter +@Setter +@ToString +@NoArgsConstructor +@Table(name = "log") +public class Log extends BaseEntity { + + @Timestamp + @Column(name = "logged_at") + private LocalDateTime loggedAt = LocalDateTime.now(); + + @Column(name = "log_message") + private String logMessage; +} From e860bf552adde867b7a4f7eccc6ff2504e260dcc Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 16:44:42 +0100 Subject: [PATCH 42/57] create LogRepository --- .../persistence/LogRepository.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/persistence/LogRepository.java diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/persistence/LogRepository.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/persistence/LogRepository.java new file mode 100644 index 0000000..aa78135 --- /dev/null +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/persistence/LogRepository.java @@ -0,0 +1,11 @@ +package com.csaba79coder.apifirstdevelopment.persistence; + +import com.csaba79coder.apifirstdevelopment.entity.Log; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.UUID; + +@Repository +public interface LogRepository extends JpaRepository { +} From afcf0c5350c50fbdfce458b68384f2281d890990 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 16:45:43 +0100 Subject: [PATCH 43/57] create LogService --- .../apifirstdevelopment/service/LogService.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/LogService.java diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/LogService.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/LogService.java new file mode 100644 index 0000000..81b75af --- /dev/null +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/LogService.java @@ -0,0 +1,12 @@ +package com.csaba79coder.apifirstdevelopment.service; + +import com.csaba79coder.apifirstdevelopment.persistence.LogRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class LogService { + + private final LogRepository logRepository; +} From 541ec2af2fb4277cdaaaa646165959cd01b802de Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 16:46:28 +0100 Subject: [PATCH 44/57] create LogController --- .../controller/LogController.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/LogController.java diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/LogController.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/LogController.java new file mode 100644 index 0000000..903db9a --- /dev/null +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/LogController.java @@ -0,0 +1,12 @@ +package com.csaba79coder.apifirstdevelopment.controller; + +import com.csaba79coder.apifirstdevelopment.service.LogService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +public class LogController { + + private final LogService logService; +} From 92e01350387dd830a3d360a6f9902fc6dc8bfeeb Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 16:47:25 +0100 Subject: [PATCH 45/57] implementing LogApi --- .../controller/LogController.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/LogController.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/LogController.java index 903db9a..8833dfe 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/LogController.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/LogController.java @@ -1,12 +1,28 @@ package com.csaba79coder.apifirstdevelopment.controller; +import com.csaba79coder.api.LogsApi; import com.csaba79coder.apifirstdevelopment.service.LogService; +import com.csaba79coder.models.LogModel; +import com.csaba79coder.models.NewLogModel; import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController @RequiredArgsConstructor -public class LogController { +public class LogController implements LogsApi { private final LogService logService; + + @Override + public ResponseEntity addLog(NewLogModel body) { + return null; + } + + @Override + public ResponseEntity> renderAllLogs() { + return null; + } } From e891658f9d2223f3886d37d4560cac8674886652 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Mon, 23 Jan 2023 18:10:18 +0100 Subject: [PATCH 46/57] adding ModelMapper dependency --- api-first-development-service/pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/api-first-development-service/pom.xml b/api-first-development-service/pom.xml index 4f5f202..82cd69c 100644 --- a/api-first-development-service/pom.xml +++ b/api-first-development-service/pom.xml @@ -86,6 +86,12 @@ 0.0.1-SNAPSHOT compile + + org.modelmapper + modelmapper + 3.1.1 + + From 33b745a33948f1ef860c5839f93235b83e467ddc Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Tue, 24 Jan 2023 19:13:36 +0100 Subject: [PATCH 47/57] refactor BaseEntity and Book.java, refactor ISBNValidator regarding Long -> BigDecimal, refactor validator test, create Mapper (using ModelMapper), create test for Mapper, refactor BookService regarding the changes --- .../entity/BaseEntity.java | 24 ++++++++ .../apifirstdevelopment/entity/Book.java | 3 +- .../service/BookService.java | 14 +++++ .../util/ISBN13Validator.java | 12 ++-- .../apifirstdevelopment/util/Mapper.java | 28 ++++++++++ .../util/ISBN13ValidatorTest.java | 14 +++-- .../apifirstdevelopment/util/MapperTest.java | 56 +++++++++++++++++++ 7 files changed, 140 insertions(+), 11 deletions(-) create mode 100644 api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/util/Mapper.java create mode 100644 api-first-development-service/src/test/java/com/csaba79coder/apifirstdevelopment/util/MapperTest.java diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/BaseEntity.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/BaseEntity.java index 31658ae..4da31f9 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/BaseEntity.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/BaseEntity.java @@ -3,13 +3,37 @@ import jakarta.persistence.Column; import jakarta.persistence.Id; import jakarta.persistence.MappedSuperclass; +import lombok.Data; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.hibernate.Hibernate; +import java.util.Objects; import java.util.UUID; @MappedSuperclass +@Getter +@Setter +@ToString +@RequiredArgsConstructor public class BaseEntity { @Id @Column(name = "id", nullable = false) private UUID id = UUID.randomUUID(); + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false; + BaseEntity that = (BaseEntity) o; + return id != null && Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } } diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/Book.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/Book.java index 216ccb7..28356a6 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/Book.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/Book.java @@ -14,6 +14,7 @@ import lombok.ToString; import org.hibernate.annotations.Where; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.UUID; @@ -42,7 +43,7 @@ public class Book extends BaseEntity { private String title; @Column(name = "isbn", nullable = false, unique = true, length = 13) - private Long isbn; + private BigDecimal isbn; @Column(name = "genre", nullable = false) @Enumerated(EnumType.STRING) diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java index a636296..8c7befc 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java @@ -3,11 +3,13 @@ import com.csaba79coder.apifirstdevelopment.entity.Book; import com.csaba79coder.apifirstdevelopment.persistence.BookRepository; import com.csaba79coder.models.BookModel; +import com.csaba79coder.models.ModifiedBookModel; import com.csaba79coder.models.NewBookModel; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.List; import java.util.NoSuchElementException; import java.util.UUID; @@ -32,4 +34,16 @@ public void deleteAnExistingBookById(UUID id) { }); bookRepository.delete(book); } + + public BookModel getBookById(UUID id) { + return null; + } + + public List renderAllBooks() { + return null; + } + + public BookModel updateAnExistingBook(UUID id, ModifiedBookModel modifyBook) { + return null; + } } diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/util/ISBN13Validator.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/util/ISBN13Validator.java index 173612f..2eafb00 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/util/ISBN13Validator.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/util/ISBN13Validator.java @@ -1,8 +1,10 @@ package com.csaba79coder.apifirstdevelopment.util; +import java.math.BigDecimal; + public class ISBN13Validator { - public static boolean isValidISBN(Long isbnLong) { + public static boolean isValidISBN(BigDecimal isbnLong) { String isbn = String.valueOf(isbnLong); if (isbn == null) { return false; @@ -10,21 +12,21 @@ public static boolean isValidISBN(Long isbnLong) { if (isbn.startsWith("-")) { return false; } - isbn = isbn.replaceAll( "-", "" ); + isbn = isbn.replaceAll("-", ""); if ( isbn.length() != 13 ) { return false; } try { int tot = 0; for (int i = 0; i < 12; i++) { - int digit = Integer.parseInt( isbn.substring( i, i + 1 ) ); + int digit = Integer.parseInt(isbn.substring( i, i + 1 )); tot += (i % 2 == 0) ? digit : digit * 3; } int checksum = 10 - (tot % 10); - if ( checksum == 10 ) { + if (checksum == 10) { checksum = 0; } - return checksum == Integer.parseInt( isbn.substring( 12 ) ); + return checksum == Integer.parseInt(isbn.substring(12)); } catch (NumberFormatException nfe) { return false; diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/util/Mapper.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/util/Mapper.java new file mode 100644 index 0000000..4cda3ed --- /dev/null +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/util/Mapper.java @@ -0,0 +1,28 @@ +package com.csaba79coder.apifirstdevelopment.util; + +import com.csaba79coder.apifirstdevelopment.entity.Book; +import com.csaba79coder.models.BookModel; +import com.csaba79coder.models.NewBookModel; +import org.modelmapper.ModelMapper; + +public class Mapper { + + private static final ModelMapper modelMapper = new ModelMapper(); + + public static Book mapNewBookModelToBookEntity(NewBookModel bookModel) { + Book book = new Book(); + modelMapper.map(bookModel, book); + return book; + } + + + public static BookModel mapBookEntityToBookModel(Book book) { + BookModel bookModel = new BookModel(); + modelMapper.map(book, bookModel); + return bookModel; + } + + private Mapper() { + + } +} diff --git a/api-first-development-service/src/test/java/com/csaba79coder/apifirstdevelopment/util/ISBN13ValidatorTest.java b/api-first-development-service/src/test/java/com/csaba79coder/apifirstdevelopment/util/ISBN13ValidatorTest.java index 2a29538..fe53361 100644 --- a/api-first-development-service/src/test/java/com/csaba79coder/apifirstdevelopment/util/ISBN13ValidatorTest.java +++ b/api-first-development-service/src/test/java/com/csaba79coder/apifirstdevelopment/util/ISBN13ValidatorTest.java @@ -2,20 +2,24 @@ import org.junit.jupiter.api.Test; +import java.math.BigDecimal; + import static org.assertj.core.api.BDDAssertions.then; class ISBN13ValidatorTest { + // https://medium.com/@stefanovskyi/unit-test-naming-conventions-dd9208eadbea + @Test void validISBN() { - boolean isValid = ISBN13Validator.isValidISBN(9788845292613L); + boolean isValid = ISBN13Validator.isValidISBN(BigDecimal.valueOf(9780671557003L)); then(isValid) .isTrue(); } @Test void invalidISBN() { - boolean isValid = ISBN13Validator.isValidISBN(999L); + boolean isValid = ISBN13Validator.isValidISBN(BigDecimal.valueOf(999L)); then(isValid) .isFalse(); } @@ -29,21 +33,21 @@ void nullISBN() { @Test void zeroISBN() { - boolean isValid = ISBN13Validator.isValidISBN(0L); + boolean isValid = ISBN13Validator.isValidISBN(BigDecimal.valueOf(0L)); then(isValid) .isFalse(); } @Test void negativeNonValidISBN() { - boolean isValid = ISBN13Validator.isValidISBN(-112L); + boolean isValid = ISBN13Validator.isValidISBN(BigDecimal.valueOf(-112L)); then(isValid) .isFalse(); } @Test void negativeValidISBN() { - boolean isValid = ISBN13Validator.isValidISBN(-9780425175477L); + boolean isValid = ISBN13Validator.isValidISBN(BigDecimal.valueOf(-9780425175477L)); then(isValid) .isFalse(); } diff --git a/api-first-development-service/src/test/java/com/csaba79coder/apifirstdevelopment/util/MapperTest.java b/api-first-development-service/src/test/java/com/csaba79coder/apifirstdevelopment/util/MapperTest.java new file mode 100644 index 0000000..061209a --- /dev/null +++ b/api-first-development-service/src/test/java/com/csaba79coder/apifirstdevelopment/util/MapperTest.java @@ -0,0 +1,56 @@ +package com.csaba79coder.apifirstdevelopment.util; + +import com.csaba79coder.apifirstdevelopment.entity.Book; +import com.csaba79coder.apifirstdevelopment.value.Genre; +import com.csaba79coder.models.BookModel; +import com.csaba79coder.models.NewBookModel; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import static org.assertj.core.api.BDDAssertions.then; + +class MapperTest { + + @Test + void mapNewBookModelToBookEntity() { + // Given + NewBookModel newBookModel = new NewBookModel().title("Cat Among the Pigeons").isbn(BigDecimal.valueOf(9780671557003L)).genre(NewBookModel.GenreEnum.NOVEL); + Book expectedEntity = new Book(); + expectedEntity.setTitle(newBookModel.getTitle()); + expectedEntity.setIsbn(BigDecimal.valueOf(9780671557003L)); + expectedEntity.setGenre(Genre.valueOf(newBookModel.getGenre().name())); + + // When + Book book = Mapper.mapNewBookModelToBookEntity(newBookModel); + + // Then + then(book) + .usingRecursiveComparison() + .ignoringFields("id", "createdAt", "updatedAt") + .isEqualTo(expectedEntity); + } + + @Test + void mapBookEntityToBookModel() { + // Given + Book book = new Book(); + book.setTitle("Cat Among the Pigeons"); + book.setIsbn(BigDecimal.valueOf(9780671557003L)); + book.setGenre(Genre.valueOf(Genre.DETECTIVE_FICTION.name())); + + // When + BookModel bookModel = Mapper.mapBookEntityToBookModel(book); + + // Then + then(bookModel) + .usingRecursiveComparison() + .ignoringFields("createdAt", "updatedAt") + .isEqualTo(book); + then(LocalDateTime.parse(bookModel.getCreatedAt())) + .isEqualTo(book.getCreatedAt()); + then(LocalDateTime.parse(bookModel.getUpdatedAt())) + .isEqualTo(book.getUpdatedAt()); + } +} \ No newline at end of file From a9c756c13e7493add0a61affe3f3413abff43c62 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Wed, 25 Jan 2023 11:39:17 +0100 Subject: [PATCH 48/57] refactor application.properties under src and test resources --- .../src/main/resources/application.properties | 2 +- .../src/test/resources/application.properties | 2 +- doc/task.adoc | 8 +++++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/api-first-development-service/src/main/resources/application.properties b/api-first-development-service/src/main/resources/application.properties index 6cefb5f..83597c0 100644 --- a/api-first-development-service/src/main/resources/application.properties +++ b/api-first-development-service/src/main/resources/application.properties @@ -1,4 +1,4 @@ -spring.liquibase.change-log= classpath:/db/changelog/db.changelog-master.xml +spring.liquibase.change-log=classpath:/db/changelog/db.changelog-master.xml spring.liquibase.enabled=true spring.jpa.hibernate.ddl-auto=update diff --git a/api-first-development-service/src/test/resources/application.properties b/api-first-development-service/src/test/resources/application.properties index d1f87a3..e0e712f 100644 --- a/api-first-development-service/src/test/resources/application.properties +++ b/api-first-development-service/src/test/resources/application.properties @@ -1,4 +1,4 @@ -spring.liquibase.change-log= classpath:/db/changelog/db.changelog-master.xml +spring.liquibase.change-log=classpath:/db/changelog/db.changelog-master.xml spring.liquibase.enabled=true spring.datasource.url=jdbc:h2:mem:testdb diff --git a/doc/task.adoc b/doc/task.adoc index 235096a..6f69011 100644 --- a/doc/task.adoc +++ b/doc/task.adoc @@ -14,4 +14,10 @@ Part 4 - Path Parameters (https://www.youtube.com/watch?v=TAVon...) Dependencies & plugin pastebin: https://pastebin.com/gdiMqhwW -Yaml file pastebin: https://pastebin.com/GhKSVbaw \ No newline at end of file +Yaml file pastebin: https://pastebin.com/GhKSVbaw + +''' + +== Liquibase changeLog + +https://www.baeldung.com/liquibase-refactor-schema-of-java-app \ No newline at end of file From 8910f7af2ab54c857227bada6ecfb8604b173927 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Wed, 25 Jan 2023 11:51:23 +0100 Subject: [PATCH 49/57] config hibernate not to update! --- .../src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api-first-development-service/src/main/resources/application.properties b/api-first-development-service/src/main/resources/application.properties index 83597c0..411347f 100644 --- a/api-first-development-service/src/main/resources/application.properties +++ b/api-first-development-service/src/main/resources/application.properties @@ -1,7 +1,7 @@ spring.liquibase.change-log=classpath:/db/changelog/db.changelog-master.xml spring.liquibase.enabled=true -spring.jpa.hibernate.ddl-auto=update +spring.jpa.hibernate.ddl-auto=none spring.datasource.url=jdbc:mysql://localhost:${DB_PORT}/${DB_URL}?createDatabaseIfNotExist=true&useSSL=true spring.datasource.username=${DB_USER} spring.datasource.password=${DB_PASSWORD} From 52a8d754f6916bdf1b0626823e356d2206883b3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csaba=20Vad=C3=A1sz?= Date: Wed, 25 Jan 2023 12:21:23 +0100 Subject: [PATCH 50/57] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9f56fb0..34a746f 100644 --- a/README.md +++ b/README.md @@ -28,5 +28,5 @@ |--------------------|--------------|-------------------|----------------------------------------------------------| | DB_PORT | 3306 | default | | | DB_URL | no such info | pls use your own! | | -| DB_USER | root | default | | -| DB_PASSWORD | no such info | pls use your own! | [MYSQL Installation Guide](https://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/) | \ No newline at end of file +| DB_USER | root | default | pls use your own if you have set any other | +| DB_PASSWORD | no such info | pls use your own! | [MYSQL Installation Guide](https://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/) | From 0e5d025f2f52c7f045fb9b2c45fcc1b7e4f93485 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Wed, 25 Jan 2023 16:16:31 +0100 Subject: [PATCH 51/57] update task.adoc --- doc/task.adoc | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/doc/task.adoc b/doc/task.adoc index 6f69011..c18b413 100644 --- a/doc/task.adoc +++ b/doc/task.adoc @@ -20,4 +20,15 @@ Yaml file pastebin: https://pastebin.com/GhKSVbaw == Liquibase changeLog -https://www.baeldung.com/liquibase-refactor-schema-of-java-app \ No newline at end of file +https://www.baeldung.com/liquibase-refactor-schema-of-java-app + +''' + +== MapStruct and ModelMapper + +https://mapstruct.org/ + +https://modelmapper.org/examples/ + +https://www.baeldung.com/java-modelmapper + From ad4c1cee6a91aed3645c718f44429fb24ed54355 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Fri, 27 Jan 2023 13:46:22 +0100 Subject: [PATCH 52/57] update Log for saving log to repository! --- .../apifirstdevelopment/entity/Log.java | 5 +++++ .../service/BookService.java | 22 +++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/Log.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/Log.java index 79f6a06..cd5906a 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/Log.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/entity/Log.java @@ -6,6 +6,7 @@ import jdk.jfr.Timestamp; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.NonNull; import lombok.Setter; import lombok.ToString; @@ -25,4 +26,8 @@ public class Log extends BaseEntity { @Column(name = "log_message") private String logMessage; + + public Log(@NonNull String message) { + logMessage = message; + } } diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java index 8c7befc..51271af 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java @@ -1,7 +1,11 @@ package com.csaba79coder.apifirstdevelopment.service; import com.csaba79coder.apifirstdevelopment.entity.Book; +import com.csaba79coder.apifirstdevelopment.entity.Log; import com.csaba79coder.apifirstdevelopment.persistence.BookRepository; +import com.csaba79coder.apifirstdevelopment.persistence.LogRepository; +import com.csaba79coder.apifirstdevelopment.util.ISBN13Validator; +import com.csaba79coder.apifirstdevelopment.util.Mapper; import com.csaba79coder.models.BookModel; import com.csaba79coder.models.ModifiedBookModel; import com.csaba79coder.models.NewBookModel; @@ -9,6 +13,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.InputMismatchException; import java.util.List; import java.util.NoSuchElementException; import java.util.UUID; @@ -17,18 +22,31 @@ @RequiredArgsConstructor @Slf4j public class BookService { + private final LogRepository logRepository; private final BookRepository bookRepository; + private Log systemLog; public BookModel addNewBook(NewBookModel newModel) { - - return null; + if (newModel.getIsbn() == null || !ISBN13Validator.isValidISBN(newModel.getIsbn()) + || newModel.getTitle().isEmpty() || newModel.getTitle().isBlank() + || newModel.getGenre() == null) { + String message = String.format("Please represent a valid isbn input, isbn: %s is not valid!", newModel.getIsbn()); + systemLog = new Log(message); + logRepository.save(systemLog); + log.info(message); + throw new InputMismatchException(message); + } else { + return Mapper.mapBookEntityToBookModel(bookRepository.save(Mapper.mapNewBookModelToBookEntity(newModel))); + } } public void deleteAnExistingBookById(UUID id) { Book book = bookRepository.findBookById(id) .orElseThrow(() -> { String message = String.format("Book with id: %s was not found", id); + systemLog = new Log(message); + logRepository.save(systemLog); log.info(message); return new NoSuchElementException(message); }); From ea65d19158bffbeb5ced21c8976e5233c7ab454b Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Fri, 27 Jan 2023 13:49:29 +0100 Subject: [PATCH 53/57] implementing addNewBook in BookController --- .../apifirstdevelopment/controller/BookController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java index 71a2b1f..d46933f 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java @@ -22,7 +22,7 @@ public class BookController implements BooksApi { @Override public ResponseEntity addBook(NewBookModel body) { - return null; + return ResponseEntity.status(201).body(bookService.addNewBook(body)); } @Override From 415f159a2802c874b182a28d99ebad9dd5e1a43b Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Fri, 27 Jan 2023 14:13:24 +0100 Subject: [PATCH 54/57] implementing addNewBook in BookController --- .../apifirstdevelopment/controller/BookController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java index d46933f..b6734b6 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java @@ -31,6 +31,8 @@ public ResponseEntity deleteBook(UUID bookId) { return ResponseEntity.status(204).build(); } + + @Override public ResponseEntity getBookById(UUID bookId) { return null; From 9aa175a7918baad50bb8daf476d46dbf5425921d Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Fri, 27 Jan 2023 16:33:51 +0100 Subject: [PATCH 55/57] implement findBookById and refactoring regarding code repetition --- .../controller/BookController.java | 4 +--- .../persistence/LogRepository.java | 3 +++ .../service/BookService.java | 24 ++++++++++++------- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java index b6734b6..72700a1 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java @@ -31,11 +31,9 @@ public ResponseEntity deleteBook(UUID bookId) { return ResponseEntity.status(204).build(); } - - @Override public ResponseEntity getBookById(UUID bookId) { - return null; + return ResponseEntity.status(200).body(bookService.getBookById(bookId)); } @Override diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/persistence/LogRepository.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/persistence/LogRepository.java index aa78135..ae92246 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/persistence/LogRepository.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/persistence/LogRepository.java @@ -4,8 +4,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.time.LocalDateTime; +import java.util.Optional; import java.util.UUID; @Repository public interface LogRepository extends JpaRepository { + // Optional findLogsByLoggedAtStartingWith(LocalDateTime localDateTime); } diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java index 51271af..c00a3eb 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java @@ -28,7 +28,7 @@ public class BookService { private Log systemLog; public BookModel addNewBook(NewBookModel newModel) { - if (newModel.getIsbn() == null || !ISBN13Validator.isValidISBN(newModel.getIsbn()) + if (!ISBN13Validator.isValidISBN(newModel.getIsbn()) || newModel.getTitle().isEmpty() || newModel.getTitle().isBlank() || newModel.getGenre() == null) { String message = String.format("Please represent a valid isbn input, isbn: %s is not valid!", newModel.getIsbn()); @@ -42,18 +42,13 @@ public BookModel addNewBook(NewBookModel newModel) { } public void deleteAnExistingBookById(UUID id) { - Book book = bookRepository.findBookById(id) - .orElseThrow(() -> { - String message = String.format("Book with id: %s was not found", id); - systemLog = new Log(message); - logRepository.save(systemLog); - log.info(message); - return new NoSuchElementException(message); - }); + Book book = findById(id); bookRepository.delete(book); } public BookModel getBookById(UUID id) { + Book book = findById(id); + bookRepository.delete(book); return null; } @@ -64,4 +59,15 @@ public List renderAllBooks() { public BookModel updateAnExistingBook(UUID id, ModifiedBookModel modifyBook) { return null; } + + private Book findById(UUID id) { + return bookRepository.findBookById(id) + .orElseThrow(() -> { + String message = String.format("Book with id: %s was not found", id); + systemLog = new Log(message); + logRepository.save(systemLog); + log.info(message); + return new NoSuchElementException(message); + }); + } } From f366635d18d94545bb898fa34ad5090fe1e84b32 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Sat, 28 Jan 2023 10:45:04 +0100 Subject: [PATCH 56/57] implement in BookService and BookController and refactor LogRepository (delete unused method from interface) --- .../apifirstdevelopment/controller/BookController.java | 2 +- .../apifirstdevelopment/persistence/LogRepository.java | 3 --- .../apifirstdevelopment/service/BookService.java | 5 ++++- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java index 72700a1..ca4628c 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/controller/BookController.java @@ -38,7 +38,7 @@ public ResponseEntity getBookById(UUID bookId) { @Override public ResponseEntity> renderAllBooks() { - return null; + return ResponseEntity.status(200).body(bookService.renderAllBooks()); } @Override diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/persistence/LogRepository.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/persistence/LogRepository.java index ae92246..aa78135 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/persistence/LogRepository.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/persistence/LogRepository.java @@ -4,11 +4,8 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import java.time.LocalDateTime; -import java.util.Optional; import java.util.UUID; @Repository public interface LogRepository extends JpaRepository { - // Optional findLogsByLoggedAtStartingWith(LocalDateTime localDateTime); } diff --git a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java index c00a3eb..bf60482 100644 --- a/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java +++ b/api-first-development-service/src/main/java/com/csaba79coder/apifirstdevelopment/service/BookService.java @@ -17,6 +17,7 @@ import java.util.List; import java.util.NoSuchElementException; import java.util.UUID; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -53,7 +54,9 @@ public BookModel getBookById(UUID id) { } public List renderAllBooks() { - return null; + return bookRepository.findAll() + .stream().map(Mapper::mapBookEntityToBookModel) + .collect(Collectors.toList()); } public BookModel updateAnExistingBook(UUID id, ModifiedBookModel modifyBook) { From ca00953585b8e3505531074c9041ca1f9456e551 Mon Sep 17 00:00:00 2001 From: Csaba79-coder Date: Sun, 29 Jan 2023 22:04:46 +0100 Subject: [PATCH 57/57] refactor genre misspell --- .../src/main/resources/service-contract-api.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml b/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml index c3d5beb..9a936e6 100644 --- a/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml +++ b/api-first-development-service-api-contract/src/main/resources/service-contract-api.yaml @@ -204,7 +204,7 @@ components: type: string example: DETECTIVE_FICTION enum: - - DETECTIVE FICTION + - DETECTIVE_FICTION - NOVEL - MYSTERY - THRILLER @@ -311,7 +311,7 @@ components: type: string example: DETECTIVE_FICTION enum: - - DETECTIVE FICTION + - DETECTIVE_FICTION - NOVEL - MYSTERY - THRILLER