プロ機材向けレンタルマーケットプレイス
ダブルブッキング防止、分割決済、保証金、リアルタイムメッセージ、空間検索を備えたRails製二面型マーケットプレイス。
課題
同じ機材が重なる日程で二重予約されることを確実に防ぎ、プラットフォーム手数料、オーナー支払い、保証金という複数のお金の流れを扱う必要があった。 小規模なチームでも、メッセージや予約更新をリアルタイムに扱うUXが求められた。
ソリューション
RailsとPostgreSQLのtstzrange/GiST排他制約で重複予約をDBレイヤーで拒否。Stripe Connectで分割決済と保証金を設計し、Hotwire、Action Cable、Sidekiqでリアルタイム更新と非同期処理を実装した。
成果
ダブルブッキングが構造上起きない二面型マーケットプレイスを構築し、決済、保証金、検索、メッセージ、通知を単一のRailsコードベースで提供した。
チーム
Small team, 12 weeks
Railsフルスタック・決済・マーケットプレイス・リアルタイム
役割
予約整合性、Stripe Connect、Hotwire、空間検索、Sidekiq、認可を担当。
PostgreSQL制約とバックグラウンドジョブへ正しさを寄せながら、HotwireでリアルタイムUXを構築しました。
技術スタック
主要機能
DB制約によるダブルブッキング防止
Stripe Connectによる分割決済と保証金
Hotwireによるリアルタイムメッセージ・予約更新
空き状況を考慮した空間検索
Sidekiqによる決済・通知・再インデックス処理
注力した点
データベースが強制する予約整合性
PostgreSQLの範囲型と排他制約で、重複する確定予約をDBエンジン自身が拒否する構成にしました。
3つのお金の流れを分けて設計
レンタル料、オーナー支払い、保証金をStripe Connectと手動キャプチャで分け、実務上の返金・解放まで扱えるようにしました。