AI Skill Report Card
Generating 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 template section with clear placeholders for quick copy-paste generation
Workflow12 / 15
Case 1: No URL parameters
- Function takes only body parameter
- URL is static string
- Apply standard error handling pattern
Case 2: With URL parameters
- URL parameters come first as separate arguments
- Body parameter comes last
- Build URL with template literals using parameters
- Apply standard error handling pattern
Progress:
- Determine if URL has parameters
- Define function signature with proper parameter order
- Add JSDoc documentation
- Implement try-catch with console.error and Promise.reject
- Generate basic unit tests
Recommendation▾
Include parameter extraction rules (how to derive function names and types from API specs)
Examples20 / 20
Example 1: No URL parameters
Input: Function name createArea, namespace Planejamento.Cadastro.Area
Output:
TypeScript/** * Creates a new area * @param body - Area creation parameters * @returns Promise with area data * @throws Error when request fails */ export const createAreaController = async ( body: Planejamento.Cadastro.Area.CreateAreaParams, ): Promise<AxiosResponse<Planejamento.Cadastro.Area.Area, any>> => { const url = '/api/planejamento/area/'; 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: Function name createColaboradorVaga, parameter versao, namespace Pessoal.Colaborador.Vaga
Output:
TypeScript/** * Creates a new colaborador vaga for a specific version * @param versao - Version ID * @param body - Colaborador vaga creation parameters * @returns Promise with colaborador vaga data * @throws Error when request fails */ export const createColaboradorVagaController = async ( versao: Planejamento.Versao.Versao['id'], body: Pessoal.Colaborador.Vaga.CreateColaboradorVagaParams, ): Promise<AxiosResponse<any, any>> => { const url = `/api/pessoal/versao/${versao}/colaborador-vaga/`; 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 error handling variations (different error types, status code handling) rather than just generic catch-all
Best Practices
- Always use
genRequestInstance()for consistent request configuration - URL should end with
/for POST endpoints - Use template literals for URLs with parameters
- Return type should be
AxiosResponse<ResponseType, any> - Body parameter type should follow pattern
Namespace.CreateEntityParams - Function names should end with
Controller - Use Portuguese error messages: "Erro na requisição:"
Common Pitfalls
- Don't use
async/awaitwithout try-catch - Don't return raw error objects - always use
Promise.reject(error) - Don't forget trailing slash in URLs
- Don't mix parameter order - URL params always come before body
- Don't skip JSDoc documentation
- Don't use generic types for body parameters
Unit Test Template
TypeScriptdescribe('createEntityController', () => { it('should create entity successfully', async () => { const mockBody = { name: 'Test' }; const mockResponse = { data: { id: 1, name: 'Test' } }; jest.spyOn(axios, 'post').mockResolvedValue(mockResponse); const result = await createEntityController(mockBody); expect(result).toEqual(mockResponse); expect(axios.post).toHaveBeenCalledWith('/api/entity/', mockBody); }); it('should handle errors properly', async () => { const mockError = new Error('Network error'); jest.spyOn(axios, 'post').mockRejectedValue(mockError); await expect(createEntityController({})).rejects.toThrow('Network error'); }); });