CommunityPro / CommunityPro/community-pro-api
Contributors: historical backfill command (Phase 5.2)
- Dominant language
- C#
- Stars
- 0
- Forks
- 0
- PR merge metrics
- No merged PRs in 30d
Description
## Scope
`dotnet run -- backfill-contributions` host command that pages the GitHub REST API across **all org repos** and records every historically merged PR as a `ContributionEvent`.
## Mechanics
- `GET /orgs/{org}/repos` then `GET /repos/{owner}/{repo}/pulls?state=closed&per_page=100` per repo, filtering `merged_at != null`.
- Honor rate limits: conditional requests where possible, respect `Retry-After` / `X-RateLimit-Remaining`, back off rather than fail.
- Idempotent: reuses the `(Repo, PrNumber)` unique constraint from #6 — safe to re-run any time (plan: run once at launch, webhooks keep it current; re-run right before launch to catch stragglers).
- Follow the existing `backfill-activations` command as the structural reference (host command wiring, Makefile target `make backfill-contributions`, logging summary at the end: repos scanned, PRs found, inserted, skipped).
- GitHub calls go behind the module-owned interface (no direct HttpClient in the command).
## Dependencies
Blocked by #6 (entity + constraints).
## Acceptance criteria
- [ ] Re-running produces zero duplicates
- [ ] Rate-limit responses back off instead of throwing
- [ ] Pagination exercised in tests via a fake GitHub client
- [ ] Makefile target + `env.example` entry for the org token if a separate one is needed
### Conventions (project-wide, non-negotiable)
- .NET 9, records for immutable shapes, file-scoped namespaces, primary constructors where they read well. Minimal-API endpoints grouped per module via `IEndpointModule.MapEndpoints`.
- `Result` (SharedKernel) instead of exception-driven control flow. Endpoint results map failures to ProblemDetails with the stable error codes listed above — the frontend keys off them.
- Module owns its EF Core `DbContext` mapped to its own Postgres schema. Modules never reference each other's internals — cross-module needs go through a public contract interface or an in-process domain event (`IEventPublisher`).
- All external calls (GitHub, Stripe, Brevo, Cloudinary, Meilisearch) behind interfaces owned by the consuming module.
- Every list endpoint paginated (offset is fine). xUnit tests in `tests/CommunityPro.Tests//` following the existing harness patterns (see `Members/MembersTestHarness.cs`).
Contributor guide
No contributing guide indexed for this repository
Research direction
Start by reading the existing backfill-activations command and its host wiring, then inspect the module-owned GitHub interface and the entity and unique constraint from #6. Done means the Makefile target and env.example entry are covered, fake-client tests exercise pagination, idempotency, and rate-limit backoff, and the command logs repos scanned, PRs found, inserted, and skipped.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- csharp, github, postgresql
- Domain
- api, backend, databases
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100