chore: refacto NestJS in modules (#308)

* chore: wip refacto in modules

* fix: rollback port

* fix: jwt guard in wrong folder

* chore: rename folder exception-filter in filters

* fix: tests are running

* fix: excessive stack depth comparing types

* fix: auth issue

* chore: move createUser in UserService

* fix: test

* fix: guards

* fix: jwt guard don't handle falsy user
This commit is contained in:
Jérémy M
2023-06-16 10:38:11 +02:00
committed by GitHub
parent 5921c7f11d
commit 2cd081234f
1084 changed files with 2251 additions and 758 deletions

View File

@ -0,0 +1,27 @@
import { Module } from '@nestjs/common';
import { PipelineService } from './services/pipeline.service';
import { PipelineResolver } from './resolvers/pipeline.resolver';
import { PipelineRelationsResolver } from './resolvers/pipeline-relations.resolver';
import { PipelineStageResolver } from './resolvers/pipeline-stage.resolver';
import { PipelineStageRelationsResolver } from './resolvers/pipeline-stage-relations.resolver';
import { PipelineProgressResolver } from './resolvers/pipeline-progress.resolver';
import { PipelineProgressRelationsResolver } from './resolvers/pipeline-progress-relations.resolver';
import { PipelineStageService } from './services/pipeline-stage.service';
import { PipelineProgressService } from './services/pipeline-progress.service';
@Module({
imports: [],
providers: [
PipelineService,
PipelineStageService,
PipelineProgressService,
PipelineResolver,
PipelineRelationsResolver,
PipelineStageResolver,
PipelineStageRelationsResolver,
PipelineProgressResolver,
PipelineProgressRelationsResolver,
],
exports: [PipelineService, PipelineStageService, PipelineProgressService],
})
export class PipelineModule {}

View File

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

View File

@ -0,0 +1,40 @@
import * as TypeGraphQL from '@nestjs/graphql';
import { PipelineProgress } from 'src/core/@generated/pipeline-progress/pipeline-progress.model';
import { PipelineStage } from 'src/core/@generated/pipeline-stage/pipeline-stage.model';
import { Pipeline } from 'src/core/@generated/pipeline/pipeline.model';
import { PipelineStageService } from '../services/pipeline-stage.service';
import { PipelineService } from '../services/pipeline.service';
@TypeGraphQL.Resolver(() => PipelineProgress)
export class PipelineProgressRelationsResolver {
constructor(
private readonly pipelineStageService: PipelineStageService,
private readonly pipelineService: PipelineService,
) {}
@TypeGraphQL.ResolveField(() => PipelineStage, {
nullable: false,
})
async pipelineStage(
@TypeGraphQL.Root() pipelineStage: PipelineProgress,
): Promise<PipelineStage> {
return this.pipelineStageService.findUniqueOrThrow({
where: {
id: pipelineStage.pipelineStageId,
},
});
}
@TypeGraphQL.ResolveField(() => Pipeline, {
nullable: false,
})
async pipeline(
@TypeGraphQL.Root() pipelineStage: PipelineProgress,
): Promise<Pipeline> {
return this.pipelineService.findUniqueOrThrow({
where: {
id: pipelineStage.pipelineId,
},
});
}
}

View File

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

View File

@ -0,0 +1,71 @@
import { Resolver, Args, Query, Mutation } from '@nestjs/graphql';
import { UseGuards } from '@nestjs/common';
import { JwtAuthGuard } from 'src/guards/jwt.auth.guard';
import { Workspace } from '../../../core/@generated/workspace/workspace.model';
import { AuthWorkspace } from '../../../decorators/auth-workspace.decorator';
import { FindManyPipelineProgressArgs } from '../../@generated/pipeline-progress/find-many-pipeline-progress.args';
import { PipelineProgress } from '../../@generated/pipeline-progress/pipeline-progress.model';
import { UpdateOnePipelineProgressArgs } from '../../@generated/pipeline-progress/update-one-pipeline-progress.args';
import { Prisma } from '@prisma/client';
import { AffectedRows } from '../../@generated/prisma/affected-rows.output';
import { DeleteManyPipelineProgressArgs } from '../../@generated/pipeline-progress/delete-many-pipeline-progress.args';
import { CreateOnePipelineProgressArgs } from '../../@generated/pipeline-progress/create-one-pipeline-progress.args';
import { PipelineProgressService } from '../services/pipeline-progress.service';
import { prepareFindManyArgs } from 'src/utils/prepare-find-many';
@UseGuards(JwtAuthGuard)
@Resolver(() => PipelineProgress)
export class PipelineProgressResolver {
constructor(
private readonly pipelineProgressService: PipelineProgressService,
) {}
@Query(() => [PipelineProgress])
async findManyPipelineProgress(
@Args() args: FindManyPipelineProgressArgs,
@AuthWorkspace() workspace: Workspace,
) {
const preparedArgs = prepareFindManyArgs<FindManyPipelineProgressArgs>(
args,
workspace,
);
return this.pipelineProgressService.findMany(preparedArgs);
}
@Mutation(() => PipelineProgress, {
nullable: true,
})
async updateOnePipelineProgress(
@Args() args: UpdateOnePipelineProgressArgs,
): Promise<PipelineProgress | null> {
return this.pipelineProgressService.update({
...args,
} satisfies UpdateOnePipelineProgressArgs as Prisma.PipelineProgressUpdateArgs);
}
@Mutation(() => AffectedRows, {
nullable: false,
})
async deleteManyPipelineProgress(
@Args() args: DeleteManyPipelineProgressArgs,
): Promise<AffectedRows> {
return this.pipelineProgressService.deleteMany({
...args,
});
}
@Mutation(() => PipelineProgress, {
nullable: false,
})
async createOnePipelineProgress(
@Args() args: CreateOnePipelineProgressArgs,
@AuthWorkspace() workspace: Workspace,
): Promise<PipelineProgress> {
return this.pipelineProgressService.create({
data: {
...args.data,
...{ workspace: { connect: { id: workspace.id } } },
},
} satisfies CreateOnePipelineProgressArgs as Prisma.PipelineProgressCreateArgs);
}
}

View File

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

View File

@ -0,0 +1,24 @@
import * as TypeGraphQL from '@nestjs/graphql';
import { PipelineStage } from 'src/core/@generated/pipeline-stage/pipeline-stage.model';
import { Pipeline } from 'src/core/@generated/pipeline/pipeline.model';
import { PipelineStageService } from '../services/pipeline-stage.service';
@TypeGraphQL.Resolver(() => Pipeline)
export class PipelineRelationsResolver {
constructor(private readonly pipelineStageService: PipelineStageService) {}
@TypeGraphQL.ResolveField(() => [PipelineStage], {
nullable: false,
})
async pipelineStages(
@TypeGraphQL.Root() pipeline: Pipeline,
): Promise<PipelineStage[]> {
return this.pipelineStageService.findMany({
where: {
pipelineId: {
equals: pipeline.id,
},
},
});
}
}

View File

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

View File

@ -0,0 +1,26 @@
import * as TypeGraphQL from '@nestjs/graphql';
import { PipelineProgress } from 'src/core/@generated/pipeline-progress/pipeline-progress.model';
import { PipelineStage } from 'src/core/@generated/pipeline-stage/pipeline-stage.model';
import { PipelineProgressService } from '../services/pipeline-progress.service';
@TypeGraphQL.Resolver(() => PipelineStage)
export class PipelineStageRelationsResolver {
constructor(
private readonly pipelineProgressService: PipelineProgressService,
) {}
@TypeGraphQL.ResolveField(() => [PipelineProgress], {
nullable: false,
})
async pipelineProgresses(
@TypeGraphQL.Root() pipelineStage: PipelineStage,
): Promise<PipelineProgress[]> {
return this.pipelineProgressService.findMany({
where: {
pipelineStageId: {
equals: pipelineStage.id,
},
},
});
}
}

View File

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

View File

@ -0,0 +1,28 @@
import { Resolver, Args, Query } from '@nestjs/graphql';
import { UseGuards } from '@nestjs/common';
import { JwtAuthGuard } from 'src/guards/jwt.auth.guard';
import { Workspace } from '../../../core/@generated/workspace/workspace.model';
import { AuthWorkspace } from '../../../decorators/auth-workspace.decorator';
import { PipelineStage } from '../../../core/@generated/pipeline-stage/pipeline-stage.model';
import { FindManyPipelineStageArgs } from '../../../core/@generated/pipeline-stage/find-many-pipeline-stage.args';
import { PipelineStageService } from '../services/pipeline-stage.service';
import { prepareFindManyArgs } from 'src/utils/prepare-find-many';
@UseGuards(JwtAuthGuard)
@Resolver(() => PipelineStage)
export class PipelineStageResolver {
constructor(private readonly pipelineStageService: PipelineStageService) {}
@Query(() => [PipelineStage])
async findManyPipelineStage(
@Args() args: FindManyPipelineStageArgs,
@AuthWorkspace() workspace: Workspace,
) {
const preparedArgs = prepareFindManyArgs<FindManyPipelineStageArgs>(
args,
workspace,
);
return this.pipelineStageService.findMany(preparedArgs);
}
}

View File

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

View File

@ -0,0 +1,27 @@
import { Resolver, Args, Query } from '@nestjs/graphql';
import { UseGuards } from '@nestjs/common';
import { JwtAuthGuard } from 'src/guards/jwt.auth.guard';
import { Workspace } from '../../@generated/workspace/workspace.model';
import { AuthWorkspace } from '../../../decorators/auth-workspace.decorator';
import { Pipeline } from '../../@generated/pipeline/pipeline.model';
import { FindManyPipelineArgs } from '../../@generated/pipeline/find-many-pipeline.args';
import { PipelineService } from '../services/pipeline.service';
import { prepareFindManyArgs } from 'src/utils/prepare-find-many';
@UseGuards(JwtAuthGuard)
@Resolver(() => Pipeline)
export class PipelineResolver {
constructor(private readonly pipelineService: PipelineService) {}
@Query(() => [Pipeline])
async findManyPipeline(
@Args() args: FindManyPipelineArgs,
@AuthWorkspace() workspace: Workspace,
) {
const preparedArgs = prepareFindManyArgs<FindManyPipelineArgs>(
args,
workspace,
);
return this.pipelineService.findMany(preparedArgs);
}
}

View File

@ -0,0 +1,26 @@
import { Test, TestingModule } from '@nestjs/testing';
import { PipelineProgressService } from './pipeline-progress.service';
import { PrismaService } from 'src/database/prisma.service';
import { prismaMock } from 'src/prisma-mock/jest-prisma-singleton';
describe('PipelineProgressService', () => {
let service: PipelineProgressService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
PipelineProgressService,
{
provide: PrismaService,
useValue: prismaMock,
},
],
}).compile();
service = module.get<PipelineProgressService>(PipelineProgressService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
});

View File

@ -0,0 +1,38 @@
import { Injectable } from '@nestjs/common';
import { PrismaService } from 'src/database/prisma.service';
@Injectable()
export class PipelineProgressService {
constructor(private readonly prismaService: PrismaService) {}
// Find
findFirst = this.prismaService.pipelineProgress.findFirst;
findFirstOrThrow = this.prismaService.pipelineProgress.findFirstOrThrow;
findUnique = this.prismaService.pipelineProgress.findUnique;
findUniqueOrThrow = this.prismaService.pipelineProgress.findUniqueOrThrow;
findMany = this.prismaService.pipelineProgress.findMany;
// Create
create = this.prismaService.pipelineProgress.create;
createMany = this.prismaService.pipelineProgress.createMany;
// Update
update = this.prismaService.pipelineProgress.update;
upsert = this.prismaService.pipelineProgress.upsert;
updateMany = this.prismaService.pipelineProgress.updateMany;
// Delete
delete = this.prismaService.pipelineProgress.delete;
deleteMany = this.prismaService.pipelineProgress.deleteMany;
// Aggregate
aggregate = this.prismaService.pipelineProgress.aggregate;
// Count
count = this.prismaService.pipelineProgress.count;
// GroupBy
groupBy = this.prismaService.pipelineProgress.groupBy;
}

View File

@ -0,0 +1,26 @@
import { Test, TestingModule } from '@nestjs/testing';
import { PipelineStageService } from './pipeline-stage.service';
import { PrismaService } from 'src/database/prisma.service';
import { prismaMock } from 'src/prisma-mock/jest-prisma-singleton';
describe('PipelineStageService', () => {
let service: PipelineStageService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
PipelineStageService,
{
provide: PrismaService,
useValue: prismaMock,
},
],
}).compile();
service = module.get<PipelineStageService>(PipelineStageService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
});

View File

@ -0,0 +1,38 @@
import { Injectable } from '@nestjs/common';
import { PrismaService } from 'src/database/prisma.service';
@Injectable()
export class PipelineStageService {
constructor(private readonly prismaService: PrismaService) {}
// Find
findFirst = this.prismaService.pipelineStage.findFirst;
findFirstOrThrow = this.prismaService.pipelineStage.findFirstOrThrow;
findUnique = this.prismaService.pipelineStage.findUnique;
findUniqueOrThrow = this.prismaService.pipelineStage.findUniqueOrThrow;
findMany = this.prismaService.pipelineStage.findMany;
// Create
create = this.prismaService.pipelineStage.create;
createMany = this.prismaService.pipelineStage.createMany;
// Update
update = this.prismaService.pipelineStage.update;
upsert = this.prismaService.pipelineStage.upsert;
updateMany = this.prismaService.pipelineStage.updateMany;
// Delete
delete = this.prismaService.pipelineStage.delete;
deleteMany = this.prismaService.pipelineStage.deleteMany;
// Aggregate
aggregate = this.prismaService.pipelineStage.aggregate;
// Count
count = this.prismaService.pipelineStage.count;
// GroupBy
groupBy = this.prismaService.pipelineStage.groupBy;
}

View File

@ -0,0 +1,26 @@
import { Test, TestingModule } from '@nestjs/testing';
import { PipelineService } from './pipeline.service';
import { PrismaService } from 'src/database/prisma.service';
import { prismaMock } from 'src/prisma-mock/jest-prisma-singleton';
describe('PipelineService', () => {
let service: PipelineService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
PipelineService,
{
provide: PrismaService,
useValue: prismaMock,
},
],
}).compile();
service = module.get<PipelineService>(PipelineService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
});

View File

@ -0,0 +1,38 @@
import { Injectable } from '@nestjs/common';
import { PrismaService } from 'src/database/prisma.service';
@Injectable()
export class PipelineService {
constructor(private readonly prismaService: PrismaService) {}
// Find
findFirst = this.prismaService.pipeline.findFirst;
findFirstOrThrow = this.prismaService.pipeline.findFirstOrThrow;
findUnique = this.prismaService.pipeline.findUnique;
findUniqueOrThrow = this.prismaService.pipeline.findUniqueOrThrow;
findMany = this.prismaService.pipeline.findMany;
// Create
create = this.prismaService.pipeline.create;
createMany = this.prismaService.pipeline.createMany;
// Update
update = this.prismaService.pipeline.update;
upsert = this.prismaService.pipeline.upsert;
updateMany = this.prismaService.pipeline.updateMany;
// Delete
delete = this.prismaService.pipeline.delete;
deleteMany = this.prismaService.pipeline.deleteMany;
// Aggregate
aggregate = this.prismaService.pipeline.aggregate;
// Count
count = this.prismaService.pipeline.count;
// GroupBy
groupBy = this.prismaService.pipeline.groupBy;
}