Переопределить атрибут Swagger в многоразовом контроллере - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь реализовать контроллер многократного использования, используя наследование классов и декораторы, потому что я не могу найти хороший пакет 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: 'Создать запись'}) итоговое значение, чтобы иметь правильное имя на каждом контроллере, который я использовал.

1 Ответ

0 голосов
/ 25 апреля 2020

Разве вы не можете просто передать специфицированное описание c конструктору, вместо того, чтобы жестко кодировать его в классе MongooseCrudController?

...