AI Skill Report Card

Creating TypeScript POST Controllers

A-82·May 6, 2026·Source: Web
15 / 15
TypeScript
export 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
12 / 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
17 / 20

Example 1: No URL parameters Input: POST /api/products/, body: Product.CreateParams, returns: Product.Product

TypeScript
export 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

TypeScript
export 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

TypeScript
export 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
  • 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>
  • 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 any for 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
0
Grade A-AI Skill Framework
Scorecard
Criteria Breakdown
Quick Start
15/15
Workflow
12/15
Examples
17/20
Completeness
10/20
Format
15/15
Conciseness
13/15