| name | scaffold |
| description | Create a new entity with its full stack including domain, database, API, frontend, and E2E tests. |
| disable-model-invocation | true |
Domain Entity Template
export interface MyEntity {
id: string;
name: string;
userId: string;
createdAt: Date;
updatedAt: Date;
}
export interface CreateMyEntityDTO {
name: string;
userId: string;
}
export interface UpdateMyEntityDTO {
name?: string;
}
Repository Port Template
import type { MyEntity, CreateMyEntityDTO, UpdateMyEntityDTO } from '../entities/MyEntity';
export interface MyEntityRepository {
create(dto: CreateMyEntityDTO): Promise<MyEntity>;
findById(id: string): Promise<MyEntity | null>;
findByUserId(userId: string): Promise<MyEntity[]>;
update(id: string, data: UpdateMyEntityDTO): Promise<MyEntity>;
delete(id: string): Promise<void>;
}
Database Schema Template
export const myEntities = sqliteTable('my_entities', {
id: text('id').primaryKey(),
name: text('name').notNull(),
userId: text('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }),
createdAt: integer('created_at', { mode: 'timestamp_ms' }).notNull(),
updatedAt: integer('updated_at', { mode: 'timestamp_ms' }).notNull(),
});
NestJS Controller Template
@Controller('my-entities')
export class MyEntitiesController {
constructor(
@Inject(CreateMyEntity) private readonly createMyEntity: CreateMyEntity,
@Inject(ListMyEntities) private readonly listMyEntities: ListMyEntities,
) {}
@Get()
async list(@CurrentUser() user: JwtPayload) {
const items = await this.listMyEntities.execute(user.sub);
return { items };
}
@Post()
@HttpCode(HttpStatus.CREATED)
async create(
@SimpleValidatedBody(CreateMyEntityDto) dto: CreateMyEntityDto,
@CurrentUser() user: JwtPayload,
) {
const item = await this.createMyEntity.execute({ ...dto, userId: user.sub });
return { item };
}
}
Mobile Feature Template
import { api } from '@/lib/api';
export interface MyEntity { id: string; name: string; userId: string; createdAt: string; updatedAt: string; }
export const myEntityApi = {
list: () => api.get<{ items: MyEntity[] }>('/my-entities').then(r => r.items),
get: (id: string) => api.get<{ item: MyEntity }>(`/my-entities/${id}`).then(r => r.item),
create: (data: { name: string }) => api.post<{ item: MyEntity }>('/my-entities', data).then(r => r.item),
update: (id: string, data: { name?: string }) => api.patch<{ item: MyEntity }>(`/my-entities/${id}`, data).then(r => r.item),
delete: (id: string) => api.delete(`/my-entities/${id}`),
};
Checklist