api-server/src/modules/review/review.service.ts

65 lines
2.0 KiB
TypeScript
Raw Normal View History

import { Injectable, NotFoundException } from '@nestjs/common';
import { ReviewRepository } from './review.repository';
import { ReviewCardGenerationWorkflow } from '../ai/workflows/review-card-generation.workflow';
import { SubmitReviewDto } from './dto/submit-review.dto';
@Injectable()
export class ReviewService {
constructor(
private readonly reviewRepository: ReviewRepository,
private readonly cardGenerationWorkflow: ReviewCardGenerationWorkflow,
) {}
async getDueCards(userId: string) {
return this.reviewRepository.findDueCards(userId);
}
async submitReview(userId: string, id: string, dto: SubmitReviewDto) {
const card = await this.reviewRepository.findById(id);
if (!card) throw new NotFoundException(`Review card ${id} not found`);
const log = await this.reviewRepository.insertLog({
userId,
reviewCardId: id,
rating: dto.rating,
responseText: dto.responseText,
});
await this.reviewRepository.updateCard(id, {
status: 'reviewed',
nextReviewAt: new Date(Date.now() + 86400000),
});
return log;
}
async generateCards(userId: string, input: {
knowledgeItemTitle: string;
knowledgeItemContent: string;
cardCount?: number;
}) {
const result = await this.cardGenerationWorkflow.execute({
userId,
knowledgeItemTitle: input.knowledgeItemTitle,
knowledgeItemContent: input.knowledgeItemContent,
cardCount: input.cardCount,
});
const savedCards: any[] = [];
for (const card of result.cards) {
const saved = await this.reviewRepository.insertCard({
userId,
frontText: card.frontText,
backText: card.backText,
difficulty: card.difficulty,
status: 'active',
intervalDays: 1,
easeFactor: 2.5,
repetitionCount: 0,
lapseCount: 0,
nextReviewAt: new Date(),
});
savedCards.push(saved);
}
return { cards: savedCards, totalCount: result.totalCount };
}
}