つくる:DB版fleama
新しいことは出てきません
この回では、新しい知識は 1 つも出てきません。第6章で書いたものを 1 つにまとめて、fleama のデータ層をデータベースへ移し切ります。
移行が終わって何が変わったか
| 第2章のファイル版 | 第6章のDB版 | |
|---|---|---|
| 1 件追加 | 全件を読み書き | INSERT 1 回 |
| 絞り込み | 全件を読んで filter | WHERE で必要な分だけ |
| id の採番 | 自分で最大値を計算 | AUTOINCREMENT に任せる |
| 途中で止まったとき | 壊れた状態が残る | ROLLBACK で戻せる |
最後の行が、このコースでいちばん大きい変化です。壊れた状態が残らないことを、仕組みとして保証できるようになりました。
ルートの側は変わっていない
第2章で分けておいたおかげで、変えたのはデータの出し入れだけです。GET /items が一覧を返すことも、無ければ 404 を返すことも、第4章で決めたまま変わっていません。
外に見せる約束を変えずに、中身を入れ替えられる。 これが層を分ける目的でした。React 側から見れば、裏でデータベースに移ったことは分かりません。
ここまでに手に入れたもの
| 何を | どのレッスンで |
|---|---|
| つないで表を作る | DBにつなぐ |
| 一覧と1件を読み分ける | 一覧・詳細をDB化 |
| 安全に書き込む | 出品をDB化 |
| つなぐ危険を知る | SQLインジェクション |
変更系と changes | 更新・削除をDB化 |
| 全部か何もしないか | 購入トランザクション |
手を動かす
演習では、第6章のすべてを備えた fleama API を組み立てます。購入までデータベースで動く形が完成します。
要件
POST /itemsはnameが空なら 400、通ればINSERTして読み直した商品を 201 で返すPOST /items/:id/buyは 商品が無ければ 404、売り切れなら 409 を返す- 購入できるときは
BEGINからCOMMITまでで売切れ化と購入記録を行い、{id, sold}を 200 で返す
入出力例
request("GET", "/items") → "200 [{"id":1,"name":"レザースニーカー","price":4800,"sold":0},{"id":2,"name":"木製のスツール","price":3500,"sold":1}]"
request("POST", "/items", {"name":"古着のデニムジャケット","price":6200}) → "201 {"id":3,"name":"古着のデニムジャケット","price":6200,"sold":0}"
request("POST", "/items", {"name":"","price":1000}) → "400 {"error":"商品名は必須です"}"
request("POST", "/items/1/buy", {"buyer":"田中"}) → "200 {"id":1,"sold":1}"
request("POST", "/items/2/buy", {"buyer":"田中"}) → "409 {"error":"すでに売り切れです"}"
request("POST", "/items/999/buy", {"buyer":"田中"}) → "404 {"error":"商品が見つかりません"}"ヒント
編集 ゆめさく編集部