business list

This commit is contained in:
2026-03-12 12:52:28 +03:30
parent 40826b9381
commit 79d36aa6fe
8 changed files with 90 additions and 21 deletions
-1
View File
@@ -1,4 +1,3 @@
export { BusinessSlug } from './rest-slug.decorator';
export { AdminId } from './admin-id.decorator'; export { AdminId } from './admin-id.decorator';
export { BusinessId } from './business-id.decorator'; export { BusinessId } from './business-id.decorator';
export { RateLimit } from './rate-limit.decorator'; export { RateLimit } from './rate-limit.decorator';
@@ -49,7 +49,7 @@ export class AuthController {
// //super admin routes // //super admin routes
// @UseGuards(SuperAdminAuthGuard) @UseGuards(SuperAdminAuthGuard)
@Post('super-admin/auth/direct-login') @Post('super-admin/auth/direct-login')
@ApiOperation({ summary: 'Direct login for DSC - returns login credentials' }) @ApiOperation({ summary: 'Direct login for DSC - returns login credentials' })
@ApiBody({ type: DirectLoginDto, description: 'Danak Subscriptionid' }) @ApiBody({ type: DirectLoginDto, description: 'Danak Subscriptionid' })
+5 -6
View File
@@ -12,7 +12,6 @@ import { Request } from 'express';
import { JwtService } from '@nestjs/jwt'; import { JwtService } from '@nestjs/jwt';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { IAdminTokenPayload } from '../interfaces/IToken-payload'; import { IAdminTokenPayload } from '../interfaces/IToken-payload';
import { PERMISSIONS_KEY } from '../../../common/decorators/permissions.decorator';
export interface AdminAuthRequest extends Request { export interface AdminAuthRequest extends Request {
adminId: string; adminId: string;
@@ -62,12 +61,12 @@ export class AdminAuthGuard implements CanActivate {
request['restId'] = payload.restId; request['restId'] = payload.restId;
// check if the user has the required permissions // check if the user has the required permissions
const requiredPermissions = // const requiredPermissions =
this.reflector.getAllAndOverride<string[]>(PERMISSIONS_KEY, [context.getHandler(), context.getClass()]) ?? []; // this.reflector.getAllAndOverride<string[]>(PERMISSIONS_KEY, [context.getHandler(), context.getClass()]) ?? [];
if (!requiredPermissions || requiredPermissions.length === 0) { // if (!requiredPermissions || requiredPermissions.length === 0) {
return true; // return true;
} // }
+2 -2
View File
@@ -21,10 +21,10 @@ export class AuthService {
async directLogin(danakSubId: string) { async directLogin(danakSubId: string) {
const business = await this.businessService.findBySubIdOrFail(danakSubId) const business = await this.businessService.findBySubIdOrFail(danakSubId)
console.log(business)
const admin = business.admin const admin = business.admin
console.log(admin)
const tokens = await this.tokensService.generateAccessAndRefreshToken(admin.id, business.id); const tokens = await this.tokensService.generateAccessAndRefreshToken(admin.id, business.id);
return tokens return { tokens }
} }
// async requestOtp(dto: RequestOtpDto, isAdmin: boolean) { // async requestOtp(dto: RequestOtpDto, isAdmin: boolean) {
+6 -4
View File
@@ -1,10 +1,12 @@
import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards } from '@nestjs/common'; import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards, Query } from '@nestjs/common';
import { BusinessService } from './business.service'; import { BusinessService } from './business.service';
import { SetupBusinessDto } from './dto/create-business.dto'; import { SetupBusinessDto } from './dto/create-business.dto';
import { UpdateBusinessDto } from './dto/update-business.dto'; import { UpdateBusinessDto } from './dto/update-business.dto';
import { SuperAdminAuthGuard } from '../auth/guards/superAdminAuth.guard'; import { SuperAdminAuthGuard } from '../auth/guards/superAdminAuth.guard';
import { FindBusinessesDto } from './dto/find-businesses.dto';
@Controller('super-admin/business') @Controller('super-admin/business')
@UseGuards(SuperAdminAuthGuard)
export class BusinessController { export class BusinessController {
constructor(private readonly businessService: BusinessService) { } constructor(private readonly businessService: BusinessService) { }
@@ -14,9 +16,9 @@ export class BusinessController {
return this.businessService.setupAccount(dto); return this.businessService.setupAccount(dto);
} }
@Get() @Get('list')
findAll() { findAll(@Query() dto :FindBusinessesDto) {
return this.businessService.findAll(); return this.businessService.findAll(dto);
} }
// @Get(':id') // @Get(':id')
+3 -2
View File
@@ -5,6 +5,7 @@ import { EntityManager } from '@mikro-orm/postgresql';
import { Business } from './entities/business.entity'; import { Business } from './entities/business.entity';
import { Admin } from '../admin/entities/admin.entity'; import { Admin } from '../admin/entities/admin.entity';
import { BusinessRepository } from './repositories/business.repository'; import { BusinessRepository } from './repositories/business.repository';
import { FindBusinessesDto } from './dto/find-businesses.dto';
@Injectable() @Injectable()
export class BusinessService { export class BusinessService {
@@ -38,8 +39,8 @@ export class BusinessService {
return business return business
} }
findAll() { findAll(dto: FindBusinessesDto) {
return `This action returns all business`; return this.businessRepository.findAllPaginated(dto)
} }
async findBySubIdOrFail(danakSubscriptionId: string) { async findBySubIdOrFail(danakSubscriptionId: string) {
@@ -0,0 +1,35 @@
import { IsOptional, IsNumber, IsString, IsIn, IsBoolean } from 'class-validator';
import { ApiPropertyOptional } from '@nestjs/swagger';
import { Type } from 'class-transformer';
export class FindBusinessesDto {
@IsOptional()
@IsNumber()
@Type(() => Number)
@ApiPropertyOptional({ example: 1 })
page?: number;
@IsOptional()
@IsNumber()
@Type(() => Number)
@ApiPropertyOptional({ example: 10 })
limit?: number;
@IsOptional()
@IsString()
@ApiPropertyOptional({ example: 'createdAt' })
orderBy?: string;
@IsOptional()
@IsIn(['asc', 'desc'])
@ApiPropertyOptional({ example: 'desc' })
order?: 'asc' | 'desc';
@IsOptional()
@IsBoolean()
@Type(() => Boolean)
@ApiPropertyOptional({ example: true })
isActive?: boolean;
}
@@ -1,5 +1,38 @@
import { EntityRepository } from "@mikro-orm/postgresql"; import { EntityRepository, FilterQuery } from "@mikro-orm/postgresql";
import { Business } from "../entities/business.entity"; import { Business } from "../entities/business.entity";
import { FindBusinessesDto } from "../dto/find-businesses.dto";
import { PaginatedResult } from "src/common/interfaces/pagination.interface";
export class BusinessRepository extends EntityRepository<Business> {} export class BusinessRepository extends EntityRepository<Business> {
async findAllPaginated(opts: FindBusinessesDto = {}): Promise<PaginatedResult<Business>> {
const { page = 1, limit = 10, orderBy = 'createdAt', order = 'desc', isActive } = opts;
const offset = (page - 1) * limit;
const where: FilterQuery<Business> = {};
const [data, total] = await this.findAndCount(where, {
limit,
offset,
orderBy: { [orderBy]: order.toLowerCase() as 'asc' | 'desc' },
populate: [],
});
const totalPages = Math.ceil(total / limit);
return {
data,
meta: {
total,
page,
limit,
totalPages,
},
};
}
}