Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add generators for graphql with authorisation #617

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
16 changes: 14 additions & 2 deletions examples/api-prisma/prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ generator nestjsGraphql {
useInputType_StringFilter_ALL = "string"
}

// Nestjs grahpql resolvers generator
generator graphqlResolvers {
// Nestjs public grahpql resolvers generator
generator publicGraphqlResolvers {
provider = "trxn-prisma-nestjs-graphql-resolvers-generator"
output = "../src/nestjs-resolvers"

Expand All @@ -33,6 +33,18 @@ generator graphqlResolvers {
nestjsGraphqlDtosImportPath = "./nestjs-graphql-dtos"
}

// Nestjs authorizd grahpql resolvers generator
generator authorizedGraphqlResolvers {
provider = "trxn-prisma-nestjs-graphql-resolvers-casl-generator"
output = "../src/authorized-nestjs-resolvers"

// Path relative to the output directory
tsConfigFilePath = "../../tsconfig.app.json"
nestjsServicesImportPath = "./nestjs-services"
nestjsGraphqlDtosImportPath = "./nestjs-graphql-dtos"
caslImportPath = "./casl-target"
}

// Nestjs common services generator
generator nestjsServices {
provider = "trxn-prisma-nestjs-services-generator"
Expand Down
3 changes: 2 additions & 1 deletion examples/api-prisma/src/app/modules/authentication.module.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { Module } from '@nestjs/common';
import { AuthenticationModule as TrxnAuthenticationModule } from '@trxn/nestjs-authentication';

import { UserModule } from './user.module';

import { AuthenticationModule as TrxnAuthenticationModule } from '@trxn/nestjs-authentication';

@Module({
imports: [
TrxnAuthenticationModule.register({
Expand Down
1 change: 1 addition & 0 deletions examples/api-prisma/src/app/modules/database.module.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Module } from '@nestjs/common';

import { DatabaseModule as TrxnDatabaseModule } from '@trxn/nestjs-database';

@Module({
Expand Down
3 changes: 2 additions & 1 deletion examples/api-prisma/src/app/modules/user.module.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { Module } from '@nestjs/common';
import { UserModule as TrxnUserModule } from '@trxn/nestjs-user';

import { NestjsServicesModule } from './services.module';

import { UserModule as TrxnUserModule } from '@trxn/nestjs-user';

@Module({
imports: [
TrxnUserModule.register({
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { Field, ObjectType } from '@nestjs/graphql';

import { Right } from '../../nestjs-graphql-dtos';

import { FindManyPagination } from '@trxn/nestjs-graphql';

@ObjectType()
export class FindManyRightOutput extends FindManyPagination {
@Field(() => [Right])
rights!: Right[];
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { Field, ObjectType } from '@nestjs/graphql';

import { Role } from '../../nestjs-graphql-dtos';

import { FindManyPagination } from '@trxn/nestjs-graphql';

@ObjectType()
export class FindManyRoleOutput extends FindManyPagination {
@Field(() => [Role])
roles!: Role[];
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { Field, ObjectType } from '@nestjs/graphql';

import { User } from '../../nestjs-graphql-dtos';

import { FindManyPagination } from '@trxn/nestjs-graphql';

@ObjectType()
export class FindManyUserOutput extends FindManyPagination {
@Field(() => [User])
users!: User[];
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export * from './find-many-user-output.dto';
export * from './find-many-role-output.dto';
export * from './find-many-right-output.dto';
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ConfigurableModuleBuilder } from '@nestjs/common';

import { addImportsExtra, ImportsExtra } from '@trxn/nestjs-core';

export const {
ConfigurableModuleClass,
MODULE_OPTIONS_TOKEN,
ASYNC_OPTIONS_TYPE,
OPTIONS_TYPE,
} = new ConfigurableModuleBuilder()
.setExtras<ImportsExtra>(
{ imports: [] },
addImportsExtra((definition) => definition),
)
.build();
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { Module } from '@nestjs/common';

import { ConfigurableModuleClass } from './graphql.module-definition';
import { UserResolver, RoleResolver, RightResolver } from './resolvers';

import { DateScalar } from '@trxn/nestjs-graphql';

const providers = [DateScalar, UserResolver, RoleResolver, RightResolver];

@Module({ providers: providers, exports: providers })
export class GraphqlModule extends ConfigurableModuleClass {}
3 changes: 3 additions & 0 deletions examples/api-prisma/src/authorized-nestjs-resolvers/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export * from './resolvers';
export * from './dtos';
export * from './graphql.module';
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export * from './user.resolver';
export * from './role.resolver';
export * from './right.resolver';
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
import { Inject } from '@nestjs/common';
import {
Args,
Info,
Mutation,
Parent,
Query,
ResolveField,
Resolver,
} from '@nestjs/graphql';
import { PrismaSelect } from '@paljs/plugins';
import { Prisma } from '@prisma/client';
import { GraphQLResolveInfo } from 'graphql';

import {
CREATE_RIGHT,
READ_RIGHT,
SEARCH_RIGHT,
UPDATE_RIGHT,
DELETE_RIGHT,
} from '../../casl-target';
import {
Right,
Role,
FindUniqueRightArgs,
FindManyRightArgs,
CreateOneRightArgs,
UpdateOneRightArgs,
DeleteOneRightArgs,
} from '../../nestjs-graphql-dtos';
import { RightService, RIGHT_SERVICE } from '../../nestjs-services';
import { FindManyRightOutput } from '../dtos';

import { Policies } from '@trxn/nestjs-core';

@Resolver(() => Right)
export class RightResolver {
constructor(
@Inject(RIGHT_SERVICE) private readonly rightService: RightService,
) {}

/** Query for a unique right */
@Query(() => Right, { nullable: true })
@Policies(READ_RIGHT)
async findUniqueRight(
@Info() info: GraphQLResolveInfo,
@Args({ nullable: true, defaultValue: {} }) { where }: FindUniqueRightArgs,
) {
const select = new PrismaSelect(info).value as Prisma.RightArgs;
const right = await this.rightService.findUnique({ where, ...select });
return right;
}

/** Query for multiple rights. */
@Query(() => FindManyRightOutput)
@Policies(SEARCH_RIGHT)
async findManyRights(
@Info() info: GraphQLResolveInfo,
@Args({ nullable: true })
{
where,
cursor,
distinct,
orderBy = [{ id: 'asc' }],
skip = 0,
take = 100,
}: FindManyRightArgs,
) {
const select = new PrismaSelect(info).valueOf(
'rights',
'Right',
) as Prisma.RightArgs;

const rights = await this.rightService.findMany({
...select,
where,
cursor,
distinct,
orderBy,
skip,
take: take + 1,
});

const count = await this.rightService.count({
where,
});

return {
rights: rights.slice(0, take),
count,
hasNextPage: typeof rights[take] !== 'undefined',
};
}

/** Create a single right. */
@Mutation(() => Right, { nullable: true })
@Policies(CREATE_RIGHT)
async createRight(
@Info() info: GraphQLResolveInfo,
@Args() { data }: CreateOneRightArgs,
) {
const select = new PrismaSelect(info).value as Prisma.RightArgs;

const right = await this.rightService.create({ data, ...select });

return right;
}

/** Update a single right. */
@Mutation(() => Right, { nullable: true })
@Policies(UPDATE_RIGHT)
async updateRight(
@Info() info: GraphQLResolveInfo,
@Args() { data, where }: UpdateOneRightArgs,
) {
const select = new PrismaSelect(info).value as Prisma.RightArgs;

const right = await this.rightService.update({ where, data, ...select });

return right;
}

/** Delete a single Right. */
@Mutation(() => Right, { nullable: true })
@Policies(DELETE_RIGHT)
async deleteRight(
@Info() info: GraphQLResolveInfo,
@Args() { where }: DeleteOneRightArgs,
) {
const select = new PrismaSelect(info).value as Prisma.RightArgs;

const right = await this.rightService.delete({ where, ...select });

return right;
}

@ResolveField(() => Role)
roles(@Parent() right: Right) {
return right.roles;
}
}
Loading