feat(proejct): project curd.

This commit is contained in:
Ivan Li
2021-01-31 19:42:17 +08:00
parent 7ba5e220d9
commit db6b699663
27 changed files with 1326 additions and 5 deletions

View File

@@ -0,0 +1,28 @@
import { InputType } from '@nestjs/graphql';
import { IsString, IsUrl, MaxLength, MinLength } from 'class-validator';
@InputType({ isAbstract: true })
export class CreateProjectInput {
@IsString()
@MaxLength(32)
@MinLength(2)
name: string;
@IsString()
@MaxLength(32)
@MinLength(2)
comment: string;
@IsUrl({ protocols: ['ssh'], require_protocol: false })
@MaxLength(256)
sshUrl: string;
@IsUrl()
@MaxLength(256)
webUrl?: string;
@IsString()
@MaxLength(128)
@MinLength(1)
webHookSecret?: string;
}

View File

@@ -0,0 +1,5 @@
import { InputType } from '@nestjs/graphql';
import { CreateProjectInput } from './create-project.input';
@InputType()
export class UpdateProjectInput extends CreateProjectInput {}

View File

@@ -0,0 +1,28 @@
import { ObjectType } from '@nestjs/graphql';
import { AppBaseEntity } from 'src/commons/entities/app-base-entity';
import { Entity, Column, DeleteDateColumn } from 'typeorm';
@ObjectType()
@Entity()
export class Project extends AppBaseEntity {
/**
* 唯一名称
*/
@Column()
name: string;
@Column()
comment: string;
@Column()
sshUrl: string;
@Column({ nullable: true })
webUrl?: string;
@Column({ nullable: true })
webHookSecret?: string;
@DeleteDateColumn()
deletedAt?: Date;
}

View File

@@ -0,0 +1,11 @@
import { Module } from '@nestjs/common';
import { ProjectsService } from './projects.service';
import { ProjectsResolver } from './projects.resolver';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Project } from './project.entity';
@Module({
imports: [TypeOrmModule.forFeature([Project])],
providers: [ProjectsService, ProjectsResolver],
})
export class ProjectsModule {}

View File

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

View File

@@ -0,0 +1,41 @@
import { Args, Mutation, Query, Resolver } from '@nestjs/graphql';
import { CreateProjectInput } from './dtos/create-project.input';
import { UpdateProjectInput } from './dtos/update-project.input';
import { Project } from './project.entity';
import { ProjectsService } from './projects.service';
@Resolver(() => Project)
export class ProjectsResolver {
constructor(private readonly service: ProjectsService) {}
@Query(() => [Project])
async findProjects() {
return await this.service.list();
}
@Query(() => Project)
async findProject(@Args('id', { type: () => String }) id: string) {
return await this.service.findOne(id);
}
@Mutation(() => Project)
async createProject(
@Args('project', { type: () => CreateProjectInput })
dto: UpdateProjectInput,
) {
return await this.service.create(dto);
}
@Mutation(() => Boolean)
async modifyProject(
@Args('id', { type: () => String }) id: string,
@Args('project', { type: () => UpdateProjectInput })
dto: UpdateProjectInput,
) {
return await this.service.update(id, dto);
}
@Mutation(() => Number)
async deleteProject(@Args('id', { type: () => String }) id: string) {
return await this.service.remove(id);
}
}

View File

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

View File

@@ -0,0 +1,35 @@
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { BaseDbService } from 'src/commons/services/base-db.service';
import { Repository } from 'typeorm';
import { CreateProjectInput } from './dtos/create-project.input';
import { Project } from './project.entity';
@Injectable()
export class ProjectsService extends BaseDbService<Project> {
readonly uniqueFields: Array<keyof Project> = ['name'];
constructor(
@InjectRepository(Project)
readonly repository: Repository<Project>,
) {
super(repository);
}
async list() {
return this.repository.find();
}
async create(dto: CreateProjectInput) {
await this.isDuplicateEntity(dto);
return await this.repository.save(this.repository.create(dto));
}
async update(id: string, dto: CreateProjectInput) {
await this.isDuplicateEntityForUpdate(id, dto);
await this.repository.update({ id }, dto);
}
async remove(id: string) {
return (await this.repository.softDelete({ id })).affected;
}
}