Individual account approval resources (java)#74
Open
lucasmiranda-stark wants to merge 1 commit into
Open
Conversation
ff08e06 to
f44a152
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Context
The account-approval feature —
IndividualAccountRequestandIndividualAccountAttachment(each with a read-only.Log) — for the java infra SDK. Generated from contractsindividual-account-request.md(v3) andindividual-account-attachment.md(v3). Run-type: generate. Run artifacts:runs/20260528-182857-account-approval/java/.What changed
IndividualAccountRequest(create/get/query/page/update + read-only.Log) with a structuredAddresssub-resource (nested object, never flattened).IndividualAccountAttachment(create/get/query/page/cancel + read-only.Log); the constructor encodescontent+contentTypeinto adata:<contentType>;base64,…URL client-side;contentTypeis input-only.Test plan
runs/20260528-182857-account-approval/java/test-run-success.md)Risk & Rollback
Contract review (Phase 7)
Contract Review
Checklist
IndividualAccountRequest (M1–M12)
createaccepts list ofIndividualAccountRequest, returns same shape with server-assignedid,status,accountType,created,updatedpopulatedcreate(List<?>)→Rest.post)testCreate@ TestIndividualAccountRequest.java:25–42addressis a structured object (not a string) with required sub-fieldsstreet,number,neighborhood,city,state,zipCode; serialized as nested JSON, never flattenedAddress extends SubResourcewith all 6 sub-fields)testCreateWithObjectAddress@ TestIndividualAccountRequest.java:48–61get(id)returns a singleIndividualAccountRequestget(String id)→Rest.getId)testQueryGet@ TestIndividualAccountRequest.java:67–81queryreturns iterable ofIndividualAccountRequest, acceptslimit,after,before,status,tags,idsquery(Map, User)→Rest.getStream; params documented at lines 197–202)testQueryGet@ TestIndividualAccountRequest.java:67–81 ;testQueryIds@ TestIndividualAccountRequest.java:85–123pagereturnsIndividualAccountRequest.Page(items + cursor), accepts same params as query pluscursorPageinner class +page(Map, User)→Rest.getPage)testPage@ TestIndividualAccountRequest.java:127–154update(id, ...)PATCHes request; accepts any subset ofname,taxId,address,income,status,tags; replaces (not deep-merges)addressupdate(String id, Map patchData, User)→Rest.patch; full field list in Javadoc lines 422–431)testUpdate@ TestIndividualAccountRequest.java:161–175 (name patch) ;testUpdateAddress@ TestIndividualAccountRequest.java:179–201 (whole-object address replace)statusenum exactlyapproved | created | denied | processing | updated(v1success/failed/cancelednot used)public String status; no enum restriction in Java type system; contract-compliant values enforced by API)testStatusEnum@ TestIndividualAccountRequest.java:207–223 (asserts every fetched status is member of{approved, created, denied, processing, updated})IndividualAccountRequest.Logis read-only, exposed under<resource>.Log, providesget,query,page;Log.requestisIndividualAccountRequesttypeLog extends Resourcewithget,query,pagestatics;public IndividualAccountRequest requestat line 543)testLogQueryAndGet@ TestIndividualAccountRequest.java:229–248 (assertslog.request.idpopulated)Log.queryandLog.pageacceptlimit,after,before,types,accountRequestIdsLog.query(Map params)with param docs at lines 609–615); IndividualAccountRequest.java:706–709 (Log.page(Map params))testLogQueryAndGet@ TestIndividualAccountRequest.java:229–248 (usestypes);testLogQueryAccountRequestIds@ TestIndividualAccountRequest.java:252–276 (usesaccountRequestIds);testLogPage@ TestIndividualAccountRequest.java:280–307created,updated) parsed to language-native type (Java:String, matching existing SDK pattern per serialization.md:44)public String created; public String updated;)testDateTimeParsing@ TestIndividualAccountRequest.java:313–328 (asserts both fields non-null)accountType,flags,id,status,created,updatedare output-only — Map constructor sets them null and rejects them as unknown paramsstatus,accountType,flags,created,updatedto null without reading from map; unknown-param check at lines 136–138)testOutputOnlyFieldsRejectedByConstructor@ TestIndividualAccountRequest.java:337–354 (passesstatus+accountTypein map, assertsUnknown parameters used in constructor:exception)com.starkcore.error.InputErrorsis raised (code-agnostic):invalidName,invalidTaxId,invalidAddress,invalidIncome,invalidStatus,notFoundRest.post/Rest.patch/Rest.getId)testCreateInvalidName@ TestIndividualAccountRequest.java:360–376 ;testCreateInvalidTaxId@ TestIndividualAccountRequest.java:381–397 ;testCreateInvalidAddress@ TestIndividualAccountRequest.java:401–422 ;testCreateInvalidIncome@ TestIndividualAccountRequest.java:426–443 ;testUpdateInvalidStatus@ TestIndividualAccountRequest.java:447–464 ;testGetNotFound@ TestIndividualAccountRequest.java:468–479IndividualAccountAttachment (M1–M14)
createaccepts list ofIndividualAccountAttachment, returns same shape with server-assignedid,status,createdpopulatedcreate(List<?>)→Rest.post)testCreate@ TestIndividualAccountAttachment.java:28–43content(raw bytes) +contentType(MIME) intodata:<contentType>;base64,<payload>URL client-side; callers pass raw bytes, not pre-encoded data URLsbyte[] content+contentType→"data:" + contentType + ";base64," + Base64.encode(content))testConstructorEncodesDataUrl@ TestIndividualAccountAttachment.java:50–62 (asserts content starts with"data:image/png;base64,")contentTypeis input-only: consumed by constructor to build data URL, NOT serialized as its own wire field; passingcontentTypein a response-shaped Map throwscontentTypeis only consumed in thebyte[]-content branch at line 111; it is never assigned to a field; unknown-param check at lines 124–126 rejects stray keys)testContentTypeIsInputOnly@ TestIndividualAccountAttachment.java:69–91 (passescontentas String +contentType→ asserts exception mentioningcontentType)get(id)returns a singleIndividualAccountAttachmentget(String id, User)→Rest.getId)testQueryGet@ TestIndividualAccountAttachment.java:96–113queryreturns iterable ofIndividualAccountAttachment, acceptslimit,after,before,status,tags,idsquery(Map, User)→Rest.getStream)testQueryGet@ TestIndividualAccountAttachment.java:96–113 ;testQueryIds@ TestIndividualAccountAttachment.java:116–148pagereturnsIndividualAccountAttachment.Page(items + cursor), accepts same params as query pluscursorPageinner class +page(Map, User)→Rest.getPage)testPage@ TestIndividualAccountAttachment.java:152–180cancel(id)maps toDELETE, returns resource withstatus = deleted; idempotent (second cancel succeeds without error)cancel(String id, User)→Rest.delete)testCancel@ TestIndividualAccountAttachment.java:187–195 (assertsstatus == "deleted") ;testCancelIdempotent@ TestIndividualAccountAttachment.java:417–431 (second cancel assertsstatus == "deleted", no exception)IndividualAccountAttachment(notaccountRequestAttachment)public final class IndividualAccountAttachment extends Resource)testCreate@ TestIndividualAccountAttachment.java:28 (imports and usescom.starkinfra.IndividualAccountAttachment; file compiles and runs under the new identifier)IndividualAccountAttachment.Logis read-only, exposed under<resource>.Log, providesget,query,page;Log.attachmentisIndividualAccountAttachmenttypeLog extends Resourcewithget,query,pagestatics;public IndividualAccountAttachment attachmentat line 428)testLogQueryAndGet@ TestIndividualAccountAttachment.java:202–219 (assertslog.attachment.idpopulated)Log.queryandLog.pageacceptlimit,after,before,types,attachmentIds(parent-id filter namedattachmentIds, notaccountRequestIds)Log.query(Map params)with param docs listingattachmentIdsat line 497); IndividualAccountAttachment.java:591–658 (Log.page(Map, User))testLogQueryAndGet@ TestIndividualAccountAttachment.java:202–219 (usestypes);testLogQueryAttachmentIds@ TestIndividualAccountAttachment.java:223–248 (usesattachmentIds);testLogPage@ TestIndividualAccountAttachment.java:251–279typeenum exactlydrivers-license-front | drivers-license-back | identity-front | identity-back;selfienot validpublic String type;; valid values enforced at API level; noselfiein any fixture or docstring's canonical list at line 29)testTypeEnum@ TestIndividualAccountAttachment.java:285–303 (asserts every fetched type is member of 4-value set, noselfie)created) parsed to language-native type (Java:String, matching existing SDK pattern)public String created;)testDateTimeParsing@ TestIndividualAccountAttachment.java:310–323 (assertscreatednon-null)InputErrorsraised (code-agnostic):typeinvalid,contentempty,contentTypemissing,accountRequestIdnot found, unknownidRest.post); IndividualAccountAttachment.java:141–160 (get forwards viaRest.getId)testCreateInvalidType@ TestIndividualAccountAttachment.java:329–346 ;testCreateInvalidContent@ TestIndividualAccountAttachment.java:350–367 ;testCreateInvalidContentType@ TestIndividualAccountAttachment.java:372–389 ;testCreateAccountRequestNotFound@ TestIndividualAccountAttachment.java:393–411 ;testGetNotFound@ TestIndividualAccountAttachment.java:436–446AccountRequestAttachmentremoved (no dual exposure): source file deleted, legacy tests deletedgenerate; noAccountRequestAttachmentsource ever existed insdk-infra/java(grep of entiresdk-infra/java/srcreturned zero source or test files matchingAccountRequestAttachment; confirmed in scaffold-plan.md:3–7; manifest has noDELlines)Summary
If FAIL — routing recommendation
N/A — PASS.
Metadata
contracts/individual-account-request.md(v3),contracts/individual-account-attachment.md(v3)runs/20260528-182857-account-approval/java/feature/account-approvale8b8e461e8aebd81c7dd517bd322de8ba07684a2