CommunityPro / CommunityPro/community-pro-api

Contributors: historical backfill command (Phase 5.2)

Open
#7 0 comments 0 reactions 0 assignees View on GitHub
contributors
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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.