chore: add get user subscriptions route

This commit is contained in:
mahyargdz
2025-02-17 15:56:34 +03:30
parent b7cfaf95b2
commit 14373bb665
4 changed files with 71 additions and 2 deletions
+1
View File
@@ -317,6 +317,7 @@ export const enum SubscriptionMessage {
SUBS_MIN_SIZE = "حداقل یک اشتراک باید انتخاب شود", SUBS_MIN_SIZE = "حداقل یک اشتراک باید انتخاب شود",
SUBS_REQUIRED = "اشتراک مورد نیاز است", SUBS_REQUIRED = "اشتراک مورد نیاز است",
SUBS_SHOULD_BE_ARRAY = "اشتراک باید یک آرایه باشد", SUBS_SHOULD_BE_ARRAY = "اشتراک باید یک آرایه باشد",
USER_SUBS_NOT_FOUND = "اشتراک کاربر یافت نشد",
} }
export const enum InvoiceMessage { export const enum InvoiceMessage {
@@ -0,0 +1,11 @@
import { ApiPropertyOptional } from "@nestjs/swagger";
import { IsOptional, IsString } from "class-validator";
import { SubscriptionMessage } from "../../../common/enums/message.enum";
export class SearchUserSubsQueryDto {
@IsOptional()
@IsString({ message: SubscriptionMessage.SEARCH_QUERY_STRING })
@ApiPropertyOptional({ description: "Search query", example: "search query" })
q?: string;
}
@@ -11,6 +11,7 @@ import { PaginationUtils } from "../../utils/providers/pagination.utils";
import { Wallet } from "../../wallets/entities/wallet.entity"; import { Wallet } from "../../wallets/entities/wallet.entity";
import { WalletsService } from "../../wallets/providers/wallets.service"; import { WalletsService } from "../../wallets/providers/wallets.service";
import { AddSubscriptionsToServiceDto } from "../DTO/create-subscription.dto"; import { AddSubscriptionsToServiceDto } from "../DTO/create-subscription.dto";
import { SearchUserSubsQueryDto } from "../DTO/search-user-subs-query.dto";
import { ServiceSubsQueryDto } from "../DTO/service-subs-query.dto"; import { ServiceSubsQueryDto } from "../DTO/service-subs-query.dto";
import { SubscribeServiceDto } from "../DTO/subscribe-service.dto"; import { SubscribeServiceDto } from "../DTO/subscribe-service.dto";
import { UpdateSubscriptionPlanDto } from "../DTO/update-subscription.dto"; import { UpdateSubscriptionPlanDto } from "../DTO/update-subscription.dto";
@@ -18,13 +19,13 @@ import { SubscriptionPlan } from "../entities/subscription.entity";
import { UserSubscription } from "../entities/user-subscription.entity"; import { UserSubscription } from "../entities/user-subscription.entity";
import { SubscriptionStatus } from "../enums/subscription-status.enum"; import { SubscriptionStatus } from "../enums/subscription-status.enum";
import { SubscriptionsPlanRepository } from "../repositories/subscriptions.repository"; import { SubscriptionsPlanRepository } from "../repositories/subscriptions.repository";
// import { UserSubscriptionsRepository } from "../repositories/user-subscriptions.repository"; import { UserSubscriptionsRepository } from "../repositories/user-subscriptions.repository";
@Injectable() @Injectable()
export class SubscriptionsService { export class SubscriptionsService {
constructor( constructor(
private readonly subscriptionsPlanRepository: SubscriptionsPlanRepository, private readonly subscriptionsPlanRepository: SubscriptionsPlanRepository,
// private readonly userSubscriptionsRepository: UserSubscriptionsRepository, private readonly userSubscriptionsRepository: UserSubscriptionsRepository,
private readonly invoicesService: InvoicesService, private readonly invoicesService: InvoicesService,
private readonly usersService: UsersService, private readonly usersService: UsersService,
private readonly walletsService: WalletsService, private readonly walletsService: WalletsService,
@@ -58,6 +59,47 @@ export class SubscriptionsService {
subscriptions: createdSubscriptions, subscriptions: createdSubscriptions,
}; };
} }
//************************************ */
async getUserSubscriptions(userId: string, queryDto: SearchUserSubsQueryDto) {
const queryBuilder = this.userSubscriptionsRepository
.createQueryBuilder("userSubscription")
.leftJoinAndSelect("userSubscription.plan", "plan")
.leftJoinAndSelect("plan.service", "service")
.where("userSubscription.user.id = :userId", { userId });
if (queryDto.q) {
queryBuilder.andWhere("(service.name ILIKE :query OR service.title ILIKE :query OR service.description ILIKE :query)", {
query: `%${queryDto.q}%`,
});
}
const subscriptions = await queryBuilder.getMany();
return {
subscriptions,
};
}
//************************************ */
async getUserSubscriptionById(userSubId: string, userId: string) {
const userSubscription = await this.userSubscriptionsRepository.findOne({
where: { id: userSubId, user: { id: userId } },
relations: {
plan: {
service: {
images: true,
subscriptionPlans: true,
},
},
},
});
if (!userSubscription) throw new BadRequestException(SubscriptionMessage.USER_SUBS_NOT_FOUND);
return {
userSubscription,
};
}
//************************************ */ //************************************ */
async updateSubscriptionPlan(id: string, updateDto: UpdateSubscriptionPlanDto) { async updateSubscriptionPlan(id: string, updateDto: UpdateSubscriptionPlanDto) {
if (updateDto.serviceId) { if (updateDto.serviceId) {
@@ -2,6 +2,7 @@ import { Body, Controller, Get, Param, Patch, Post, Query } from "@nestjs/common
import { ApiOperation } from "@nestjs/swagger"; import { ApiOperation } from "@nestjs/swagger";
import { AddSubscriptionsToServiceDto } from "./DTO/create-subscription.dto"; import { AddSubscriptionsToServiceDto } from "./DTO/create-subscription.dto";
import { SearchUserSubsQueryDto } from "./DTO/search-user-subs-query.dto";
import { ServiceIdParamDto } from "./DTO/service-id.param.dto"; import { ServiceIdParamDto } from "./DTO/service-id.param.dto";
import { ServiceSubsQueryDto } from "./DTO/service-subs-query.dto"; import { ServiceSubsQueryDto } from "./DTO/service-subs-query.dto";
import { SubscribeServiceDto } from "./DTO/subscribe-service.dto"; import { SubscribeServiceDto } from "./DTO/subscribe-service.dto";
@@ -33,6 +34,20 @@ export class SubscriptionsController {
return this.subscriptionService.getServiceSubscriptions(paramDto.serviceId, queryDto); return this.subscriptionService.getServiceSubscriptions(paramDto.serviceId, queryDto);
} }
@ApiOperation({ summary: "get all user subscriptions ==> user route" })
@AuthGuards()
@Get("user")
getUserSubscriptions(@UserDec("id") userId: string, @Query() queryDto: SearchUserSubsQueryDto) {
return this.subscriptionService.getUserSubscriptions(userId, queryDto);
}
@ApiOperation({ summary: "get a user subscription by id ==> user route" })
@AuthGuards()
@Get("user/:id")
getUserSubscriptionById(@Param() paramDto: ParamDto, @UserDec("id") userId: string) {
return this.subscriptionService.getUserSubscriptionById(paramDto.id, userId);
}
@ApiOperation({ summary: "toggle status of service subs" }) @ApiOperation({ summary: "toggle status of service subs" })
@AuthGuards() @AuthGuards()
@PermissionsDec(PermissionEnum.SERVICES) @PermissionsDec(PermissionEnum.SERVICES)