diff --git a/src/modules/danak-services/danak-services.controller.ts b/src/modules/danak-services/danak-services.controller.ts index 01f933f..b22e29c 100755 --- a/src/modules/danak-services/danak-services.controller.ts +++ b/src/modules/danak-services/danak-services.controller.ts @@ -116,6 +116,14 @@ export class DanakServicesController { return this.danakServicesService.getDanakServiceByIdWithSubs(paramDto.id, isAdmin, userId); } + @ApiOperation({ summary: "get service users" }) + @AuthGuards() + @PermissionsDec(PermissionEnum.SERVICES) + @Get(":id/users") + getServiceUsers(@Param() paramDto: ParamDto) { + return this.danakServicesService.getServiceUsers(paramDto.id); + } + @ApiOperation({ summary: "add review to danak service ==> user route" }) @AuthGuards() @Post(":id/reviews") diff --git a/src/modules/danak-services/providers/danak-services.service.ts b/src/modules/danak-services/providers/danak-services.service.ts index a5a43b0..12459d9 100755 --- a/src/modules/danak-services/providers/danak-services.service.ts +++ b/src/modules/danak-services/providers/danak-services.service.ts @@ -244,6 +244,31 @@ export class DanakServicesService { } /******************************************** */ + async getServiceUsers(serviceId: string) { + await this.findServiceById(serviceId); + + const users = await this.danakServicesRepository + .createQueryBuilder("service") + .innerJoin("service.subscriptionPlans", "subscriptionPlans") + .innerJoin("subscriptionPlans.userSubscriptions", "userSubscriptions") + .innerJoin("user", "user", "userSubscriptions.userId = user.id") + .select([ + "DISTINCT user.id AS id", + "user.firstName AS firstName", + "user.lastName AS lastName", + "user.email AS email", + "user.profilePic AS profilePic", + ]) + .where("service.id = :serviceId", { serviceId }) + .andWhere("userSubscriptions.status = :status", { status: SubscriptionStatus.ACTIVE }) + .andWhere("userSubscriptions.endDate > NOW()") + .getRawMany(); + + return { users }; + } + + /******************************************** */ + async getDanakServiceReviews(queryDto: DanakServiceReviewQueryDto) { const { limit, skip } = PaginationUtils(queryDto); diff --git a/src/modules/subscriptions/entities/subscription.entity.ts b/src/modules/subscriptions/entities/subscription.entity.ts index 7876b24..ba2fd87 100755 --- a/src/modules/subscriptions/entities/subscription.entity.ts +++ b/src/modules/subscriptions/entities/subscription.entity.ts @@ -1,7 +1,8 @@ // eslint-disable-next-line import/no-named-as-default import Decimal from "decimal.js"; -import { Column, Entity, Index, ManyToOne } from "typeorm"; +import { Column, Entity, Index, ManyToOne, OneToMany } from "typeorm"; +import { UserSubscription } from "./user-subscription.entity"; import { BaseEntity } from "../../../common/entities/base.entity"; import { DecimalTransformer } from "../../../common/transformers/decimal.transformer"; import { DanakService } from "../../danak-services/entities/danak-service.entity"; @@ -25,6 +26,9 @@ export class SubscriptionPlan extends BaseEntity { @ManyToOne(() => DanakService, (danakService) => danakService.subscriptionPlans, { nullable: false, onDelete: "CASCADE" }) service: DanakService; + @OneToMany(() => UserSubscription, (userSubscription) => userSubscription.plan) + userSubscriptions: UserSubscription[]; + // @ManyToMany(() => Discount, (discount) => discount.subscriptionPlans) // discounts: Discount[]; } diff --git a/src/modules/subscriptions/entities/user-subscription.entity.ts b/src/modules/subscriptions/entities/user-subscription.entity.ts index d173814..0d86efd 100755 --- a/src/modules/subscriptions/entities/user-subscription.entity.ts +++ b/src/modules/subscriptions/entities/user-subscription.entity.ts @@ -10,7 +10,7 @@ export class UserSubscription extends BaseEntity { @ManyToOne(() => User, (user) => user.subscriptions, { nullable: false, onDelete: "CASCADE" }) user: User; - @ManyToOne(() => SubscriptionPlan, { nullable: false, onDelete: "CASCADE" }) + @ManyToOne(() => SubscriptionPlan, (plan) => plan.userSubscriptions, { nullable: false, onDelete: "CASCADE" }) plan: SubscriptionPlan; @Column({ type: "timestamp", nullable: false })