Skip to content

Commit e2f4998

Browse files
committed
Add full Lists API support with list-item operations
1 parent 1a4267e commit e2f4998

6 files changed

Lines changed: 515 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ nylas-python Changelog
22
======================
33
Unreleased
44
----------
5+
* Added Lists support (`Client.lists`, `/v3/lists`): list, create, find, update, and delete lists, plus `list_items`, `add_items`, and `remove_items` for `/v3/lists/{list_id}/items`, with typed request/response models in `nylas.models.lists`
56
* Added Manage Domains (`Client.domains`, `/v3/admin/domains`): list, create, find, update, delete, `get_info`, and `verify` with models in `nylas.models.domains`; optional `ServiceAccountSigner` (`nylas.handler.service_account`) for service-account headers (`X-Nylas-Kid`, `X-Nylas-Nonce`, `X-Nylas-Timestamp`, `X-Nylas-Signature`) on each `Domains` method; new `cryptography` dependency, RSA signing, and `HttpClient` `serialized_json_body` so signed payloads match the wire body
67
* Added Transactional Send: `Client.transactional_send.send()` for `POST /v3/domains/{domain_name}/messages/send`, with `TransactionalSendMessageRequest` and `TransactionalTemplate` models (JSON and multipart send behavior aligned with grant `messages.send`)
78
* Added Policies support (`Client.policies`, `/v3/policies`): list, create, find, update, and delete, with typed request/response models in `nylas.models.policies`

nylas/client.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from nylas.resources.events import Events
99
from nylas.resources.folders import Folders
1010
from nylas.resources.messages import Messages
11+
from nylas.resources.lists import Lists
1112
from nylas.resources.threads import Threads
1213
from nylas.resources.transactional_send import TransactionalSend
1314
from nylas.resources.webhooks import Webhooks
@@ -186,6 +187,16 @@ def messages(self) -> Messages:
186187
"""
187188
return Messages(self.http_client)
188189

190+
@property
191+
def lists(self) -> Lists:
192+
"""
193+
Access the Lists API.
194+
195+
Returns:
196+
The Lists API.
197+
"""
198+
return Lists(self.http_client)
199+
189200
@property
190201
def threads(self) -> Threads:
191202
"""

nylas/models/lists.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
from dataclasses import dataclass
2+
from typing import List as TypingList, Literal, Optional
3+
4+
from dataclasses_json import dataclass_json
5+
from typing_extensions import NotRequired, TypedDict
6+
7+
from nylas.models.list_query_params import ListQueryParams
8+
9+
ListType = Literal["domain", "tld", "address"]
10+
11+
12+
class ListListsQueryParams(ListQueryParams):
13+
"""Query parameters for listing lists."""
14+
15+
pass
16+
17+
18+
class ListListItemsQueryParams(ListQueryParams):
19+
"""Query parameters for listing items in a list."""
20+
21+
pass
22+
23+
24+
class CreateListRequest(TypedDict):
25+
"""Request body for creating a list."""
26+
27+
name: str
28+
type: ListType
29+
description: NotRequired[str]
30+
31+
32+
class UpdateListRequest(TypedDict, total=False):
33+
"""Request body for updating a list."""
34+
35+
name: NotRequired[str]
36+
description: NotRequired[str]
37+
38+
39+
class UpdateListItemsRequest(TypedDict):
40+
"""Request body for adding/removing list items."""
41+
42+
items: TypingList[str]
43+
44+
45+
@dataclass_json
46+
@dataclass
47+
class NylasList:
48+
"""A typed collection used in `in_list` rule conditions."""
49+
50+
id: Optional[str] = None
51+
name: Optional[str] = None
52+
description: Optional[str] = None
53+
type: Optional[str] = None
54+
items_count: Optional[int] = None
55+
application_id: Optional[str] = None
56+
organization_id: Optional[str] = None
57+
created_at: Optional[int] = None
58+
updated_at: Optional[int] = None
59+
60+
61+
@dataclass_json
62+
@dataclass
63+
class ListItem:
64+
"""A single value belonging to a Nylas list."""
65+
66+
id: Optional[str] = None
67+
list_id: Optional[str] = None
68+
value: Optional[str] = None
69+
created_at: Optional[int] = None

nylas/resources/lists.py

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
from nylas.config import RequestOverrides
2+
from nylas.handler.api_resources import (
3+
CreatableApiResource,
4+
DestroyableApiResource,
5+
FindableApiResource,
6+
ListableApiResource,
7+
UpdatableApiResource,
8+
)
9+
from nylas.models.lists import (
10+
CreateListRequest,
11+
ListItem,
12+
ListListItemsQueryParams,
13+
ListListsQueryParams,
14+
NylasList,
15+
UpdateListItemsRequest,
16+
UpdateListRequest,
17+
)
18+
from nylas.models.response import DeleteResponse, ListResponse, Response
19+
20+
21+
class Lists(
22+
ListableApiResource,
23+
FindableApiResource,
24+
CreatableApiResource,
25+
UpdatableApiResource,
26+
DestroyableApiResource,
27+
):
28+
"""Nylas Lists API."""
29+
30+
def list(
31+
self,
32+
query_params: ListListsQueryParams = None,
33+
overrides: RequestOverrides = None,
34+
) -> ListResponse[NylasList]:
35+
"""Return all lists for the application."""
36+
return super().list(
37+
path="/v3/lists",
38+
response_type=NylasList,
39+
query_params=query_params,
40+
overrides=overrides,
41+
)
42+
43+
def create(
44+
self,
45+
request_body: CreateListRequest,
46+
overrides: RequestOverrides = None,
47+
) -> Response[NylasList]:
48+
"""Create a new list."""
49+
return super().create(
50+
path="/v3/lists",
51+
request_body=request_body,
52+
response_type=NylasList,
53+
overrides=overrides,
54+
)
55+
56+
def find(self, list_id: str, overrides: RequestOverrides = None) -> Response[NylasList]:
57+
"""Return a specific list by ID."""
58+
return super().find(
59+
path=f"/v3/lists/{list_id}",
60+
response_type=NylasList,
61+
overrides=overrides,
62+
)
63+
64+
def update(
65+
self,
66+
list_id: str,
67+
request_body: UpdateListRequest,
68+
overrides: RequestOverrides = None,
69+
) -> Response[NylasList]:
70+
"""Update a list by ID."""
71+
return super().update(
72+
path=f"/v3/lists/{list_id}",
73+
response_type=NylasList,
74+
request_body=request_body,
75+
method="PUT",
76+
overrides=overrides,
77+
)
78+
79+
def destroy(self, list_id: str, overrides: RequestOverrides = None) -> DeleteResponse:
80+
"""Delete a list by ID."""
81+
return super().destroy(path=f"/v3/lists/{list_id}", overrides=overrides)
82+
83+
def list_items(
84+
self,
85+
list_id: str,
86+
query_params: ListListItemsQueryParams = None,
87+
overrides: RequestOverrides = None,
88+
) -> ListResponse[ListItem]:
89+
"""Return all items in a list."""
90+
return super().list(
91+
path=f"/v3/lists/{list_id}/items",
92+
response_type=ListItem,
93+
query_params=query_params,
94+
overrides=overrides,
95+
)
96+
97+
def add_items(
98+
self,
99+
list_id: str,
100+
request_body: UpdateListItemsRequest,
101+
overrides: RequestOverrides = None,
102+
) -> Response[NylasList]:
103+
"""Add items to a list."""
104+
return super().create(
105+
path=f"/v3/lists/{list_id}/items",
106+
request_body=request_body,
107+
response_type=NylasList,
108+
overrides=overrides,
109+
)
110+
111+
def remove_items(
112+
self,
113+
list_id: str,
114+
request_body: UpdateListItemsRequest,
115+
overrides: RequestOverrides = None,
116+
) -> Response[NylasList]:
117+
"""Remove items from a list."""
118+
json_response, headers = self._http_client._execute(
119+
"DELETE",
120+
f"/v3/lists/{list_id}/items",
121+
None,
122+
None,
123+
request_body,
124+
overrides=overrides,
125+
)
126+
return Response.from_dict(json_response, NylasList, headers)

0 commit comments

Comments
 (0)