Hardening pass over the API surface. No route's auth requirements change.
Resilience:
- Add recover middleware. There was none, so an unhandled panic in any
handler propagated out of the process instead of becoming a 500.
- Add a centralized ErrorHandler so errors and recovered panics return the
same {success,message} envelope as the utils helpers, not Fiber's default
plain-text body. 5xx responses are logged with method and path.
Rate limiting:
- Global 300/min per IP as an abuse backstop, exempting health/readiness
probes and websocket upgrades.
- 10/min shared across every credential endpoint (customer/miler/admin/hub
login, verify-pin, reset-pin, email OTP). PINs are 4 digits, so the whole
keyspace was previously walkable in seconds. One shared limiter instance
means rotating between endpoints doesn't reset the budget.
- Add TRUSTED_PROXIES config. Limits key on c.IP(), which behind a TLS
terminator is the proxy, collapsing every client into one bucket. When set,
X-Forwarded-For is honoured only from those proxies so the header can't be
spoofed to dodge the limit. Logs a warning when unset.
Transactions:
- Check the error on all 51 previously-unchecked tx.Save/Create/Delete/
Model(...).Update/Commit calls across 6 controllers. A failed write inside
a transaction was silently ignored and the request still reported success;
an unchecked Commit could fail with the caller told everything worked.
Each site now rolls back and returns a specific message.
Pagination:
- Add utils.ParsePage/Paginated, reusing the pageno/pagesize convention
GetAdminBookings already established. Default 500, hard cap 1000.
- Apply to the previously unbounded consignments, tripsheets, exceptions,
app-users and clients endpoints. Defaults are high so existing consoles
that don't paginate keep working; the cap only stops a growing table from
being loaded wholesale. total is now a real COUNT, not len(data).
- GetClients also loaded the entire auth table to join in memory; it now
fetches only the current page's rows.
Tests (first in the repo):
- Extract the hyperlocal pincode rule out of BookingPickupComplete into
isHyperlocal so it is testable, covering the short/empty pincode fallback.
- Cover calculateVolumetricWeight and the ParsePage clamping rules.
Repo hygiene:
- Tag scratch/*.go with //go:build ignore. Each declared its own main(), so
`go build ./...` failed on redeclaration; it now passes repo-wide.
- Untrack scratch/node_modules (216 files) and ignore node_modules, test
artifacts, and the `doormile` binary `go build .` emits.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
97 lines
4.5 KiB
Modula-2
97 lines
4.5 KiB
Modula-2
module doormile
|
|
|
|
go 1.25.0
|
|
|
|
require (
|
|
github.com/gofiber/fiber/v2 v2.52.10
|
|
github.com/golang-jwt/jwt/v5 v5.2.1
|
|
github.com/joho/godotenv v1.5.1
|
|
github.com/lib/pq v1.12.3
|
|
github.com/redis/go-redis/v9 v9.16.0
|
|
go.uber.org/zap v1.27.1
|
|
golang.org/x/crypto v0.51.0
|
|
gorm.io/driver/postgres v1.5.11
|
|
gorm.io/gorm v1.25.12
|
|
)
|
|
|
|
require (
|
|
cel.dev/expr v0.25.2 // indirect
|
|
cloud.google.com/go v0.123.0 // indirect
|
|
cloud.google.com/go/auth v0.20.0 // indirect
|
|
cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
|
|
cloud.google.com/go/compute/metadata v0.9.0 // indirect
|
|
cloud.google.com/go/firestore v1.22.0 // indirect
|
|
cloud.google.com/go/iam v1.11.0 // indirect
|
|
cloud.google.com/go/longrunning v1.0.0 // indirect
|
|
cloud.google.com/go/monitoring v1.29.0 // indirect
|
|
cloud.google.com/go/storage v1.62.1 // indirect
|
|
firebase.google.com/go/v4 v4.20.0 // indirect
|
|
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 // indirect
|
|
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.56.0 // indirect
|
|
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.56.0 // indirect
|
|
github.com/MicahParks/keyfunc v1.9.0 // indirect
|
|
github.com/andybalholm/brotli v1.1.0 // indirect
|
|
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
|
github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect
|
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
|
github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect
|
|
github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect
|
|
github.com/fasthttp/websocket v1.5.3 // indirect
|
|
github.com/felixge/httpsnoop v1.0.4 // indirect
|
|
github.com/go-jose/go-jose/v4 v4.1.4 // indirect
|
|
github.com/go-logr/logr v1.4.3 // indirect
|
|
github.com/go-logr/stdr v1.2.2 // indirect
|
|
github.com/gofiber/websocket/v2 v2.2.1 // indirect
|
|
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
|
|
github.com/golang/protobuf v1.5.4 // indirect
|
|
github.com/google/s2a-go v0.1.9 // indirect
|
|
github.com/google/uuid v1.6.0 // indirect
|
|
github.com/googleapis/enterprise-certificate-proxy v0.3.15 // indirect
|
|
github.com/googleapis/gax-go/v2 v2.22.0 // indirect
|
|
github.com/jackc/pgpassfile v1.0.0 // indirect
|
|
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
|
|
github.com/jackc/pgx/v5 v5.5.5 // indirect
|
|
github.com/jackc/puddle/v2 v2.2.1 // indirect
|
|
github.com/jinzhu/inflection v1.0.0 // indirect
|
|
github.com/jinzhu/now v1.1.5 // indirect
|
|
github.com/klauspost/compress v1.17.9 // indirect
|
|
github.com/mattn/go-colorable v0.1.13 // indirect
|
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
|
github.com/mattn/go-runewidth v0.0.16 // indirect
|
|
github.com/nats-io/nats.go v1.31.0 // indirect
|
|
github.com/nats-io/nkeys v0.4.5 // indirect
|
|
github.com/nats-io/nuid v1.0.1 // indirect
|
|
github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c // indirect
|
|
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect
|
|
github.com/rivo/uniseg v0.4.7 // indirect
|
|
github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee // indirect
|
|
github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect
|
|
github.com/tinylib/msgp v1.2.5 // indirect
|
|
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
|
github.com/valyala/fasthttp v1.51.0 // indirect
|
|
github.com/valyala/tcplisten v1.0.0 // indirect
|
|
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
|
|
go.opentelemetry.io/contrib/detectors/gcp v1.43.0 // indirect
|
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 // indirect
|
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 // indirect
|
|
go.opentelemetry.io/otel v1.43.0 // indirect
|
|
go.opentelemetry.io/otel/metric v1.43.0 // indirect
|
|
go.opentelemetry.io/otel/sdk v1.43.0 // indirect
|
|
go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect
|
|
go.opentelemetry.io/otel/trace v1.43.0 // indirect
|
|
go.uber.org/multierr v1.10.0 // indirect
|
|
golang.org/x/net v0.54.0 // indirect
|
|
golang.org/x/oauth2 v0.36.0 // indirect
|
|
golang.org/x/sync v0.20.0 // indirect
|
|
golang.org/x/sys v0.44.0 // indirect
|
|
golang.org/x/text v0.37.0 // indirect
|
|
golang.org/x/time v0.15.0 // indirect
|
|
google.golang.org/api v0.279.0 // indirect
|
|
google.golang.org/appengine/v2 v2.0.6 // indirect
|
|
google.golang.org/genproto v0.0.0-20260511170946-3700d4141b60 // indirect
|
|
google.golang.org/genproto/googleapis/api v0.0.0-20260511170946-3700d4141b60 // indirect
|
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20260511170946-3700d4141b60 // indirect
|
|
google.golang.org/grpc v1.81.1 // indirect
|
|
google.golang.org/protobuf v1.36.11 // indirect
|
|
)
|