WITHMIA v1.0.5 — セキュリティ、品質、そして請求書
API全体へのレート制限、GitHub ActionsによるCI/CDパイプライン、自動テストのスイート、完成した紹介プログラム、そしてWITHMIAのブランドをまとったPDF請求書の生成をお届けします。
WITHMIAチーム
WITHMIA
注記(2026年7月): BusinessプランとEnterpriseプランは、現在TeamとMaxという名称になっています。価格は変わりません。
v1.0.4では、持続可能な収益モデルを組み立てました。v1.0.5で固めるのは土台そのものです。APIの保護、コード品質の自動チェック、そして本格的な請求書。このアップデートで、WITHMIAは安心して規模を広げられるプラットフォームになります。
レート制限:すべてのルートを守る
APIのすべてのルートに、きめ細かいレート制限をかけました。処理の種類に応じて、6種類のリミッターが働きます。
| リミッター | 対象ルート | 上限 |
|---|---|---|
| api | プロフィール、チケット、チャネル、ナレッジベース、設定 | 60 req/分 |
| chatwoot-proxy | 会話とメッセージのリアルタイムプロキシ | 120 req/分 |
| evolution | WhatsAppのインスタンス(Evolution API) | 60 req/分 |
| integrations | カレンダー、商品、売上、外部連携 | 60 req/分 |
| billing | サブスクリプション、チェックアウト、超過分、請求書 | 20 req/分 |
| admin | 管理画面 | 30 req/分 |
なぜ重要なのか
レート制限がなければ、悪意のある相手がひとりいるだけで(あるいはクライアント側のバグひとつで)API全体が飽和します。この保護によって、次のことが得られます。
- 不正利用の防止 — ボットやスクレイパーがエンドポイントを叩き続けられなくなります
- 高負荷でも安定 — トラフィックが急増しても、APIは予測どおりに応答します
- 金銭面の保護 — 課金のエンドポイントは20 req/分と、とくに厳しく守っています
- Chatwootに最適化 — チャットのプロキシはリアルタイム処理のため、上限をもっとも高く(120 req/分)しています
各リミッターは、認証済みユーザーごとに適用されます。公開リクエストの場合はIPごとです。レスポンスにはX-RateLimit-Limit、X-RateLimit-Remaining、Retry-Afterという標準のヘッダーが含まれます。
CI/CD:GitHub Actionsによる自動デプロイ
WITHMIAに、継続的インテグレーションと継続的デリバリーの完全なパイプラインが加わりました。mainへのプッシュのたびに、次の処理が自動で走ります。
バックエンド(PHP)
- パイプラインのサービスとしてPostgreSQL 16 + Redis 7を起動
- Composerによる依存関係のインストール
- Pestによるテストスイート全体の実行
- 隔離されたテスト用の環境変数
フロントエンド(TypeScript/React)
- npmによる依存関係のインストール
- ESLint — スタイルとエラーの検証
- TypeScript — プロジェクト全体の型チェック
- ビルド — すべてが解決することを確かめるための完全なコンパイル
デプロイ
- Railwayへの自動デプロイ。実行は
mainブランチからのみ - シークレット
RAILWAY_TOKENで保護 - テストとビルドが通った場合にだけ実行
テストが1つでも失敗するか、TypeScriptが型エラーを見つけると、デプロイは自動的に止まります。壊れたコードが本番に上がる余地はありません。
Pestによる自動テスト
WITHMIA初の自動テストスイートです。事業にとってもっとも重要な部分を押さえています。
ユニットテスト
- CurrencyService — 国からの通貨判定、ゲートウェイの振り分け(CLPはFlow、それ以外はdLocal)、現地価格の正しさ
- BillingConfig — プラン構成(Free、Pro、Business、Enterprise)、超過分の価格、FlowとdLocalの設定、年間割引の検証
- OverageService — パックあたりの価格、超過メッセージ数に応じたコスト計算
機能テスト
- APIのエンドポイント — ヘルスチェック、認証ガード、スロットリングの動作、404の扱い
- モデル — factory patternによるUser、Company、Subscriptionの作成
各テストはRefreshDatabaseのおかげでまっさらなPostgreSQLのデータベース上で走るため、テスト同士が独立し、何度でも同じ結果を再現できます。
紹介プログラムが完成
紹介のしくみが、空のスタブから完全な実装になりました。
どう動くのか
- あなたの会社がコードを発行します — 形式は
WM-XXXXXX(英数字6文字) - そのコードを他社と共有します
- 相手企業が契約時に適用すると、3か月間10%の割引を受けられます
- あなたには紹介実績が積み上がります — コードが何回使われたかをシステムが記録します
業務ルール
- 自分のコードは使えません(自己紹介の防止)
- 同じ企業が同じコードを2回適用することはできません
- 割引は設定可能です(割引率、適用月数、利用回数の上限)
- コードには有効期限を設定できます
- コードを発行できるのは、有効なプランを契約している企業だけです
新しいエンドポイント
GET /api/subscription/referral-code— 自社のコードを取得または発行POST /api/subscription/apply-referral— 紹介コードを適用(スタブとしては既にありましたが、今回から実際に動きます)
本格的なPDF請求書
WITHMIAのブランドをまとった、新しい請求書生成のしくみです。
Invoiceモデル
- 自動採番 — 形式は
WM-YYYY-XXXXX(例:WM-2026-00001) - 税額の計算 — CLPでの支払いには19%を自動で適用
- 明細 — 品目、プラン、請求サイクル
- リレーション — CompanyおよびSubscriptionに紐づけ
請求書の自動生成
支払いが確定した時点で、請求書はユーザーの操作なしに自動で作成されます。
- Flow.cl — Webhookで支払いが確定したとき(
status === 2) - dLocal — dLocalのWebhookで支払いが確定したとき
- Flow Subscription — 継続課金の更新のたび(初回の請求書か更新かを記録します)
各請求書には、支払い方法、取引の参照番号、金額、通貨、税の内訳が記録されます。
PDFのダウンロード
InvoiceServiceは、次の要素を備えた整ったHTML文書を生成します。
- ゴールドのアクセント(#FFD700)を用いたWITHMIAのロゴとブランド表現
- 発行元企業と宛先企業の情報
- 小計、税、合計の内訳を示す明細テーブル
- 支払い情報:方法、参照番号、日付
- 印刷に最適化されたレスポンシブなデザイン
dompdfがインストールされていれば実際のPDFを生成します。入っていない場合は、window.print()を組み込んだ印刷向けのHTML版を返します。
新しいエンドポイント
GET /api/subscription/invoices— 自社の直近50件の請求書一覧GET /api/subscription/invoices/{id}/pdf— 請求書をPDF/HTMLでダウンロード
技術的なまとめ
| 変更点 | ファイル | 影響範囲 |
|---|---|---|
| レート制限 | AppServiceProvider + routes/api.php | リミッター6種、18以上のルートグループ |
| CI/CD | .github/workflows/ci.yml + .env.ci | 3つのジョブ(バックエンド、フロントエンド、デプロイ) |
| テスト | tests/内の5ファイル | 23件以上のテストケース(ユニット + 機能) |
| 紹介プログラム | モデル2つ + マイグレーション + コントローラー | 一式そろった状態 |
| 請求書 | Invoiceモデル + InvoiceService + マイグレーション | Webhookでの自動作成 |
この先の予定
品質を支えるインフラが整ったことで、2026年Q2のロードマップは効果の大きい機能に集中します。
- PWA / モバイルアプリ — モバイルファーストのラテンアメリカでは最優先です
- CSATアンケート — 競合がどこも備えている機能です
- AIの解決率分析 — AIによる解決の指標
- WhatsAppの一斉配信 — 大規模キャンペーン
WITHMIA v1.0.5は、いちばん華やかなアップデートではありません。それでも、安心して眠れるようにしてくれる一手です。テスト済みのコード、守られたAPI、自動で発行される請求書。
ラベル
コメント
敬意をもってご記入ください。メールアドレスは公開されません。