import { Injectable } from "@nestjs/common"; import { InjectRepository } from "@nestjs/typeorm"; import { Brackets, IsNull, Repository } from "typeorm"; import { PaginationUtils } from "../../utils/providers/pagination.utils"; import { BlogListSearchQueryDto, BlogSearchQueryDto } from "../DTO/search-blog-query.dto"; import { Blog } from "../entities/blog.entity"; @Injectable() export class BlogsRepository extends Repository { constructor(@InjectRepository(Blog) blogsRepository: Repository) { super(blogsRepository.target, blogsRepository.manager, blogsRepository.queryRunner); } async findOneById(id: string): Promise { return this.findOne({ where: { id, deletedAt: IsNull() }, relations: { author: true, category: true, }, select: { id: true, title: true, previewContent: true, metaTitle: true, metaDescription: true, imageUrl: true, slug: true, createdAt: true, content: true, tags: true, category: { id: true, title: true, iconUrl: true, description: true, }, author: { id: true, firstName: true, lastName: true, }, }, }); } async findOneBySlug(slug: string): Promise { return this.findOne({ where: { slug, deletedAt: IsNull(), isActive: true }, }); } async fineOneByTitle(title: string): Promise { return this.findOne({ where: { title, deletedAt: IsNull(), isActive: true }, }); } //*********************************** */ async getBlogsForUserSide(queryDto: BlogSearchQueryDto) { const { limit, skip } = PaginationUtils(queryDto); const queryBuilder = this.createQueryBuilder("blog") .where("blog.deletedAt IS NULL") .andWhere("blog.isActive = :isActive", { isActive: true }) .leftJoinAndSelect("blog.category", "category") .leftJoinAndSelect("blog.author", "author") .select([ "blog.id", "blog.title", "blog.previewContent", "blog.metaTitle", "blog.metaDescription", "blog.imageUrl", "blog.slug", "blog.createdAt", "category.id", "category.iconUrl", "category.title", "author.id", "author.firstName", "author.lastName", ]); if (queryDto.categoryId) { queryBuilder.andWhere("blog.categoryId = :categoryId", { categoryId: queryDto.categoryId }); } queryBuilder.skip(skip).take(limit).orderBy("blog.createdAt", "DESC"); return queryBuilder.getManyAndCount(); } //*********************************** */ async getBlogListForAdmin(queryDto: BlogListSearchQueryDto) { const { limit, skip } = PaginationUtils(queryDto); const queryBuilder = this.createQueryBuilder("blog") .where("blog.deletedAt IS NULL") .leftJoinAndSelect("blog.category", "category") .leftJoinAndSelect("blog.author", "author"); if (queryDto.isActive) { queryBuilder.andWhere("blog.isActive = :isActive", { isActive: queryDto.isActive === 1 }); } if (queryDto.q) { // queryBuilder.andWhere( // "blog.title ILIKE :q OR blog.previewContent ILIKE :q OR blog.content ILIKE :q OR blog.metaTitle ILIKE :q OR blog.slug ILIKE :q", // { q: `%${queryDto.q}%` }, // ); queryBuilder.andWhere( new Brackets((qb) => { qb.where("blog.title ILIKE :q", { q: `%${queryDto.q}%` }) .orWhere("blog.previewContent ILIKE :q", { q: `%${queryDto.q}%` }) .orWhere("blog.content ILIKE :q", { q: `%${queryDto.q}%` }) .orWhere("blog.metaTitle ILIKE :q", { q: `%${queryDto.q}%` }) .orWhere("blog.slug ILIKE :q", { q: `%${queryDto.q}%` }); }), ); } if (queryDto.categoryId) { queryBuilder.andWhere("blog.categoryId = :categoryId", { categoryId: queryDto.categoryId }); } if (queryDto.since) { queryBuilder.andWhere("blog.createdAt >= :since", { since: queryDto.since }); } queryBuilder.skip(skip).take(limit).orderBy("blog.createdAt", "DESC"); return queryBuilder.getManyAndCount(); } }