feat: prisma typed select (#347)

* feat: wip prisma gql select

* feat: stronger api using decorator

* feat: add PrismaSelect everywhere

* fix: remove unused

* fix: remove seed debug
This commit is contained in:
Jérémy M
2023-06-22 11:17:31 +02:00
committed by GitHub
parent eb9be6894e
commit ca283a2196
35 changed files with 1081 additions and 578 deletions

View File

@ -1,25 +0,0 @@
import { Test, TestingModule } from '@nestjs/testing';
import { UserRelationsResolver } from './user-relations.resolver';
import { UserService } from './user.service';
describe('UserRelationsResolver', () => {
let resolver: UserRelationsResolver;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
UserRelationsResolver,
{
provide: UserService,
useValue: {},
},
],
}).compile();
resolver = module.get<UserRelationsResolver>(UserRelationsResolver);
});
it('should be defined', () => {
expect(resolver).toBeDefined();
});
});

View File

@ -1,46 +0,0 @@
import * as TypeGraphQL from '@nestjs/graphql';
import type { GraphQLResolveInfo } from 'graphql';
import { WorkspaceMember } from 'src/core/@generated/workspace-member/workspace-member.model';
import { User } from 'src/core/@generated/user/user.model';
import { Company } from 'src/core/@generated/company/company.model';
import { FindManyCompanyArgs } from 'src/core/@generated/company/find-many-company.args';
import { UserService } from './user.service';
@TypeGraphQL.Resolver(() => User)
export class UserRelationsResolver {
constructor(private readonly userService: UserService) {}
@TypeGraphQL.ResolveField(() => WorkspaceMember, {
nullable: true,
})
async workspaceMember(
@TypeGraphQL.Parent() user: User,
): Promise<WorkspaceMember | null> {
return await this.userService
.findFirst({
where: {
id: user.id,
},
})
.workspaceMember({});
}
@TypeGraphQL.ResolveField(() => [Company], {
nullable: false,
})
async companies(
@TypeGraphQL.Parent() user: User,
@TypeGraphQL.Info() info: GraphQLResolveInfo,
@TypeGraphQL.Args() args: FindManyCompanyArgs,
): Promise<Company[]> {
return this.userService
.findUniqueOrThrow({
where: {
id: user.id,
},
})
.companies({
...args,
});
}
}

View File

@ -1,12 +1,11 @@
import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserResolver } from './user.resolver';
import { UserRelationsResolver } from './user-relations.resolver';
import { WorkspaceModule } from '../workspace/workspace.module';
@Module({
imports: [WorkspaceModule],
providers: [UserService, UserResolver, UserRelationsResolver],
providers: [UserService, UserResolver],
exports: [UserService],
})
export class UserModule {}

View File

@ -7,6 +7,10 @@ import { User } from 'src/core/@generated/user/user.model';
import { ExceptionFilter } from 'src/filters/exception.filter';
import { UseFilters, UseGuards } from '@nestjs/common';
import { JwtAuthGuard } from 'src/guards/jwt.auth.guard';
import {
PrismaSelect,
PrismaSelector,
} from 'src/decorators/prisma-select.decorator';
@UseGuards(JwtAuthGuard)
@Resolver(() => User)
@ -20,7 +24,9 @@ export class UserResolver {
async findManyUser(
@Args() args: FindManyUserArgs,
@AuthWorkspace() workspace: Workspace,
): Promise<User[]> {
@PrismaSelector({ modelName: 'User' })
prismaSelect: PrismaSelect<'User'>,
): Promise<Partial<User>[]> {
return await this.userService.findMany({
...args,
where: {
@ -29,6 +35,7 @@ export class UserResolver {
is: { workspace: { is: { id: { equals: workspace.id } } } },
},
},
select: prismaSelect.value,
});
}
}