233 lines
7.0 KiB
TypeScript
Executable File
233 lines
7.0 KiB
TypeScript
Executable File
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<Blog> {
|
|
constructor(@InjectRepository(Blog) blogsRepository: Repository<Blog>) {
|
|
super(blogsRepository.target, blogsRepository.manager, blogsRepository.queryRunner);
|
|
}
|
|
|
|
async findOneById(id: string): Promise<Blog | null> {
|
|
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<Blog | null> {
|
|
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<Blog | null> {
|
|
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")
|
|
.select([
|
|
"blog.id",
|
|
"blog.title",
|
|
"blog.previewContent",
|
|
"blog.metaTitle",
|
|
"blog.imageUrl",
|
|
"blog.slug",
|
|
"blog.isActive",
|
|
"blog.createdAt",
|
|
"blog.viewCount",
|
|
"category.id",
|
|
"category.title",
|
|
"author.id",
|
|
"author.firstName",
|
|
"author.lastName",
|
|
]);
|
|
|
|
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")
|
|
.leftJoinAndSelect("blog.category", "category")
|
|
.addSelect(["category.id", "category.title", "category.iconUrl"])
|
|
.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",
|
|
"category.id",
|
|
"category.title",
|
|
"category.iconUrl",
|
|
])
|
|
.orderBy("blog.createdAt", "DESC")
|
|
.take(limit)
|
|
.getMany();
|
|
}
|
|
}
|