원클릭으로
fullstack-route
Creates a typed API endpoint across shared route definition, NestJS controller, frontend service, and Query hook.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Creates a typed API endpoint across shared route definition, NestJS controller, frontend service, and Query hook.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
Extracts methods from the monolithic RoseauGateway/RoseauRepository into a dedicated gateway/repository pair within the same folder. Use this when moving domain-specific methods out of roseau.gateway into their own gateway.
Creates a full-stack paginated table page with filters, sorting, and detail view — from SQL to React — using MasaProvider.
Creates new functionalities that fetch reference data via MasaProvider instead of directly using LanceleauGateway or RoseauGateway.
Creates unit and e2e tests for NestJS applications using Jest and Supertest. Includes patterns for testing services, controllers, guards, and e2e tests with testcontainers.
Creates unit tests for React frontend components using Vitest and React Testing Library, following accessibility-first best practices.
Develops, styles, and tests DSFR-compliant React 19 components.
SOC 직업 분류 기준
| name | fullstack-route |
| description | Creates a typed API endpoint across shared route definition, NestJS controller, frontend service, and Query hook. |
Full typed API stack: route definition -> controller -> API service -> Query hook.
packages/dossier/src/routes/<domain>.routes.ts -- Shared contract
apps/back/src/<domain>/<entity>.controller.ts -- NestJS (uses route types)
apps/front/src/api/<domain>.ts -- API service (apiCall)
apps/front/src/hooks/use<Feature>.ts -- TanStack Query hook
File: packages/dossier/src/routes/<domain>.routes.ts. Re-export from packages/dossier/src/index.ts. Rebuild: npm run build --workspace=packages/dossier.
import { z } from 'zod';
import type { RouteDefinition } from './route.types';
import { MyDtoSchema } from '../myDomain/my.dto';
export const listItems = {
method: 'GET',
path: '/my-domain',
response: z.array(MyDtoSchema),
} as const satisfies RouteDefinition;
export const getItem = {
method: 'GET',
path: '/my-domain/:id',
params: z.object({ id: z.string() }),
response: MyDtoSchema,
} as const satisfies RouteDefinition;
export const createItem = {
method: 'POST',
path: '/my-domain',
body: z.object({ name: z.string() }),
response: MyDtoSchema,
} as const satisfies RouteDefinition;
RouteResponse<typeof route> (never duplicate types)@Query(new ZodValidationPipe(route['query'])) or @Body(new ZodValidationPipe(route['body']))@UseGuards(...)import type { RouteQuery, RouteResponse, RouteBody } from '@lib/dossier';
import { listItems, createItem } from '@lib/dossier';
import { ZodValidationPipe } from '@shared/schema/zodValidation.pipe';
@Controller('my-domain')
export class MyDomainController {
@Get()
async list(): Promise<RouteResponse<typeof listItems>> {
return this.myService.findAll();
}
@Post()
async create(
@Body(new ZodValidationPipe(createItem['body'])) body: RouteBody<typeof createItem>,
): Promise<RouteResponse<typeof createItem>> {
return this.myService.create(body);
}
}
File: apps/front/src/api/<domain>.ts. Import from ./apiClient.
apiCall(route, { params?, query?, body? }) -- typed JSON calls (response inferred)buildRoutePath(route, { params }) + apiDownload() -- binary downloadsapiPostFormData() -- file uploadsimport { listItems, getItem, downloadRapport } from '@lib/dossier';
import { apiCall, buildRoutePath, apiDownload } from './apiClient';
export const fetchItems = () => apiCall(listItems);
export const fetchItem = (id: string) => apiCall(getItem, { params: { id } });
export const downloadReport = (id: string) => apiDownload(buildRoutePath(downloadRapport, { params: { id } }));
File: apps/front/src/hooks/use<Feature>.ts. Wraps API service functions -- never call apiCall directly.
// Query
import { useQuery } from '@tanstack/react-query';
import { fetchItems } from '../api/myDomain';
export function useItems() {
return useQuery({ queryKey: ['items'], queryFn: fetchItems });
}
// Mutation
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { createItem } from '../api/myDomain';
export function useCreateItem() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: createItem,
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['items'] }),
});
}
For binary downloads, use useState instead of TanStack Query (see useRapportAndXmlDownload.ts for pattern).
packages/dossier/src/routes/ + re-export from index.tsnpm run build --workspace=packages/dossierapps/front/src/api/apps/front/src/hooks/npm run lint --workspace=apps/back && npm run lint --workspace=apps/frontapiGet<ManualType>('/path') for new code -- use apiCall(route)@lib/dossierapiCall directly in components -- wrap in hook or service