parent
fbaeb45d2c
commit
7a46dd79ff
16 changed files with 244 additions and 7 deletions
@ -1,7 +1,5 @@ |
|||||||
import { Product } from 'src/modules/products/entities/product.entity'; |
|
||||||
|
|
||||||
export class CreateReceiptDto { |
export class CreateReceiptDto { |
||||||
userId: number; |
userId: number; |
||||||
totalPrice: number; |
totalPrice: number; |
||||||
products: Product[]; |
products: number[]; |
||||||
} |
} |
||||||
|
@ -0,0 +1,7 @@ |
|||||||
|
import { Product } from 'src/modules/products/entities/product.entity'; |
||||||
|
|
||||||
|
export class CreateShoppingCardDto { |
||||||
|
userId: number; |
||||||
|
products: number[]; |
||||||
|
totalPrice: number; |
||||||
|
} |
@ -0,0 +1,2 @@ |
|||||||
|
export * from './create-shopping-card.dto'; |
||||||
|
export * from './update-shopping-card.dto'; |
@ -0,0 +1,4 @@ |
|||||||
|
import { PartialType } from '@nestjs/mapped-types'; |
||||||
|
import { CreateShoppingCardDto } from './create-shopping-card.dto'; |
||||||
|
|
||||||
|
export class UpdateShoppingCardDto extends PartialType(CreateShoppingCardDto) {} |
@ -0,0 +1,32 @@ |
|||||||
|
import { |
||||||
|
Table, |
||||||
|
Column, |
||||||
|
Model, |
||||||
|
DataType, |
||||||
|
ForeignKey, |
||||||
|
BelongsTo, |
||||||
|
} from 'sequelize-typescript'; |
||||||
|
import { Product } from 'src/modules/products/entities/product.entity'; |
||||||
|
import { User } from 'src/modules/users/entities/user.entity'; |
||||||
|
|
||||||
|
@Table({ tableName: 'shopping_cards' }) |
||||||
|
export class ShoppingCard extends Model<ShoppingCard> { |
||||||
|
@Column({ |
||||||
|
type: DataType.FLOAT, |
||||||
|
allowNull: false, |
||||||
|
}) |
||||||
|
totalPrice: number; |
||||||
|
|
||||||
|
@Column({ |
||||||
|
type: DataType.ARRAY(DataType.INTEGER), |
||||||
|
allowNull: false, |
||||||
|
}) |
||||||
|
products: number[]; |
||||||
|
|
||||||
|
@ForeignKey(() => User) |
||||||
|
@Column |
||||||
|
userId: number; |
||||||
|
|
||||||
|
@BelongsTo(() => User) |
||||||
|
user: User; |
||||||
|
} |
@ -0,0 +1,51 @@ |
|||||||
|
import { |
||||||
|
Controller, |
||||||
|
Get, |
||||||
|
Post, |
||||||
|
Body, |
||||||
|
Patch, |
||||||
|
Param, |
||||||
|
Delete, |
||||||
|
} from '@nestjs/common'; |
||||||
|
import { ShoppingCardsService } from './shopping-cards.service'; |
||||||
|
import { CreateShoppingCardDto, UpdateShoppingCardDto } from './dto'; |
||||||
|
import { ReceiptsService } from '../receipts/receipts.service'; |
||||||
|
import { CreateReceiptDto } from '../receipts/dto'; |
||||||
|
|
||||||
|
@Controller('shopping-cards') |
||||||
|
export class ShoppingCardsController { |
||||||
|
constructor(private readonly shoppingCardsService: ShoppingCardsService) {} |
||||||
|
|
||||||
|
@Post() |
||||||
|
create(@Body() createShoppingCardDto: CreateShoppingCardDto) { |
||||||
|
return this.shoppingCardsService.create(createShoppingCardDto); |
||||||
|
} |
||||||
|
|
||||||
|
@Get() |
||||||
|
findAll() { |
||||||
|
return this.shoppingCardsService.findAll(); |
||||||
|
} |
||||||
|
|
||||||
|
@Get(':id') |
||||||
|
findbyUser(@Param('id') id: string) { |
||||||
|
return this.shoppingCardsService.findbyUser(+id); |
||||||
|
} |
||||||
|
|
||||||
|
@Patch(':id') |
||||||
|
update( |
||||||
|
@Param('id') id: string, |
||||||
|
@Body() updateShoppingCardDto: UpdateShoppingCardDto, |
||||||
|
) { |
||||||
|
return this.shoppingCardsService.update(+id, updateShoppingCardDto); |
||||||
|
} |
||||||
|
|
||||||
|
@Delete('/purchase/:id') |
||||||
|
submitPurchase(@Param('id') id: string) { |
||||||
|
return this.shoppingCardsService.submitPurchase(+id); |
||||||
|
} |
||||||
|
|
||||||
|
@Delete(':id') |
||||||
|
remove(@Param('id') id: string) { |
||||||
|
return this.shoppingCardsService.remove(+id); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
import { Module } from '@nestjs/common'; |
||||||
|
import { ShoppingCardsService } from './shopping-cards.service'; |
||||||
|
import { ShoppingCardsController } from './shopping-cards.controller'; |
||||||
|
import { shoppingCardsProviders } from './shopping-cards.providers'; |
||||||
|
import { ReceiptsService } from '../receipts/receipts.service'; |
||||||
|
import { receiptsProviders } from '../receipts/receipts.providers'; |
||||||
|
import { ProductsService } from '../products/products.service'; |
||||||
|
import { productsProviders } from '../products/products.providers'; |
||||||
|
|
||||||
|
@Module({ |
||||||
|
controllers: [ShoppingCardsController], |
||||||
|
providers: [ |
||||||
|
ShoppingCardsService, |
||||||
|
...shoppingCardsProviders, |
||||||
|
ReceiptsService, |
||||||
|
...receiptsProviders, |
||||||
|
ProductsService, |
||||||
|
...productsProviders, |
||||||
|
], |
||||||
|
exports: [ShoppingCardsService], |
||||||
|
}) |
||||||
|
export class ShoppingCardsModule {} |
@ -0,0 +1,9 @@ |
|||||||
|
import { ShoppingCard } from './entities/shopping-card.entity'; |
||||||
|
import { SHOPPING_CARD_REPOSITORY } from '../../core/constants'; |
||||||
|
|
||||||
|
export const shoppingCardsProviders = [ |
||||||
|
{ |
||||||
|
provide: SHOPPING_CARD_REPOSITORY, |
||||||
|
useValue: ShoppingCard, |
||||||
|
}, |
||||||
|
]; |
@ -0,0 +1,63 @@ |
|||||||
|
import { Inject, Injectable } from '@nestjs/common'; |
||||||
|
import { CreateShoppingCardDto } from './dto/create-shopping-card.dto'; |
||||||
|
import { UpdateShoppingCardDto } from './dto/update-shopping-card.dto'; |
||||||
|
import { SHOPPING_CARD_REPOSITORY } from 'src/core/constants'; |
||||||
|
import { ShoppingCard } from './entities/shopping-card.entity'; |
||||||
|
import { CreateReceiptDto } from '../receipts/dto'; |
||||||
|
import { ReceiptsService } from '../receipts/receipts.service'; |
||||||
|
import { ProductsService } from '../products/products.service'; |
||||||
|
|
||||||
|
@Injectable() |
||||||
|
export class ShoppingCardsService { |
||||||
|
constructor( |
||||||
|
@Inject(SHOPPING_CARD_REPOSITORY) |
||||||
|
private readonly shoppingCardRepository: typeof ShoppingCard, |
||||||
|
private readonly receiptService: ReceiptsService, |
||||||
|
private readonly productsService: ProductsService, |
||||||
|
) {} |
||||||
|
async create(createShoppingCardDto: CreateShoppingCardDto) { |
||||||
|
return await this.shoppingCardRepository.create(createShoppingCardDto); |
||||||
|
} |
||||||
|
|
||||||
|
async findAll() { |
||||||
|
return await this.shoppingCardRepository.findAll(); |
||||||
|
} |
||||||
|
|
||||||
|
async findbyUser(id: number) { |
||||||
|
return await this.shoppingCardRepository.findAll({ where: { userId: id } }); |
||||||
|
} |
||||||
|
|
||||||
|
async update(id: number, updateShoppingCardDto: UpdateShoppingCardDto) { |
||||||
|
const [numberOfAffectedRows, [updatedCard]] = |
||||||
|
await this.shoppingCardRepository.update( |
||||||
|
{ ...updateShoppingCardDto }, |
||||||
|
{ where: { userId: id }, returning: true }, |
||||||
|
); |
||||||
|
return { numberOfAffectedRows, updatedCard }; |
||||||
|
} |
||||||
|
|
||||||
|
async remove(id: number) { |
||||||
|
return await this.shoppingCardRepository.destroy({ where: { userId: id } }); |
||||||
|
} |
||||||
|
|
||||||
|
async submitPurchase(id: number) { |
||||||
|
const [card] = await this.findbyUser(id); |
||||||
|
|
||||||
|
let total = 0; |
||||||
|
for (let i of card.products) { |
||||||
|
const [product] = await this.productsService.findOne(i); |
||||||
|
total += product.pricePerUnit; |
||||||
|
} |
||||||
|
|
||||||
|
await this.createReceipt({ |
||||||
|
userId: id, |
||||||
|
products: card.products, |
||||||
|
totalPrice: total, |
||||||
|
}); |
||||||
|
return await this.remove(id); |
||||||
|
} |
||||||
|
|
||||||
|
private async createReceipt(createReceiptDto: CreateReceiptDto) { |
||||||
|
await this.receiptService.create(createReceiptDto); |
||||||
|
} |
||||||
|
} |
@ -1,9 +1,36 @@ |
|||||||
|
import { |
||||||
|
IsEmail, |
||||||
|
IsEnum, |
||||||
|
IsString, |
||||||
|
IsNotEmpty, |
||||||
|
IsOptional, |
||||||
|
} from 'class-validator'; |
||||||
|
|
||||||
export class CreateUserDto { |
export class CreateUserDto { |
||||||
|
@IsNotEmpty() |
||||||
|
@IsString() |
||||||
firstName: string; |
firstName: string; |
||||||
|
|
||||||
|
@IsNotEmpty() |
||||||
|
@IsString() |
||||||
lastName: string; |
lastName: string; |
||||||
|
|
||||||
|
@IsNotEmpty() |
||||||
|
@IsEmail() |
||||||
email: string; |
email: string; |
||||||
|
|
||||||
|
@IsNotEmpty() |
||||||
|
@IsString() |
||||||
password: string; |
password: string; |
||||||
|
|
||||||
|
@IsOptional() |
||||||
|
@IsString() |
||||||
phoneNumber: string; |
phoneNumber: string; |
||||||
|
|
||||||
|
@IsOptional() |
||||||
|
@IsEnum(['mail', 'female']) |
||||||
gender: string; |
gender: string; |
||||||
|
|
||||||
|
@IsOptional() |
||||||
city: string; |
city: string; |
||||||
} |
} |
||||||
|
Loading…
Reference in new issue