ショッピングアプリに必要となる基本的な機能を持つサーバーを開発しています。
はじめに
こんにちは。絶賛ほぼニートというスローライフを送る、Kokomiです。
私は主にフロントエンドに興味を持っていますが、TypeScriptでできることはなんでもやりたいと思うので、APIサーバーも作ってみようかということで、将来開発するかもしれない、Kokomi shoppingというショッピングアプリのサーバーを作ることにしました。
最近といいますか、トレンドとして、NuxtやらNextやらSvelteKitなどの、フロントエンドフレームワークとサーバーサイドが合体したようなWebフレームワークが流行っていますが、私はあのやり方がどうにも好きになれず、フロントエンドとAPIサーバーはそれぞれ独立しているべきであるという考えが根強いので、サーバーサイドフレームワークのKoa.jsを利用してサーバーを開発しました。Koa.jsのAPIは最もシンプルで使いやすいと思います。
いまだリファクタリングの余地はあり、検証が緩いところも少し見受けられるかもしれませんが、基本的なサーバーサイドのコードを完成させ、テストも作り(まだ十分とは言えませんが)パスしたので、とりあえず公開してみようかと思いました。
このサーバーでできること
-
ユーザーの作成・取得・更新・削除
-
製品の作成・取得・更新・削除
-
製品のレビューの作成・取得・更新・削除
-
注文履歴の取得
-
ユーザーのカートに製品を入れたり、取り出したりする
-
Stripe で決済処理を行う
-
Cloudinary に製品画像を保存する
-
管理者・モデレーター専用のルートがあり、これらの特権ユーザーの管理を行う
使用しているサービス
-
認証:Firebase Authentication
-
データベース:Firestore
-
決済処理:Stripe
-
画像保存:Cloudinary
準備
-
依存関係のインストール
npm i
-
Firebase のサービスアカウントキーをこのプロジェクトのルートに配置する
serviceAccountKey.json
ファイルをルートに配置します。{ "type": "service_account", "project_id": "", "private_key_id": "", "private_key": "", "client_email": "", "client_id": "", "auth_uri": "", "token_uri": "", "auth_provider_x509_cert_url": "", "client_x509_cert_url": "", "universe_domain": "" }
-
環境変数をセットする
Cloudinary や Stripe の API キーを
.env
ファイルに設定します。.env.example
を参考に環境変数をプレースホルダーから置き換えてください。Redis に関しては、使わないようであれば、src/server.ts
を編集して、Redis に関連したコードを削除してください。 -
準備完了!
npm run serve
を行うとサーバーが起動します。プロジェクトは fly.io でデプロイしやすいようになっています。お好きなように、fly.toml
ファイルを編集してください。
注意事項
-
すべてのルートの基本的なレスポンスや、権限によるエラーレスポンスなどの確認はしていますが、まだ十分な量と質のテストでないため、あくまでこれは参考にして付け足すなり、検証を強化するなりしてくださいね。
-
ユーザーが製品の画像データを送信すると、Cloudinaryの
temp
というフォルダに、一時的に画像が追加され、ここに保存されるものにはtemporary
というタグが付与されるので、Cloudinaryのダッシュボードで、このタグのメディアが定期的に削除されるよう設定するといいでしょう。 -
宅配サービスのAPIを利用するには審査が必要らしく、ちょっと面倒だなと思って、売り手は注文の配達したことを買い手に伝え、買い手が配達完了を決定できる感じです。
詳しくはリポジトリを確認してください。ここで詳しく説明しても、APIが変更されたりして古くなる可能性がありますから。
私は初めてこのようなサーバーを作ったので、ログやらRedisを使ったキャッシュに関してはあんまり知らず、とりあえずChatGPTに任せたところがあるので、その辺はおいおい改善していこうかと思います。
ご覧いただきありがとうございました。
Discussion