[golang]fiber API1~Checkout: GetLinkとCreateOrderの実装~

こんにちは、KOUKIです。

GolangのWebフレームワークであるfiberを使って、APIを開発しています。

前回は、Ranking APIとRedisのソート処理の実装を行いました。

今回からは、Checkout APIの実装に入ります。

尚、本記事は「React, NextJS and Golang: A Rapid Guide – Advanced」コースを参考にしています。解釈は私が勝手に付けているので、本物をみたい場合は受講をお勧めします!

前回

作るもの

Checkout機能を作りたいと思います。エンドポイントは、次の通りです。

エンドポイント
  • GET /api/checkout/links/{code}
  • POST /api/checkout/orders
  • POST /api/checkout/orders/confirm

今回は、「/api/checkout/links/{code}」、「/api/checkout/orders」への処理を実装します。

GetLink

ユーザーID(code)からLinkデータを取得するAPIを実装します。

ルートの追加

「/api/checkout/links/{code}」へのルートを追加します。

コントローラーの追加

コントローラーを追加します。

Linkモデルの修正

LinkモデルのOrdersはレスポンス先に表示したくないので、「omitempty」を付与しておきます。

検証

検証してみましょう。

まずは、Linkを作成します。

  • URL: http://localhost:8000/api/ambassador/links
  • 形式: POST

次に、以下のパラメーターでCodeを取得します。

  • URL: http://localhost:8000/api/ambassador/stats
  • 形式: GET

このコードを使って、Linkを取得します。

  • URL: http://localhost:8000/api/checkout/links/yfUVevT
  • 形式: GET

OKですね。

オーダーの作成

オーダーを作成するAPIを実装します。

ルートの追加

「/api/checkout/orders」へのルートを追加します。

コントローラーの追加

コントローラーを追加します。

検証

以下のパラメーターで検証してみましょう。

  • URL: http://localhost:8000/api/checkout/orders
  • 形式: POST

OKですね。

トランザクション

先ほどの処理で、Order -> OrderItemの順にデータを保存しました。

しかし、この流れの中でエラーが発生した場合は、どうなるでしょうか?

例えば、Orderは保存成功、OrderItemは保存成功、みたいな感じです。

この2つのデータは全て保存されるか、全て保存されないかのどちらかでないと大変困ります。そうでないと、データの整合性を保つことができないのです。

そんな時に、トランザクションという技術が役立ちます。

トランザクションは、DBシステムで実行される処理のまとまり、または作業単位のことを指します。

「Order -> OrderItem」で保存する流れを一まとまりとし、これらの保存が全て成功した場合だけ、処理を完了させます。 失敗した場合は、ロールバック(トランザクション内の処理で問題が発生した場合に実行する処理)を実行し、データを処理前に戻すということを行います。

トランザクションは、GORMのBeginメソッドを使えば簡単に実装できます。

次回

次回は、Stripe機能を実装しましょう。

Go言語まとめ

ソースコード

ここまでのソースコードを以下に記載します。

link.go

linkController.go

orderController.go

routes.go

コメントを残す