Skip to content

Commit b819789

Browse files
authored
[TW-4786] feat(admin): add callback URI CRUD and fix auth config (#43)
1 parent dcb533e commit b819789

15 files changed

Lines changed: 1124 additions & 37 deletions

File tree

docs/COMMANDS.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,7 @@ nylas scheduler sessions show <session-id> # Show session details
788788

789789
## Admin (API Management)
790790

791-
Manage Nylas applications, connectors, credentials, and grants.
791+
Manage Nylas applications, callback URIs, connectors, credentials, and grants.
792792

793793
```bash
794794
# Applications
@@ -798,6 +798,13 @@ nylas admin applications create # Create application
798798
nylas admin applications update <app-id> # Update application
799799
nylas admin applications delete <app-id> # Delete application
800800

801+
# Callback URIs (OAuth redirect endpoints)
802+
nylas admin callback-uris list # List callback URIs
803+
nylas admin callback-uris show <uri-id> # Show callback URI
804+
nylas admin callback-uris create --url <url> # Create callback URI
805+
nylas admin callback-uris update <uri-id> --url <url> # Update callback URI
806+
nylas admin callback-uris delete <uri-id> # Delete callback URI
807+
801808
# Connectors (provider integrations)
802809
nylas admin connectors list # List connectors
803810
nylas admin connectors show <connector-id> # Show connector

docs/commands/admin.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,62 @@ Callback URIs (2):
6363
2. https://myapp.com/oauth/redirect
6464
```
6565

66+
### Callback URIs
67+
68+
Manage OAuth callback URIs for your Nylas application. These are the redirect endpoints used during OAuth authentication flows.
69+
70+
```bash
71+
# List callback URIs
72+
nylas admin callback-uris list
73+
nylas admin cb list # Alias
74+
nylas admin callbacks list --json # Output as JSON
75+
76+
# Show callback URI details
77+
nylas admin callback-uris show <uri-id>
78+
nylas admin cb show <uri-id> --json
79+
80+
# Create callback URI
81+
nylas admin callback-uris create --url http://localhost:9007/callback
82+
nylas admin cb create --url https://myapp.com/oauth/callback --platform web
83+
84+
# Update callback URI
85+
nylas admin callback-uris update <uri-id> --url https://myapp.com/new-callback
86+
nylas admin cb update <uri-id> --platform ios
87+
88+
# Delete callback URI
89+
nylas admin callback-uris delete <uri-id>
90+
nylas admin cb delete <uri-id> --yes # Skip confirmation
91+
```
92+
93+
**Example: List callback URIs**
94+
```bash
95+
$ nylas admin callback-uris list
96+
97+
Found 2 callback URI(s):
98+
99+
ID URL PLATFORM
100+
f454b6d7-22e4-4f22-8536-35b6c2706a5d http://localhost:8080/callback web
101+
732ae831-06e4-4fe2-91de-bd20b099ff38 http://localhost:9007/callback web
102+
```
103+
104+
**Example: Create callback URI**
105+
```bash
106+
$ nylas admin cb create --url http://localhost:9007/callback
107+
108+
✓ Created callback URI
109+
ID: 732ae831-06e4-4fe2-91de-bd20b099ff38
110+
URL: http://localhost:9007/callback
111+
Platform: web
112+
```
113+
114+
**Flags:**
115+
- `--url` - Callback URL (required for create)
116+
- `--platform` - Platform type: `web`, `ios`, `android` (default: `web`)
117+
- `--yes`, `-y` - Skip delete confirmation
118+
- `--json` - Output as JSON
119+
120+
> **Note:** `nylas auth config` automatically creates a callback URI (`http://localhost:<port>/callback`) during initial setup. Use these commands to manage additional URIs or troubleshoot OAuth issues.
121+
66122
### Connectors
67123

68124
Manage email provider connectors (Google, Microsoft, IMAP, etc.).

internal/adapters/nylas/admin.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,94 @@ func (c *HTTPClient) DeleteApplication(ctx context.Context, appID string) error
127127
return c.doDelete(ctx, queryURL)
128128
}
129129

130+
// Callback URI Operations
131+
132+
// ListCallbackURIs retrieves all callback URIs for the application.
133+
func (c *HTTPClient) ListCallbackURIs(ctx context.Context) ([]domain.CallbackURI, error) {
134+
queryURL := fmt.Sprintf("%s/v3/applications/callback-uris", c.baseURL)
135+
136+
var result struct {
137+
Data []domain.CallbackURI `json:"data"`
138+
}
139+
if err := c.doGet(ctx, queryURL, &result); err != nil {
140+
return nil, err
141+
}
142+
return result.Data, nil
143+
}
144+
145+
// GetCallbackURI retrieves a specific callback URI.
146+
func (c *HTTPClient) GetCallbackURI(ctx context.Context, uriID string) (*domain.CallbackURI, error) {
147+
if err := validateRequired("callback URI ID", uriID); err != nil {
148+
return nil, err
149+
}
150+
151+
queryURL := fmt.Sprintf("%s/v3/applications/callback-uris/%s", c.baseURL, uriID)
152+
153+
var result struct {
154+
Data domain.CallbackURI `json:"data"`
155+
}
156+
if err := c.doGetWithNotFound(ctx, queryURL, &result, domain.ErrCallbackURINotFound); err != nil {
157+
return nil, err
158+
}
159+
return &result.Data, nil
160+
}
161+
162+
// CreateCallbackURI creates a new callback URI for the application.
163+
func (c *HTTPClient) CreateCallbackURI(ctx context.Context, req *domain.CreateCallbackURIRequest) (*domain.CallbackURI, error) {
164+
if req == nil {
165+
return nil, fmt.Errorf("create callback URI request is required")
166+
}
167+
if err := validateRequired("callback URI URL", req.URL); err != nil {
168+
return nil, err
169+
}
170+
171+
queryURL := fmt.Sprintf("%s/v3/applications/callback-uris", c.baseURL)
172+
173+
resp, err := c.doJSONRequest(ctx, "POST", queryURL, req)
174+
if err != nil {
175+
return nil, err
176+
}
177+
178+
var result struct {
179+
Data domain.CallbackURI `json:"data"`
180+
}
181+
if err := c.decodeJSONResponse(resp, &result); err != nil {
182+
return nil, err
183+
}
184+
return &result.Data, nil
185+
}
186+
187+
// UpdateCallbackURI updates an existing callback URI.
188+
func (c *HTTPClient) UpdateCallbackURI(ctx context.Context, uriID string, req *domain.UpdateCallbackURIRequest) (*domain.CallbackURI, error) {
189+
if err := validateRequired("callback URI ID", uriID); err != nil {
190+
return nil, err
191+
}
192+
193+
queryURL := fmt.Sprintf("%s/v3/applications/callback-uris/%s", c.baseURL, uriID)
194+
195+
resp, err := c.doJSONRequest(ctx, "PATCH", queryURL, req)
196+
if err != nil {
197+
return nil, err
198+
}
199+
200+
var result struct {
201+
Data domain.CallbackURI `json:"data"`
202+
}
203+
if err := c.decodeJSONResponse(resp, &result); err != nil {
204+
return nil, err
205+
}
206+
return &result.Data, nil
207+
}
208+
209+
// DeleteCallbackURI deletes a callback URI.
210+
func (c *HTTPClient) DeleteCallbackURI(ctx context.Context, uriID string) error {
211+
if err := validateRequired("callback URI ID", uriID); err != nil {
212+
return err
213+
}
214+
queryURL := fmt.Sprintf("%s/v3/applications/callback-uris/%s", c.baseURL, uriID)
215+
return c.doDelete(ctx, queryURL)
216+
}
217+
130218
// Admin Connectors
131219

132220
// ListConnectors retrieves all connectors.

0 commit comments

Comments
 (0)