diff --git a/src/app.module.ts b/src/app.module.ts index d0bfb0c..916dd17 100755 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -45,6 +45,7 @@ import { WalletsModule } from "./modules/wallets/wallets.module"; import { DkalaModule } from "./modules/dkala/dkala.module"; import { DpageModule } from './modules/dpage/dpage.module'; import { DmailModule } from './modules/dmail/dmail.module'; +import { ResellerModule } from './modules/reseller/reseller.module'; @Module({ imports: [ // TelegrafModule.forRootAsync(telegrafConfig()), @@ -92,7 +93,8 @@ import { DmailModule } from './modules/dmail/dmail.module'; DmenuModule, DkalaModule, DpageModule, - DmailModule + DmailModule, + ResellerModule ], controllers: [], }) diff --git a/src/modules/reseller/dto/create-reseller.dto.ts b/src/modules/reseller/dto/create-reseller.dto.ts new file mode 100755 index 0000000..7d3235b --- /dev/null +++ b/src/modules/reseller/dto/create-reseller.dto.ts @@ -0,0 +1,19 @@ +import { ApiProperty } from "@nestjs/swagger"; +import { IsMobilePhone, IsNotEmpty, IsString, Length } from "class-validator"; +import { AuthMessage } from "../../../common/enums/message.enum"; + + +export class CreateResellerDto { + @IsNotEmpty() + @IsString() + @Length(2, 50,) + @ApiProperty({ description: "name", example: "mahyar" }) + name: string; + + @IsNotEmpty({ message: AuthMessage.PHONE_NOT_EMPTY }) + @IsMobilePhone("fa-IR", {}, { message: AuthMessage.INVALID_PHONE_FORMAT }) + @Length(11, 11, { message: AuthMessage.PHONE_SHOULD_BE_11_DIGIT }) + @ApiProperty({ description: "phone number", default: "09922320740" }) + phone: string; + +} diff --git a/src/modules/reseller/dto/update-reseller.dto.ts b/src/modules/reseller/dto/update-reseller.dto.ts new file mode 100644 index 0000000..8f5f535 --- /dev/null +++ b/src/modules/reseller/dto/update-reseller.dto.ts @@ -0,0 +1,4 @@ +import { PartialType } from '@nestjs/swagger'; +import { CreateResellerDto } from './create-reseller.dto'; + +export class UpdateResellerDto extends PartialType(CreateResellerDto) {} diff --git a/src/modules/users/entities/reseller.entity.ts b/src/modules/reseller/entities/reseller.entity.ts similarity index 89% rename from src/modules/users/entities/reseller.entity.ts rename to src/modules/reseller/entities/reseller.entity.ts index 3ea800b..e6dcfcc 100755 --- a/src/modules/users/entities/reseller.entity.ts +++ b/src/modules/reseller/entities/reseller.entity.ts @@ -1,6 +1,6 @@ import { Column, Entity, JoinColumn, OneToMany, OneToOne } from "typeorm"; -import { User } from "./user.entity"; +import { User } from "../../users/entities/user.entity"; import { BaseEntity } from "../../../common/entities/base.entity"; @Entity() diff --git a/src/modules/users/repositories/reseller.repository.ts b/src/modules/reseller/repositories/reseller.repository.ts similarity index 100% rename from src/modules/users/repositories/reseller.repository.ts rename to src/modules/reseller/repositories/reseller.repository.ts diff --git a/src/modules/reseller/reseller.controller.ts b/src/modules/reseller/reseller.controller.ts new file mode 100644 index 0000000..e32660c --- /dev/null +++ b/src/modules/reseller/reseller.controller.ts @@ -0,0 +1,29 @@ +import { Controller, Get, Post, Body } from '@nestjs/common'; +import { ResellerService } from './reseller.service'; +import { ApiOperation } from '@nestjs/swagger'; +import { PermissionsDec } from '../../common/decorators/permission.decorator'; +import { PermissionEnum } from '../users/enums/permission.enum'; +import { CreateResellerDto } from './dto/create-reseller.dto'; + +@Controller('reseller') +export class ResellerController { + constructor( + private readonly resellerService: ResellerService, + + ) { } + + + @ApiOperation({ summary: "create Reseller ==> admin route" }) + @PermissionsDec(PermissionEnum.RESELLER) + @Post("reseller") + createReseller(@Body() dto: CreateResellerDto) { + return this.resellerService.create(dto) + } + + @ApiOperation({ summary: "get Resellers ==> admin route" }) + @PermissionsDec(PermissionEnum.RESELLER) + @Get("reseller") + getResellers() { + return this.resellerService.findAll() + } +} diff --git a/src/modules/reseller/reseller.module.ts b/src/modules/reseller/reseller.module.ts new file mode 100644 index 0000000..ba6e902 --- /dev/null +++ b/src/modules/reseller/reseller.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { ResellerService } from './reseller.service'; +import { ResellerController } from './reseller.controller'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Reseller } from './entities/reseller.entity'; +import { ResellerRepository } from './repositories/reseller.repository'; +import { UsersModule } from '../users/users.module'; + +@Module({ + imports: [TypeOrmModule.forFeature([Reseller]), UsersModule], + controllers: [ResellerController], + providers: [ResellerService, ResellerRepository], +}) +export class ResellerModule { } diff --git a/src/modules/reseller/reseller.service.ts b/src/modules/reseller/reseller.service.ts new file mode 100644 index 0000000..3ee4f66 --- /dev/null +++ b/src/modules/reseller/reseller.service.ts @@ -0,0 +1,40 @@ +import { BadRequestException, Injectable } from '@nestjs/common'; +import { UsersService } from '../users/providers/users.service'; +import { CreateResellerDto } from './dto/create-reseller.dto'; +import { ResellerRepository } from './repositories/reseller.repository'; +import { AuthMessage } from '../../common/enums/message.enum'; + +@Injectable() +export class ResellerService { + constructor( + private readonly usersService: UsersService, + private readonly resellerRepository: ResellerRepository, + ) { } + + async create(dto: CreateResellerDto) { + const { name, phone } = dto + + const user = await this.usersService.findOneWithPhone(phone) + + if (!user) { + throw new BadRequestException(AuthMessage.USER_NOT_FOUND) + } + + const reseller = this.resellerRepository.create({ + name, + owner: user + }) + + await this.resellerRepository.save(reseller) + + return reseller + } + + async findAll() { + return this.resellerRepository.find({ + relations: { + owner: true + } + }) + } +} diff --git a/src/modules/users/entities/user.entity.ts b/src/modules/users/entities/user.entity.ts index e931013..0c487f3 100755 --- a/src/modules/users/entities/user.entity.ts +++ b/src/modules/users/entities/user.entity.ts @@ -30,7 +30,7 @@ import { TicketMessage } from "../../tickets/entities/ticket-message.entity"; import { Ticket } from "../../tickets/entities/ticket.entity"; import { Wallet } from "../../wallets/entities/wallet.entity"; import { FinancialType } from "../enums/financial-type.enum"; -import { Reseller } from "./reseller.entity"; +import { Reseller } from "../../reseller/entities/reseller.entity"; @Entity() export class User extends BaseEntity { diff --git a/src/modules/users/providers/users.service.ts b/src/modules/users/providers/users.service.ts index efcbb6e..bc46ae8 100755 --- a/src/modules/users/providers/users.service.ts +++ b/src/modules/users/providers/users.service.ts @@ -30,8 +30,7 @@ import { LegalUserRepository } from "../repositories/legal-user.repository"; import { RealUserRepository } from "../repositories/real-user.repository"; import { UserGroupRepository } from "../repositories/user-group.repository"; import { UserRepository } from "../repositories/users.repository"; -import { ResellerRepository } from "../repositories/reseller.repository"; -import { CreateResellerDto } from "../DTO/create-reseller.dto"; + @Injectable() export class UsersService { private readonly logger = new Logger(UsersService.name); @@ -49,8 +48,7 @@ export class UsersService { private readonly smsService: SmsService, private readonly cacheService: CacheService, private readonly referralsService: ReferralsService, - private readonly resellerRepository: ResellerRepository, - ) { } + ) { } /************************************************************ */ @@ -385,15 +383,7 @@ export class UsersService { return { agent }; } - /************************************************************ */ - async getResellersList() { - this.resellerRepository.find({ - relations: { - owner: true - } - }) - } /************************************************************ */ private async createEmailHashLink(email: string) { @@ -426,22 +416,5 @@ export class UsersService { /************************************************************ */ - async createReseller(dto: CreateResellerDto) { - const { name, phone } = dto - const user = await this.findOneWithPhone(phone) - - if (!user) { - throw new BadRequestException(AuthMessage.USER_NOT_FOUND) - } - - const reseller = this.resellerRepository.create({ - name, - owner: user - }) - - await this.resellerRepository.save(reseller) - - return reseller - } } diff --git a/src/modules/users/users.controller.ts b/src/modules/users/users.controller.ts index 465e2c4..a970269 100755 --- a/src/modules/users/users.controller.ts +++ b/src/modules/users/users.controller.ts @@ -29,8 +29,7 @@ import { IUserIpAndHeaders, UserDec, UserIpAndHeaders } from "../../common/decor import { ParamDto } from "../../common/DTO/param.dto"; import { RequestOtpDto } from "../auth/DTO/request-otp.dto"; import { VerifyOtpDto } from "../auth/DTO/verify-otp.dto"; -import { CreateResellerDto } from "./DTO/create-reseller.dto"; - + @AuthGuards() @Controller("users") export class UsersController { @@ -230,19 +229,5 @@ export class UsersController { return this.adminsService.createRole(createDto); } - // ==================== Reseller ========= - - @ApiOperation({ summary: "create Reseller ==> admin route" }) - @PermissionsDec(PermissionEnum.RESELLER) - @Post("reseller") - createReseller(@Body() dto: CreateResellerDto) { - return this.usersService.createReseller(dto) - } - - @ApiOperation({ summary: "get Resellers ==> admin route" }) - @PermissionsDec(PermissionEnum.RESELLER) - @Get("reseller") - getResellers( ) { - return this.usersService.getResellersList() - } + } diff --git a/src/modules/users/users.module.ts b/src/modules/users/users.module.ts index f80a3d3..1d24e7a 100755 --- a/src/modules/users/users.module.ts +++ b/src/modules/users/users.module.ts @@ -28,12 +28,11 @@ import { AdminsService } from "./providers/admins.service"; import { CustomersService } from "./providers/customers.service"; import { RefreshTokensRepository } from "./repositories/refresh-token.repository"; import { ReferralsModule } from "../referrals/referrals.module"; -import { ResellerRepository } from "./repositories/reseller.repository"; -import { Reseller } from "./entities/reseller.entity"; + @Module({ imports: [ - TypeOrmModule.forFeature([User, Role, UserGroup, UserSetting, RealUser, LegalUser, Permission, RefreshToken,Reseller]), + TypeOrmModule.forFeature([User, Role, UserGroup, UserSetting, RealUser, LegalUser, Permission, RefreshToken]), WalletsModule, UtilsModule, AddressModule, @@ -54,9 +53,9 @@ import { Reseller } from "./entities/reseller.entity"; RealUserRepository, LegalUserRepository, AddressService, - ResellerRepository + ], controllers: [UsersController], exports: [UsersService, UserRepository, CustomersService, AdminsService, RefreshTokensRepository], }) -export class UsersModule {} +export class UsersModule { }