Skip to content

Commit

Permalink
Merge pull request #15 from deviate-team/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
TeetouchQQ authored Aug 4, 2023
2 parents fdae7e0 + 0dd368b commit 03dee38
Show file tree
Hide file tree
Showing 9 changed files with 160 additions and 40 deletions.
17 changes: 17 additions & 0 deletions src/offers/dto/buy-carbon.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { ApiProperty } from '@nestjs/swagger';
import { IsString, IsNumber } from 'class-validator';
export class BuyCarbonDto {
@ApiProperty({
description: 'offer id',
example: 'fk3jof83jdo3eiqeir',
})
@IsString()
id: string;

@ApiProperty({
description: 'amount',
example: 20,
})
@IsNumber()
amount: number;
}
58 changes: 57 additions & 1 deletion src/offers/dto/create-offer.dto.ts
Original file line number Diff line number Diff line change
@@ -1 +1,57 @@
export class CreateOfferDto {}
import { ApiProperty } from '@nestjs/swagger';
import {
IsString,
IsDate,
IsNumber,
IsObject,
IsUrl,
IsPositive,
isNotEmpty,
} from 'class-validator';
import { Project } from '@/projects/schemas/project.schema';

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

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

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

@ApiProperty({
description: 'Carbon credit sell price',
example: 50,
})
@IsNumber()
@IsPositive()
price_per_kg: number;

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

@ApiProperty({
description: 'how much this offer cab sell',
example: 10000,
})
@IsNumber()
@IsPositive()
avaliable: number;
}
20 changes: 15 additions & 5 deletions src/offers/offers.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,24 @@ import {
import { OffersService } from './offers.service';
import { CreateOfferDto } from './dto/create-offer.dto';
import { UpdateOfferDto } from './dto/update-offer.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('Offers')
@ApiBearerAuth()
@Controller('offers')
export class OffersController {
constructor(private readonly offersService: OffersService) {}

@Post()
create(@Body() createOfferDto: CreateOfferDto) {
return this.offersService.create(createOfferDto);
@UseGuards(JwtGuard, RolesGuard)
@Roles(Role.Provider, Role.Admin)
create(@Body() createOfferDto: CreateOfferDto, @GetUser() user) {
return this.offersService.create(createOfferDto, user);
}

@Get()
Expand All @@ -26,8 +36,8 @@ export class OffersController {
}

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

@Patch(':id')
Expand Down
8 changes: 7 additions & 1 deletion src/offers/offers.module.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
import { Module } from '@nestjs/common';
import { OffersService } from './offers.service';
import { OffersController } from './offers.controller';

import { MongooseModule } from '@nestjs/mongoose';
import { Offer, OfferSchema } from './schemas/offer.schema';
import { ProjectsModule } from '@/projects/projects.module';
@Module({
imports: [
MongooseModule.forFeature([{ name: Offer.name, schema: OfferSchema }]),
ProjectsModule,
],
controllers: [OffersController],
providers: [OffersService],
})
Expand Down
46 changes: 39 additions & 7 deletions src/offers/offers.service.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,51 @@
import { Injectable } from '@nestjs/common';
import { CreateOfferDto } from './dto/create-offer.dto';
import { UpdateOfferDto } from './dto/update-offer.dto';

import { OfferDocument } from './schemas/offer.schema';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { Offer } from './entities/offer.entity';
import { BuyCarbonDto } from './dto/buy-carbon.dto';
import { Project, ProjectDocument } from '@/projects/schemas/project.schema';
import { ProjectsService } from '@/projects/projects.service';
import { Inject } from '@nestjs/common';
@Injectable()
export class OffersService {
create(createOfferDto: CreateOfferDto) {
return 'This action adds a new offer';
@Inject(ProjectsService)
private readonly projectsService: ProjectsService;

constructor(
@InjectModel(Offer.name) private offerModel: Model<OfferDocument>, //@InjectModel(Project.name) private projectModel: Model<ProjectDocument>,
) {}

async create(createOfferDto: CreateOfferDto, user) {
return await this.offerModel.create({
...createOfferDto,
owner: user._id,
});
}

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

findAll() {
return `This action returns all offers`;
async buyCarbon(buyCarbonDto: BuyCarbonDto, user) {
const offer = await this.offerModel.findById(buyCarbonDto.id);
if (offer.available < buyCarbonDto.amount) {
throw new Error('Not enough carbon available');
}
const project = await this.projectsService.findOne(offer.project);
console.log(project);
// offer.available -= buyCarbonDto.amount;
// offer.save();
// return await this.offerModel.create({
// ...buyCarbonDto,
// owner: user._id,
// });
}

findOne(id: number) {
return `This action returns a #${id} offer`;
async findOne(id: string) {
return await this.offerModel.findById(id);
}

update(id: number, updateOfferDto: UpdateOfferDto) {
Expand Down
39 changes: 24 additions & 15 deletions src/offers/schemas/offer.schema.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,38 @@
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { HydratedDocument, Document } from 'mongoose';
import { HydratedDocument, Document, Types } from 'mongoose';

import { User } from '@/users/schemas/user.schema';
import { Project } from '@/projects/schemas/project.schema';
export type OfferDocument = Offer & HydratedDocument<Offer>;

export interface TimePeriod {
start: Date;
end: Date;
}

export interface Contract {
name: string;
email: string;
tel: number;
}

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

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

@Prop({ required: true })
_id: string;
project: string;

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

@Prop({ default: 50 })
price_per_kg: number;

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

@Prop({ default: 420 })
available: number;

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

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

export const OfferSchema = SchemaFactory.createForClass(Offer);
5 changes: 0 additions & 5 deletions src/projects/projects.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,6 @@ export class ProjectsController {
}
}

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

@Delete(':id')
@UseGuards(JwtGuard, RolesGuard)
@Roles(Role.Provider, Role.Admin)
Expand Down
1 change: 1 addition & 0 deletions src/projects/projects.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ import { Project, ProjectSchema } from './schemas/project.schema';
],
controllers: [ProjectsController],
providers: [ProjectsService],
exports: [ProjectsService],
})
export class ProjectsModule {}
6 changes: 0 additions & 6 deletions src/projects/projects.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,19 +78,13 @@ export class ProjectsService {
}
}

async findMember(id: string) {}

async findOne(id: string) {
const projectExits = await this.projectModel.findById(id).exec();
if (projectExits) {
return projectExits;
}
}

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

async remove(id: string) {
//todo
return await this.projectModel.findByIdAndDelete(id).exec();
Expand Down

0 comments on commit 03dee38

Please sign in to comment.