update: the danak services module and add new route to fetch the danak service
This commit is contained in:
@@ -328,22 +328,7 @@ export class DanakServicesService {
|
||||
/******************************************** */
|
||||
|
||||
async searchServices(queryDto: DanakServicesGlobalSearchDto) {
|
||||
const servicesQuery = this.danakServicesRepository
|
||||
.createQueryBuilder("service")
|
||||
.leftJoin("service.category", "category")
|
||||
.leftJoin("service.subscriptionPlans", "subscriptionPlans")
|
||||
.select(["service.id", "service.name", "service.description", "service.icon", "category.id", "category.title"])
|
||||
.where("service.isActive = :isActive", { isActive: true })
|
||||
.andWhere("service.deletedAt IS NULL")
|
||||
.andWhere("category.isActive = :categoryActive", { categoryActive: true })
|
||||
.andWhere("category.deletedAt IS NULL")
|
||||
.andWhere("subscriptionPlans.isActive = :planActive", { planActive: true });
|
||||
|
||||
if (queryDto.q) {
|
||||
servicesQuery.andWhere("service.name ILIKE :searchQuery", { searchQuery: `%${queryDto.q}%` });
|
||||
}
|
||||
|
||||
const services = await servicesQuery.getMany();
|
||||
const services = await this.danakServicesRepository.searchServices(queryDto);
|
||||
|
||||
return {
|
||||
services,
|
||||
@@ -381,57 +366,11 @@ export class DanakServicesService {
|
||||
/******************************************** */
|
||||
|
||||
async getDanakServiceByIdWithSubs(serviceId: string, isAdmin: boolean, userId: string) {
|
||||
const serviceQueryBuilder = this.danakServicesRepository
|
||||
.createQueryBuilder("service")
|
||||
.where("service.deletedAt IS NULL")
|
||||
.leftJoin("service.category", "category")
|
||||
.addSelect(["category.id", "category.title"])
|
||||
.leftJoinAndSelect("service.images", "images")
|
||||
.leftJoinAndSelect("service.subscriptionPlans", "subscriptionPlans")
|
||||
.leftJoin("service.reviews", "reviews", "reviews.status = :reviewStatus", { reviewStatus: ReviewStatus.APPROVED })
|
||||
.leftJoin("reviews.user", "user")
|
||||
.addSelect([
|
||||
"reviews.id",
|
||||
"reviews.comment",
|
||||
"reviews.rating",
|
||||
"reviews.title",
|
||||
"reviews.createdAt",
|
||||
"reviews.status",
|
||||
"user.id",
|
||||
"user.firstName",
|
||||
"user.lastName",
|
||||
"user.profilePic",
|
||||
])
|
||||
// .loadRelationCountAndMap("service.reviewCount", "service.reviews")
|
||||
// .addSelect(
|
||||
// (subQuery) =>
|
||||
// subQuery
|
||||
// .select("CAST(AVG(rating) AS DECIMAL(10,2))", "averageRating")
|
||||
// .from(DanakServiceReview, "r")
|
||||
// .where("r.serviceId = service.id")
|
||||
// .andWhere("r.status = :reviewStatus", { reviewStatus: ReviewStatus.APPROVED }),
|
||||
// "averageRating",
|
||||
// )
|
||||
.andWhere("service.id = :serviceId", { serviceId })
|
||||
.groupBy("service.id,category.id, images.id, subscriptionPlans.id, reviews.id, user.id");
|
||||
const danakService = await this.danakServicesRepository.getDanakServiceById(serviceId, isAdmin);
|
||||
|
||||
if (!isAdmin) {
|
||||
serviceQueryBuilder
|
||||
.andWhere("service.isActive = :isActive", { isActive: true })
|
||||
.andWhere("subscriptionPlans.isActive = :planActive", { planActive: true });
|
||||
}
|
||||
|
||||
const danakService = await serviceQueryBuilder.getOne();
|
||||
if (!danakService) throw new BadRequestException(ServiceMessage.SERVICE_NOT_FOUND_BY_ID);
|
||||
|
||||
const averageRatingResult = await this.danakServiceReviewRepository
|
||||
.createQueryBuilder("r")
|
||||
.select("CAST(AVG(r.rating) AS DECIMAL(10,2))", "averageRating")
|
||||
.where("r.serviceId = :serviceId", { serviceId })
|
||||
.andWhere("r.status = :reviewStatus", { reviewStatus: ReviewStatus.APPROVED })
|
||||
.getRawOne();
|
||||
|
||||
const averageRating = parseFloat(averageRatingResult?.averageRating) || 0;
|
||||
const averageRating = await this.danakServiceReviewRepository.getAverageRating(danakService.id);
|
||||
|
||||
const hasSubscription = await this.checkUserPurchasedService(userId, serviceId);
|
||||
|
||||
@@ -443,25 +382,17 @@ export class DanakServicesService {
|
||||
}
|
||||
/******************************************** */
|
||||
|
||||
async getDanakServiceByIdPublic(serviceId: string) {
|
||||
const danakService = await this.danakServicesRepository.getDanakServiceById(serviceId, false);
|
||||
if (!danakService) throw new BadRequestException(ServiceMessage.SERVICE_NOT_FOUND_BY_ID);
|
||||
return { danakService };
|
||||
}
|
||||
/******************************************** */
|
||||
|
||||
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();
|
||||
const users = await this.danakServicesRepository.getUsersByService(serviceId);
|
||||
|
||||
return { users };
|
||||
}
|
||||
@@ -469,31 +400,7 @@ export class DanakServicesService {
|
||||
/******************************************** */
|
||||
|
||||
async getDanakServiceReviews(queryDto: DanakServiceReviewQueryDto) {
|
||||
const { limit, skip } = PaginationUtils(queryDto);
|
||||
|
||||
const reviewsQueryBuilder = this.danakServiceReviewRepository
|
||||
.createQueryBuilder("review")
|
||||
.leftJoinAndSelect("review.user", "user")
|
||||
.leftJoinAndSelect("review.service", "service")
|
||||
.select([
|
||||
"review.id",
|
||||
"review.title",
|
||||
"review.comment",
|
||||
"review.rating",
|
||||
"review.status",
|
||||
"review.createdAt",
|
||||
"user.id",
|
||||
"user.firstName",
|
||||
"user.lastName",
|
||||
"user.profilePic",
|
||||
"service.id",
|
||||
"service.name",
|
||||
])
|
||||
.orderBy("review.createdAt", "DESC")
|
||||
.skip(skip)
|
||||
.take(limit);
|
||||
|
||||
const [reviews, count] = await reviewsQueryBuilder.getManyAndCount();
|
||||
const [reviews, count] = await this.danakServiceReviewRepository.getDanakServiceReviews(queryDto);
|
||||
|
||||
return {
|
||||
reviews,
|
||||
|
||||
Reference in New Issue
Block a user