Skip to main content

9 posts tagged with "minor"

View All Tags

v0.11.0

路 5 min read

@InjectQueryService#

In v0.11.x an new decorator was added @InjectQueryService, this decorator replaces the ORM specific decorators:

  • @InjectTypeOrmQueryService
  • @InjectSequelizeQueryService

To migrate replace all @InjectTypeOrmQueryService and @InjectSequelizeQueryService with @InjectQueryService.

note

You still need to import the NestjsQueryTypeOrmModule or NestjsQuerySequelizeModule to use @InjectQueryService.

import { QueryService, InjectQueryService } from '@nestjs-query/core';import { CRUDResolver } from '@nestjs-query/query-graphql';import { Resolver } from '@nestjs/graphql';import { TodoItemDTO } from './dto/todo-item.dto';import { TodoItemEntity } from './todo-item.entity';
@Resolver(() => TodoItemDTO)export class TodoItemResolver extends CRUDResolver(TodoItemDTO) {  constructor(@InjectQueryService(TodoItemEntity) readonly service: QueryService<TodoItemEntity>) {    super(service);  }}

Relation Decorators#

In v0.11.x two new decorators were introduced from the @nestjs-query/query-graphql package. The @Relation and @Connection allow specifying relations on the DTO rather than passing them in as options to the CRUDResolver.

@Relation#

The @Relation decorator allow specifying a single relation (e.g. one-to-one, many-to-one).

In this example we add a relation for a todoItem.

import { FilterableField, Relation } from '@nestjs-query/query-graphql';import { ObjectType, ID, GraphQLISODateTime } from '@nestjs/graphql';import { TodoItemDTO } from '../todo-item/todo-item.dto.ts';
@ObjectType('SubTask')@Relation('todoItem', () => TodoItemDTO, { disableRemove: true })export class SubTaskDTO {  @FilterableField(() => ID)  id!: string;
  @FilterableField()  title!: string;
  @FilterableField()  completed!: boolean;
  @FilterableField(() => GraphQLISODateTime)  created!: Date;
  @FilterableField(() => GraphQLISODateTime)  updated!: Date;
  @FilterableField()  todoItemId!: string;}

@Connection#

The @Connection decorator allow specifying a connection relation (e.g. many-to-many, one-to-many).

In this example we add a connection for subTasks.

import { FilterableField, Connection } from '@nestjs-query/query-graphql';import { ObjectType, ID, GraphQLISODateTime } from '@nestjs/graphql';import { SubTaskDTO } from '../sub-task/sub-task.dto'
@ObjectType('TodoItem')@Connection('subTasks', () => SubTaskDTO, { disableRemove: true })export class TodoItemDTO {  @FilterableField(() => ID)  id!: string;
  @FilterableField()  title!: string;
  @FilterableField()  completed!: boolean;
  @FilterableField(() => GraphQLISODateTime)  created!: Date;
  @FilterableField(() => GraphQLISODateTime)  updated!: Date;}

Auto Generated Resolvers#

In v0.11.x the @nestjs-query/query-graph package is now able to automatically create your resolvers.

To start using this feature update your module to import the NestjsQueryGraphQLModule

note

When used with the new relation decorators, you can remove a lot of boiler plate.

todo-item.module.ts
import { NestjsQueryGraphQLModule } from '@nestjs-query/query-graphql';import { NestjsQueryTypeOrmModule } from '@nestjs-query/query-typeorm';import { Module } from '@nestjs/common';import { TodoItemDTO } from './todo-item.dto';import { TodoItemEntity } from './todo-item.entity';
@Module({  imports: [    NestjsQueryGraphQLModule.forFeature({      imports: [NestjsQueryTypeOrmModule.forFeature([TodoItemEntity])],      resolvers: [{ DTOClass: TodoItemDTO, EntityClass: TodoItemEntity }],    }),  ],})export class TodoItemModule {}

Once you have updated your module you can remove the old resolver.

note

Be sure to add the NestjsQueryTypeOrmModule or NestjsQuerySequelizeModule to the imports in NestjsQueryGraphQLModule.

To read more about the auto-generated resolvers check out the resolvers docs

Example#

Previously#

todo-item.resolver.ts
import { QueryService, InjectQueryService } from '@nestjs-query/core';import { CRUDResolver } from '@nestjs-query/query-graphql';import { Resolver } from '@nestjs/graphql';import { TodoItemInputDTO } from './todo-item.input';import { TodoItemDTO } from './todo-item.dto';import { TodoItemEntity } from './todo-item.entity';
@Resolver()export class TodoItemResolver extends CRUDResolver(TodoItemDTO) {  constructor(      @InjectQueryService(TodoItemEntity) readonly service: QueryService<TodoItemEntity>  ) {    super(service);  }}
todo-item.module.ts
import { NestjsQueryTypeOrmModule } from '@nestjs-query/query-typeorm';import { Module } from '@nestjs/common';import { TodoItemEntity } from './todo-item.entity';import { TodoItemResolver } from './todo-item.resolver';
@Module({  providers: [TodoItemResolver],  imports: [NestjsQueryTypeOrmModule.forFeature([TodoItemEntity])],})export class TodoItemModule {}

New#

todo-item.module.ts
import { NestjsQueryGraphQLModule } from '@nestjs-query/query-graphql';import { NestjsQueryTypeOrmModule } from '@nestjs-query/query-typeorm';import { Module } from '@nestjs/common';import { TodoItemDTO } from './todo-item.dto';import { TodoItemEntity } from './todo-item.entity';
@Module({  imports: [    NestjsQueryGraphQLModule.forFeature({      imports: [NestjsQueryTypeOrmModule.forFeature([TodoItemEntity])],      resolvers: [{ DTOClass: TodoItemDTO, EntityClass: TodoItemEntity }],    }),  ],})export class TodoItemModule {}

v0.6.0

路 One min read
  • [FIXED] Get Underlying Entity Object #41
    • Changed TypeOrmQueryService to operate on the Entity
    • Added new AssemblerQueryService to translate between the DTO and Entity
  • [ADDED] New InjectTypeOrmQueryService decorator to auto-create a TypeOrm query service.

See the migration guide for a more in-depth review of the changes.

v0.4.0

路 One min read
  • Updated all mutations to take a single input argument with custom fields.
    • createOne(input: DTO) -> createOne(input: { [dtoName]: DTO })
    • createMany(input: DTO[]) -> createOne(input: { [pluralDTOName]: DTO[] })
    • updateOne(id: ID, input: UpdateDTO) -> createOne(input: { id: ID, update: UpdateDTO })
    • updateMany(filter: Filter<DTO>, input: UpdateDTO) -> createOne(input: { filter: Filter<DTO>, update: UpdateDTO })
    • deleteOne(input: ID) -> deleteOne(input: {id: ID})
    • deleteMany(input: Filter<DTO>) -> createOne(input: { filter: Filter<DTO> })
  • Updated docs to reflect changes.