chore: add blog blog comment and blog category crud

This commit is contained in:
mahyargdz
2025-04-12 16:09:25 +03:30
parent 0bc001c66b
commit a9879732a3
23 changed files with 976 additions and 3 deletions
@@ -0,0 +1,136 @@
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> {
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<Blog | null> {
return this.findOne({
where: { slug, deletedAt: IsNull(), isActive: true },
});
}
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",
"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();
}
}