feat: add field validators for username and password, and integrate them into DTOs

This commit is contained in:
2026-05-19 20:34:05 +03:30
parent d526f6ed2c
commit 98099e97e7
17 changed files with 136 additions and 33 deletions
@@ -1,13 +1,16 @@
import { PasswordFieldValidator, UsernameFieldValidator } from '@/common/utils'
import { ApiProperty, PartialType } from '@nestjs/swagger'
import { IsEnum, IsOptional, IsString } from 'class-validator'
import { AccountStatus, ConsumerRole } from 'generated/prisma/enums'
export class CreateConsumerAccountDto {
@IsString()
@UsernameFieldValidator()
@ApiProperty({ required: true })
username: string
@IsString()
@PasswordFieldValidator()
@ApiProperty({ required: true })
password: string
@@ -1,3 +1,4 @@
import { PasswordFieldValidator, UsernameFieldValidator } from '@/common/utils'
import { ConsumerStatus } from '@/generated/prisma/enums'
import { ApiProperty, OmitType, PartialType } from '@nestjs/swagger'
import { IsEnum, IsOptional, IsString } from 'class-validator'
@@ -16,10 +17,12 @@ export class CreateConsumerDto {
last_name: string
@IsString()
@UsernameFieldValidator()
@ApiProperty({ required: true })
username: string
@IsString()
@PasswordFieldValidator()
@ApiProperty({ required: true })
password: string
@@ -1,3 +1,4 @@
import { PasswordFieldValidator, UsernameFieldValidator } from '@/common/utils'
import { PartnerStatus, TspProviderType } from '@/generated/prisma/enums'
import { ApiProperty, PartialType } from '@nestjs/swagger'
import { IsEnum, IsNumber, IsOptional, IsString } from 'class-validator'
@@ -21,10 +22,12 @@ export class CreatePartnerDto {
// license_quota?: number
@IsString()
@UsernameFieldValidator()
@ApiProperty({ required: true })
username: string
@IsString()
@PasswordFieldValidator()
@ApiProperty({ required: true })
password: string
@@ -1,3 +1,4 @@
import { PasswordFieldValidator, UsernameFieldValidator } from '@/common/utils'
import { ApiProperty, PartialType } from '@nestjs/swagger'
import { IsEnum, IsOptional, IsString } from 'class-validator'
import { PartnerRole } from 'generated/prisma/enums'
@@ -5,9 +6,11 @@ import { PartnerRole } from 'generated/prisma/enums'
export class CreatePartnerAccountDto {
@IsString()
@ApiProperty({})
@UsernameFieldValidator()
username: string
@IsString()
@PasswordFieldValidator()
@ApiProperty({})
password: string
}
@@ -1,13 +1,16 @@
import { PasswordFieldValidator, UsernameFieldValidator } from '@/common/utils'
import { ApiProperty, PartialType } from '@nestjs/swagger'
import { IsEnum, IsOptional, IsString } from 'class-validator'
import { AccountStatus, AccountType } from 'generated/prisma/enums'
export class CreateAccountDto {
@IsString()
@UsernameFieldValidator()
@ApiProperty()
username: string
@IsString()
@PasswordFieldValidator()
@ApiProperty()
password: string
+5 -2
View File
@@ -2,11 +2,14 @@ import { ApiProperty } from '@nestjs/swagger'
import { IsBoolean, IsOptional, IsString } from 'class-validator'
export class LoginDto {
@ApiProperty({ description: 'Mobile number used as username', example: '09120258156' })
@ApiProperty({
description: 'you can use your mobile number as username',
example: '09120258156',
})
@IsString()
username: string
@ApiProperty({ description: 'OTP password (one-time password)', example: '11111' })
@ApiProperty({ example: '11111' })
@IsString()
password: string
+6 -12
View File
@@ -52,20 +52,14 @@ export class CatalogsService {
async getSKU(search: string) {
const items = await this.prisma.stockKeepingUnits.findMany({
// where: {
// OR: [{ code: { contains: search } }, { name: { contains: search } }],
// },
select: {
id: true,
code: true,
name: true,
is_domestic: true,
is_public: true,
VAT: true,
},
take: 100,
})
return ResponseMapper.list(items)
const mappedItems = items.map(item => ({
...item,
fullname: `${item.code} - ${item.name}`,
}))
return ResponseMapper.list(mappedItems)
}
async getGuildGoodCategories(guild_id: string) {
@@ -1,13 +1,16 @@
import { PasswordFieldValidator, UsernameFieldValidator } from '@/common/utils'
import { ApiProperty, PartialType } from '@nestjs/swagger'
import { IsEnum, IsOptional, IsString } from 'class-validator'
import { AccountStatus } from 'generated/prisma/enums'
export class CreateConsumerAccountDto {
@IsString()
@UsernameFieldValidator()
@ApiProperty({ required: true })
username: string
@IsString()
@PasswordFieldValidator()
@ApiProperty({ required: true })
password: string
@@ -1,13 +1,16 @@
import { PasswordFieldValidator, UsernameFieldValidator } from '@/common/utils'
import { ApiProperty, PartialType } from '@nestjs/swagger'
import { IsEnum, IsOptional, IsString } from 'class-validator'
import { AccountStatus, ConsumerRole } from 'generated/prisma/enums'
export class CreateConsumerAccountDto {
@IsString()
@UsernameFieldValidator()
@ApiProperty({ required: true })
username: string
@IsString()
@PasswordFieldValidator()
@ApiProperty({ required: true })
password: string
@@ -1,9 +1,12 @@
import { RedisKeyMaker } from '@/common/utils'
import { BusinessActivitySelect } from '@/generated/prisma/models'
import {
BusinessActivityCreateInput,
BusinessActivitySelect,
} from '@/generated/prisma/models'
import { getPartnerFirstRemainingLicense } from '@/modules/partners/utils/getPartnerRemainingLicenses.util'
import { PrismaService } from '@/prisma/prisma.service'
import { RedisService } from '@/redis/redis.service'
import { BadRequestException, Injectable } from '@nestjs/common'
import { Injectable } from '@nestjs/common'
import { ResponseMapper } from 'common/response/response-mapper'
import { PartnersCacheInvalidationService } from '../../cache/partners-cache-invalidation.service'
import { CreateBusinessActivitiesDto } from './dto/create-business-activities.dto'
@@ -158,6 +161,37 @@ export class BusinessActivitiesService {
const license = await getPartnerFirstRemainingLicense(tx, { partner_id })
const { guild_id, license_starts_at, expires_at, ...rest } = data
const dataToCreate: BusinessActivityCreateInput = {
...rest,
economic_code: String(data.economic_code),
guild: {
connect: {
id: guild_id,
},
},
consumer: {
connect: {
id: consumer_id,
},
},
}
if (license_starts_at) {
dataToCreate.license_activation = {
create: {
starts_at: license_starts_at ?? new Date(),
expires_at:
expires_at ?? this.setExpireDate(new Date(license_starts_at || '')),
license: {
connect: {
id: license.id,
},
},
},
}
}
const createdBusinessActivity = await tx.businessActivity.create({
data: {
...rest,
@@ -196,25 +230,23 @@ export class BusinessActivitiesService {
})
const activationId = createdBusinessActivity.license_activation?.id
if (!activationId) {
throw new BadRequestException('لایسنس برای این فعالیت تجاری ایجاد نشد.')
}
const licenseAllocationCreation = Array.from({
length: license.accounts_limit,
}).map(() =>
tx.licenseAccountAllocation.create({
data: {
license_activation: {
connect: {
id: activationId,
if (activationId) {
const licenseAllocationCreation = Array.from({
length: license.accounts_limit,
}).map(() =>
tx.licenseAccountAllocation.create({
data: {
license_activation: {
connect: {
id: activationId,
},
},
},
},
}),
)
}),
)
await Promise.all(licenseAllocationCreation)
await Promise.all(licenseAllocationCreation)
}
return tx.businessActivity.findUniqueOrThrow({
where: {
@@ -1,5 +1,6 @@
import { FiscalIdFieldValidator } from '@/common/utils'
import { ApiProperty, PartialType } from '@nestjs/swagger'
import { IsDateString, IsOptional, IsString } from 'class-validator'
import { IsDateString, IsNumber, IsOptional, IsString, Max, Min } from 'class-validator'
export class CreateBusinessActivitiesDto {
@IsString()
@@ -11,6 +12,7 @@ export class CreateBusinessActivitiesDto {
economic_code: string
@IsString()
@FiscalIdFieldValidator()
@ApiProperty({ required: true })
fiscal_id: string
@@ -22,6 +24,12 @@ export class CreateBusinessActivitiesDto {
@ApiProperty({ required: true })
guild_id: string
@ApiProperty({ required: false, default: '1' })
@IsNumber()
@Min(0)
@Max(1_000_000_000)
invoice_number_sequence: number
@IsDateString()
@IsOptional()
@ApiProperty({ required: false })
@@ -1,3 +1,4 @@
import { PasswordFieldValidator, UsernameFieldValidator } from '@/common/utils'
import { ConsumerIndividual, ConsumerLegal } from '@/generated/prisma/client'
import { ConsumerStatus, ConsumerType } from '@/generated/prisma/enums'
import { ApiProperty, OmitType, PartialType } from '@nestjs/swagger'
@@ -9,10 +10,12 @@ export class CreateConsumerDto {
type: ConsumerType
@IsString()
@UsernameFieldValidator()
@ApiProperty({ required: true })
username: string
@IsString()
@PasswordFieldValidator()
@ApiProperty({ required: true })
password: string