# Fizzy

## 概要

Fizzyは37signals（Basecamp）が開発したカンバン形式のプロジェクト管理・イシュートラッキングアプリケーションです。チームがカード（タスク/イシュー）を作成・管理し、ボード上のカラムでワークフローの段階を整理し、コメント、メンション、アサインメントを通じてコラボレーションできます。

## 主な機能

| 機能カテゴリ | 説明 |
| --- | --- |
| ボード管理 | カンバンボードの作成・管理、カラムによるワークフロー定義 |
| カード管理 | タスク/イシューの作成、リッチテキスト説明、添付ファイル |
| コラボレーション | コメント、メンション、リアクション、アサインメント |
| 検索 | 16シャードMySQLベースの全文検索 |
| 通知 | メール通知、Webプッシュ通知、バンドル通知 |
| 公開機能 | ボードの公開共有リンク生成 |
| エントロピーシステム | 非アクティブカードの自動延期（"not now"への移動） |
| Webhook | 外部連携用Webhook |
| データ移行 | エクスポート/インポート機能（大容量ZIP対応） |
| マルチテナンシー | URLパスベースのマルチテナント対応 |
| PWA | プログレッシブWebアプリ対応 |
| モバイルクライアント | iOS/Androidアプリ設定API |

## 技術スタック

### コア

- フレームワーク: Ruby on Rails（main branch）
- 言語: Ruby 3.x
- データベース: SQLite（デフォルト）、MySQL対応
- Webサーバー: Puma
- アセットパイプライン: Propshaft、Importmap

### 主要ライブラリ

- Hotwire（Turbo、Stimulus）: SPA風のインタラクション
- Solid Queue: データベースベースのジョブキュー
- Solid Cache: データベースベースのキャッシュ
- Solid Cable: データベースベースのAction Cable
- Action Text: リッチテキストエディタ
- Active Storage: ファイルアップロード（AWS S3対応）
- bcrypt: パスワードハッシュ
- web-push: Webプッシュ通知
- Kamal: デプロイツール
- Mission Control Jobs: ジョブ監視
- geared_pagination: ページネーション
- rqrcode: QRコード生成

## ディレクトリ構成

```
fizzy-main/
├── app/
│   ├── assets/          # スタイルシート、画像
│   ├── channels/        # Action Cableチャンネル
│   ├── controllers/     # コントローラー（36ファイル）
│   ├── helpers/         # ビューヘルパー
│   ├── javascript/      # JavaScriptコントローラー（Stimulus）
│   ├── jobs/            # バックグラウンドジョブ
│   ├── mailers/         # メール送信
│   ├── models/          # ドメインモデル（62ファイル）
│   └── views/           # ビューテンプレート
├── bin/                 # 実行スクリプト
├── config/              # 設定ファイル
│   ├── environments/    # 環境別設定
│   ├── initializers/    # 初期化スクリプト
│   ├── routes.rb        # ルーティング定義
│   └── recurring.yml    # 定期実行ジョブ設定
├── db/
│   ├── migrate/         # マイグレーションファイル
│   ├── schema.rb        # DBスキーマ
│   └── seeds/           # シードデータ
├── docs/                # ドキュメント
├── lib/                 # ライブラリコード
│   ├── rails_ext/       # Rails拡張
│   └── tasks/           # Rakeタスク
├── public/              # 静的ファイル
├── saas/                # SaaS版用コンパニオンgem
├── script/              # スクリプト
├── test/                # テスト
│   ├── controllers/     # コントローラーテスト
│   ├── fixtures/        # テストフィクスチャ
│   ├── models/          # モデルテスト
│   └── system/          # システムテスト
└── vendor/              # サードパーティコード
```

## セットアップ

### 必要条件

- Ruby（バージョンは`.ruby-version`参照）
- SQLite3 または MySQL
- Node.js（開発ツール用）

### インストール手順

```bash
# 初期セットアップ（gem インストール、DB作成、スキーマ読み込み）
bin/setup

# データベースリセット（必要な場合）
bin/setup --reset
```

### 開発サーバー起動

```bash
bin/dev
```

開発URL: http://fizzy.localhost:3006

ログイン: `david@example.com`（開発フィクスチャ）、認証コードはブラウザコンソールで確認

### Webプッシュ通知（オプション）

VAPIDキーを生成し環境変数を設定:

```bash
# VAPID_PRIVATE_KEY
# VAPID_PUBLIC_KEY
```

## 開発

### テスト実行

```bash
# ユニットテスト（高速）
bin/rails test

# 単一ファイルテスト
bin/rails test test/path/file_test.rb

# システムテスト（Capybara + Selenium）
bin/rails test:system

# 完全CIスイート
bin/ci
```

CIパイプライン（`bin/ci`）の実行内容:
1. Rubocop（スタイルチェック）
2. Bundler audit（gem セキュリティ）
3. Importmap audit
4. Brakeman（セキュリティスキャン）
5. アプリケーションテスト
6. システムテスト

### データベース操作

```bash
# フィクスチャデータ読み込み
bin/rails db:fixtures:load

# マイグレーション実行
bin/rails db:migrate

# データベースリセット
bin/rails db:reset
```

### データベースアダプター切り替え

```bash
# MySQL使用（デフォルトはSQLite）
DATABASE_ADAPTER=mysql bin/setup --reset
DATABASE_ADAPTER=mysql bin/ci
```

### コードスタイル

- Rubocop Rails Omakase準拠
- 詳細は`STYLE.md`参照
- PRレビューでスタイルを厳格にチェック

### メールプレビュー

開発環境: http://fizzy.localhost:3006/rails/mailers

```bash
# letter_openerの有効/無効切り替え
bin/rails dev:email
```

### ジョブ管理

```bash
# Solid Queueジョブ管理
bin/jobs
```

管理画面: `/admin/jobs`（Mission Control Jobs）

## デプロイ

### Kamalデプロイ

```bash
# SaaS機能有効化
bin/rails saas:enable

# デプロイ
bin/kamal deploy -d <destination>
```

デプロイ先: production, staging, beta, beta1, beta2, beta3, beta4

### Dockerデプロイ

詳細は`docs/docker-deployment.md`参照

## ライセンス

O'Saasy License（`LICENSE.md`参照）
