Я пытаюсь реализовать контроллер многократного использования, используя наследование классов и декораторы, потому что я не могу найти хороший пакет CRUD для nest js mongodb.
Теперь моя проблема в том, что я не могу переопределить некоторые атрибуты контроллера, используя метаданные отражения. Пример кода ниже:
Многоразовый контроллер:
export class MongooseCrudController {
constructor(
public model: ModelType<{} | any>,
public crudOptions?: CrudOptionsWithModel,
) {
}
@Post()
@ApiOperation({ summary: 'Create a record' })
create(@Body() body: CrudPlaceholderDto, @Query() query: CreateUpdateQueryDto) {
const transform = get(this.crudOptions, 'routes.create.transform');
const { populate = undefined } = query;
if (transform) {
body = transform(body);
}
return this.performCreate(body, populate);
}
}
Декоратор для обновления некоторых атрибутов:
const CRUD_ROUTES = {
create: 'create',
};
const allMethods = Object.values(CRUD_ROUTES);
export const Crud = (options: CrudOptionsWithModel) => {
options = merge({}, CrudConfig.options, options);
return target => {
const controller = target.prototype;
// get define DTO at decorator
const methods = allMethods.filter(v => !!get(options, `routes.${v}`));
methods.forEach((method) => {
const types = Reflect.getMetadata(PARAMTYPES_METADATA, controller, method);
if (types) {
Reflect.decorate([
// Update Dto
Reflect.metadata(PARAMTYPES_METADATA, types.map((v: any) => {
if (get(v, 'name') === CrudPlaceholderDto.name) {
return get(options, `routes.${method}.dto`, options.model);
}
return v;
})),
...get(options, `routes.${method}.decorators`, []),
], controller, method, Object.getOwnPropertyDescriptor(controller, method));
}
});
};
};
Пример приложения выше на контроллере
@Crud({
model: Menu,
routes: {
create: { dto: MenuDto, summary: "API to create menu" },
},
})
@Controller('menus')
export class MenusController extends MongooseCrudController {
constructor(public model: MenusService,) {
super(model);
}
}
Теперь я уже достиг переопределения декоратора параметров на CrudPlaceholderDto , но мне также нужно обновить @ ApiOperation ({ summary: 'Создать запись'}) итоговое значение, чтобы иметь правильное имя на каждом контроллере, который я использовал.