NestJS GraphQL: Getting Started
What you get
Drop @relayerjs/nestjs-graphql into a NestJS project and get a complete code-first GraphQL API:
- Full CRUD - queries (list, findById, count, aggregate) and mutations (create, update, delete)
- Auto-generated types - ObjectType, WhereInput, OrderByInput, CreateInput, UpdateInput, Connection, Edge, PageInfo
- Three pagination modes - flat cursor (default), offset, or Relay-style cursor with edges
- Rich filtering - per-type operators, AND/OR/NOT combinators, relation filters (some/every/none)
- Ordering - multi-field sorting, nested relation ordering
- Aggregation - groupBy, count, sum, avg, min, max
- Selection optimization - only fetches fields the client actually requested
- Lifecycle hooks - beforeCreate, afterFind, etc.
- Typed context - extract request data and use it for row-level scoping
All type-safe, all configurable.
Installation
npm install @relayerjs/nestjs-graphql @relayerjs/core @relayerjs/drizzle @relayerjs/nestjs-commonAssumes a working NestJS GraphQL setup (@nestjs/graphql, @nestjs/apollo, graphql, graphql-scalars).
Quick start
1. Define your entity
import { createRelayerEntity } from '@relayerjs/drizzle';
import * as schema from '../schema';
export class PostEntity extends createRelayerEntity(schema, 'posts') {}Need computed fields? Extend the class:
const UserBase = createRelayerEntity(schema, 'users');
export class UserEntity extends UserBase { @UserBase.computed({ resolve: ({ table, sql }) => sql`${table.firstName} || ' ' || ${table.lastName}`, }) fullName!: string;}2. Create an entity map
export const entities = { users: UserEntity, posts: PostEntity };export type EM = typeof entities;3. Register the module
import { RelayerGraphqlModule } from '@relayerjs/nestjs-graphql';
@Module({ imports: [ RelayerGraphqlModule.forRoot({ db, schema, entities: [UserEntity, PostEntity], defaultRelationLimit: 50, }), UsersModule, PostsModule, ],})export class AppModule {}4. Create a service
@Injectable()export class UsersService extends RelayerService<UserEntity, EM> { constructor(@InjectRelayer() r: RelayerInstance<EM>) { super(r, UserEntity); }}5. Create a resolver
import { GqlResolver, RelayerResolver } from '@relayerjs/nestjs-graphql';
@GqlResolver(UserEntity, { name: 'User' })export class UsersResolver extends RelayerResolver<UserEntity, EM> { constructor(usersService: UsersService) { super(usersService); }}That’s it. One decorator, full GraphQL CRUD:
| Type | Name | Description |
|---|---|---|
| Query | users | Cursor-paginated list |
| Query | user(id: ID!) | Find by ID |
| Query | usersCount(where: ...) | Count matching records |
| Query | usersAggregate(...) | Aggregation with groupBy |
| Mutation | createUser(data: ...) | Create one |
| Mutation | updateUser(id: ID!, ...) | Update one |
| Mutation | deleteUser(id: ID!) | Delete one |
All GraphQL types are generated automatically: User, UserWhereInput, UserOrderByInput, CreateUserInput, UpdateUserInput, UserCursorResult, PageInfo, UserAggregate, plus scalar filter inputs.
What’s next
For the full API reference (resolver configuration, pagination modes, filtering operators, hooks, typed context, field selection), see the @relayerjs/nestjs-graphql README.