update license structures and setup file storage services

This commit is contained in:
2026-04-16 22:19:20 +03:30
parent d098ef10e1
commit ca494ee82a
75 changed files with 4550 additions and 1255 deletions
@@ -17,7 +17,10 @@ export class CreateLicenseDto {
)
expires_at?: Date
@ApiProperty()
@ApiProperty({
required: true,
nullable: false,
})
partner_id: string
}
@@ -1,6 +1,6 @@
import { Body, Controller, Param, Patch, Post } from '@nestjs/common'
import { Body, Controller, Get, Param, Post } from '@nestjs/common'
import { ApiTags } from '@nestjs/swagger'
import { CreateLicenseDto, UpdateLicenseDto } from './dto/license.dto'
import { CreateLicenseDto } from './dto/license.dto'
import { LicensesService } from './licenses.service'
@ApiTags('AdminConsumerAccounts')
@@ -8,15 +8,20 @@ import { LicensesService } from './licenses.service'
export class LicensesController {
constructor(private readonly service: LicensesService) {}
@Get()
async findAll(@Param('consumerId') consumerId: string) {
return this.service.findAll(consumerId)
}
@Post()
async create(@Param('consumerId') consumerId: string, @Body() data: CreateLicenseDto) {
return this.service.create(consumerId, data)
}
@Patch(':id')
async update(@Param('id') id: string, @Body() data: UpdateLicenseDto) {
return this.service.update(id, data)
}
// @Patch(':id')
// async update(@Param('id') id: string, @Body() data: UpdateLicenseDto) {
// return this.service.update(id, data)
// }
// @Delete(':id')
// async delete(@Param('id') id: string) {
@@ -1,13 +1,16 @@
import { LicenseStatus } from '@/generated/prisma/enums'
import { LicenseUpdateInput } from '@/generated/prisma/models'
import { PartnerStatus } from '@/generated/prisma/enums'
import { PrismaService } from '@/prisma/prisma.service'
import { BadRequestException, Injectable } from '@nestjs/common'
import { ResponseMapper } from 'common/response/response-mapper'
import { CreateLicenseDto, UpdateLicenseDto } from './dto/license.dto'
import { CreateLicenseDto } from './dto/license.dto'
@Injectable()
export class LicensesService {
constructor(private readonly prisma: PrismaService) {}
private startOfToday = new Date()
constructor(private readonly prisma: PrismaService) {
this.startOfToday.setHours(0, 0, 0, 0)
}
private readonly setExpireDate = (starts_at: Date) => {
return new Date(
@@ -15,85 +18,143 @@ export class LicensesService {
).toISOString()
}
async create(consumerId: string, data: CreateLicenseDto) {
const { starts_at, expires_at } = data
const license = await this.prisma.license.create({
data: {
starts_at,
expires_at: expires_at ?? this.setExpireDate(starts_at),
partner: {
connect: {
id: data.partner_id,
async findAll(consumer_id: string) {
const licenses = await this.prisma.activatedLicense.findMany({
where: {
consumer_id,
},
select: {
id: true,
starts_at: true,
expires_at: true,
created_at: true,
license: {
select: {
id: true,
charged_license_transaction: {
select: {
partner: {
select: {
id: true,
name: true,
},
},
},
},
},
},
consumer: {
connect: {
id: consumerId,
},
},
status: LicenseStatus.ACTIVE,
},
})
return ResponseMapper.create(license)
return ResponseMapper.list(licenses)
}
async update(id: string, data: UpdateLicenseDto) {
async create(consumerId: string, data: CreateLicenseDto) {
const { starts_at, expires_at, partner_id } = data
const currentLicense = await this.prisma.license.findUnique({
where: { id },
select: {
partner_id: true,
},
})
if (partner_id && currentLicense?.partner_id !== partner_id) {
const partner = await this.prisma.partner.findUnique({
const license = await this.prisma.$transaction(async tx => {
const partnerLicense = await tx.license.findFirst({
where: {
id: partner_id,
activated_license: null,
charged_license_transaction: {
activation_expires_at: {
gte: this.startOfToday,
},
partner: {
id: partner_id,
status: PartnerStatus.ACTIVE,
},
},
},
select: {
name: true,
license_quota: true,
_count: {
select: {
licenses: true,
id: true,
},
})
if (!partnerLicense) {
throw new BadRequestException(
`تعداد لایسنس‌های فعلی شریک تجاری به پایان رسیده است.`,
)
}
return await this.prisma.activatedLicense.create({
data: {
starts_at,
expires_at: expires_at ?? this.setExpireDate(starts_at),
consumer: {
connect: {
id: consumerId,
},
},
license: {
connect: {
id: partnerLicense.id,
},
},
},
})
if (!((partner?.license_quota || 0) - (partner?._count.licenses || 0))) {
throw new BadRequestException(`تعداد لایسنس‌های ${partner?.name} کافی نیست.`)
}
}
const dataToUpdate: LicenseUpdateInput = {}
if (partner_id) {
dataToUpdate.partner = {
connect: {
id: partner_id,
},
}
} else if (currentLicense?.partner_id) {
dataToUpdate.partner = {
disconnect: {
id: currentLicense?.partner_id,
},
}
}
if (starts_at) {
dataToUpdate.starts_at = starts_at
dataToUpdate.expires_at = this.setExpireDate(starts_at)
}
const license = await this.prisma.license.update({
where: { id },
data: {
...dataToUpdate,
},
})
return ResponseMapper.update(license)
return ResponseMapper.create(license)
}
// async update(id: string, data: UpdateLicenseDto) {
// const { starts_at, expires_at, partner_id } = data
// const currentLicense = await this.prisma.license.findUnique({
// where: { id },
// select: {
// partner_id: true,
// },
// })
// if (partner_id && currentLicense?.partner_id !== partner_id) {
// const partner = await this.prisma.partner.findUnique({
// where: {
// id: partner_id,
// },
// select: {
// name: true,
// license_quota: true,
// _count: {
// select: {
// licenses: true,
// },
// },
// },
// })
// if (!((partner?.license_quota || 0) - (partner?._count.licenses || 0))) {
// throw new BadRequestException(`تعداد لایسنس‌های ${partner?.name} کافی نیست.`)
// }
// }
// const dataToUpdate: LicenseUpdateInput = {}
// if (partner_id) {
// dataToUpdate.partner = {
// connect: {
// id: partner_id,
// },
// }
// } else if (currentLicense?.partner_id) {
// dataToUpdate.partner = {
// disconnect: {
// id: currentLicense?.partner_id,
// },
// }
// }
// if (starts_at) {
// dataToUpdate.starts_at = starts_at
// dataToUpdate.expires_at = this.setExpireDate(starts_at)
// }
// const license = await this.prisma.license.update({
// where: { id },
// data: {
// ...dataToUpdate,
// },
// })
// return ResponseMapper.update(license)
// }
}