feat(proejct): project curd.
This commit is contained in:
28
src/projects/dtos/create-project.input.ts
Normal file
28
src/projects/dtos/create-project.input.ts
Normal 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;
|
||||
}
|
||||
5
src/projects/dtos/update-project.input.ts
Normal file
5
src/projects/dtos/update-project.input.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
import { InputType } from '@nestjs/graphql';
|
||||
import { CreateProjectInput } from './create-project.input';
|
||||
|
||||
@InputType()
|
||||
export class UpdateProjectInput extends CreateProjectInput {}
|
||||
28
src/projects/project.entity.ts
Normal file
28
src/projects/project.entity.ts
Normal 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;
|
||||
}
|
||||
11
src/projects/projects.module.ts
Normal file
11
src/projects/projects.module.ts
Normal 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 {}
|
||||
18
src/projects/projects.resolver.spec.ts
Normal file
18
src/projects/projects.resolver.spec.ts
Normal 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();
|
||||
});
|
||||
});
|
||||
41
src/projects/projects.resolver.ts
Normal file
41
src/projects/projects.resolver.ts
Normal 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);
|
||||
}
|
||||
}
|
||||
18
src/projects/projects.service.spec.ts
Normal file
18
src/projects/projects.service.spec.ts
Normal 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();
|
||||
});
|
||||
});
|
||||
35
src/projects/projects.service.ts
Normal file
35
src/projects/projects.service.ts
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user