AI Skill Report Card

Generated Skill

B-70·May 6, 2026·Source: Web

TypeScript API Controller Implementation

TypeScript
export const getResourceController = async ( id: string, qsParams: ResourceQueryParams, ): Promise<AxiosResponse<App.Pagination<Resource>, any>> => { const qs = getQueryStringFromRecord(qsParams); const url = `/api/resource/${id}?${qs}`; const instance = genRequestInstance(); try { const response = await instance.get(url); return response; } catch (error) { console.error('Erro na requisição:', error); return Promise.reject(error); } };
Recommendation
Consider adding more specific examples

Progress:

  • Define function signature with proper TypeScript types
  • Extract query string parameters
  • Construct URL with path parameters and query string
  • Create HTTP client instance
  • Execute GET request with error handling
  • Return typed response

Step 1: Define Function Signature

TypeScript
export const getResourceController = async ( // Path parameters resourceId: Resource.Id, // Query parameters qsParams: Resource.QueryStringParams, ): Promise<AxiosResponse<ResponseType, any>> => {

Step 2: Build URL

TypeScript
const qs = getQueryStringFromRecord(qsParams); const url = `/api/resource/${resourceId}?${qs}`;

Step 3: Execute Request

TypeScript
const instance = genRequestInstance(); try { const response = await instance.get(url); return response; } catch (error) { console.error('Erro na requisição:', error); return Promise.reject(error); }
Recommendation
Include edge cases

Example 1: Simple Resource Controller Input: Users list with pagination

TypeScript
export const getUsersController = async ( qsParams: User.QueryStringParams, ): Promise<AxiosResponse<App.Pagination<User.User>, any>> => { const qs = getQueryStringFromRecord(qsParams); const url = `/api/users?${qs}`; const instance = genRequestInstance(); try { const response = await instance.get(url); return response; } catch (error) { console.error('Erro na requisição:', error); return Promise.reject(error); } };

Example 2: Nested Resource Controller Input: Orders for specific customer

TypeScript
export const getCustomerOrdersController = async ( customerId: Customer.Id, qsParams: Order.QueryStringParams, ): Promise<AxiosResponse<App.Pagination<Order.Order>, any>> => { const qs = getQueryStringFromRecord(qsParams); const url = `/api/customers/${customerId}/orders?${qs}`; const instance = genRequestInstance(); try { const response = await instance.get(url); return response; } catch (error) { console.error('Erro na requisição:', error); return Promise.reject(error); } };

Example 3: Multiple Path Parameters Input: Product variants for specific category and brand

TypeScript
export const getProductVariantsController = async ( categoryId: Category.Id, brandId: Brand.Id, qsParams: Product.VariantQueryParams, ): Promise<AxiosResponse<App.Pagination<Product.Variant>, any>> => { const qs = getQueryStringFromRecord(qsParams); const url = `/api/categories/${categoryId}/brands/${brandId}/variants?${qs}`; const instance = genRequestInstance(); try { const response = await instance.get(url); return response; } catch (error) { console.error('Erro na requisição:', error); return Promise.reject(error); } };
  • Use descriptive function names: Include the resource and action (getUsersController, not getController)
  • Type everything: Path parameters, query parameters, and response types
  • Follow URL structure: /api/{resource}/{id}/{subresource}
  • Consistent error handling: Log error and reject promise
  • Use const assertions: For URL building to prevent mutations
  • Export const functions: Better for tree-shaking than default exports
  • Missing type definitions: Always define interfaces for query params and response types
  • Hardcoded URLs: Use constants or environment variables for base URLs
  • Swallowing errors: Don't catch errors without re-throwing or proper handling
  • Missing await: Controllers are async, ensure proper await usage
  • Inconsistent naming: Stick to {action}{Resource}Controller pattern
  • No validation: Consider validating query parameters before sending request
  • Memory leaks: Don't store axios instances in global scope without cleanup
0
Grade B-AI Skill Framework
Scorecard
Criteria Breakdown
Quick Start
11/15
Workflow
11/15
Examples
15/20
Completeness
15/20
Format
11/15
Conciseness
11/15