AI Skill Report Card
Generated Skill
TypeScript API Controller Implementation
Quick Start
TypeScriptexport 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
Workflow
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
TypeScriptexport const getResourceController = async ( // Path parameters resourceId: Resource.Id, // Query parameters qsParams: Resource.QueryStringParams, ): Promise<AxiosResponse<ResponseType, any>> => {
Step 2: Build URL
TypeScriptconst qs = getQueryStringFromRecord(qsParams); const url = `/api/resource/${resourceId}?${qs}`;
Step 3: Execute Request
TypeScriptconst 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
Examples
Example 1: Simple Resource Controller Input: Users list with pagination
TypeScriptexport 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
TypeScriptexport 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
TypeScriptexport 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); } };
Best Practices
- Use descriptive function names: Include the resource and action (
getUsersController, notgetController) - 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
Common Pitfalls
- 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}Controllerpattern - No validation: Consider validating query parameters before sending request
- Memory leaks: Don't store axios instances in global scope without cleanup