🫠

ショッピングアプリに必要となる基本的な機能を持つサーバーを開発しています。

2025/01/09に公開

はじめに

こんにちは。絶賛ほぼニートというスローライフを送る、Kokomiです。

私は主にフロントエンドに興味を持っていますが、TypeScriptでできることはなんでもやりたいと思うので、APIサーバーも作ってみようかということで、将来開発するかもしれない、Kokomi shoppingというショッピングアプリのサーバーを作ることにしました。

最近といいますか、トレンドとして、NuxtやらNextやらSvelteKitなどの、フロントエンドフレームワークとサーバーサイドが合体したようなWebフレームワークが流行っていますが、私はあのやり方がどうにも好きになれず、フロントエンドとAPIサーバーはそれぞれ独立しているべきであるという考えが根強いので、サーバーサイドフレームワークのKoa.jsを利用してサーバーを開発しました。Koa.jsのAPIは最もシンプルで使いやすいと思います。

いまだリファクタリングの余地はあり、検証が緩いところも少し見受けられるかもしれませんが、基本的なサーバーサイドのコードを完成させ、テストも作り(まだ十分とは言えませんが)パスしたので、とりあえず公開してみようかと思いました。

kokomi-shopping-serverのリポジトリへ

このサーバーでできること

  • ユーザーの作成・取得・更新・削除

  • 製品の作成・取得・更新・削除

  • 製品のレビューの作成・取得・更新・削除

  • 注文履歴の取得

  • ユーザーのカートに製品を入れたり、取り出したりする

  • Stripe で決済処理を行う

  • Cloudinary に製品画像を保存する

  • 管理者・モデレーター専用のルートがあり、これらの特権ユーザーの管理を行う

使用しているサービス

  • 認証:Firebase Authentication

  • データベース:Firestore

  • 決済処理:Stripe

  • 画像保存:Cloudinary

準備

  1. 依存関係のインストール

    npm i
    
  2. 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": ""
    }
    
  3. 環境変数をセットする

    Cloudinary や Stripe の API キーを.envファイルに設定します。.env.exampleを参考に環境変数をプレースホルダーから置き換えてください。Redis に関しては、使わないようであれば、src/server.tsを編集して、Redis に関連したコードを削除してください。

  4. 準備完了!

    npm run serveを行うとサーバーが起動します。プロジェクトは fly.io でデプロイしやすいようになっています。お好きなように、fly.tomlファイルを編集してください。

注意事項

  • すべてのルートの基本的なレスポンスや、権限によるエラーレスポンスなどの確認はしていますが、まだ十分な量と質のテストでないため、あくまでこれは参考にして付け足すなり、検証を強化するなりしてくださいね。

  • ユーザーが製品の画像データを送信すると、Cloudinaryのtempというフォルダに、一時的に画像が追加され、ここに保存されるものにはtemporaryというタグが付与されるので、Cloudinaryのダッシュボードで、このタグのメディアが定期的に削除されるよう設定するといいでしょう。

  • 宅配サービスのAPIを利用するには審査が必要らしく、ちょっと面倒だなと思って、売り手は注文の配達したことを買い手に伝え、買い手が配達完了を決定できる感じです。

詳しくはリポジトリを確認してください。ここで詳しく説明しても、APIが変更されたりして古くなる可能性がありますから。

私は初めてこのようなサーバーを作ったので、ログやらRedisを使ったキャッシュに関してはあんまり知らず、とりあえずChatGPTに任せたところがあるので、その辺はおいおい改善していこうかと思います。

ご覧いただきありがとうございました。

Discussion