Skip to content

Commit

Permalink
Merge pull request #8 from TeetouchQQ/main
Browse files Browse the repository at this point in the history
feat: projects
  • Loading branch information
TeetouchQQ authored Aug 4, 2023
2 parents fc949a8 + f1a1d38 commit 0b02b30
Show file tree
Hide file tree
Showing 12 changed files with 267 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { AuthModule } from './auth/auth.module';
import { TicketsModule } from './tickets/tickets.module';
import { UsersModule } from './users/users.module';
import { OffersModule } from './offers/offers.module';
import { ProjectsModule } from './projects/projects.module';

@Module({
imports: [
Expand All @@ -30,6 +31,7 @@ import { OffersModule } from './offers/offers.module';
TicketsModule,
UsersModule,
OffersModule,
ProjectsModule,
],
controllers: [AppController],
providers: [AppService],
Expand Down
6 changes: 6 additions & 0 deletions src/common/interfaces/contract.interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export interface IContract {
name: string;
email: string;
tel: string
}

5 changes: 5 additions & 0 deletions src/common/interfaces/timePeroid.interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export interface ITimePeriod {
start: string;
end: string;
}

66 changes: 66 additions & 0 deletions src/projects/dto/create-project.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import { ApiProperty } from '@nestjs/swagger';
import { IsString, IsDate, IsNumber, IsObject, IsUrl, IsPositive, isNotEmpty } from 'class-validator';
import { IContract } from '@/common/interfaces/contract.interface';
import { ITimePeriod } from '@/common/interfaces/timePeroid.interface';

export class CreateProjectDto {
@ApiProperty({
description: 'Project Name',
example: 'ปลูกต้นไม้100ล้านต้น',
})
@IsString()
name: string;

@ApiProperty({
description: 'Project description',
example: 'ปลูกต้นไม่กับพี่ตูน',
})
@IsString()
description: string;

@ApiProperty({
description: 'Project date',
example: 'วันที่เริ่ม',
})

@ApiProperty({
description: 'Project date',
example: 'วันที่เริ่ม',
})
@IsString()
contract: IContract;

@ApiProperty({
description: 'Project description',
example: 50,
})
@IsNumber()
@IsPositive()
price_by_unit: number;

@ApiProperty({
description: 'Project time_peroid',
example: {
start: '2021-01-01',
end: '2022-01-01',
},
type: Object,
})
@IsString()
time_period: ITimePeriod;

@ApiProperty({
description: 'Project image',
example: 'img_path',
})
@IsUrl()
image: string;

@ApiProperty({
description: 'Project maximun money amount',
example: 10000,
})
@IsNumber()
@IsPositive()
maximum: number;
}
4 changes: 4 additions & 0 deletions src/projects/dto/update-project.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { PartialType } from '@nestjs/swagger';
import { CreateProjectDto } from './create-project.dto';

export class UpdateProjectDto extends PartialType(CreateProjectDto) {}
1 change: 1 addition & 0 deletions src/projects/entities/project.entity.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export class Project {}
20 changes: 20 additions & 0 deletions src/projects/projects.controller.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { Test, TestingModule } from '@nestjs/testing';
import { ProjectsController } from './projects.controller';
import { ProjectsService } from './projects.service';

describe('ProjectsController', () => {
let controller: ProjectsController;

beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [ProjectsController],
providers: [ProjectsService],
}).compile();

controller = module.get<ProjectsController>(ProjectsController);
});

it('should be defined', () => {
expect(controller).toBeDefined();
});
});
55 changes: 55 additions & 0 deletions src/projects/projects.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import { ProjectsService } from './projects.service';
import { CreateProjectDto } from './dto/create-project.dto';
import { UpdateProjectDto } from './dto/update-project.dto';
import { GetUser } from '@/common/decorators/get-user.decorator';
import { ApiTags, ApiBearerAuth } from '@nestjs/swagger';
import { JwtGuard } from '@/common/guards/jwt.guard';
import { Role } from '@/common/enums/role.enum';
import { UseGuards } from '@nestjs/common';
import { Roles } from '@/common/decorators/roles.decorator';
import { RolesGuard } from '@/common/guards/roles.guard';
@ApiTags('Projects')
@ApiBearerAuth()
@Controller('projects')
export class ProjectsController {
constructor(private readonly projectsService: ProjectsService) {}

@Post()
@UseGuards(JwtGuard, RolesGuard)
@Roles(Role.Provider, Role.Admin)
async create(@Body() createProjectDto: CreateProjectDto, @GetUser() user) {
console.log(user);
const newProject = await this.projectsService.create(createProjectDto, user);
return {
success: true,
message: 'Project created successfully',
data: newProject,
};
}

@Get()
async findAll() {
const projects = await this.projectsService.findAll();
return {
success: true,
message: 'Projects retrieved successfully',
data: projects,
};
}

@Get(':id')
findOne(@Param('id') id: string) {
return this.projectsService.findOne(+id);
}

@Patch(':id')
update(@Param('id') id: string, @Body() updateProjectDto: UpdateProjectDto) {
return this.projectsService.update(+id, updateProjectDto);
}

@Delete(':id')
remove(@Param('id') id: string) {
return this.projectsService.remove(+id);
}
}
13 changes: 13 additions & 0 deletions src/projects/projects.module.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { Module } from '@nestjs/common';
import { ProjectsService } from './projects.service';
import { ProjectsController } from './projects.controller';
import {MongooseModule} from "@nestjs/mongoose";
import { Project, ProjectSchema } from './schemas/project.schema';
@Module({
imports: [
MongooseModule.forFeature([{ name: Project.name, schema: ProjectSchema }]),
],
controllers: [ProjectsController],
providers: [ProjectsService]
})
export class ProjectsModule {}
18 changes: 18 additions & 0 deletions src/projects/projects.service.spec.ts
Original file line number Diff line number Diff line change
@@ -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 changes: 35 additions & 0 deletions src/projects/projects.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { Injectable } from '@nestjs/common';
import { CreateProjectDto } from './dto/create-project.dto';
import { UpdateProjectDto } from './dto/update-project.dto';
import { Project,ProjectDocument } from './schemas/project.schema';
import { Model } from 'mongoose';
import {InjectModel} from "@nestjs/mongoose";
@Injectable()
export class ProjectsService {
constructor(
@InjectModel(Project.name) private projectModel: Model<ProjectDocument>,
) {}

async create(createProjectDto: CreateProjectDto, user) {
return await this.projectModel.create({
...createProjectDto,
owner: user._id,
});
}

async findAll() {
return await this.projectModel.find().exec();
}

findOne(id: number) {
return `This action returns a #${id} project`;
}

update(id: number, updateProjectDto: UpdateProjectDto) {
return `This action updates a #${id} project`;
}

remove(id: number) {
return `This action removes a #${id} project`;
}
}
42 changes: 42 additions & 0 deletions src/projects/schemas/project.schema.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { HydratedDocument, Document, Types } from 'mongoose';

import { User } from '@/users/schemas/user.schema';
import { IContract } from '@/common/interfaces/contract.interface';
import { ITimePeriod } from '@/common/interfaces/timePeroid.interface';
export type ProjectDocument = Project & HydratedDocument<Project>;

@Schema()
export class Project extends Document {
@Prop({ required: true })
name: string;

@Prop({ required: true })
description: string;

@Prop({ required: false, type: Types.ObjectId, ref: 'User' })
owner: User;

@Prop({ required: true, type: Types.ObjectId })
contract: IContract;

@Prop({ required: true })
price_by_unit: number;

@Prop({ required: true , type: Types.ObjectId})
time_period: ITimePeriod;

@Prop({ required: true })
image: string;

@Prop({ required: true })
maximum: number;

@Prop({ default: Date.now })
createdAt: Date;

@Prop({ default: Date.now })
updatedAt: Date;
}

export const ProjectSchema = SchemaFactory.createForClass(Project);

0 comments on commit 0b02b30

Please sign in to comment.