* Add GET /api/stats endpoint for total downloads badge
Public JSON endpoint that reads the existing package_stats singleton
row (same data source as the admin dashboard). Includes per-IP rate
limiting (10 req/min) and Cache-Control: public, max-age=300 so
CDN/shields.io caching reduces actual hits further.
Response shape:
{ total_installs, installs_30d, active_plugins, active_themes, total_packages }
https://claude.ai/code/session_019NzdEnnohsqdqyuw5VXUgy
* Use golang.org/x/time/rate for API rate limiting and add installs badge
Replace custom token-counting rate limiter with per-IP rate.Limiter
instances from golang.org/x/time/rate. Add total composer installs
badge to README.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Strip port from RemoteAddr before rate limiting
Use clientIP to normalize host:port to just the host, so varying
source ports from the same IP share a single rate limiter. Update
middleware test to use realistic host:port addresses.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Show exact install counts with per-type breakdown on admin dashboard
- Display exact numbers with commas instead of rounded "24K"
- Show plugin and theme install counts separately
- Show timestamp in CST instead of relative time
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
53 lines
2.3 KiB
Modula-2
53 lines
2.3 KiB
Modula-2
module github.com/roots/wp-packages
|
|
|
|
go 1.26.1
|
|
|
|
require (
|
|
github.com/aws/aws-sdk-go-v2 v1.41.4
|
|
github.com/aws/aws-sdk-go-v2/credentials v1.19.12
|
|
github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1
|
|
github.com/fogleman/gg v1.3.0
|
|
github.com/getsentry/sentry-go v0.43.0
|
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
|
|
github.com/johannesboyne/gofakes3 v0.0.0-20260208201424-4c385a1f6a73
|
|
github.com/pressly/goose/v3 v3.27.0
|
|
github.com/spf13/cobra v1.10.2
|
|
golang.org/x/crypto v0.49.0
|
|
golang.org/x/image v0.37.0
|
|
golang.org/x/sync v0.20.0
|
|
golang.org/x/time v0.15.0
|
|
gopkg.in/yaml.v3 v3.0.1
|
|
modernc.org/sqlite v1.46.1
|
|
)
|
|
|
|
require (
|
|
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 // indirect
|
|
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect
|
|
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect
|
|
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 // indirect
|
|
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect
|
|
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 // indirect
|
|
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect
|
|
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 // indirect
|
|
github.com/aws/smithy-go v1.24.2 // indirect
|
|
github.com/dustin/go-humanize v1.0.1 // indirect
|
|
github.com/google/uuid v1.6.0 // indirect
|
|
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
|
github.com/kr/text v0.2.0 // indirect
|
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
|
github.com/mfridman/interpolate v0.0.2 // indirect
|
|
github.com/ncruces/go-strftime v1.0.0 // indirect
|
|
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
|
|
github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46 // indirect
|
|
github.com/sethvargo/go-retry v0.3.0 // indirect
|
|
github.com/spf13/pflag v1.0.9 // indirect
|
|
go.shabbyrobe.org/gocovmerge v0.0.0-20230507111327-fa4f82cfbf4d // indirect
|
|
go.uber.org/multierr v1.11.0 // indirect
|
|
golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa // indirect
|
|
golang.org/x/sys v0.42.0 // indirect
|
|
golang.org/x/text v0.35.0 // indirect
|
|
golang.org/x/tools v0.42.0 // indirect
|
|
modernc.org/libc v1.68.0 // indirect
|
|
modernc.org/mathutil v1.7.1 // indirect
|
|
modernc.org/memory v1.11.0 // indirect
|
|
)
|