add : subscription list

This commit is contained in:
2026-01-05 20:40:18 +03:30
parent 4cf89e1f8e
commit f0eae80342
3 changed files with 118 additions and 0 deletions
@@ -0,0 +1,53 @@
import { ApiPropertyOptional } from "@nestjs/swagger";
import { Type } from "class-transformer";
import { IsEnum, IsOptional, IsString, IsUUID } from "class-validator";
import { PaginationDto } from "../../../common/DTO/pagination.dto";
import { SubscriptionMessage } from "../../../common/enums/message.enum";
import { SubscriptionStatus } from "../enums/subscription-status.enum";
export class AdminUserSubscriptionsQueryDto extends PaginationDto {
@IsOptional()
@IsString({ message: SubscriptionMessage.SEARCH_QUERY_STRING })
@ApiPropertyOptional({ description: "Search query (business name, description, etc.)" })
q?: string;
@IsOptional()
@IsUUID()
@ApiPropertyOptional({ description: "Filter by user ID" })
userId?: string;
@IsOptional()
@IsUUID()
@ApiPropertyOptional({ description: "Filter by service ID" })
serviceId?: string;
@IsOptional()
@IsEnum(SubscriptionStatus)
@ApiPropertyOptional({
description: "Filter by subscription status",
enum: SubscriptionStatus
})
status?: SubscriptionStatus;
@IsOptional()
@Type(() => Date)
@ApiPropertyOptional({ description: "Filter by start date (from)", })
startDateFrom?: Date;
@IsOptional()
@Type(() => Date)
@ApiPropertyOptional({ description: "Filter by start date (to)" })
startDateTo?: Date;
@IsOptional()
@Type(() => Date)
@ApiPropertyOptional({ description: "Filter by end date (from)", })
endDateFrom?: Date;
@IsOptional()
@Type(() => Date)
@ApiPropertyOptional({ description: "Filter by end date (to)", })
endDateTo?: Date;
}
@@ -16,6 +16,7 @@ import { UsersService } from "../../users/providers/users.service";
import { PaginationUtils } from "../../utils/providers/pagination.utils";
import { SUBSCRIPTIONS } from "../constants";
import { AddSubscriptionsToServiceDto } from "../DTO/create-subscription.dto";
import { AdminUserSubscriptionsQueryDto } from "../DTO/admin-user-subscriptions-query.dto";
import { SearchUserSubsQueryDto } from "../DTO/search-user-subs-query.dto";
import { ServiceSubsQueryDto } from "../DTO/service-subs-query.dto";
import { ExtendUSerSubscribeServiceDto, SubscribeServiceDto } from "../DTO/subscribe-service.dto";
@@ -589,5 +590,61 @@ export class SubscriptionsService {
);
}
//************************************ */
async getAllUserSubscriptions(queryDto: AdminUserSubscriptionsQueryDto) {
const { limit, skip } = PaginationUtils(queryDto);
const queryBuilder = this.userSubscriptionsRepository
.createQueryBuilder("userSubscription")
.leftJoinAndSelect("userSubscription.user", "user")
.leftJoinAndSelect("userSubscription.plan", "plan")
.leftJoinAndSelect("plan.service", "service");
if (queryDto.q) {
queryBuilder.andWhere(
"(userSubscription.businessName ILIKE :query OR userSubscription.description ILIKE :query OR user.email ILIKE :query OR user.firstName ILIKE :query OR user.lastName ILIKE :query OR service.name ILIKE :query OR service.title ILIKE :query)",
{ query: `%${queryDto.q}%` }
);
}
if (queryDto.userId) {
queryBuilder.andWhere("user.id = :userId", { userId: queryDto.userId });
}
if (queryDto.serviceId) {
queryBuilder.andWhere("service.id = :serviceId", { serviceId: queryDto.serviceId });
}
if (queryDto.status) {
queryBuilder.andWhere("userSubscription.status = :status", { status: queryDto.status });
}
if (queryDto.startDateFrom) {
queryBuilder.andWhere("userSubscription.startDate >= :startDateFrom", { startDateFrom: queryDto.startDateFrom });
}
if (queryDto.startDateTo) {
queryBuilder.andWhere("userSubscription.startDate <= :startDateTo", { startDateTo: queryDto.startDateTo });
}
if (queryDto.endDateFrom) {
queryBuilder.andWhere("userSubscription.endDate >= :endDateFrom", { endDateFrom: queryDto.endDateFrom });
}
if (queryDto.endDateTo) {
queryBuilder.andWhere("userSubscription.endDate <= :endDateTo", { endDateTo: queryDto.endDateTo });
}
queryBuilder.orderBy("userSubscription.createdAt", "DESC");
const [userSubscriptions, count] = await queryBuilder.skip(skip).take(limit).getManyAndCount();
return {
userSubscriptions,
count,
pagination: true,
};
}
//************************************ */
}
@@ -2,6 +2,7 @@ import { Body, Controller, Delete, Get, Param, Patch, Post, Put, Query } from "@
import { ApiOperation } from "@nestjs/swagger";
import { AddSubscriptionsToServiceDto } from "./DTO/create-subscription.dto";
import { AdminUserSubscriptionsQueryDto } from "./DTO/admin-user-subscriptions-query.dto";
import { SearchUserSubsQueryDto } from "./DTO/search-user-subs-query.dto";
import { ServiceIdParamDto } from "./DTO/service-id.param.dto";
import { ServiceSubsQueryDto } from "./DTO/service-subs-query.dto";
@@ -132,4 +133,11 @@ export class SubscriptionsController {
getUserServiceAccess(@Param() serviceIdParamDto: ServiceIdParamDto, @UserDec("id") userId: string) {
return this.subscriptionService.getUserSubscriptionsForService(userId, serviceIdParamDto.serviceId);
}
@ApiOperation({ summary: "get all user subscriptions with pagination and filters ==> admin route" })
@PermissionsDec(PermissionEnum.SERVICES)
@Get("admin/user-subscriptions/all")
getAllUserSubscriptions(@Query() queryDto: AdminUserSubscriptionsQueryDto) {
return this.subscriptionService.getAllUserSubscriptions(queryDto);
}
}