Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

追加のGET API実装 #29

Open
riii111 opened this issue Sep 30, 2024 · 1 comment
Open

追加のGET API実装 #29

riii111 opened this issue Sep 30, 2024 · 1 comment
Labels
backend enhancement New feature or request

Comments

@riii111
Copy link
Owner

riii111 commented Sep 30, 2024

内容

APIの追加実装あとで。
※app routerの特性を考慮した「細粒度のAPI」を意識した設計で。

対象

企業関連API

  • 企業概要取得API: /api/companies/{company_id}/summary
  • 企業詳細取得API: /api/companies/{company_id}

プロジェクト関連API

  • プロジェクト概要取得API(企業ごと): /api/companies/{company_id}/projects/summary
  • プロジェクト一覧取得API(企業ごと、ページネーション付き): /api/companies/{company_id}/projects?page={page}&per_page={per_page}
    プロジェクト詳細取得API: /api/projects/{project_id}

勤怠記録関連API

  • 勤怠記録概要取得API(プロジェクトごと): /api/projects/{project_id}/work-logs/summary
  • 勤怠記録一覧取得API(プロジェクトごと、ページネーション付き): /api/projects/{project_id}/work-logs?page={page}&per_page={per_page}

補足・メモ

  • 集約パイプライン活用してみる?
    複数のステージから構成され、各ステージでデータに操作をかける。
    SQLの実行順序を、自前で定義してる感じか?
$match: ドキュメントをフィルタリング(SQLのWHERE句に相当)。
$group: ドキュメントをグループ化し、集計操作を行う(SQLのGROUP BY句に相当)。
$project: 出力するフィールドを指定したり、新しいフィールドを追加。
$sort: ドキュメントをソートする。
$limit / $skip: 結果の数を制限したり、スキップしたり(ページネーションに使用)。
$lookup: 他のコレクションとの結合を行う(SQLのJOINに相当)。
  • 部分的な非正規化も検討して良いかも
    例)projectドキュメントに、最新の勤怠記録サマリーを埋め込む
      →どれくらい頻繁にアクセスされるか次第
@riii111 riii111 added enhancement New feature or request backend labels Sep 30, 2024
@riii111
Copy link
Owner Author

riii111 commented Sep 30, 2024

集約パイプラインのネタ↓

プロジェクトの概要を取得する集約パイプライン

let pipeline = vec![
    doc! { "$match": { "company_id": company_id } },
    doc! {
        "$group": {
            "_id": null,
            "total_projects": { "$sum": 1 },
            "active_projects": { 
                "$sum": { "$cond": [{ "$eq": ["$status", "active"] }, 1, 0] }
            },
            "total_budget": { "$sum": "$budget" }
        }
    },
    doc! {
        "$project": {
            "_id": 0,
            "total_projects": 1,
            "active_projects": 1,
            "total_budget": 1,
            "average_budget": { "$divide": ["$total_budget", "$total_projects"] }
        }
    }
];
  • $match: 特定の会社のプロジェクトのみをフィルタリングする
  • $group: 全プロジェクトの数、アクティブなプロジェクトの数、総予算を計算する
  • $project: 結果のフォーマットを整え、平均予算を計算する

適切に設計すれば、個別のクエリを実行するより高速。

⭐️これをRSC側で呼び出せば初期ロード時間も短縮可能か?

@riii111 riii111 changed the title 追加のAPI実装 追加のGET API実装 Sep 30, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

1 participant