Files
2025-03-25 13:37:29 +01:00

104 lines
3.1 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server';
import { getDataSource, Post } from '@/lib/database';
// GET /api/posts - Get all posts
export async function GET(request: NextRequest) {
try {
const dataSource = await getDataSource();
const postRepository = dataSource.getRepository(Post);
// Get query parameters
const url = new URL(request.url);
const parentId = url.searchParams.get('parentId');
// Pagination parameters
const page = parseInt(url.searchParams.get('page') || '1');
const pageSize = parseInt(url.searchParams.get('pageSize') || '10');
const skip = (page - 1) * pageSize;
// Build query
let queryBuilder = postRepository.createQueryBuilder('post')
.leftJoinAndSelect('post.user', 'user')
.leftJoinAndSelect('post.parent', 'parent')
.orderBy('post.createdAt', 'DESC');
// Filter by parentId if provided
if (parentId) {
if (parentId === 'null') {
// Get root posts (no parent)
queryBuilder = queryBuilder.where('post.parentId IS NULL');
} else {
// Get children of specific parent
queryBuilder = queryBuilder.where('post.parentId = :parentId', { parentId });
}
}
// Get total count for pagination
const totalCount = await queryBuilder.getCount();
// Apply pagination
queryBuilder = queryBuilder
.skip(skip)
.take(pageSize);
// Execute query
const posts = await queryBuilder.getMany();
// Calculate total pages
const totalPages = Math.ceil(totalCount / pageSize);
return NextResponse.json({
data: posts,
pagination: {
page,
pageSize,
totalCount,
totalPages
}
});
} catch (error) {
console.error('Error fetching posts:', error);
return NextResponse.json(
{ error: 'Failed to fetch posts' },
{ status: 500 }
);
}
}
// POST /api/posts - Create a new post
export async function POST(request: NextRequest) {
try {
const data = await request.json();
const { title, content, userId, parentId } = data;
// Validate required fields
if (!title || !content || !userId) {
return NextResponse.json(
{ error: 'Title, content, and userId are required' },
{ status: 400 }
);
}
const dataSource = await getDataSource();
const postRepository = dataSource.getRepository(Post);
// Create new post
const newPost = postRepository.create({
title,
content,
userId,
parentId: parentId || null
});
await postRepository.save(newPost);
return NextResponse.json(newPost, { status: 201 });
} catch (error) {
console.error('Error creating post:', error);
return NextResponse.json(
{ error: 'Failed to create post' },
{ status: 500 }
);
}
}