create license management

This commit is contained in:
2026-04-06 13:31:40 +03:30
parent c02e7afca1
commit 1160d81cdb
42 changed files with 1233 additions and 522 deletions
@@ -0,0 +1,37 @@
import { LicenseStatus } from '@/generated/prisma/enums'
import { ApiProperty, OmitType, PartialType } from '@nestjs/swagger'
import { IsDateString, IsEnum } from 'class-validator'
export class CreateLicenseDto {
@ApiProperty({ required: true, default: new Date().toISOString() })
@IsDateString(
{ strict: true },
{ message: 'invoice_date must be a valid ISO-8601 string' },
)
starts_at: Date
@ApiProperty()
@IsDateString(
{ strict: true },
{ message: 'invoice_date must be a valid ISO-8601 string' },
)
expires_at?: Date
@ApiProperty()
partner_id: string
}
export class UpdateLicenseDto extends OmitType(PartialType(CreateLicenseDto), [
'starts_at',
]) {
@ApiProperty({ required: true, default: new Date().toISOString() })
@IsDateString(
{ strict: true },
{ message: 'invoice_date must be a valid ISO-8601 string' },
)
starts_at: Date
@ApiProperty({ enum: LicenseStatus })
@IsEnum(LicenseStatus)
status?: LicenseStatus
}
@@ -0,0 +1,25 @@
import { Body, Controller, Param, Patch, Post } from '@nestjs/common'
import { ApiTags } from '@nestjs/swagger'
import { CreateLicenseDto, UpdateLicenseDto } from './dto/license.dto'
import { LicensesService } from './licenses.service'
@ApiTags('AdminConsumerAccounts')
@Controller('admin/consumers/:consumerId/licenses')
export class LicensesController {
constructor(private readonly service: LicensesService) {}
@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)
}
// @Delete(':id')
// async delete(@Param('id') id: string) {
// return this.service.delete(id)
// }
}
@@ -0,0 +1,12 @@
import { PrismaModule } from '@/prisma/prisma.module'
import { Module } from '@nestjs/common'
import { LicensesController } from './licenses.controller'
import { LicensesService } from './licenses.service'
@Module({
imports: [PrismaModule],
controllers: [LicensesController],
providers: [LicensesService],
exports: [LicensesService],
})
export class AdminConsumerLicensesModule {}
@@ -0,0 +1,51 @@
import { LicenseStatus } from '@/generated/prisma/enums'
import { PrismaService } from '@/prisma/prisma.service'
import { Injectable } from '@nestjs/common'
import { ResponseMapper } from 'common/response/response-mapper'
import { CreateLicenseDto, UpdateLicenseDto } from './dto/license.dto'
@Injectable()
export class LicensesService {
constructor(private readonly prisma: PrismaService) {}
private readonly setExpireDate = (starts_at: Date) => {
return new Date(
new Date(starts_at).setFullYear(new Date(starts_at).getFullYear() + 1),
).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,
},
},
consumers: {
connect: {
id: consumerId,
},
},
status: LicenseStatus.ACTIVE,
},
})
return ResponseMapper.create(license)
}
async update(id: string, data: UpdateLicenseDto) {
const { starts_at, expires_at } = data
const license = await this.prisma.license.update({
where: { id },
data: {
...data,
starts_at,
expires_at: expires_at ?? this.setExpireDate(starts_at),
},
})
return ResponseMapper.update(license)
}
}