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 { const queryBuilder = this.createQueryBuilder("blog") .leftJoinAndSelect("blog.author", "author") .leftJoinAndSelect("blog.category", "category") .where("blog.id = :id", { id }) .andWhere("blog.deletedAt IS NULL") .select([ "blog.id", "blog.title", "blog.previewContent", "blog.metaTitle", "blog.metaDescription", "blog.imageUrl", "blog.slug", "blog.createdAt", "blog.content", "blog.tags", "blog.viewCount", "blog.isActive", "blog.isPinned", "category.id", "category.title", "category.iconUrl", "category.description", "author.id", "author.firstName", "author.lastName", ]); return queryBuilder.getOne(); } async findOneBySlug(slug: string): Promise { const queryBuilder = this.createQueryBuilder("blog") .leftJoinAndSelect("blog.author", "author") .leftJoinAndSelect("blog.category", "category") .where("blog.slug = :slug", { slug }) .andWhere("blog.deletedAt IS NULL") .andWhere("blog.isActive = :isActive", { isActive: true }) .select([ "blog.id", "blog.title", "blog.previewContent", "blog.metaTitle", "blog.metaDescription", "blog.imageUrl", "blog.slug", "blog.createdAt", "blog.content", "blog.tags", "blog.viewCount", "category.id", "category.title", "category.iconUrl", "category.description", "author.id", "author.firstName", "author.lastName", ]); return queryBuilder.getOne(); } 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", "blog.viewCount", "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(); } async getMostVisitedBlogs(limit: number = 5) { return 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", "blog.viewCount", "category.id", "category.iconUrl", "category.title", "author.id", "author.firstName", "author.lastName", ]) .orderBy("blog.viewCount", "DESC") .take(limit) .getMany(); } async getPinnedBlogs(limit: number = 4) { return this.createQueryBuilder("blog") .where("blog.deletedAt IS NULL") .andWhere("blog.isActive = :isActive", { isActive: true }) .andWhere("blog.isPinned = :isPinned", { isPinned: true }) .select([ "blog.id", "blog.title", "blog.previewContent", "blog.metaTitle", "blog.metaDescription", "blog.imageUrl", "blog.slug", "blog.createdAt", "blog.viewCount", ]) .orderBy("blog.createdAt", "DESC") .take(limit) .getMany(); } }