Go · 1423 bytes Raw Blame History
1 // SPDX-License-Identifier: AGPL-3.0-or-later
2
3 package billing
4
5 // SubjectKind discriminates which side of the polymorphic billing
6 // schema a row applies to. Mirrors the `billing_subject_kind` enum
7 // from migration 0074.
8 //
9 // PRO02 Q1 ratified the hybrid table strategy: `billing_invoices`
10 // and `billing_webhook_events` carry `(subject_kind, subject_id)`;
11 // `org_billing_states` and `user_billing_states` remain
12 // kind-specific. Go callers that need to thread the kind through
13 // (webhook routing, polymorphic invoice queries) use the constants
14 // below.
15 //
16 // PRO04 builds the `Principal{Kind, ID}` abstraction on top of
17 // these; PRO03 ships the constants alone so the queries it adds in
18 // billing.sql have a typed Go binding without yet depending on
19 // PRO04's larger Principal refactor.
20 type SubjectKind string
21
22 const (
23 SubjectKindUser SubjectKind = "user"
24 SubjectKindOrg SubjectKind = "org"
25 )
26
27 // String satisfies fmt.Stringer for log fields without forcing
28 // callers to cast.
29 func (k SubjectKind) String() string { return string(k) }
30
31 // Valid reports whether the kind is one of the known enum values.
32 // Used at sqlc-binding sites to guard against zero-value bugs
33 // before they reach the database (which would surface as a clearer
34 // but later "invalid input value for enum" error).
35 func (k SubjectKind) Valid() bool {
36 switch k {
37 case SubjectKindUser, SubjectKindOrg:
38 return true
39 }
40 return false
41 }
42