Products were inserted with empty tenant_id because ExtractTenantId was
called after the Insert; moved extraction before the struct so rows are
stored with the correct tenant and appear in list queries.
Regenerated purchase.pb.go and purchase_grpc.pb.go from purchase.proto
using protoc-gen-go v1.36.11; the previous hand-written stubs lacked the
proto.Message interface, causing all purchase gRPC calls to fail with a
marshal error.