Skip to content

Commit e053773

Browse files
author
Mack
committed
feat: add ForwardingRequest, Secret, Team, ManagedAccount resources + ManualConnect
Critical SDK sync — 4 entirely missing resources and 1 missing sub-resource: - ForwardingRequest: POST /forwarding_requests, GET /forwarding_requests/{id} - Secret: Full CRUD (/secrets) - Team: Retrieve, create, encryption key, MLE public keys - ManagedAccount: List, retrieve, transactions - Entity ManualConnect: sub-resource for manual account linking All resources wired into the Method client.
1 parent 8ef0c7d commit e053773

11 files changed

Lines changed: 331 additions & 0 deletions

File tree

method/method.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
from method.resources.Events import EventResource
1313
from method.resources.CardProduct import CardProductResource
1414
from method.resources.Opal import OpalResource
15+
from method.resources.ForwardingRequests import ForwardingRequestResource
16+
from method.resources.Secrets import SecretResource
17+
from method.resources.Teams import TeamResource
18+
from method.resources.ManagedAccounts import ManagedAccountResource
1519

1620
class Method:
1721
accounts: AccountResource
@@ -26,6 +30,10 @@ class Method:
2630
simulate: SimulateResource
2731
card_products: CardProductResource
2832
opal: OpalResource
33+
forwarding_requests: ForwardingRequestResource
34+
secrets: SecretResource
35+
teams: TeamResource
36+
managed_accounts: ManagedAccountResource
2937

3038
def __init__(self, opts: ConfigurationOpts = None, **kwargs: ConfigurationOpts):
3139
_opts: ConfigurationOpts = {**(opts or {}), **kwargs} # type: ignore
@@ -43,6 +51,10 @@ def __init__(self, opts: ConfigurationOpts = None, **kwargs: ConfigurationOpts):
4351
self.simulate = SimulateResource(config)
4452
self.card_products = CardProductResource(config)
4553
self.opal = OpalResource(config)
54+
self.forwarding_requests = ForwardingRequestResource(config)
55+
self.secrets = SecretResource(config)
56+
self.teams = TeamResource(config)
57+
self.managed_accounts = ManagedAccountResource(config)
4658

4759
def ping(self) -> MethodResponse[PingResponse]:
4860
return self.healthcheck.retrieve()

method/resources/Entities/Entity.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from method.resources.Entities.Sensitive import EntitySensitiveResource
1515
from method.resources.Entities.Subscriptions import EntitySubscriptionsResource
1616
from method.resources.Entities.VerificationSessions import EntityVerificationSessionResource
17+
from method.resources.Entities.ManualConnect import EntityManualConnectResource
1718

1819

1920
class EntityCreateOpts(TypedDict):
@@ -116,6 +117,7 @@ class EntitySubResources:
116117
sensitive: EntitySensitiveResource
117118
subscriptions: EntitySubscriptionsResource
118119
verification_sessions: EntityVerificationSessionResource
120+
manual_connect: EntityManualConnectResource
119121

120122
def __init__(self, _id: str, config: Configuration):
121123
self.attributes = EntityAttributesResource(config.add_path(_id))
@@ -127,6 +129,7 @@ def __init__(self, _id: str, config: Configuration):
127129
self.sensitive = EntitySensitiveResource(config.add_path(_id))
128130
self.subscriptions = EntitySubscriptionsResource(config.add_path(_id))
129131
self.verification_sessions = EntityVerificationSessionResource(config.add_path(_id))
132+
self.manual_connect = EntityManualConnectResource(config.add_path(_id))
130133

131134

132135
class EntityResource(Resource):
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
from typing import TypedDict, Optional, List, Literal
2+
3+
from method.resource import MethodResponse, Resource, RequestOpts
4+
from method.configuration import Configuration
5+
6+
7+
class ManualConnectNarrativeCode(TypedDict):
8+
code: Optional[str]
9+
description: Optional[str]
10+
11+
12+
class ManualConnectTradeline(TypedDict):
13+
type_code: Optional[str]
14+
portfolio_type_code: Optional[str]
15+
designator_code: Optional[str]
16+
number: Optional[str]
17+
creditor_name: Optional[str]
18+
creditor_code: Optional[str]
19+
balance: Optional[int]
20+
highest_balance: Optional[int]
21+
credit_limit: Optional[int]
22+
term: Optional[int]
23+
next_payment_minimum_amount: Optional[int]
24+
last_payment_amount: Optional[int]
25+
payment_history: Optional[List[str]]
26+
past_due_amount: Optional[int]
27+
delinquency_charge_off_amount: Optional[int]
28+
opened_at: Optional[str]
29+
closed_at: Optional[str]
30+
last_activity_date: Optional[str]
31+
reported_date: Optional[str]
32+
next_payment_due_date: Optional[str]
33+
last_payment_date: Optional[str]
34+
delinquency_first_start_date: Optional[str]
35+
narrative_codes: Optional[List[ManualConnectNarrativeCode]]
36+
external_id: Optional[str]
37+
38+
39+
ManualConnectBureauLiterals = Literal['equifax', 'transunion']
40+
41+
42+
class ManualConnectCreateOpts(TypedDict):
43+
bureau: ManualConnectBureauLiterals
44+
tradelines: List[ManualConnectTradeline]
45+
46+
47+
class EntityManualConnectResource(Resource):
48+
def __init__(self, config: Configuration):
49+
super(EntityManualConnectResource, self).__init__(config.add_path('manual_connect'))
50+
51+
def retrieve(self, _id: str) -> MethodResponse:
52+
return super(EntityManualConnectResource, self)._get_with_id(_id)
53+
54+
def create(self, opts: ManualConnectCreateOpts, request_opts: Optional[RequestOpts] = None) -> MethodResponse:
55+
return super(EntityManualConnectResource, self)._create(opts, request_opts=request_opts)
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
from typing import TypedDict, Optional, List, Dict, Any, Literal
2+
3+
from method.resource import MethodResponse, Resource, RequestOpts
4+
from method.configuration import Configuration
5+
6+
7+
ForwardingRequestStatusesLiterals = Literal[
8+
'completed',
9+
'failed'
10+
]
11+
12+
13+
ForwardingRequestMethodsLiterals = Literal[
14+
'GET',
15+
'POST',
16+
'PUT',
17+
'PATCH',
18+
'DELETE'
19+
]
20+
21+
22+
class ForwardingRequestDetail(TypedDict):
23+
url: str
24+
method: ForwardingRequestMethodsLiterals
25+
headers: Dict[str, str]
26+
body: str
27+
28+
29+
class ForwardingResponseDetail(TypedDict):
30+
status_code: Optional[int]
31+
headers: Dict[str, str]
32+
body: Optional[Any]
33+
34+
35+
class ForwardingRequestStatusHistory(TypedDict):
36+
status: str
37+
message: Optional[str]
38+
39+
40+
class ForwardingRequest(TypedDict):
41+
id: str
42+
bindings: Dict[str, str]
43+
request: ForwardingRequestDetail
44+
response: ForwardingResponseDetail
45+
duration_ms: int
46+
status: ForwardingRequestStatusesLiterals
47+
status_history: List[ForwardingRequestStatusHistory]
48+
created_at: str
49+
50+
51+
class ForwardingRequestCreateOpts(TypedDict):
52+
url: str
53+
method: ForwardingRequestMethodsLiterals
54+
headers: Dict[str, str]
55+
body: str
56+
bindings: Dict[str, str]
57+
metadata: Optional[Dict[str, Any]]
58+
59+
60+
class ForwardingRequestResource(Resource):
61+
def __init__(self, config: Configuration):
62+
super(ForwardingRequestResource, self).__init__(config.add_path('forwarding_requests'))
63+
64+
def retrieve(self, _id: str) -> MethodResponse[ForwardingRequest]:
65+
return super(ForwardingRequestResource, self)._get_with_id(_id)
66+
67+
def create(self, opts: ForwardingRequestCreateOpts, request_opts: Optional[RequestOpts] = None) -> MethodResponse[ForwardingRequest]:
68+
return super(ForwardingRequestResource, self)._create(opts, request_opts=request_opts)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from method.resources.ForwardingRequests.ForwardingRequest import ForwardingRequest, ForwardingRequestResource
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
from typing import TypedDict, Optional, List
2+
3+
from method.resource import MethodResponse, Resource, ResourceListOpts
4+
from method.configuration import Configuration
5+
6+
7+
class ManagedAccountTransaction(TypedDict):
8+
id: str
9+
managed_account_id: str
10+
amount: int
11+
type: str
12+
status: str
13+
description: Optional[str]
14+
created_at: str
15+
updated_at: str
16+
17+
18+
class ManagedAccount(TypedDict):
19+
id: str
20+
type: str
21+
status: str
22+
routing_number: Optional[str]
23+
account_number: Optional[str]
24+
balance: Optional[int]
25+
created_at: str
26+
updated_at: str
27+
28+
29+
class ManagedAccountTransactionsResource(Resource):
30+
def __init__(self, config: Configuration):
31+
super(ManagedAccountTransactionsResource, self).__init__(config.add_path('transactions'))
32+
33+
def list(self, params: Optional[ResourceListOpts] = None) -> MethodResponse[List[ManagedAccountTransaction]]:
34+
return super(ManagedAccountTransactionsResource, self)._list(params)
35+
36+
37+
class ManagedAccountSubResources:
38+
transactions: ManagedAccountTransactionsResource
39+
40+
def __init__(self, _id: str, config: Configuration):
41+
self.transactions = ManagedAccountTransactionsResource(config.add_path(_id))
42+
43+
44+
class ManagedAccountResource(Resource):
45+
def __init__(self, config: Configuration):
46+
super(ManagedAccountResource, self).__init__(config.add_path('managed_accounts'))
47+
48+
def __call__(self, _id: str) -> ManagedAccountSubResources:
49+
return ManagedAccountSubResources(_id, self.config)
50+
51+
def list(self, params: Optional[ResourceListOpts] = None) -> MethodResponse[List[ManagedAccount]]:
52+
return super(ManagedAccountResource, self)._list(params)
53+
54+
def retrieve(self, _id: str) -> MethodResponse[ManagedAccount]:
55+
return super(ManagedAccountResource, self)._get_with_id(_id)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from method.resources.ManagedAccounts.ManagedAccount import ManagedAccount, ManagedAccountResource

method/resources/Secrets/Secret.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from typing import TypedDict, Optional, List, Dict, Any, Literal
2+
3+
from method.resource import MethodResponse, Resource, RequestOpts, ResourceListOpts
4+
from method.configuration import Configuration
5+
6+
7+
SecretStatusesLiterals = Literal[
8+
'active',
9+
'deleted'
10+
]
11+
12+
13+
class Secret(TypedDict):
14+
id: str
15+
metadata: Optional[Dict[str, Any]]
16+
status: SecretStatusesLiterals
17+
created_at: str
18+
updated_at: str
19+
20+
21+
class SecretCreateOpts(TypedDict):
22+
value: str
23+
metadata: Optional[Dict[str, Any]]
24+
25+
26+
class SecretResource(Resource):
27+
def __init__(self, config: Configuration):
28+
super(SecretResource, self).__init__(config.add_path('secrets'))
29+
30+
def retrieve(self, _id: str) -> MethodResponse[Secret]:
31+
return super(SecretResource, self)._get_with_id(_id)
32+
33+
def list(self, params: Optional[ResourceListOpts] = None) -> MethodResponse[List[Secret]]:
34+
return super(SecretResource, self)._list(params)
35+
36+
def create(self, opts: SecretCreateOpts, request_opts: Optional[RequestOpts] = None) -> MethodResponse[Secret]:
37+
return super(SecretResource, self)._create(opts, request_opts=request_opts)
38+
39+
def delete(self, _id: str) -> MethodResponse[Secret]:
40+
return super(SecretResource, self)._delete(_id)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from method.resources.Secrets.Secret import Secret, SecretResource

method/resources/Teams/Team.py

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
from typing import TypedDict, Optional, List, Dict, Any, Literal
2+
3+
from method.resource import MethodResponse, Resource, RequestOpts
4+
from method.configuration import Configuration
5+
6+
7+
TeamStatusesLiterals = Literal[
8+
'active',
9+
'verified',
10+
'disabled',
11+
'pending_disablement'
12+
]
13+
14+
15+
class TeamProduct(TypedDict):
16+
type: str
17+
enabled: bool
18+
19+
20+
class TeamKey(TypedDict):
21+
id: str
22+
type: Literal['secret', 'public']
23+
deleted: bool
24+
created_at: str
25+
updated_at: str
26+
last_used_at: Optional[str]
27+
28+
29+
class Team(TypedDict):
30+
id: str
31+
parent_id: Optional[str]
32+
name: str
33+
legal_name: str
34+
logo: Optional[str]
35+
api_version: str
36+
status: TeamStatusesLiterals
37+
products: List[TeamProduct]
38+
keys: List[TeamKey]
39+
created_at: str
40+
updated_at: str
41+
42+
43+
class TeamCreateOpts(TypedDict):
44+
name: str
45+
46+
47+
class TeamEncryptionKeyOpts(TypedDict):
48+
key: str
49+
50+
51+
class MLEPublicKey(TypedDict):
52+
id: str
53+
jwk: Dict[str, Any]
54+
created_at: str
55+
updated_at: str
56+
57+
58+
class MLEPublicKeyCreateOpts(TypedDict):
59+
jwk: Dict[str, Any]
60+
61+
62+
class TeamPublicKeysResource(Resource):
63+
def __init__(self, config: Configuration):
64+
super(TeamPublicKeysResource, self).__init__(config.add_path('mle/public_keys'))
65+
66+
def list(self) -> MethodResponse[List[MLEPublicKey]]:
67+
return super(TeamPublicKeysResource, self)._list()
68+
69+
def retrieve(self, _id: str) -> MethodResponse[MLEPublicKey]:
70+
return super(TeamPublicKeysResource, self)._get_with_id(_id)
71+
72+
def create(self, opts: MLEPublicKeyCreateOpts, request_opts: Optional[RequestOpts] = None) -> MethodResponse[MLEPublicKey]:
73+
return super(TeamPublicKeysResource, self)._create(opts, request_opts=request_opts)
74+
75+
def delete(self, _id: str) -> MethodResponse[MLEPublicKey]:
76+
return super(TeamPublicKeysResource, self)._delete(_id)
77+
78+
79+
class TeamResource(Resource):
80+
public_keys: TeamPublicKeysResource
81+
82+
def __init__(self, config: Configuration):
83+
_config = config.add_path('teams')
84+
super(TeamResource, self).__init__(_config)
85+
self.public_keys = TeamPublicKeysResource(_config)
86+
87+
def retrieve(self) -> MethodResponse[Team]:
88+
return super(TeamResource, self)._get()
89+
90+
def create(self, opts: TeamCreateOpts, request_opts: Optional[RequestOpts] = None) -> MethodResponse[Team]:
91+
return super(TeamResource, self)._create(opts, request_opts=request_opts)
92+
93+
def update_encryption_key(self, opts: TeamEncryptionKeyOpts) -> MethodResponse[Team]:
94+
return super(TeamResource, self)._create_with_sub_path('default_encryption_key', opts)

0 commit comments

Comments
 (0)