fix: bug in the customer and tikcet for admin panel
This commit is contained in:
@@ -507,6 +507,7 @@ export const enum FinancialMessage {
|
|||||||
NATIONAL_ID_STRING = "شناسه ملی باید یک رشته باشد",
|
NATIONAL_ID_STRING = "شناسه ملی باید یک رشته باشد",
|
||||||
ECONOMIC_CODE_NUMBER_STRING = "کد اقتصادی باید یک رشته عددی باشد",
|
ECONOMIC_CODE_NUMBER_STRING = "کد اقتصادی باید یک رشته عددی باشد",
|
||||||
REGISTRATION_ID_NUMBER_STRING = "شناسه ثبت باید یک رشته عددی باشد",
|
REGISTRATION_ID_NUMBER_STRING = "شناسه ثبت باید یک رشته عددی باشد",
|
||||||
|
SEARCH_QUERY_MUST_BE_A_STRING = "رشته جستجو باید یک رشته باشد",
|
||||||
}
|
}
|
||||||
|
|
||||||
export const enum AdminMessage {
|
export const enum AdminMessage {
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ export class InvoicesRepository extends Repository<Invoice> {
|
|||||||
.leftJoinAndSelect("invoice.user", "user")
|
.leftJoinAndSelect("invoice.user", "user")
|
||||||
.leftJoinAndSelect("invoice.items", "items")
|
.leftJoinAndSelect("invoice.items", "items")
|
||||||
.leftJoinAndSelect("items.subscriptionPlan", "subscriptionPlan", "subscriptionPlan.id IS NOT NULL")
|
.leftJoinAndSelect("items.subscriptionPlan", "subscriptionPlan", "subscriptionPlan.id IS NOT NULL")
|
||||||
.leftJoinAndSelect("subscriptionPlan.service", "service", "subscriptionPlan.id IS NOT NULL");
|
.leftJoinAndSelect("subscriptionPlan.plan", "plan", "subscriptionPlan.id IS NOT NULL")
|
||||||
|
.leftJoin("plan.service", "service", "subscriptionPlan.id IS NOT NULL")
|
||||||
|
.addSelect(["service.name", "service.id"]);
|
||||||
|
|
||||||
if (queryDto.q) {
|
if (queryDto.q) {
|
||||||
queryBuilder
|
queryBuilder
|
||||||
@@ -39,7 +41,7 @@ export class InvoicesRepository extends Repository<Invoice> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (queryDto.serviceId) {
|
if (queryDto.serviceId) {
|
||||||
queryBuilder.andWhere("subscriptionPlan.serviceId = :serviceId", { serviceId: queryDto.serviceId });
|
queryBuilder.andWhere("plan.serviceId = :serviceId", { serviceId: queryDto.serviceId });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (queryDto.since) {
|
if (queryDto.since) {
|
||||||
|
|||||||
@@ -1,12 +1,18 @@
|
|||||||
import { ApiPropertyOptional } from "@nestjs/swagger";
|
import { ApiPropertyOptional } from "@nestjs/swagger";
|
||||||
import { IsEnum, IsOptional } from "class-validator";
|
import { IsEnum, IsOptional, IsUUID } from "class-validator";
|
||||||
|
|
||||||
import { PaginationDto } from "../../../common/DTO/pagination.dto";
|
import { PaginationDto } from "../../../common/DTO/pagination.dto";
|
||||||
|
import { UserMessage } from "../../../common/enums/message.enum";
|
||||||
import { TicketStatus } from "../enums/ticket-status.enum";
|
import { TicketStatus } from "../enums/ticket-status.enum";
|
||||||
|
|
||||||
export class SearchTicketQueryDto extends PaginationDto {
|
export class SearchTicketQueryDto extends PaginationDto {
|
||||||
@IsOptional()
|
@IsOptional()
|
||||||
@IsEnum(TicketStatus)
|
@IsEnum(TicketStatus)
|
||||||
@ApiPropertyOptional({ enum: TicketStatus, description: "ticket status", example: TicketStatus.PENDING })
|
@ApiPropertyOptional({ enum: TicketStatus, description: "ticket status", example: TicketStatus.PENDING })
|
||||||
status: TicketStatus;
|
status?: TicketStatus;
|
||||||
|
|
||||||
|
@IsOptional()
|
||||||
|
@IsUUID("4", { message: UserMessage.USER_ID_SHOULD_BE_A_UUID })
|
||||||
|
@ApiPropertyOptional({ description: "user id", example: "123e4567-e89b-12d3-a456-426614174000" })
|
||||||
|
userId?: string;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { BadRequestException, HttpException, Injectable, InternalServerErrorException, Logger } from "@nestjs/common";
|
import { BadRequestException, HttpException, Injectable, InternalServerErrorException, Logger } from "@nestjs/common";
|
||||||
import { DataSource, FindManyOptions, Not } from "typeorm";
|
import { DataSource, Not } from "typeorm";
|
||||||
|
|
||||||
import { ParamDto } from "../../../common/DTO/param.dto";
|
import { ParamDto } from "../../../common/DTO/param.dto";
|
||||||
import { CommonMessage, TicketMessageEnum, UserMessage } from "../../../common/enums/message.enum";
|
import { CommonMessage, TicketMessageEnum, UserMessage } from "../../../common/enums/message.enum";
|
||||||
@@ -220,25 +220,26 @@ export class TicketsService {
|
|||||||
}
|
}
|
||||||
//******************************** */
|
//******************************** */
|
||||||
//TODO: get for admin with group of category
|
//TODO: get for admin with group of category
|
||||||
async getAllTickets(queryDto: SearchTicketQueryDto) {
|
async getTicketForAdmin(queryDto: SearchTicketQueryDto) {
|
||||||
const { limit, skip } = PaginationUtils(queryDto);
|
const { limit, skip } = PaginationUtils(queryDto);
|
||||||
|
|
||||||
const findOptions: FindManyOptions<Ticket> = {
|
const queryBuilder = this.ticketsRepository
|
||||||
where: {
|
.createQueryBuilder("ticket")
|
||||||
...(queryDto.status && { status: queryDto.status }),
|
.leftJoinAndSelect("ticket.category", "category")
|
||||||
},
|
.leftJoinAndSelect("ticket.user", "user")
|
||||||
relations: {
|
.leftJoinAndSelect("ticket.assignedTo", "assignedTo")
|
||||||
category: true,
|
.leftJoinAndSelect("ticket.danakService", "danakService")
|
||||||
user: true,
|
.orderBy("ticket.createdAt", "DESC");
|
||||||
assignedTo: true,
|
|
||||||
danakService: true,
|
|
||||||
},
|
|
||||||
order: { createdAt: "DESC" as const },
|
|
||||||
skip,
|
|
||||||
take: limit,
|
|
||||||
};
|
|
||||||
|
|
||||||
const [tickets, count] = await this.ticketsRepository.findAndCount(findOptions);
|
if (queryDto.status) {
|
||||||
|
queryBuilder.andWhere("ticket.status = :status", { status: queryDto.status });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (queryDto.userId) {
|
||||||
|
queryBuilder.andWhere("user.id = :userId", { userId: queryDto.userId });
|
||||||
|
}
|
||||||
|
|
||||||
|
const [tickets, count] = await queryBuilder.skip(skip).take(limit).getManyAndCount();
|
||||||
|
|
||||||
return { tickets, count, paginate: true };
|
return { tickets, count, paginate: true };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ export class TicketsController {
|
|||||||
@Pagination()
|
@Pagination()
|
||||||
@Get("admin")
|
@Get("admin")
|
||||||
getAllTickets(@Query() queryDto: SearchTicketQueryDto) {
|
getAllTickets(@Query() queryDto: SearchTicketQueryDto) {
|
||||||
return this.ticketsService.getAllTickets(queryDto);
|
return this.ticketsService.getTicketForAdmin(queryDto);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiOperation({ summary: "create ticket messages" })
|
@ApiOperation({ summary: "create ticket messages" })
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
// import { ApiPropertyOptional } from "@nestjs/swagger";
|
import { ApiPropertyOptional } from "@nestjs/swagger";
|
||||||
// import { IsOptional, IsString } from "class-validator";
|
import { IsOptional, IsString } from "class-validator";
|
||||||
|
|
||||||
// import { PaginationDto } from "../../../common/DTO/pagination.dto";
|
import { PaginationDto } from "../../../common/DTO/pagination.dto";
|
||||||
// import { FinancialMessage } from "../../../common/enums/message.enum";
|
import { FinancialMessage } from "../../../common/enums/message.enum";
|
||||||
|
|
||||||
// export class SearchCustomersDto extends PaginationDto {
|
export class SearchCustomersDto extends PaginationDto {
|
||||||
// @IsOptional()
|
@IsOptional()
|
||||||
// @IsString({ message: FinancialMessage.SEARCH_QUERY_MUST_BE_A_STRING })
|
@IsString({ message: FinancialMessage.SEARCH_QUERY_MUST_BE_A_STRING })
|
||||||
// @ApiPropertyOptional({ description: "search query", example: "search query" })
|
@ApiPropertyOptional({ description: "search query", example: "search query" })
|
||||||
// q: string;
|
q?: string;
|
||||||
// }
|
}
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ export class User extends BaseEntity {
|
|||||||
@Column({ type: "boolean", default: false })
|
@Column({ type: "boolean", default: false })
|
||||||
emailVerified: boolean;
|
emailVerified: boolean;
|
||||||
|
|
||||||
@Column({ type: "enum", enum: FinancialType, nullable: true })
|
@Column({ type: "enum", enum: FinancialType, nullable: true, default: null })
|
||||||
financialType: FinancialType | null;
|
financialType: FinancialType | null;
|
||||||
|
|
||||||
//-----------------------------------------
|
//-----------------------------------------
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import { CreateLegalUserDto } from "../DTO/create-legal-user.dto";
|
|||||||
import { CreateRealUserDto } from "../DTO/create-real-user.dto";
|
import { CreateRealUserDto } from "../DTO/create-real-user.dto";
|
||||||
import { CreateRoleDto } from "../DTO/create-role.dto";
|
import { CreateRoleDto } from "../DTO/create-role.dto";
|
||||||
import { SearchAdminQueryDto } from "../DTO/search-admins-query.dto";
|
import { SearchAdminQueryDto } from "../DTO/search-admins-query.dto";
|
||||||
|
import { SearchCustomersDto } from "../DTO/search-customers.dto";
|
||||||
import { SearchRolesQueryDto } from "../DTO/search-roles.dto";
|
import { SearchRolesQueryDto } from "../DTO/search-roles.dto";
|
||||||
import { UpdateProfileDto } from "../DTO/update-profile.dto";
|
import { UpdateProfileDto } from "../DTO/update-profile.dto";
|
||||||
import { CreateUserGroupDto } from "../DTO/user-group.dto";
|
import { CreateUserGroupDto } from "../DTO/user-group.dto";
|
||||||
@@ -398,30 +399,30 @@ export class UsersService {
|
|||||||
|
|
||||||
/************************************************************ */
|
/************************************************************ */
|
||||||
|
|
||||||
// async findAllCustomers(queryDto: SearchCustomersDto) {
|
async getCustomers(queryDto: SearchCustomersDto) {
|
||||||
// const { limit, skip } = PaginationUtils(queryDto);
|
const { limit, skip } = PaginationUtils(queryDto);
|
||||||
|
|
||||||
// const queryBuilder = this.userRepository
|
const queryBuilder = this.userRepository
|
||||||
// .createQueryBuilder("user")
|
.createQueryBuilder("user")
|
||||||
// .leftJoin("user.roles", "role")
|
.leftJoin("user.roles", "role")
|
||||||
// .where("role.name = :roleName", { roleName: RoleEnum.USER })
|
.where("role.name = :roleName", { roleName: RoleEnum.USER })
|
||||||
// .leftJoin("user.groups", "groups")
|
.leftJoin("user.groups", "groups")
|
||||||
// .addSelect(["groups.id", "groups.name"])
|
.addSelect(["groups.id", "groups.name"])
|
||||||
// .loadRelationCountAndMap("user.invoicesCount", "user.invoices")
|
.loadRelationCountAndMap("user.invoicesCount", "user.invoices")
|
||||||
// .loadRelationCountAndMap("user.subscriptionsCount", "user.subscriptions")
|
.loadRelationCountAndMap("user.subscriptionsCount", "user.subscriptions")
|
||||||
// .loadRelationCountAndMap("user.ticketsCount", "user.tickets");
|
.loadRelationCountAndMap("user.ticketsCount", "user.tickets");
|
||||||
|
|
||||||
// if (queryDto.q) {
|
if (queryDto.q) {
|
||||||
// queryBuilder
|
queryBuilder
|
||||||
// .orWhere("user.firstName ILIKE :search", { search: `%${queryDto.q}%` })
|
.orWhere("user.firstName ILIKE :search", { search: `%${queryDto.q}%` })
|
||||||
// .orWhere("user.lastName ILIKE :search", { search: `%${queryDto.q}%` })
|
.orWhere("user.lastName ILIKE :search", { search: `%${queryDto.q}%` })
|
||||||
// .orWhere("user.userName ILIKE :search", { search: `%${queryDto.q}%` });
|
.orWhere("user.userName ILIKE :search", { search: `%${queryDto.q}%` });
|
||||||
// }
|
}
|
||||||
|
|
||||||
// const [customers, count] = await queryBuilder.skip(skip).take(limit).getManyAndCount();
|
const [customers, count] = await queryBuilder.skip(skip).take(limit).getManyAndCount();
|
||||||
|
|
||||||
// return { customers, count };
|
return { customers, count };
|
||||||
// }
|
}
|
||||||
|
|
||||||
/************************************************************ */
|
/************************************************************ */
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import { CreateLegalUserDto } from "./DTO/create-legal-user.dto";
|
|||||||
import { CreateRealUserDto } from "./DTO/create-real-user.dto";
|
import { CreateRealUserDto } from "./DTO/create-real-user.dto";
|
||||||
import { CreateRoleDto } from "./DTO/create-role.dto";
|
import { CreateRoleDto } from "./DTO/create-role.dto";
|
||||||
import { SearchAdminQueryDto } from "./DTO/search-admins-query.dto";
|
import { SearchAdminQueryDto } from "./DTO/search-admins-query.dto";
|
||||||
|
import { SearchCustomersDto } from "./DTO/search-customers.dto";
|
||||||
import { SearchRolesQueryDto } from "./DTO/search-roles.dto";
|
import { SearchRolesQueryDto } from "./DTO/search-roles.dto";
|
||||||
import { UpdateProfileDto } from "./DTO/update-profile.dto";
|
import { UpdateProfileDto } from "./DTO/update-profile.dto";
|
||||||
import { CreateUserGroupDto } from "./DTO/user-group.dto";
|
import { CreateUserGroupDto } from "./DTO/user-group.dto";
|
||||||
@@ -117,13 +118,13 @@ export class UsersController {
|
|||||||
return this.usersService.findAllUsers();
|
return this.usersService.findAllUsers();
|
||||||
}
|
}
|
||||||
|
|
||||||
// @ApiOperation({ summary: "get all customers ==> admin route" })
|
@ApiOperation({ summary: "get all customers ==> admin route" })
|
||||||
// @AuthGuards()
|
@AuthGuards()
|
||||||
// @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS)
|
@PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS)
|
||||||
// @Get("customers")
|
@Get("customers")
|
||||||
// customers(@Query() queryDto: SearchCustomersDto) {
|
getCustomers(@Query() queryDto: SearchCustomersDto) {
|
||||||
// return this.usersService.findAllCustomers(queryDto);
|
return this.usersService.getCustomers(queryDto);
|
||||||
// }
|
}
|
||||||
|
|
||||||
@ApiOperation({ summary: "get all customers ==> admin route" })
|
@ApiOperation({ summary: "get all customers ==> admin route" })
|
||||||
@AuthGuards()
|
@AuthGuards()
|
||||||
|
|||||||
Reference in New Issue
Block a user