seperate module for reseller

This commit is contained in:
2026-04-12 15:30:08 +03:30
parent 84ed654739
commit fccea733e3
12 changed files with 119 additions and 54 deletions
+3 -1
View File
@@ -45,6 +45,7 @@ import { WalletsModule } from "./modules/wallets/wallets.module";
import { DkalaModule } from "./modules/dkala/dkala.module"; import { DkalaModule } from "./modules/dkala/dkala.module";
import { DpageModule } from './modules/dpage/dpage.module'; import { DpageModule } from './modules/dpage/dpage.module';
import { DmailModule } from './modules/dmail/dmail.module'; import { DmailModule } from './modules/dmail/dmail.module';
import { ResellerModule } from './modules/reseller/reseller.module';
@Module({ @Module({
imports: [ imports: [
// TelegrafModule.forRootAsync(telegrafConfig()), // TelegrafModule.forRootAsync(telegrafConfig()),
@@ -92,7 +93,8 @@ import { DmailModule } from './modules/dmail/dmail.module';
DmenuModule, DmenuModule,
DkalaModule, DkalaModule,
DpageModule, DpageModule,
DmailModule DmailModule,
ResellerModule
], ],
controllers: [], controllers: [],
}) })
+19
View File
@@ -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;
}
@@ -0,0 +1,4 @@
import { PartialType } from '@nestjs/swagger';
import { CreateResellerDto } from './create-reseller.dto';
export class UpdateResellerDto extends PartialType(CreateResellerDto) {}
@@ -1,6 +1,6 @@
import { Column, Entity, JoinColumn, OneToMany, OneToOne } from "typeorm"; 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"; import { BaseEntity } from "../../../common/entities/base.entity";
@Entity() @Entity()
@@ -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()
}
}
+14
View File
@@ -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 { }
+40
View File
@@ -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
}
})
}
}
+1 -1
View File
@@ -30,7 +30,7 @@ import { TicketMessage } from "../../tickets/entities/ticket-message.entity";
import { Ticket } from "../../tickets/entities/ticket.entity"; import { Ticket } from "../../tickets/entities/ticket.entity";
import { Wallet } from "../../wallets/entities/wallet.entity"; import { Wallet } from "../../wallets/entities/wallet.entity";
import { FinancialType } from "../enums/financial-type.enum"; import { FinancialType } from "../enums/financial-type.enum";
import { Reseller } from "./reseller.entity"; import { Reseller } from "../../reseller/entities/reseller.entity";
@Entity() @Entity()
export class User extends BaseEntity { export class User extends BaseEntity {
+1 -28
View File
@@ -30,8 +30,7 @@ import { LegalUserRepository } from "../repositories/legal-user.repository";
import { RealUserRepository } from "../repositories/real-user.repository"; import { RealUserRepository } from "../repositories/real-user.repository";
import { UserGroupRepository } from "../repositories/user-group.repository"; import { UserGroupRepository } from "../repositories/user-group.repository";
import { UserRepository } from "../repositories/users.repository"; import { UserRepository } from "../repositories/users.repository";
import { ResellerRepository } from "../repositories/reseller.repository";
import { CreateResellerDto } from "../DTO/create-reseller.dto";
@Injectable() @Injectable()
export class UsersService { export class UsersService {
private readonly logger = new Logger(UsersService.name); private readonly logger = new Logger(UsersService.name);
@@ -49,7 +48,6 @@ export class UsersService {
private readonly smsService: SmsService, private readonly smsService: SmsService,
private readonly cacheService: CacheService, private readonly cacheService: CacheService,
private readonly referralsService: ReferralsService, private readonly referralsService: ReferralsService,
private readonly resellerRepository: ResellerRepository,
) { } ) { }
/************************************************************ */ /************************************************************ */
@@ -385,15 +383,7 @@ export class UsersService {
return { agent }; return { agent };
} }
/************************************************************ */
async getResellersList() {
this.resellerRepository.find({
relations: {
owner: true
}
})
}
/************************************************************ */ /************************************************************ */
private async createEmailHashLink(email: string) { 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
}
} }
-15
View File
@@ -29,7 +29,6 @@ import { IUserIpAndHeaders, UserDec, UserIpAndHeaders } from "../../common/decor
import { ParamDto } from "../../common/DTO/param.dto"; import { ParamDto } from "../../common/DTO/param.dto";
import { RequestOtpDto } from "../auth/DTO/request-otp.dto"; import { RequestOtpDto } from "../auth/DTO/request-otp.dto";
import { VerifyOtpDto } from "../auth/DTO/verify-otp.dto"; import { VerifyOtpDto } from "../auth/DTO/verify-otp.dto";
import { CreateResellerDto } from "./DTO/create-reseller.dto";
@AuthGuards() @AuthGuards()
@Controller("users") @Controller("users")
@@ -230,19 +229,5 @@ export class UsersController {
return this.adminsService.createRole(createDto); 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()
}
} }
+3 -4
View File
@@ -28,12 +28,11 @@ import { AdminsService } from "./providers/admins.service";
import { CustomersService } from "./providers/customers.service"; import { CustomersService } from "./providers/customers.service";
import { RefreshTokensRepository } from "./repositories/refresh-token.repository"; import { RefreshTokensRepository } from "./repositories/refresh-token.repository";
import { ReferralsModule } from "../referrals/referrals.module"; import { ReferralsModule } from "../referrals/referrals.module";
import { ResellerRepository } from "./repositories/reseller.repository";
import { Reseller } from "./entities/reseller.entity";
@Module({ @Module({
imports: [ imports: [
TypeOrmModule.forFeature([User, Role, UserGroup, UserSetting, RealUser, LegalUser, Permission, RefreshToken,Reseller]), TypeOrmModule.forFeature([User, Role, UserGroup, UserSetting, RealUser, LegalUser, Permission, RefreshToken]),
WalletsModule, WalletsModule,
UtilsModule, UtilsModule,
AddressModule, AddressModule,
@@ -54,7 +53,7 @@ import { Reseller } from "./entities/reseller.entity";
RealUserRepository, RealUserRepository,
LegalUserRepository, LegalUserRepository,
AddressService, AddressService,
ResellerRepository
], ],
controllers: [UsersController], controllers: [UsersController],
exports: [UsersService, UserRepository, CustomersService, AdminsService, RefreshTokensRepository], exports: [UsersService, UserRepository, CustomersService, AdminsService, RefreshTokensRepository],