Skip to content

docs(openapi): pin Customer schema field lengths to match the validators#270

Merged
CryptoJones merged 1 commit into
masterfrom
docs/openapi-customer-component-state-length
May 19, 2026
Merged

docs(openapi): pin Customer schema field lengths to match the validators#270
CryptoJones merged 1 commit into
masterfrom
docs/openapi-customer-component-state-length

Conversation

@CryptoJones
Copy link
Copy Markdown
Owner

Summary

The OpenAPI Customer component schema declared every string field as a bare type: 'string' with no length constraint. The actual zod validators in customer.schema.js have concrete max lengths — and as of #265 a fixed .length(2) on custState.

SDK generators (openapi-typescript et al.) consume the OpenAPI spec, so without these constraints client-side types miss the real bounds and a SDK-driven 400 surprises the caller.

What changed

Test plan

  • npm run lint && npm test — 760 passing
  • Pure spec metadata; no behavior change.

Proudly Made in Nebraska. Go Big Red! 🌽 https://xkcd.com/2347/

The OpenAPI \`Customer\` component declared every string field as a
bare \`type: 'string'\` with no length constraint. The actual zod
validators in customer.schema.js have concrete max lengths (and a
fixed \`.length(2)\` on custState per #265). SDK generators
(openapi-typescript et al.) consume the OpenAPI spec, so without
these constraints client-side types miss the real bounds and a
SDK-driven 400 surprises the caller.

What changed:
  - custState: type 'string' with min/maxLength: 2 (per #265 fix)
  - custZip / custPhone / custEmail: explicit maxLength matching
    the zod schema (32 / 64 / 255)
  - custCompanyName / FName / LName / Address1/2 / City: maxLength
    255 each

No behavior change — runtime still validates via the same zod
schema; this just brings the published contract into agreement
with reality. 760 tests still pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@CryptoJones CryptoJones merged commit 6c79b6d into master May 19, 2026
3 checks passed
@CryptoJones CryptoJones deleted the docs/openapi-customer-component-state-length branch May 19, 2026 14:21
CryptoJones added a commit that referenced this pull request May 19, 2026
…rs (#272)

Mirror of the customer fix in #270. The OpenAPI Company component
schema had compState with maxLength: 2 already, but the other
fields were unbounded — even though company.schema.js validates
them with concrete .min/.max constraints (and the DB columns
underneath cap compPhone at varchar(32)).

Aligned every string field with the runtime contract:
  - compName: minLength: 1, maxLength: 255  (per zod min(1).max(255))
  - compAddress1/2 / compCity / compEmail:  maxLength: 255
  - compState:                              minLength: 2, maxLength: 2
  - compZip / compPhone:                    maxLength: 32

SDK generators (openapi-typescript et al.) now carry the bounds
into client types. No behavior change. 760 tests still pass.

Co-authored-by: Aaron K. Clark <akclark@thenetwerk.net>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
CryptoJones added a commit that referenced this pull request May 19, 2026
#276)

Same pattern as the customer fix (#270) and company fix (#272).

\`worker.schema.js\` validates workerFName / workerLName / workerTitle
each as \`z.string().min(1).max(255)\`. The OpenAPI Worker component
had them as bare \`type: 'string'\` with no bounds; SDK generators
(openapi-typescript et al.) couldn't surface the constraint, so
clients generated from the spec missed the minimum-1-char floor and
the 255-char ceiling.

Set \`minLength: 1, maxLength: 255\` on each name field. No
behavior change. 760 tests still pass.

Co-authored-by: Aaron K. Clark <akclark@thenetwerk.net>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
CryptoJones added a commit that referenced this pull request May 19, 2026
…ts (#290)

Extends the field-length / numeric-bound pinning sweep started in
#270 (Customer), #272 (Company), and #276 (Worker) to the two
remaining single-table entity components.

  BillingType:
    - btName: minLength: 1, maxLength: 255  (per zod min(1).max(255))
    - btHourlyRate: minimum: 0              (per zod nonnegative())
  InventoryItem:
    - invitDescription: minLength: 1, maxLength: 1000
                                            (per zod min(1).max(1000))

\`finite\` is implicit in OpenAPI's number type per the spec (no
NaN / Infinity in JSON), so no extra annotation is needed there.

SDK generators now carry the bounds into client-side types for
these two entities, matching the rest of the spec. No behavior
change. 760 tests still pass.

Co-authored-by: Aaron K. Clark <akclark@thenetwerk.net>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant