機能仕様 - rfdnxbro/trends-laravel GitHub Wiki

機能仕様

概要

技術コミュニティでの企業影響力を定点観測するWebアプリケーションの機能仕様書です。

認証・権限

  • 招待制サイト: 招待を受けた人のみアクセス可能
  • 権限レベル:
    • 一般ユーザー: 閲覧・検索機能
    • 管理者: データ管理・ユーザー管理機能

データ収集システム(MVP)

収集頻度

  • 1時間ごとにスクレイピング実行

スクレイピングコマンド

  • 全プラットフォーム実行: php artisan scrape:all / php artisan scrape:all --dry-run
  • 個別プラットフォーム実行: php artisan scrape:platform <platform>
  • 定期実行用: php artisan scrape:schedule / php artisan scrape:schedule --silent

対象サイト・企業特定方法

はてなブックマーク(✅ 実装済み)

  • URL: https://b.hatena.ne.jp/hotentry/it
  • 企業特定: テックブログのドメインで特定
  • 自動登録条件: ITカテゴリのホットエントリーに掲載された記事のドメイン
  • 実装状況: HatenaBookmarkScraperクラスで実装済み
  • コマンド: php artisan scrape:platform hatena / php artisan scrape:platform hatena --dry-run

Qiita(✅ 実装済み)

  • URL: https://qiita.com(トレンドページ)
  • 企業特定: ユーザーアカウントと企業の紐づけ
  • 自動登録条件: トレンドに掲載された記事のユーザーが企業アカウントの場合
  • 実装状況: QiitaScraperクラスで実装済み
  • コマンド: php artisan scrape:platform qiita / php artisan scrape:platform qiita --dry-run

Zenn(✅ 実装済み)

  • URL: https://zenn.dev/ (Techカテゴリ、16記事上限)
  • 企業特定: ユーザーアカウントと企業の紐づけ
  • 自動登録条件: Techカテゴリのトレンド記事のユーザーが企業アカウントの場合
  • 実装状況: ZennScraperクラスで実装済み
  • コマンド: php artisan scrape:platform zenn / php artisan scrape:platform zenn --dry-run

収集データ項目

  • 記事タイトル
  • URL
  • 投稿日時
  • 著者情報
  • エンゲージメント数(統一されたエンゲージメント指標)
  • 記事の技術タグ・カテゴリ

Qiita固有のデータ項目:

  • エンゲージメント数(LGTM数)
  • 投稿者ユーザー名
  • 投稿者URL

Zenn固有のデータ項目:

  • エンゲージメント数(いいね数)
  • 投稿者ユーザー名
  • 投稿者URL

企業影響力ランキング

算出ロジック(3パターン検討中)

  1. 表示回数カウント: 各サイトに表示された回数の単純合計
  2. エンゲージメント数カウント: エンゲージメント数の合計
  3. ポイント加算方式: エンゲージメント数に応じたポイント制
    • 10以上: +1ポイント
    • 100以上: +5ポイント
    • 1000以上: +10ポイント等

技術カテゴリ

  • 対象: 全技術カテゴリ
    • プログラミング言語
    • フレームワーク
    • インフラ技術
    • データベース
    • AI/ML、ブロックチェーン等

データベース設計

企業マスタ

  • 企業ID
  • 企業名
  • 作成日時
  • 更新日時

ブログテーブル(企業マスタと1対多)

  • ブログID
  • 企業ID(外部キー)
  • ドメイン名
  • ブログ名
  • 作成日時
  • 更新日時

企業自動登録

  • 条件: 各サイトのトレンドに新しいドメイン・Organization・Publicationが掲載
  • 処理: 企業マスタとブログテーブルに自動登録
  • URL変更対応: ブログテーブルでドメイン変更・削除に対応

API機能(✅ 実装済み)

企業ランキングAPI

  • 期間別ランキング: GET /api/rankings/{period} - 日次/週次/月次ランキング
  • 期間タイプ一覧: GET /api/rankings/periods - 利用可能期間の取得
  • 統計情報: GET /api/rankings/statistics - ランキング統計データ
  • 上位N件: GET /api/rankings/{period}/top/{limit} - 上位企業の取得
  • 順位変動: GET /api/rankings/{period}/risers - 上昇企業の取得
  • 順位下降: GET /api/rankings/{period}/fallers - 下降企業の取得
  • 変動統計: GET /api/rankings/{period}/statistics - 順位変動統計
  • 企業別ランキング: GET /api/rankings/company/{company_id} - 特定企業のランキング

企業詳細API

  • 企業詳細情報: GET /api/companies/{company_id} - 企業基本情報と現在ランキング
  • 企業記事一覧: GET /api/companies/{company_id}/articles - 企業の記事履歴(ページネーション対応)
  • 影響力スコア履歴: GET /api/companies/{company_id}/scores - 時系列スコアデータ
  • ランキング情報: GET /api/companies/{company_id}/rankings - 企業のランキング履歴

記事API

  • 記事一覧: GET /api/articles - 記事一覧(企業・プラットフォーム別フィルタ、ページネーション対応)
  • 記事詳細情報: GET /api/articles/{id} - 記事基本情報・企業情報・統計データ

検索API

  • 企業検索: GET /api/search/companies - 企業名・ドメイン・説明文での検索
  • 記事検索: GET /api/search/articles - 記事タイトル・著者名での検索
  • 統合検索: GET /api/search - 企業・記事の横断検索
  • 関連度スコア: 検索結果に関連度スコアを付与して最適化

API共通仕様

  • レート制限: 60リクエスト/分
  • キャッシュ: 5分間のレスポンスキャッシュ
  • エラーハンドリング: 統一されたエラーレスポンス形式
  • バリデーション: 入力パラメータの検証

フロントエンド機能(計画中)

基本機能

  • 企業影響力ランキング表示: リアルタイムでのランキング表示
  • 期間指定: 過去1ヶ月、3ヶ月、1年等の期間選択
  • 企業詳細ページ: 投稿履歴、技術スタックの変遷等
  • 技術キーワード分析: 注目技術と企業の関連性を可視化
  • 検索機能: 企業・記事の横断検索

管理機能(管理者のみ)

  • 企業マスタ管理: 企業情報の手動修正・削除
  • ブログドメイン管理: ドメイン情報の手動修正・削除
  • スクレイピング状況確認: 実行ログとエラー確認
  • ユーザー管理: 招待・権限変更・削除

開発状況

✅ 実装完了

  1. データ収集システム: スクレイピング機能の実装
  2. 企業自動登録: 新規企業の自動検出・登録
  3. 企業影響力ランキングAPI: 期間別ランキング機能
  4. 企業詳細API: 企業情報・記事・スコア履歴
  5. 検索API: 企業・記事の横断検索機能
  6. フロントエンドダッシュボード: React + Tailwind CSSでのダッシュボード

🚧 開発継続中

  1. 基本認証: 招待制ユーザー管理
  2. 管理画面: データ管理機能
  3. 技術キーワード分析: 注目技術と企業の関連性を可視化
  4. 高度な検索フィルタ: 技術スタック・期間・影響力による絞り込み
  5. レポート機能: 定点観測データのエクスポート
  6. 通知機能: ランキング変動アラート

技術要件

  • バックエンド: Laravel(キューシステムでスクレイピング非同期実行)
  • フロントエンド: React + Tailwind CSS
  • データベース: PostgreSQL(時系列データ処理)
  • 本番環境: Laravel Cloud

スクレイピング実装方針

定期実行システム

  • Laravel Scheduler: 1時間ごとの定期実行
  • キューシステム: 非同期でのスクレイピング処理
  • Job分散: 各サイト別のジョブで並列実行

技術スタック

  • Guzzle HTTP: HTTPリクエスト処理
  • Goutte: DOMスクレイピング(Symfony DomCrawler)
  • Laravel HTTP Client: 簡単なHTTPクライアント

アーキテクチャ構成

Laravel Scheduler (hourly) ↓ ScrapingJob (Main) ├─ HatenaScrapingJob ├─ QiitaScrapingJob
└─ ZennScrapingJob

レイヤー構成

  • Job層: 各サイトのスクレイピング処理
  • Service層: スクレイピングロジック
  • Repository層: データベース操作
  • Model層: Eloquentモデル

エラー処理・監視

  • Retry機能: 3回まで自動リトライ
  • Failed Job Queue: 失敗したジョブの管理
  • ログ記録: 各サイトのスクレイピング状況記録
  • Horizon: キューの監視・管理
  • Laravel Telescope: デバッグ・パフォーマンス監視
⚠️ **GitHub.com Fallback** ⚠️