From e5ad2e3b3accb23d5c46859faddef6793a14541d Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Sun, 30 Nov 2025 23:36:23 +0330 Subject: [PATCH] ordder init --- src/app.module.ts | 2 + src/modules/orders/dto/create-order.dto.ts | 1 + src/modules/orders/dto/update-order.dto.ts | 4 ++ .../orders/entities/order-item.entity.ts | 25 ++++++++ src/modules/orders/entities/order.entity.ts | 60 +++++++++++++++++++ src/modules/orders/interface/order-status.ts | 6 ++ src/modules/orders/orders.controller.ts | 34 +++++++++++ src/modules/orders/orders.module.ts | 9 +++ src/modules/orders/orders.service.ts | 26 ++++++++ .../payments/interface/payment-status.ts | 6 ++ 10 files changed, 173 insertions(+) create mode 100644 src/modules/orders/dto/create-order.dto.ts create mode 100644 src/modules/orders/dto/update-order.dto.ts create mode 100644 src/modules/orders/entities/order-item.entity.ts create mode 100644 src/modules/orders/entities/order.entity.ts create mode 100644 src/modules/orders/interface/order-status.ts create mode 100644 src/modules/orders/orders.controller.ts create mode 100644 src/modules/orders/orders.module.ts create mode 100644 src/modules/orders/orders.service.ts create mode 100644 src/modules/payments/interface/payment-status.ts diff --git a/src/app.module.ts b/src/app.module.ts index ba5f23d..a368c0d 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -20,6 +20,7 @@ import { CartModule } from './modules/cart/cart.module'; import { RolesModule } from './modules/roles/roles.module'; import { PaymentsModule } from './modules/payments/payments.module'; import { ShipmentsModule } from './modules/shipments/shipments.module'; +import { OrdersModule } from './modules/orders/orders.module'; @Module({ imports: [ @@ -53,6 +54,7 @@ import { ShipmentsModule } from './modules/shipments/shipments.module'; RolesModule, PaymentsModule, ShipmentsModule, + OrdersModule, ], controllers: [], providers: [], diff --git a/src/modules/orders/dto/create-order.dto.ts b/src/modules/orders/dto/create-order.dto.ts new file mode 100644 index 0000000..0eafaef --- /dev/null +++ b/src/modules/orders/dto/create-order.dto.ts @@ -0,0 +1 @@ +export class CreateOrderDto {} diff --git a/src/modules/orders/dto/update-order.dto.ts b/src/modules/orders/dto/update-order.dto.ts new file mode 100644 index 0000000..93dff6d --- /dev/null +++ b/src/modules/orders/dto/update-order.dto.ts @@ -0,0 +1,4 @@ +import { PartialType } from '@nestjs/swagger'; +import { CreateOrderDto } from './create-order.dto'; + +export class UpdateOrderDto extends PartialType(CreateOrderDto) {} diff --git a/src/modules/orders/entities/order-item.entity.ts b/src/modules/orders/entities/order-item.entity.ts new file mode 100644 index 0000000..46a3e44 --- /dev/null +++ b/src/modules/orders/entities/order-item.entity.ts @@ -0,0 +1,25 @@ +import { Entity, ManyToOne, Property } from '@mikro-orm/core'; +import { BaseEntity } from '../../../common/entities/base.entity'; +import { Order } from './order.entity'; +import { Food } from '../../foods/entities/food.entity'; + +@Entity({ tableName: 'order_items' }) +export class OrderItem extends BaseEntity { + @ManyToOne(() => Order) + order!: Order; + + @ManyToOne(() => Food) + food!: Food; + + @Property({ type: 'int' }) + quantity!: number; + + @Property({ type: 'decimal', precision: 10, scale: 0 }) + unitPrice!: number; + + @Property({ type: 'decimal', precision: 10, scale: 0, default: 0 }) + discount: number = 0; + + @Property({ type: 'decimal', precision: 10, scale: 0 }) + totalPrice!: number; +} diff --git a/src/modules/orders/entities/order.entity.ts b/src/modules/orders/entities/order.entity.ts new file mode 100644 index 0000000..aebeae8 --- /dev/null +++ b/src/modules/orders/entities/order.entity.ts @@ -0,0 +1,60 @@ +import { Entity, ManyToOne, OneToMany, Property, Collection, Cascade, Enum } from '@mikro-orm/core'; +import { BaseEntity } from '../../../common/entities/base.entity'; +import { PaymentStatus } from '../../payments/interface/payment-status'; +import { OrderStatus } from '../interface/order-status'; +import { User } from '../../users/entities/user.entity'; +import { Restaurant } from '../../restaurants/entities/restaurant.entity'; +import { UserAddress } from '../../users/entities/user-address.entity'; +import { RestaurantPaymentMethod } from '../../payments/entities/restaurant-payment-method.entity'; +import { OrderItem } from './order-item.entity'; + +@Entity({ tableName: 'orders' }) +export class Order extends BaseEntity { + @ManyToOne(() => User) + user!: User; + + @ManyToOne(() => Restaurant) + restaurant!: Restaurant; + + @OneToMany(() => OrderItem, item => item.order, { + cascade: [Cascade.ALL], + orphanRemoval: true, + }) + items = new Collection(this); + + @ManyToOne(() => UserAddress, { nullable: true }) + address?: UserAddress; + + @ManyToOne(() => RestaurantPaymentMethod, { nullable: true }) + paymentMethod?: RestaurantPaymentMethod; + + @Property({ type: 'decimal', precision: 10, scale: 0, default: 0 }) + couponDiscount: number = 0; + + @Property({ type: 'decimal', precision: 10, scale: 0, default: 0 }) + itemsDiscount: number = 0; + + @Property({ type: 'decimal', precision: 10, scale: 0, default: 0 }) + totalDiscount: number = 0; + + @Property({ type: 'decimal', precision: 10, scale: 0 }) + subTotal!: number; + + @Property({ type: 'decimal', precision: 10, scale: 0, default: 0 }) + tax: number = 0; + + @Property({ type: 'decimal', precision: 10, scale: 0, default: 0 }) + deliveryFee: number = 0; + + @Property({ type: 'decimal', precision: 10, scale: 0 }) + total!: number; + + @Property({ type: 'int', default: 0 }) + totalItems: number = 0; + + @Enum(() => OrderStatus) + status!: OrderStatus; + + @Enum(() => PaymentStatus) + paymentStatus!: PaymentStatus; +} diff --git a/src/modules/orders/interface/order-status.ts b/src/modules/orders/interface/order-status.ts new file mode 100644 index 0000000..4b1cb18 --- /dev/null +++ b/src/modules/orders/interface/order-status.ts @@ -0,0 +1,6 @@ +export enum OrderStatus { + Pending = 'pending', + Confirmed = 'confirmed', + Delivered = 'delivered', + Cancelled = 'cancelled', +} diff --git a/src/modules/orders/orders.controller.ts b/src/modules/orders/orders.controller.ts new file mode 100644 index 0000000..b46b64e --- /dev/null +++ b/src/modules/orders/orders.controller.ts @@ -0,0 +1,34 @@ +import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'; +import { OrdersService } from './orders.service'; +import { CreateOrderDto } from './dto/create-order.dto'; +import { UpdateOrderDto } from './dto/update-order.dto'; + +@Controller('orders') +export class OrdersController { + constructor(private readonly ordersService: OrdersService) {} + + @Post() + create(@Body() createOrderDto: CreateOrderDto) { + return this.ordersService.create(createOrderDto); + } + + @Get() + findAll() { + return this.ordersService.findAll(); + } + + @Get(':id') + findOne(@Param('id') id: string) { + return this.ordersService.findOne(+id); + } + + @Patch(':id') + update(@Param('id') id: string, @Body() updateOrderDto: UpdateOrderDto) { + return this.ordersService.update(+id, updateOrderDto); + } + + @Delete(':id') + remove(@Param('id') id: string) { + return this.ordersService.remove(+id); + } +} diff --git a/src/modules/orders/orders.module.ts b/src/modules/orders/orders.module.ts new file mode 100644 index 0000000..de72044 --- /dev/null +++ b/src/modules/orders/orders.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { OrdersService } from './orders.service'; +import { OrdersController } from './orders.controller'; + +@Module({ + controllers: [OrdersController], + providers: [OrdersService], +}) +export class OrdersModule {} diff --git a/src/modules/orders/orders.service.ts b/src/modules/orders/orders.service.ts new file mode 100644 index 0000000..ddc00ed --- /dev/null +++ b/src/modules/orders/orders.service.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@nestjs/common'; +import { CreateOrderDto } from './dto/create-order.dto'; +import { UpdateOrderDto } from './dto/update-order.dto'; + +@Injectable() +export class OrdersService { + create(createOrderDto: CreateOrderDto) { + return 'This action adds a new order'; + } + + findAll() { + return `This action returns all orders`; + } + + findOne(id: number) { + return `This action returns a #${id} order`; + } + + update(id: number, updateOrderDto: UpdateOrderDto) { + return `This action updates a #${id} order`; + } + + remove(id: number) { + return `This action removes a #${id} order`; + } +} diff --git a/src/modules/payments/interface/payment-status.ts b/src/modules/payments/interface/payment-status.ts new file mode 100644 index 0000000..37e47b7 --- /dev/null +++ b/src/modules/payments/interface/payment-status.ts @@ -0,0 +1,6 @@ +export enum PaymentStatus { + Pending = 'pending', + Paid = 'paid', + Failed = 'failed', +} +