62 lines
1.5 KiB
TypeScript
62 lines
1.5 KiB
TypeScript
import { json } from '@sveltejs/kit';
|
|
import { db } from '$lib/server/db';
|
|
import { questions, answers } from '$lib/server/db/schema';
|
|
import { eq, sql } from 'drizzle-orm';
|
|
|
|
const maxAnswers = 5;
|
|
|
|
export async function POST({ locals, request }) {
|
|
const { userId, questionId, content } = await request.json();
|
|
const { session } = locals;
|
|
|
|
if (!session?.data?.userId) return;
|
|
const user = session.data.userId;
|
|
|
|
if (!user || !userId || user !== userId) {
|
|
return json({ error: 'Unauthorized' }, { status: 401 });
|
|
}
|
|
|
|
// Start transaction
|
|
return await db.transaction(async (tx) => {
|
|
// Get question and validate in one query
|
|
const question = await tx
|
|
.select({
|
|
creator: questions.creator,
|
|
answerCount: questions.answerCount
|
|
})
|
|
.from(questions)
|
|
.where(eq(questions.id, questionId))
|
|
.limit(1);
|
|
|
|
if (!question.length) {
|
|
return json({ error: 'Question not found' }, { status: 400 });
|
|
}
|
|
|
|
const [questionData] = question;
|
|
|
|
// if (questionData.creator === user) {
|
|
// return json({ error: 'Cannot answer own question' }, { status: 400 });
|
|
// }
|
|
|
|
if (questionData.answerCount >= maxAnswers) {
|
|
return json({ error: 'No more answers needed' }, { status: 400 });
|
|
}
|
|
|
|
// Insert answer and update count atomically
|
|
const [newAnswer] = await tx
|
|
.insert(answers)
|
|
.values({
|
|
content,
|
|
creator: userId,
|
|
questionId
|
|
})
|
|
.returning();
|
|
|
|
await tx
|
|
.update(questions)
|
|
.set({ answerCount: sql`${questions.answerCount} + 1` })
|
|
.where(eq(questions.id, questionId));
|
|
|
|
return json(newAnswer);
|
|
});
|
|
}
|