-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #8 from TeetouchQQ/main
feat: projects
- Loading branch information
Showing
12 changed files
with
267 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
export interface IContract { | ||
name: string; | ||
email: string; | ||
tel: string | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
export interface ITimePeriod { | ||
start: string; | ||
end: string; | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
export class Project {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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`; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); |