|
@@ -1,11 +1,15 @@
|
|
|
import { DataSource, Repository } from 'typeorm';
|
|
import { DataSource, Repository } from 'typeorm';
|
|
|
|
|
+import debug from 'debug';
|
|
|
import { z } from '@hono/zod-openapi';
|
|
import { z } from '@hono/zod-openapi';
|
|
|
import { PostEntity as Post } from './post.entity';
|
|
import { PostEntity as Post } from './post.entity';
|
|
|
|
|
+import { FollowEntity } from '../follows/follow.entity';
|
|
|
import { UserEntity as User } from '../users/user.entity';
|
|
import { UserEntity as User } from '../users/user.entity';
|
|
|
import type { CreatePostDto, UpdatePostDto } from './post.entity';
|
|
import type { CreatePostDto, UpdatePostDto } from './post.entity';
|
|
|
import { HTTPException } from 'hono/http-exception';
|
|
import { HTTPException } from 'hono/http-exception';
|
|
|
import { DeleteStatus } from '@/share/types';
|
|
import { DeleteStatus } from '@/share/types';
|
|
|
|
|
|
|
|
|
|
+const logger = debug('backend:posts:service');
|
|
|
|
|
+
|
|
|
export class PostService {
|
|
export class PostService {
|
|
|
private postRepository: Repository<Post>;
|
|
private postRepository: Repository<Post>;
|
|
|
private userRepository: Repository<User>;
|
|
private userRepository: Repository<User>;
|
|
@@ -22,7 +26,7 @@ export class PostService {
|
|
|
// 验证用户是否存在
|
|
// 验证用户是否存在
|
|
|
const user = await this.userRepository.findOneBy({ id: userId });
|
|
const user = await this.userRepository.findOneBy({ id: userId });
|
|
|
if (!user) {
|
|
if (!user) {
|
|
|
- throw new HTTPException(404, { message: '用户不存在' });
|
|
|
|
|
|
|
+ throw new Error('用户不存在');
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const post = this.postRepository.create({
|
|
const post = this.postRepository.create({
|
|
@@ -60,7 +64,7 @@ export class PostService {
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
if (!post) {
|
|
if (!post) {
|
|
|
- throw new HTTPException(404, { message: '帖子不存在或没有权限' });
|
|
|
|
|
|
|
+ throw new Error('帖子不存在或没有权限');
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
Object.assign(post, data);
|
|
Object.assign(post, data);
|
|
@@ -103,6 +107,9 @@ export class PostService {
|
|
|
const skip = (page - 1) * pageSize;
|
|
const skip = (page - 1) * pageSize;
|
|
|
|
|
|
|
|
// 直接查询关注用户的帖子,假设follow表存在且有关联
|
|
// 直接查询关注用户的帖子,假设follow表存在且有关联
|
|
|
|
|
+ logger('Building following feed query for followerId: %d, page: %d, pageSize: %d', followerId, page, pageSize);
|
|
|
|
|
+
|
|
|
|
|
+ // 创建主查询用于获取分页数据
|
|
|
const query = this.postRepository
|
|
const query = this.postRepository
|
|
|
.createQueryBuilder('post')
|
|
.createQueryBuilder('post')
|
|
|
.leftJoin('follows', 'f', 'f.following_id = post.user_id')
|
|
.leftJoin('follows', 'f', 'f.following_id = post.user_id')
|
|
@@ -113,7 +120,25 @@ export class PostService {
|
|
|
.skip(skip)
|
|
.skip(skip)
|
|
|
.take(pageSize);
|
|
.take(pageSize);
|
|
|
|
|
|
|
|
- const [posts, total] = await query.getManyAndCount();
|
|
|
|
|
|
|
+ // 创建计数查询
|
|
|
|
|
+ const countQuery = this.postRepository
|
|
|
|
|
+ .createQueryBuilder('post')
|
|
|
|
|
+ .leftJoin('follows', 'f', 'f.following_id = post.user_id')
|
|
|
|
|
+ .where('f.follower_id = :followerId', { followerId })
|
|
|
|
|
+ .andWhere('post.is_deleted = :notDeleted', { notDeleted: DeleteStatus.NOT_DELETED });
|
|
|
|
|
+
|
|
|
|
|
+ // 记录生成的SQL和参数
|
|
|
|
|
+ const sql = query.getSql();
|
|
|
|
|
+ const parameters = query.getParameters();
|
|
|
|
|
+ logger('Following feed query: %s', sql);
|
|
|
|
|
+ logger('Query parameters: %o', parameters);
|
|
|
|
|
+
|
|
|
|
|
+ const [posts, total] = await Promise.all([
|
|
|
|
|
+ query.getRawMany(),
|
|
|
|
|
+ countQuery.getCount()
|
|
|
|
|
+ ]);
|
|
|
|
|
+
|
|
|
|
|
+ logger('Following feed results: %d posts, total: %d', posts.length, total);
|
|
|
return [posts, total];
|
|
return [posts, total];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -127,7 +152,7 @@ export class PostService {
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
if (!post) {
|
|
if (!post) {
|
|
|
- throw new HTTPException(404, { message: '帖子不存在' });
|
|
|
|
|
|
|
+ throw new Error('帖子不存在');
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
post.likesCount += 1;
|
|
post.likesCount += 1;
|
|
@@ -144,7 +169,7 @@ export class PostService {
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
if (!post) {
|
|
if (!post) {
|
|
|
- throw new HTTPException(404, { message: '帖子不存在' });
|
|
|
|
|
|
|
+ throw new Error('帖子不存在');
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (post.likesCount > 0) {
|
|
if (post.likesCount > 0) {
|