diff --git a/scripts/pull-triggers.ts b/scripts/pull-triggers.ts index 6d99601..646e606 100644 --- a/scripts/pull-triggers.ts +++ b/scripts/pull-triggers.ts @@ -18,7 +18,5 @@ import { env } from 'prisma/config' WHERE TRIGGER_SCHEMA = DATABASE(); `) - console.log(rows) - await db.end() })() diff --git a/src/common/decorators/withToken.decorator.ts b/src/common/decorators/withToken.decorator.ts new file mode 100644 index 0000000..4d22b6e --- /dev/null +++ b/src/common/decorators/withToken.decorator.ts @@ -0,0 +1,4 @@ +import { SetMetadata } from '@nestjs/common' + +export const IS_PUBLIC_WITH_TOKEN_KEY = 'IS_PUBLIC_WITH_TOKEN_KEY' +export const PublicWithToken = () => SetMetadata(IS_PUBLIC_WITH_TOKEN_KEY, true) diff --git a/src/common/guards/jwt-auth.guard.ts b/src/common/guards/jwt-auth.guard.ts index 205ef86..a889175 100644 --- a/src/common/guards/jwt-auth.guard.ts +++ b/src/common/guards/jwt-auth.guard.ts @@ -10,6 +10,7 @@ import { Reflector } from '@nestjs/core' import { JwtService } from '@nestjs/jwt' import { Request as ExpressRequest } from 'express' import { IS_PUBLIC_KEY } from '../decorators/public.decorator' +import { IS_PUBLIC_WITH_TOKEN_KEY } from '../decorators/withToken.decorator' import { ConsumerGuard } from './auth-consumer.guard' import { PosGuard } from './auth-pos.guard' @@ -43,6 +44,14 @@ export class JwtAuthGuard implements CanActivate { if (!token) throw new UnauthorizedException('Missing access token') + const isPublicWithToken = this.reflector.getAllAndOverride( + IS_PUBLIC_WITH_TOKEN_KEY, + [context.getHandler(), context.getClass()], + ) + if (isPublicWithToken) { + return true + } + try { this.jwt.verify(token, { secret: process.env.JWT_SECRET, diff --git a/src/modules/admin/partners/dto/partner.dto.ts b/src/modules/admin/partners/dto/partner.dto.ts index 142e08c..f5ff9bc 100644 --- a/src/modules/admin/partners/dto/partner.dto.ts +++ b/src/modules/admin/partners/dto/partner.dto.ts @@ -30,3 +30,12 @@ export class UpdatePartnerDto extends PartialType(CreatePartnerDto) { @ApiProperty({ enum: PartnerStatus }) status: PartnerStatus } + +export class LicenseChargeDto { + @IsNumber() + @ApiProperty({ + required: true, + minimum: 0, + }) + count: number +} diff --git a/src/modules/admin/partners/partners.controller.ts b/src/modules/admin/partners/partners.controller.ts index ad226cd..38e479f 100644 --- a/src/modules/admin/partners/partners.controller.ts +++ b/src/modules/admin/partners/partners.controller.ts @@ -1,5 +1,5 @@ import { Body, Controller, Delete, Get, Param, Patch, Post } from '@nestjs/common' -import { CreatePartnerDto, UpdatePartnerDto } from './dto/partner.dto' +import { CreatePartnerDto, LicenseChargeDto, UpdatePartnerDto } from './dto/partner.dto' import { PartnersService } from './partners.service' @Controller('admin/partners') @@ -26,6 +26,11 @@ export class PartnersController { return this.partnersService.update(id, data) } + @Post(':id/charge-license') + async licenseCharge(@Param('id') id: string, @Body() data: LicenseChargeDto) { + return this.partnersService.licenseCharge(id, data) + } + @Delete(':id') async delete(@Param('id') id: string) { return this.partnersService.delete(id) diff --git a/src/modules/admin/partners/partners.service.ts b/src/modules/admin/partners/partners.service.ts index 7c2e6df..2fdea4a 100644 --- a/src/modules/admin/partners/partners.service.ts +++ b/src/modules/admin/partners/partners.service.ts @@ -8,7 +8,7 @@ import { import { PrismaService } from '@/prisma/prisma.service' import { Injectable } from '@nestjs/common' import { ResponseMapper } from 'common/response/response-mapper' -import { CreatePartnerDto, UpdatePartnerDto } from './dto/partner.dto' +import { CreatePartnerDto, LicenseChargeDto, UpdatePartnerDto } from './dto/partner.dto' @Injectable() export class PartnersService { @@ -69,6 +69,18 @@ export class PartnersService { return ResponseMapper.update(partner) } + async licenseCharge(id: string, data: LicenseChargeDto) { + const partner = await this.prisma.partner.update({ + where: { id }, + data: { + license_quota: { + increment: data.count, + }, + }, + }) + return ResponseMapper.update(partner) + } + async delete(id: string) { await this.prisma.partner.delete({ where: { id } }) return ResponseMapper.delete() diff --git a/src/modules/enums/enums.controller.ts b/src/modules/enums/enums.controller.ts index bf4636c..09f4b04 100644 --- a/src/modules/enums/enums.controller.ts +++ b/src/modules/enums/enums.controller.ts @@ -1,3 +1,4 @@ +import { PublicWithToken } from '@/common/decorators/withToken.decorator' import { Controller, Get } from '@nestjs/common' import { EnumsService } from './enums.service' @@ -6,86 +7,103 @@ export class EnumsController { constructor(private readonly enumsService: EnumsService) {} @Get('gold_karat') + @PublicWithToken() async getGoldKarat() { return this.enumsService.getEnumValues('GoldKarat') } @Get('user_status') + @PublicWithToken() async getUserStatus() { return this.enumsService.getEnumValues('UserStatus') } @Get('account_role') + @PublicWithToken() async getAccountRole() { return this.enumsService.getEnumValues('AccountRole') } @Get('account_status') + @PublicWithToken() async getAccountStatus() { return this.enumsService.getEnumValues('AccountStatus') } @Get('pos_status') + @PublicWithToken() async getPOSStatus() { return this.enumsService.getEnumValues('POSStatus') } @Get('pos_role') + @PublicWithToken() async getPOSRole() { return this.enumsService.getEnumValues('POSRole') } @Get('license_type') + @PublicWithToken() async getLicenseType() { return this.enumsService.getEnumValues('LicenseType') } @Get('license_status') + @PublicWithToken() async getLicenseStatus() { return this.enumsService.getEnumValues('LicenseStatus') } @Get('pos_type') + @PublicWithToken() async getPOSType() { return this.enumsService.getEnumValues('POSType') } @Get('user_type') + @PublicWithToken() async getUserType() { return this.enumsService.getEnumValues('UserType') } @Get('account_type') + @PublicWithToken() async getAccountType() { return this.enumsService.getEnumValues('AccountType') } @Get('partner_role') + @PublicWithToken() async getPartnerRole() { return this.enumsService.getEnumValues('PartnerRole') } @Get('business_role') + @PublicWithToken() async getBusinessRole() { return this.enumsService.getEnumValues('BusinessRole') } @Get('provider_role') + @PublicWithToken() async getProviderRole() { return this.enumsService.getEnumValues('ProviderRole') } @Get('token_type') + @PublicWithToken() async getTokenType() { return this.enumsService.getEnumValues('TokenType') } @Get('unit_type') + @PublicWithToken() async getUnitType() { return this.enumsService.getEnumValues('UnitType') } @Get('good_pricing_model') + @PublicWithToken() async getGoodPricingModel() { return this.enumsService.getEnumValues('GoodPricingModel') }