feat: add App API Design Studio language & component methods#240
Conversation
Batch 9 (stacked on Batch 8). Adds the second half of the design_studio
family: 5 email-translation (language) methods and 5 component methods.
Verified against the services backend (ext_api/design_studio/router.go +
designstudio/dsapi/*), not the OpenAPI spec:
- Email languages: create/get return { email_translation }; PUT/DELETE 204;
update takes no language (immutable, from path); omitted content blocks
inherit from the default-language email.
- Components: list adds a 'tag' filter to the shared node-list params;
create requires name+tag; PUT/DELETE 204; parent_folder_id tri-state.
Includes unit tests (100% coverage), live round-trip coverage, and docs.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit a703381. Configure here.
|
|
||
| return { method, uri, headers, body: form }; | ||
| } | ||
|
|
There was a problem hiding this comment.
Multipart retries reuse consumed FormData
Medium Severity
postForm is the first path that sends a FormData body through the shared handler retry loop. After a completed attempt (including retryable HTTP errors like 503), the same FormData instance is replayed, but multipart bodies are single-use streams in Node’s fetch/undici stack, so automatic retries and manual redirect replays can fail or upload an empty body instead of retrying the file.
Additional Locations (2)
Reviewed by Cursor Bugbot for commit a703381. Configure here.


Another set of the App API backfill on top of #239 which adds 5 email-translation (language) methods and 5 component methods:
listDesignStudioEmailLanguagesGET /v1/design_studio/emails/{id}/languagescreateDesignStudioEmailLanguagePOST /v1/design_studio/emails/{id}/languagesgetDesignStudioEmailLanguageGET /v1/design_studio/emails/{id}/languages/{language}updateDesignStudioEmailLanguagePUT …/languages/{language}(204)deleteDesignStudioEmailLanguageDELETE …/languages/{language}(204)listDesignStudioComponentsGET /v1/design_studio/componentscreateDesignStudioComponentPOST /v1/design_studio/componentsgetDesignStudioComponentGET /v1/design_studio/components/{id}updateDesignStudioComponentPUT /v1/design_studio/components/{id}(204)deleteDesignStudioComponentDELETE /v1/design_studio/components/{id}(204)Assisted by AI 🤖
Note
Medium Risk
Large additive API surface plus shared HTTP transport changes for multipart; behavior is well-tested but affects all clients using
Requestbody typing.Overview
Extends the App API client with Design Studio email translations (list/create/get/update/delete per language), reusable components (full CRUD plus list with optional
tagfilter), and a new Assets surface for files and folders (list/upload/get/update/delete).Assets uploads go through new
Request.postForm/formOptionsmultipart handling sofetchcan set the boundary;createAssetbuildsFormDataand derives MIME types from filename (or explicit/Blobtype) so uploads are not sent asapplication/octet-stream. Typed inputs and matching docs (docs/app.md), unit tests, and live integration round-trips are included.Reviewed by Cursor Bugbot for commit a703381. Bugbot is set up for automated code reviews on this repo. Configure here.