code first와 schema first가 다릅니다. 여기서는 code first 부분만 설명하겠습니다.
단순히 TypeScript enum을 사용하는 것으로 enum을 만들 수 있습니다.
enum AllowedColor {
RED,
GREEN,
BLUE,
}
이 enum type을 gql schema/entity와 같이 쓰기 위해서는 다음과 같이 @nestjs/graphql에서 registerEnumType을 가져와 다음과 같이 감싸주시면 됩니다.
registerEnumType(AllowedColor, {
name: 'AllowedColor',
});
name 외에도 enum 자체에 대한 설명, valuesMap을 통해 세부 enum 속성 각각에 대한 설명, 혹은 deprecated를 붙일 수 있습니다. 다음과 같이 작성한다면
registerEnumType(AllowedColor, {
name: 'AllowedColor',
description: 'The supported colors.',
valuesMap: {
RED: {
description: 'The default color.',
},
BLUE: {
deprecationReason: 'Too blue.',
}
}
});
gql 상에서는 아래와 같이 변환됩니다.
"""The supported colors."""
enum AllowedColor {
"""The default color."""
RED
GREEN
BLUE @deprecated(reason: "Too blue.")
}
Schema first#
여튼, gql schema/entity 부분에 다음과 같이 작성함으로서 enum을 사용할 수 있습니다.
@Field(type => AllowedColor)
favoriteColor: AllowedColor;
이제 실제로 사용해보도록하겠습니다.
Enum을 registerEnumType으로 감싼 후
gql에 해당하는 @Field에는 해당 타입을 반환하고
typeORM에 해당하는 @Column은 아래 첨부한 예시처럼 UserRole을 지정하면 됩니다.
import { Field, InputType, ObjectType, registerEnumType } from '@nestjs/graphql';
import { IsString } from 'class-validator';
import { CoreEntity } from 'src/common/entities/core.entity';
import { Column, Entity } from 'typeorm';
enum UserRole {
Client,
Owner,
Delivery,
}
registerEnumType(UserRole, { name: 'UserRole' });
@InputType({ isAbstract: true })
@ObjectType()
@Entity()
export class User extends CoreEntity {
@Field(() => String) // gql
@Column() // typeorm
@IsString() // class-validatior
email: string;
@Field(() => String)
@Column()
@IsString()
password: string;
@Field(() => UserRole)
@Column({ type: 'enum', enum: UserRole })
role: UserRole;
}
Mutation을 날리는 방법은 다음과 같다. String 형태가 아니라 Enum이니까 통짜로 해당 값을 넣어주면 된다.
mutation {
createAccount(
input: { email: "test@emai.com", password: "1234", role: Client }
) {
ok
error
}
}