From 7f09e92abb93790a11d2d31714c6264a972cb885 Mon Sep 17 00:00:00 2001 From: Matin Date: Mon, 17 Feb 2025 10:37:58 +0330 Subject: [PATCH] chore: seeder for city and province --- database/seeder.runner.ts | 18 ++++++----- database/seeders/iran-city.seeder.ts | 32 +++++++++++++++++++ src/app.module.ts | 2 ++ src/modules/address/address.controller.ts | 6 ++++ src/modules/address/address.module.ts | 16 ++++++++++ src/modules/address/entities/city.entity.ts | 15 +++++++++ .../address/entities/province.entity.ts | 15 +++++++++ .../address/providers/address.service.ts | 6 ++++ .../address/repositories/city.repository.ts | 12 +++++++ .../repositories/province.repository.ts | 12 +++++++ src/modules/invoices/invoices.controller.ts | 11 +++++++ 11 files changed, 137 insertions(+), 8 deletions(-) create mode 100644 database/seeders/iran-city.seeder.ts create mode 100644 src/modules/address/entities/province.entity.ts create mode 100644 src/modules/address/providers/address.service.ts create mode 100644 src/modules/address/repositories/city.repository.ts create mode 100644 src/modules/address/repositories/province.repository.ts diff --git a/database/seeder.runner.ts b/database/seeder.runner.ts index b2a0b3e..bb3bceb 100644 --- a/database/seeder.runner.ts +++ b/database/seeder.runner.ts @@ -1,10 +1,11 @@ import { Logger } from "@nestjs/common"; import { connectionSource } from "./connection"; -import { seedAdmin } from "./seeders/admin.seeder"; -import { seedNotifSettings } from "./seeders/notif-setting.seeder"; -import { seedPaymentGateways } from "./seeders/payment-gateway.seeder"; -import { seedRole } from "./seeders/role.seeder"; +// import { seedAdmin } from "./seeders/admin.seeder"; +import { seedCityAndProvince } from "./seeders/iran-city.seeder"; +// import { seedNotifSettings } from "./seeders/notif-setting.seeder"; +// import { seedPaymentGateways } from "./seeders/payment-gateway.seeder"; +// import { seedRole } from "./seeders/role.seeder"; const logger = new Logger("Seeder"); @@ -12,10 +13,11 @@ export const runSeeder = async () => { await connectionSource.initialize(); logger.log("start seeding database"); // - await seedRole(connectionSource, logger); - await seedAdmin(connectionSource, logger); - await seedNotifSettings(connectionSource, logger); - await seedPaymentGateways(connectionSource, logger); + // await seedRole(connectionSource, logger); + // await seedAdmin(connectionSource, logger); + // await seedNotifSettings(connectionSource, logger); + // await seedPaymentGateways(connectionSource, logger); + await seedCityAndProvince(connectionSource, logger); logger.log("seeding completed"); process.exit(0); diff --git a/database/seeders/iran-city.seeder.ts b/database/seeders/iran-city.seeder.ts new file mode 100644 index 0000000..0f85182 --- /dev/null +++ b/database/seeders/iran-city.seeder.ts @@ -0,0 +1,32 @@ +import { Logger } from "@nestjs/common"; +import { DataSource } from "typeorm"; + +import { City } from "../../src/modules/address/entities/city.entity"; +import { Province } from "../../src/modules/address/entities/province.entity"; +import provincesData from "../data/json/ostan.json"; +import citiesData from "../data/json/shahr.json"; + +export const seedCityAndProvince = async (dataSource: DataSource, logger: Logger) => { + try { + const provinceRepo = dataSource.getRepository(Province); + const cityRepo = dataSource.getRepository(City); + + for (const province of provincesData) { + const newProvince = provinceRepo.create({ name: province.name }); + await provinceRepo.save(newProvince); + } + + for (const city of citiesData) { + const province = await provinceRepo.findOne({ where: { id: city.ostan } }); + if (province) { + const newCity = cityRepo.create({ name: city.name, province }); + await cityRepo.save(newCity); + } + } + + logger.log("City and Province seeding completed"); + } catch (error) { + logger.error("Error in seeding City and Province", error); + process.exit(1); + } +}; diff --git a/src/app.module.ts b/src/app.module.ts index 7d4e308..94b561e 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -14,6 +14,7 @@ import { mailerConfig } from "./configs/mailer.config"; import { rateLimitConfig } from "./configs/rateLimit.config"; import { databaseConfigs } from "./configs/typeorm.config"; import { HTTPLogger } from "./core/middlewares/logger.middleware"; +import { AddressModule } from "./modules/address/address.module"; import { AdsModule } from "./modules/ads/ads.module"; import { AnnouncementsModule } from "./modules/announcements/announcement.module"; import { AuthModule } from "./modules/auth/auth.module"; @@ -59,6 +60,7 @@ import { WalletsModule } from "./modules/wallets/wallets.module"; LearningModule, DiscountModule, AdsModule, + AddressModule, ], controllers: [], providers: [], diff --git a/src/modules/address/address.controller.ts b/src/modules/address/address.controller.ts index e69de29..6bc8d2f 100644 --- a/src/modules/address/address.controller.ts +++ b/src/modules/address/address.controller.ts @@ -0,0 +1,6 @@ +import { Controller } from "@nestjs/common"; + +@Controller("address") +export class AddressController { + constructor() {} +} diff --git a/src/modules/address/address.module.ts b/src/modules/address/address.module.ts index e69de29..c013c6e 100644 --- a/src/modules/address/address.module.ts +++ b/src/modules/address/address.module.ts @@ -0,0 +1,16 @@ +import { Module } from "@nestjs/common"; +import { TypeOrmModule } from "@nestjs/typeorm"; + +import { AddressController } from "./address.controller"; +import { City } from "./entities/city.entity"; +import { Province } from "./entities/province.entity"; +import { AddressService } from "./providers/address.service"; +import { CityRepository } from "./repositories/city.repository"; +import { ProvinceRepository } from "./repositories/province.repository"; + +@Module({ + imports: [TypeOrmModule.forFeature([City, Province])], + providers: [AddressService, CityRepository, ProvinceRepository], + controllers: [AddressController], +}) +export class AddressModule {} diff --git a/src/modules/address/entities/city.entity.ts b/src/modules/address/entities/city.entity.ts index e69de29..312819e 100644 --- a/src/modules/address/entities/city.entity.ts +++ b/src/modules/address/entities/city.entity.ts @@ -0,0 +1,15 @@ +import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from "typeorm"; + +import { Province } from "./province.entity"; + +@Entity() +export class City { + @PrimaryGeneratedColumn() + id: number; + + @Column({ type: "varchar", length: 255 }) + name: string; + + @ManyToOne(() => Province, (province) => province.cities, { nullable: false }) + province: Province; +} diff --git a/src/modules/address/entities/province.entity.ts b/src/modules/address/entities/province.entity.ts new file mode 100644 index 0000000..c0eb5b5 --- /dev/null +++ b/src/modules/address/entities/province.entity.ts @@ -0,0 +1,15 @@ +import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm"; + +import { City } from "./city.entity"; + +@Entity() +export class Province { + @PrimaryGeneratedColumn() + id: number; + + @Column({ type: "varchar", length: 255 }) + name: string; + + @OneToMany(() => City, (city) => city.province) + cities: City[]; +} diff --git a/src/modules/address/providers/address.service.ts b/src/modules/address/providers/address.service.ts new file mode 100644 index 0000000..5fd58c2 --- /dev/null +++ b/src/modules/address/providers/address.service.ts @@ -0,0 +1,6 @@ +import { Injectable } from "@nestjs/common"; + +@Injectable() +export class AddressService { + constructor() {} +} diff --git a/src/modules/address/repositories/city.repository.ts b/src/modules/address/repositories/city.repository.ts new file mode 100644 index 0000000..095192d --- /dev/null +++ b/src/modules/address/repositories/city.repository.ts @@ -0,0 +1,12 @@ +import { Injectable } from "@nestjs/common"; +import { InjectRepository } from "@nestjs/typeorm"; +import { Repository } from "typeorm"; + +import { City } from "../entities/city.entity"; + +@Injectable() +export class CityRepository extends Repository { + constructor(@InjectRepository(City) cityRepository: Repository) { + super(cityRepository.target, cityRepository.manager, cityRepository.queryRunner); + } +} diff --git a/src/modules/address/repositories/province.repository.ts b/src/modules/address/repositories/province.repository.ts new file mode 100644 index 0000000..f68d115 --- /dev/null +++ b/src/modules/address/repositories/province.repository.ts @@ -0,0 +1,12 @@ +import { Injectable } from "@nestjs/common"; +import { InjectRepository } from "@nestjs/typeorm"; +import { Repository } from "typeorm"; + +import { Province } from "../entities/province.entity"; + +@Injectable() +export class ProvinceRepository extends Repository { + constructor(@InjectRepository(Province) provinceRepository: Repository) { + super(provinceRepository.target, provinceRepository.manager, provinceRepository.queryRunner); + } +} diff --git a/src/modules/invoices/invoices.controller.ts b/src/modules/invoices/invoices.controller.ts index 1325c5a..3063216 100644 --- a/src/modules/invoices/invoices.controller.ts +++ b/src/modules/invoices/invoices.controller.ts @@ -1,6 +1,7 @@ import { Body, Controller, Get, Param, Post, Query } from "@nestjs/common"; import { ApiOperation } from "@nestjs/swagger"; +import { ApplyDiscountDto } from "./DTO/apply-discount-invoice.dto"; import { CreateInvoiceDto } from "./DTO/create-invoice.dto"; import { InvoicesSearchQueryDto, UserInvoicesSearchQueryDto } from "./DTO/invoices-search-query.dto"; import { InvoicesService } from "./providers/invoices.service"; @@ -48,4 +49,14 @@ export class InvoicesController { getInvoiceById(@Param() paramDto: ParamDto, @UserDec("role") role: RoleEnum, @UserDec("id") userId: string) { return this.invoiceService.getInvoiceById(paramDto.id, role, userId); } + + @Post(":id/apply-discount") + async applyDiscount(@Param() paramDto: ParamDto, @Body() applyDiscountDto: ApplyDiscountDto) { + return this.invoiceService.applyDiscount(paramDto.id, applyDiscountDto); + } + + @Get(":id/final-price") + async getFinalPrice(@Param() paramDto: ParamDto) { + return this.invoiceService.calculateFinalPrice(paramDto.id); + } }