サブスクリプション制の投稿プラットフォーム。Go製バックエンドとReact製フロントエンドで構築された、管理者による投稿承認機能付きのWebアプリケーションです。
- ユーザー登録(メール認証)
- JWT認証(アクセストークン15分、リフレッシュトークン720時間)
- パスワードリセット機能
- 管理者・一般ユーザーのロール制御
- アカウント無効化・ユーザーBAN機能
- 投稿作成・編集・削除(承認ワークフロー付き)
- 投稿への返信(匿名・実名選択可)
- 画像アップロード機能(サムネイル生成)
- カテゴリシステム(色付きタグ、投稿あたり最大5個)
- いいね機能(リアルタイム集計)
- 論理削除システム(is_deletedフラグ)
- グループ作成・編集・削除
- グループオーナー制度(権限管理)
- メンバー管理(表示ユーザー名による検索・追加)
- メンバー除名・自主退会機能
- グループ限定投稿(メンバーシップコンテンツ)
- 表示ユーザー名のユニーク制約(セキュリティ強化)
- Stripe連携による定期課金
- コンテンツ作成にはアクティブなサブスクリプションが必要
- サブスクリプション状態のリアルタイム追跡
- Webhook対応とバッチ同期機能
- 投稿承認・拒否ワークフロー
- ユーザー管理・BAN機能
- コンテンツモデレーションダッシュボード
- 管理者専用アクセス制御
- 言語: Go 1.21
- フレームワーク: Chi router
- データベース: PostgreSQL(SQLマイグレーション)
- 認証: JWT + bcrypt
- 決済: Stripe API
- メール: SendGrid
- バリデーション: go-playground/validator
- ログ: slog + zerolog(JSON形式)
- フレームワーク: React 18 + TypeScript
- スタイリング: PandaCSS + Material-UI(管理画面)
- 状態管理: React Query + Context API
- フォーム: react-hook-form + zod validation
- ファイルアップロード: react-dropzone + compressorjs
- 決済: Stripe React components
- テスト: React Testing Library
- API仕様: OpenAPI 3.0 specification
- コンテナ: Docker + Docker Compose
- データベース: PostgreSQL 15
- ファイルストレージ: ローカルファイルシステム(設定可能)
- デプロイ: Cloud Run対応
- Docker & Docker Compose
- Node.js 18+(フロントエンドローカル開発)
- Go 1.21+(バックエンドローカル開発)
- リポジトリクローン:
git clone <repository-url>
cd posting-app- 環境変数設定:
cp .env.example .env.envファイルの設定:
# データベース
DB_HOST=postgres
DB_PORT=5432
DB_USER=postgres
DB_PASSWORD=password
DB_NAME=posting_app
# JWT
JWT_SECRET=your-super-secret-jwt-key-change-this-in-production
JWT_ACCESS_DURATION=15m
JWT_REFRESH_DURATION=720h
# Stripe
STRIPE_API_KEY=sk_test_your_stripe_secret_key
STRIPE_PRICE_ID=price_your_stripe_price_id
STRIPE_WEBHOOK_SECRET=whsec_your_webhook_secret
# SendGrid
SENDGRID_API_KEY=your_sendgrid_api_key
# アプリケーション
BASE_URL=http://localhost:3000
PORT=8080# 全サービス起動
docker-compose up
# 個別サービス起動
docker-compose up postgres # データベースのみ
docker-compose up backend # バックエンドのみ
docker-compose up frontend # フロントエンドのみアクセスURL:
- フロントエンド: http://localhost:3000
- バックエンドAPI: http://localhost:8080
- データベース: localhost:5432
cd backend
go mod tidy
go run main.gocd front
npm install
npm run generate-api # OpenAPI仕様からAPIクライアント生成
npm start管理者ログイン情報:
- メール: admin@example.com
- パスワード: admin123
管理画面: http://localhost:3000/admin
posting-app/
├── backend/ # Go バックエンド
│ ├── domain/ # ドメインモデル(Post, User, Group, Category等)
│ ├── usecase/ # ビジネスロジック層
│ ├── repository/ # データアクセス層
│ ├── handler/ # HTTPハンドラー層
│ ├── infrastructure/ # 外部サービス実装(DB, JWT等)
│ ├── di/ # 依存性注入コンテナ
│ ├── migrations/ # データベースマイグレーション
│ └── main.go # エントリーポイント
│
├── front/ # React フロントエンド
│ ├── src/
│ │ ├── pages/ # ページコンポーネント(Home, Groups, Admin等)
│ │ ├── components/ # 共通コンポーネント(Layout, Routes等)
│ │ ├── context/ # React Context(認証状態管理)
│ │ ├── generated/ # 自動生成APIクライアント
│ │ ├── utils/ # ユーティリティ関数
│ │ └── types/ # TypeScript型定義
│ ├── package.json
│ ├── tsconfig.json
│ └── orval.config.js # API生成設定
│
├── api/
│ └── schema.yaml # OpenAPI 3.0 仕様書
│
├── batch/ # バッチ処理
│ └── subscription_batch.go
│
├── docker-compose.yml # 開発環境設定
├── CLAUDE.md # 開発者向けガイド
└── README.md # このファイル
- users - ユーザーアカウント・サブスクリプション状態
- posts - ユーザー投稿・承認状態
- replies - 投稿への返信(匿名可)
- categories - カテゴリマスタ
- post_categories - 投稿-カテゴリ関連(多対多)
- likes - いいね機能
- groups - グループ情報
- group_members - グループメンバー関係
- subscriptions - Stripeサブスクリプション追跡
- password_resets - パスワードリセットトークン
001_initial_schema.sql- 基本テーブル作成002_seed_data.sql- 初期データ投入(管理者アカウント等)003_add_new_features.sql- 新機能追加(カテゴリ、いいね、グループ、論理削除)004_add_display_name_unique.sql- セキュリティ強化(表示ユーザー名ユニーク制約)
POST /auth/login- ユーザー認証POST /auth/register- ユーザー登録POST /auth/logout- ログアウトPOST /auth/forgot-password- パスワードリセット要求POST /auth/reset-password- パスワードリセット実行
GET /posts- 承認済み投稿一覧POST /posts- 新規投稿作成(サブスクリプション必須)PUT /posts/{id}- 投稿更新DELETE /posts/{id}- 投稿削除POST /posts/{id}/replies- 返信追加POST /posts/{id}/like- いいね切り替え
GET /groups- ユーザーのグループ一覧POST /groups- グループ作成PUT /groups/{id}- グループ更新DELETE /groups/{id}- グループ削除GET /groups/{id}/members- メンバー一覧POST /groups/{id}/members/by-name- 表示ユーザー名でメンバー追加DELETE /groups/{id}/members/{memberId}- メンバー除名POST /groups/{id}/leave- グループ退会
GET /admin/posts- 投稿管理(承認待ち等)POST /admin/posts/{id}/approve- 投稿承認POST /admin/posts/{id}/reject- 投稿拒否GET /admin/users- ユーザー管理POST /admin/users/{id}/ban- ユーザーBAN
GET /categories- カテゴリ一覧GET /users/search- ユーザー検索GET /subscription/status- サブスクリプション状態確認POST /subscription/create-checkout-session- Stripeチェックアウト作成
cd backend
go test ./...
go test ./... -coverprofile=coverage.outcd front
npm test
npm run lint
npm run lint:fixcd front
npm run generate-api # OpenAPI仕様からTypeScriptクライアント生成- プロダクションビルド:
# バックエンド
cd backend
docker build -f Dockerfile.cloudrun -t backend-image .
# フロントエンド
cd front
npm run build
docker build -f Dockerfile.cloudrun -t frontend-image .- 環境変数設定:
- データベース接続情報
- JWT秘密鍵(強力なランダム文字列)
- Stripe APIキー・Webhook秘密鍵
- SendGrid APIキー
- BASE_URL(フロントエンドドメイン)
問題: /{id}/members/by-name と /{id}/members のパス競合
解決: より具体的なパスを先に定義
// 修正前(404エラー発生)
r.Delete("/{id}", handlers.Post.DeleteGroup)
r.Get("/{id}/members", handlers.Post.GetGroupMembers)
// 修正後(正常動作)
r.Post("/{id}/members/by-name", handlers.Post.AddGroupMemberByDisplayName)
r.Delete("/{id}/members/{memberId}", handlers.Post.RemoveGroupMember)
r.Get("/{id}/members", handlers.Post.GetGroupMembers)
r.Delete("/{id}", handlers.Post.DeleteGroup) // より一般的なパスは最後問題: 表示ユーザー名の重複により、別ユーザーが追加される可能性 解決: display_name にUNIQUE制約追加
-- 既存重複データの自動解決
UPDATE users SET display_name = display_name || '_' || id::text
WHERE id IN (
SELECT id FROM (
SELECT id, ROW_NUMBER() OVER (PARTITION BY display_name ORDER BY id) as rn
FROM users
) t WHERE rn > 1
);
-- UNIQUE制約追加
ALTER TABLE users ADD CONSTRAINT users_display_name_unique UNIQUE (display_name);問題: バックエンドコード変更がコンテナに反映されない 解決: 強制リビルドコマンド
docker-compose up --build backend
# または
docker-compose down && docker-compose up- 環境変数: 秘密情報をバージョン管理にコミットしない
- JWT秘密鍵: 本番環境では強力なランダム文字列を使用
- HTTPS: 本番環境では必ずHTTPS使用
- データベース: 強力なパスワード設定・ネットワークアクセス制限
- ファイルアップロード: ファイル形式・サイズの検証
- レート制限: 適切なレート制限設定
- 表示ユーザー名: UNIQUE制約によるユーザー誤認識防止
- データベース設計: マイグレーションファイル作成
- バックエンド実装: ドメイン → リポジトリ → ユースケース → ハンドラー の順
- API仕様更新:
api/schema.yaml更新 - フロントエンド: API再生成 → UI実装
- テスト: バックエンド・フロントエンドテスト実行
- Chi Router: 具体的なパスを一般的なパスより先に定義
- API生成: OpenAPI仕様変更後は
npm run generate-api実行必須 - Docker: バックエンド変更時はコンテナ再起動・リビルド
- TypeScript: models ディレクトリからの直接インポート使用
- グループ権限管理強化(副管理者ロール)
- 投稿スケジューリング機能
- 高度な検索・フィルター機能
- 通知システム
- ファイル種別拡張(動画、PDF等)
- パフォーマンス最適化(ページネーション、キャッシュ)
- セキュリティ強化(レート制限、CSRF対策)
- 監視・ログ強化
- 自動テスト拡充
- CI/CD パイプライン構築
MIT License - 詳細は LICENSE ファイルを参照
- このREADMEドキュメントを確認
- API仕様書(
api/schema.yaml)を参照 - 開発者向けガイド(
CLAUDE.md)を確認 - GitHub Issue で質問・報告
- 開発チームへ連絡
このプラットフォームは Clean Architecture 原則に従い、レイヤー間の明確な分離とテスタビリティを重視して設計されています。継続的な機能拡張と保守性を考慮した構成となっています。