AI Skill Report Card
Creating TypeScript POST Controllers
Quick Start15 / 15
TypeScriptexport const createUserController = async ( body: User.CreateUserParams, ): Promise<AxiosResponse<User.User, any>> => { const url = '/api/users/'; const instance = genRequestInstance(); try { const response = await instance.post(url, body); return response; } catch (error) { console.error('Erro na requisição:', error); return Promise.reject(error); } };
Recommendation▾
Add a templates section with boilerplate code patterns for different parameter scenarios
Workflow12 / 15
Progress:
- Define function name (verb + resource + "Controller")
- Identify URL parameters (0 or more)
- Define body type
- Define response type
- Construct URL with parameters
- Implement error handling
Recommendation▾
Include edge cases like handling optional parameters or query strings in POST requests
Examples17 / 20
Example 1: No URL parameters Input: POST /api/products/, body: Product.CreateParams, returns: Product.Product
TypeScriptexport const createProductController = async ( body: Product.CreateProductParams, ): Promise<AxiosResponse<Product.Product, any>> => { const url = '/api/products/'; const instance = genRequestInstance(); try { const response = await instance.post(url, body); return response; } catch (error) { console.error('Erro na requisição:', error); return Promise.reject(error); } };
Example 2: With URL parameters Input: POST /api/projects/{projectId}/tasks/, body: Task.CreateParams, returns: Task.Task
TypeScriptexport const createTaskController = async ( projectId: Project.Project['id'], body: Task.CreateTaskParams, ): Promise<AxiosResponse<Task.Task, any>> => { const url = `/api/projects/${projectId}/tasks/`; const instance = genRequestInstance(); try { const response = await instance.post(url, body); return response; } catch (error) { console.error('Erro na requisição:', error); return Promise.reject(error); } };
Example 3: Multiple parameters and union body type Input: POST /api/teams/{teamId}/members/{memberId}/roles/, body: Role.AssignParams | Role.UpdateParams, returns: Role.Assignment
TypeScriptexport const createMemberRoleController = async ( teamId: Team.Team['id'], memberId: Member.Member['id'], body: Role.AssignRoleParams | Role.UpdateRoleParams, ): Promise<AxiosResponse<Role.Assignment, any>> => { const url = `/api/teams/${teamId}/members/${memberId}/roles/`; const instance = genRequestInstance(); try { const response = await instance.post(url, body); return response; } catch (error) { console.error('Erro na requisição:', error); return Promise.reject(error); } };
Recommendation▾
Expand completeness with configuration options for timeout, headers, or authentication patterns
Best Practices
- Function naming: Use
create+ resource name +Controller - Parameter order: URL parameters first (in order), body last
- Type references: Use
ResourceName.ResourceType['id']for ID parameters - URL construction: Always use template literals for parameter interpolation
- Error handling: Log error and reject promise
- Return type: Always
AxiosResponse<ResponseType, any>
Common Pitfalls
- Don't mix URL parameters with body parameters in the same object
- Don't forget trailing slash in URL if the API expects it
- Don't use
anyfor body or response types - always define proper interfaces - Don't catch errors without re-throwing or rejecting
- Don't use concatenation for URLs with parameters - use template literals