NestJSでデコレーターをまとめて使い回す

f:id:cgig:20210107225703p:plain

はじめに

NestJSでコントローラーを作っていくと同じ用なデコレーターを定義することが多くなっていくことがあります

それをまとめてみました

日に日に増えていくデコレーター

@Controller('users')
@ApiTags('users')
@ApiBearerAuth()
@UseGuards(UserGuard)
@UseInterceptors(ClassSerializerInterceptor)
export class UserController {

このControllerはGuardがついてて…

とか一回立ち止まって考える時間が発生するのが嫌でした

デコレーターをまとめたデコレーターを作る

export const NullDecorator = (): ClassDecorator => () => {};

type Options = {
    path?: string;
    auth: boolean;
}

export function UserControllerDecorator(options?: Options): ClassDecorator {
    const { path, auth = false } = options ?? {};

    return applyDecorators(
        Controller(path ? `users/${path}` : 'users'),
        ApiTags('users'),
        ApiBearerAuth(),
        auth ? UseGuards(UserGuard) : NullDecorator(),
        UseInterceptors(ClassSerializerInterceptor),
    );
}

デコレーターを使う

@UserControllerDecorator()
export class UserController {}

@UserControllerDecorator({ auth: true, path: 'posts' })
export class UserPostController {}

終わりに

まとめられることを知って、まとめてみたらスッキリした気持ちになりました

まだ使いだして日が浅いので今後変更する可能性はありますが現状は上記のようにしています