sugao-2211 / stockListProject

0 stars 0 forks source link

CRUD処理すべてを備えたREST APIの作成

概要

消耗品の在庫一覧についてAPIを作成しました。
今回は試験研究などで使用される試薬を題材にして在庫一覧表を作成しました。

プロジェクトの進捗
(作業を行いながら作成中)
https://github.com/users/sugao-2211/projects/1

APIの内容

データベース作成時の内容

id name grade quantity unit purchase
1 メタノール HPLC用 3 L 2023−05−24
2 塩化カリウム 特級 500 g 2023−07−19
3 硫酸ナトリウム 特級 5 kg 2022-08-30
4 グルコアミラーぜ 生化学用 10000 unit 2023-10-11
5 硫酸 硫酸呈色用 500 mL 2023-04-05
6 ピリドキシン塩酸塩 日本薬局方標準品 200 mg 2023-09-22

Read処理の実装

Read処理 以下の処理を実行 - データベース全件検索 - クエリパラメータ(name)に合致するものを部分一致検索 - 「硫酸」で検索 - クエリパラメータ(name)の部分一致検索における例外処理 - 「硝酸」で検索し例外処理を発生 - パスパラメータ(id)に合致するものを検索 - id「4」で検索 - パスパラメータ(id)の検索における例外処理 - id「9」で検索し例外処理を発生 - findById()メソッドのService単体テスト - 存在する在庫のidを指定したときに正常に在庫の情報が返されること - 存在しないidを指定したときにNotFoundExceptionが返されること - findData()メソッドのService単体テスト - 在庫名を指定しなかったときにfindAllメソッドが呼び出されること - 在庫名を指定したときにfindByNameメソッドが呼び出されること - 存在しない在庫名を指定したときに空のリストが返されること - findAll()メソッドのDB単体テスト - findAll()メソッドによって全件の在庫情報が取得できること - findByName()メソッドのDB単体テスト - 在庫名を指定したときに該当する在庫情報が取得できること - 存在しない在庫名を指定したときに空のリストが返されること - findById()メソッドのDB単体テスト - idを指定したときに該当する在庫情報が取得できること - 存在しないidを指定したときに空のOptionalが返されること - 結合テスト(全件取得) - 全件の在庫情報が取得できること - 結合テスト(在庫名による取得) - 存在する在庫名の在庫情報が取得できること - 存在しない在庫名を指定したときに空のリストが返されること - 結合テスト(idによる取得) - 存在するidの在庫情報が取得できること - 存在しないidを指定したときにNotFoundExceptionが返されること ##
全件検索 - 全件検索 - curlコマンド ``` curl --location 'http://localhost:8080/stockList' ``` - 実行結果 スクリーンショット 2023-10-31 13 33 02 スクリーンショット 2023-10-31 13 33 23
##
部分一致検索(クエリパラメータ検索) - 部分一致検索(クエリパラメータ検索) - curlコマンド ``` curl --location 'http://localhost:8080/stockList?name=%E7%A1%AB%E9%85%B8' ``` 硫酸のエンコード:%E7%A1%AB%E9%85%B8 - 実行結果 スクリーンショット 2023-10-31 13 36 14 ## - 部分一致検索(クエリパラメータ検索)で存在しない名前を指定した場合 - curlコマンド ``` curl --location 'http://localhost:8080/stockList?name=%E7%A1%9D%E9%85%B8' ``` 硝酸のエンコード:%E7%A1%9D%E9%85%B8 - 実行結果 スクリーンショット 2023-12-16 23 49 10
##
id検索(パスパラメータ検索)及び例外処理 - id検索(パスパラメータ検索) - curlコマンド ``` curl --location 'http://localhost:8080/stockList/4' ``` - 実行結果 スクリーンショット 2023-10-31 14 14 18 ## - id検索(パスパラメータ検索)の例外処理 - curlコマンド ``` curl --location 'http://localhost:8080/stockList/9' ``` - 実行結果 スクリーンショット 2023-10-31 16 17 58
##
findById()メソッドのService単体テスト - findById()メソッド(パスパラメータ検索)のService単体テスト - 存在する在庫のidを指定したときに正常に在庫の情報が返されること - 存在しないidを指定したときにNotFoundExceptionが返されること https://github.com/sugao-2211/stockListProject/blob/e8d7c8dd4d7a8342de67f6051d5ed96f452e8fd8/src/test/java/com/stock/stocklist/service/StockListServiceTest.java#L1-L59 - 実行結果 スクリーンショット 2023-12-04 17 55 18
##
findData()メソッドのService単体テスト - findData()メソッドのService単体テスト - 在庫名を指定しなかったときにfindAllメソッド呼び出されて全件の在庫情報が返却されること - 存在する在庫名を指定したときにfindByNameメソッドが呼び出されて該当する在庫情報が返却されること - 存在しない在庫名を指定したときに空のListが返されること https://github.com/sugao-2211/stockListProject/blob/dac5df8cb3816a8ec91aad88ea8d47a3b48f2b52/src/test/java/com/stock/stocklist/service/StockListServiceTest.java#L52-L91 - 実行結果 - 在庫名を指定しなかったときにfindAllメソッド呼び出されて全件の在庫情報が返却されること スクリーンショット 2023-12-13 10 56 07 - 存在する在庫名を指定したときにfindByNameメソッドが呼び出されて該当する在庫情報が返却されること スクリーンショット 2023-12-13 10 56 29 - 存在しない在庫名を指定したときに空のListが返されること スクリーンショット 2023-12-14 15 39 45
##
findAll()メソッドのDB単体テスト - findAll()メソッドのDB単体テスト - findAll()メソッドによって全件の在庫情報が取得できること https://github.com/sugao-2211/stockListProject/blob/a3fc05a918a62fcfa01414b7aa416d632f9bc833/src/test/java/com/stock/stocklist/mapper/StockListMapperTest.java#L1-L42 https://github.com/sugao-2211/stockListProject/blob/38da884c0443afb05d3d58d154dc0cdb322ab945/src/test/resources/datasets/stockList.yml#L1-L37 https://github.com/sugao-2211/stockListProject/blob/38da884c0443afb05d3d58d154dc0cdb322ab945/src/test/resources/dbunit.yml#L1-L9 https://github.com/sugao-2211/stockListProject/blob/38da884c0443afb05d3d58d154dc0cdb322ab945/build.gradle#L18-L28 - 実行結果 スクリーンショット 2023-12-16 23 42 21
##
findByName()メソッドのDB単体テスト - findByName()メソッドのDB単体テスト - 在庫名を指定したときに該当するの在庫情報が取得できること - 存在しない在庫名を指定したときに空のリストが返されること https://github.com/sugao-2211/stockListProject/blob/4a1c4063201ef38414f2568a0cb9ebcdc9b49825/src/test/java/com/stock/stocklist/mapper/StockListMapperTest.java#L42-L58 - 実行結果 - 在庫名を指定したときに該当するの在庫情報が取得できること スクリーンショット 2023-12-17 16 19 03 - 存在しない在庫名を指定したときに空のリストが返されること スクリーンショット 2023-12-17 16 24 05
##
findById()メソッドのDB単体テスト - findById()メソッドのDB単体テスト - idを指定したときに該当する在庫情報が取得できること - 存在しないidを指定したときに空のOptionalが返されること https://github.com/sugao-2211/stockListProject/blob/0b4cbbca4335d147a3c9863cffdb2ee60174b0f3/src/test/java/com/stock/stocklist/mapper/StockListMapperTest.java#L60-L76 - 実行結果 - idを指定したときに該当する在庫情報が取得できること スクリーンショット 2023-12-18 22 22 07 - 存在しないidを指定したときに空のOptionalが返されること スクリーンショット 2023-12-18 22 22 37
##
結合テスト(全件取得) - 結合テスト(全件取得) - 全件の在庫情報が取得できること https://github.com/sugao-2211/stockListProject/blob/0089bfae7c672a53d66ea7131b4a51ce630a0f4f/src/test/java/com/stock/stock/integrationtest/StockApiIntegrationTest.java#L1-L91 - 実行結果 スクリーンショット 2023-12-21 13 03 29
##
結合テスト(在庫名による取得) - 結合テスト(在庫名による取得) - 存在する在庫名の在庫情報が取得できること - 存在しない在庫名を指定したときに空のリストが返されること https://github.com/sugao-2211/stockListProject/blob/df4ff7add3f37d44f499653f29eb604274f930f3/src/test/java/com/stock/stock/integrationtest/StockApiIntegrationTest.java#L91-L135 - 実行結果 - 存在する在庫名の在庫情報が取得できること スクリーンショット 2023-12-21 19 07 36 - 存在しない在庫名を指定したときに空のリストが返されること スクリーンショット 2023-12-21 15 42 55
##
結合テスト(idによる取得) - 結合テスト(idによる取得) - 存在するidの在庫情報が取得できること - 存在しないidを指定したときにNotFoundExceptionが返されること https://github.com/sugao-2211/stockListProject/blob/b4a22715322aad9316ee27bfa95b23a61c7bdb49/src/test/java/com/stock/stock/integrationtest/StockApiIntegrationTest.java#L170-L211 - 実行結果 - 存在するidの在庫情報が取得できること スクリーンショット 2023-12-22 10 18 50 - 存在しないidを指定したときにNotFoundExceptionが返されること スクリーンショット 2023-12-22 10 19 19

Create処理の実装

Create処理 以下の処理を実行 - データ登録 - name: 硫化ナトリウム九水和物 - grade: 特級 - quantity: 500 - unit: g - purchase: 2023-08-12 - 例外処理の確認1 (MethodArgumentNotValidException) - nameを空文字で入力 - gradeを空文字で入力 - quantityを0で入力 - unitを空文字で入力 - purchaseを空文字で入力 - 例外処理の確認2 (MethodArgumentNotValidException) - nameを101文字で入力 - purchaseを未来の日付で入力 - quantityを空文字で入力 - 例外処理の確認3 (HttpMessageNotReadableException) - quantityを文字列で入力した場合 - quantityを小数で入力した場合 - purchaseの形式が誤っている場合 - insert()メソッドのDB単体テスト - insert()メソッドによって新規の在庫情報が登録できること ##
データ登録 - データ登録 - curlコマンド ``` curl --location 'http://localhost:8080/stockList' \ --header 'Content-Type: application/json' \ --data '{ "name": "硫化ナトリウム九水和物", "grade": "特級", "quantity": "500", "unit": "g", "purchase": "2023-08-12" }' ``` - 実行結果(Postman) スクリーンショット 2023-11-05 13 06 03 - 実行結果(SQL) スクリーンショット 2023-11-05 13 08 49
## ### 例外処理の確認 - バリデーションは以下のコードを記述 https://github.com/sugao-2211/stockListProject/blob/298d4015b43313a869b09a04d2cdf652d1617625/src/main/java/com/stock/stocklist/controller/request/InsertRequest.java#L17-L34 - 例外処理は以下のコードで実施 https://github.com/sugao-2211/stockListProject/blob/298d4015b43313a869b09a04d2cdf652d1617625/src/main/java/com/stock/stocklist/controller/ExceptionHandlerController.java#L34-L47 https://github.com/sugao-2211/stockListProject/blob/cd34c4b35a55664394e89476c91cc0b2ff8e74fe/src/main/java/com/stock/stocklist/controller/ExceptionHandlerController.java#L62-L70 - 例外処理は以下の内容で実施。 - `@DateTimeFormat(pattern = "yyyy-MM-dd")`以外は`MethodArgumentNotValidException`で処理。 - `@DateTimeFormat(pattern = "yyyy-MM-dd")`は`HttpMessageNotReadableException`で処理。 - `quantity`の入力内容が`int`型に合致しない場合は`HttpMessageNotReadableException`で処理。 ##
例外処理の確認1 (MethodArgumentNotValidException) - 例外処理の確認1 (MethodArgumentNotValidException) - nameを空文字で入力 - gradeを空文字で入力 - quantityを0で入力 - unitを空文字で入力 - purchaseを空文字で入力 - 実行結果 スクリーンショット 2023-11-05 12 47 10 スクリーンショット 2023-11-05 12 47 34
##
例外処理の確認2 (MethodArgumentNotValidException) - 例外処理の確認2 (MethodArgumentNotValidException) - nameを101文字で入力 - purchaseを未来の日付で入力 - quantityを空文字で入力 - 実行結果 - nameを101文字で入力 - purchaseを未来の日付で入力 スクリーンショット 2023-11-05 12 49 22 - quantityを空文字で入力 スクリーンショット 2023-11-07 21 37 53
##
例外処理の確認3 (HttpMessageNotReadableException) - 例外処理の確認3 (HttpMessageNotReadableException) - quantityを文字列で入力した場合 - quantityを小数で入力した場合 - purchaseの形式が誤っている場合 - 実行結果 - quantityを文字列で入力した場合 スクリーンショット 2023-11-05 13 04 41
- quantityを小数で入力した場合 スクリーンショット 2023-11-05 13 43 55
- purchaseの形式が誤っている場合 スクリーンショット 2023-11-05 12 56 09
##
insert()メソッドのDB単体テスト - insert()メソッドのDB単体テスト - insert()メソッドによって新規の在庫情報が登録できること https://github.com/sugao-2211/stockListProject/blob/fb29b26c3e01b26c6e38412a44cfce8a3f70a3e8/src/test/java/com/stock/stock/mapper/StockMapperTest.java#L78-L88 - 実行結果 スクリーンショット 2024-09-26 22 57 38
##
insert()メソッドのService単体テスト - insert()メソッドのService単体テスト - insert()メソッドによって新規の在庫情報が登録できること https://github.com/sugao-2211/stockListProject/blob/0b85e9b44ccefae4163983bfc801537e8fa5dee2/src/test/java/com/stock/stock/service/StockServiceTest.java#L93-L101 - 実行結果 スクリーンショット 2024-09-28 23 27 03

Update処理の実装

Update処理 以下の処理を実行 - データ更新 - id: 1 - name: エタノール(95) - grade: 特級 - quantity: 500 - unit: mL - purchase: 2023-09-30 - 例外処理の確認1 (NotFoundException) - 存在しないデータの更新 - 例外処理の確認2 (MethodArgumentNotValidException) - nameを空文字で入力 - gradeを空文字で入力 - quantityを空文字で入力 - unitを空文字で入力 - purchaseを空文字で入力 - 例外処理の確認3 (MethodArgumentNotValidException) - nameを101文字で入力 - quantityを0で入力 - purchaseを未来の日付で入力 - 例外処理の確認4 (HttpMessageNotReadableException) - quantityを文字列で入力した場合 - quantityを小数で入力した場合 - purchaseの形式が誤っている場合 - update()メソッドのDB単体テスト - update()メソッドによってidを指定したときに該当する在庫情報が更新できること - 存在しないidを指定したときに在庫情報が更新されないこと - update()メソッドのService単体テスト - update()メソッドによってidを指定したときに該当する在庫情報が更新できること - 在庫情報を更新する際に存在しないidを指定すると例外をスローすること ##
データ更新 - データ更新 - curlコマンド ``` curl --location --request PATCH 'http://localhost:8080/stockList/1' \ --header 'Content-Type: application/json' \ --data '{ "name": "エタノール(95)", "grade": "特級", "quantity": "500", "unit": "mL", "purchase": "2023-09-30" }' ``` - 実行結果(Postman) スクリーンショット 2023-11-07 21 14 47 - 実行結果(SQL) スクリーンショット 2023-11-07 21 16 45
## ### 例外処理の確認 - バリデーションは以下のコードを記述 https://github.com/sugao-2211/stockListProject/blob/cbc95ec5c3e328702519e88b0b54de0de67e26f9/src/main/java/com/stock/stocklist/controller/request/UpdateRequest.java#L17-L34 - 例外処理は以下のコードで実施 https://github.com/sugao-2211/stockListProject/blob/298d4015b43313a869b09a04d2cdf652d1617625/src/main/java/com/stock/stocklist/controller/ExceptionHandlerController.java#L22-L47 https://github.com/sugao-2211/stockListProject/blob/cd34c4b35a55664394e89476c91cc0b2ff8e74fe/src/main/java/com/stock/stocklist/controller/ExceptionHandlerController.java#L62-L70 - 例外処理は以下の内容で実施。 - 存在しないデータを更新しようとした場合に`NotFoundException`で処理 - `@DateTimeFormat(pattern = "yyyy-MM-dd")`以外は`MethodArgumentNotValidException`で処理 - `@DateTimeFormat(pattern = "yyyy-MM-dd")`は`HttpMessageNotReadableException`で処理 - `quantity`の入力内容が`int`型に合致しない場合は`HttpMessageNotReadableException`で処理 ##
例外処理の確認1 (NotFoundException) - 例外処理の確認1 (NotFoundException) - 存在しないデータの更新(id:99を更新するリクエスト) - 実行結果 スクリーンショット 2023-11-07 22 03 22
##
例外処理の確認2 (MethodArgumentNotValidException) - 例外処理の確認2 (MethodArgumentNotValidException) - nameを空文字で入力 - gradeを空文字で入力 - quantityを空文字で入力 - unitを空文字で入力 - purchaseを空文字で入力 - 実行結果 スクリーンショット 2023-11-07 21 19 45 スクリーンショット 2023-11-07 21 20 02
##
例外処理の確認3 (MethodArgumentNotValidException) - 例外処理の確認3 (MethodArgumentNotValidException) - nameを101文字で入力 - quantityを0で入力 - purchaseを未来の日付で入力 - 実行結果 スクリーンショット 2023-11-07 21 34 46
##
例外処理の確認4 (HttpMessageNotReadableException) - 例外処理の確認4 (HttpMessageNotReadableException) - quantityを文字列で入力した場合 - quantityを小数で入力した場合 - purchaseの形式が誤っている場合 - 実行結果 - quantityを文字列で入力した場合 スクリーンショット 2023-11-07 21 30 48 - quantityを小数で入力した場合 スクリーンショット 2023-11-07 21 31 12 - purchaseの形式が誤っている場合 スクリーンショット 2023-11-07 21 31 40
##
update()メソッドのDB単体テスト - update()メソッドのDB単体テスト - update()メソッドによってidを指定したときに該当する在庫情報が更新できること - 存在しないidを指定したときに在庫情報が更新されないこと https://github.com/sugao-2211/stockListProject/blob/fb29b26c3e01b26c6e38412a44cfce8a3f70a3e8/src/test/java/com/stock/stock/mapper/StockMapperTest.java#L90-L114 - 実行結果 - update()メソッドによってidを指定したときに該当する在庫情報が更新できること スクリーンショット 2024-09-26 23 02 33 - 存在しないidを指定したときに在庫情報が更新されないこと スクリーンショット 2024-09-26 23 02 57
##
update()メソッドのService単体テスト - update()メソッドのService単体テスト - update()メソッドによってidを指定したときに該当する在庫情報が更新できること - 在庫情報を更新する際に存在しないidを指定すると例外をスローすること https://github.com/sugao-2211/stockListProject/blob/0b85e9b44ccefae4163983bfc801537e8fa5dee2/src/test/java/com/stock/stock/service/StockServiceTest.java#L103-L122 - 実行結果 - update()メソッドによってidを指定したときに該当する在庫情報が更新できること スクリーンショット 2024-09-28 23 48 04 - 在庫情報を更新する際に存在しないidを指定すると例外をスローすること スクリーンショット 2024-09-29 7 19 26

Delete処理の実装

Delete処理 以下の処理を実行 - データ削除 - id: 6 - 例外処理の確認 (NotFoundException) - 存在しないデータの削除 - delete()メソッドのDB単体テスト - delete()メソッドによってidを指定したときに該当する在庫情報が削除できること - 存在しないidを指定したときに在庫情報が削除されないこと - delete()メソッドのService単体テスト - delete()メソッドによってidを指定したときに該当する在庫情報が削除できること - 在庫情報を削除する際に存在しないidを指定すると例外をスローすること ##
データ削除 - データ削除 - curlコマンド ``` curl --location --request DELETE 'http://localhost:8080/stockList/6' \ --data '' ``` - 実行結果(Postman) スクリーンショット 2023-11-08 22 36 30 - 実行結果(SQL) スクリーンショット 2023-11-08 22 36 57
## ### 例外処理の確認 - 例外処理は以下のコードで実施 https://github.com/sugao-2211/stockListProject/blob/4f22c0856b96f510d6836cab8f6cdef711aa1d53/src/main/java/com/stock/stocklist/controller/ExceptionHandlerController.java#L22-L32 - 例外処理は以下の内容で実施。 - 存在しないデータを更新しようとした場合に`NotFoundException`で処理 ##
例外処理の確認 (NotFoundException) - 例外処理の確認 (NotFoundException) - 存在しないデータの削除(id:99を削除するリクエスト) - 実行結果 スクリーンショット 2023-11-08 22 44 02
##
delete()メソッドのDB単体テスト - delete()メソッドのDB単体テスト - delete()メソッドによってidを指定したときに該当する在庫情報が削除できること - 存在しないidを指定したときに在庫情報が削除されないこと https://github.com/sugao-2211/stockListProject/blob/fb29b26c3e01b26c6e38412a44cfce8a3f70a3e8/src/test/java/com/stock/stock/mapper/StockMapperTest.java#L116-L136 - 実行結果 - delete()メソッドによってidを指定したときに該当する在庫情報が削除できること スクリーンショット 2024-09-26 23 10 25 - 存在しないidを指定したときに在庫情報が削除されないこと スクリーンショット 2024-09-26 23 12 12
##
delete()メソッドのService単体テスト - delete()メソッドのService単体テスト - delete()メソッドによってidを指定したときに該当する在庫情報が削除できること - 在庫情報を削除する際に存在しないidを指定すると例外をスローすること https://github.com/sugao-2211/stockListProject/blob/0b85e9b44ccefae4163983bfc801537e8fa5dee2/src/test/java/com/stock/stock/service/StockServiceTest.java#L124-L138 - 実行結果 - delete()メソッドによってidを指定したときに該当する在庫情報が削除できること スクリーンショット 2024-09-28 23 54 07 - 在庫情報を削除する際に存在しないidを指定すると例外をスローすること スクリーンショット 2024-09-29 7 21 24