107 lines
3.1 KiB
Go
107 lines
3.1 KiB
Go
package assignmentgen
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"boostai-backend/internal/sqlc"
|
|
)
|
|
|
|
const defaultPersonalizedRatio = 0.30
|
|
|
|
type WeaknessSummary struct {
|
|
TopicScores map[sqlc.QuestionTopic]float64
|
|
WeakTags []string
|
|
RecentIssues []string
|
|
}
|
|
|
|
type MixedPlanParams struct {
|
|
StudentID int64
|
|
PrimaryTopic sqlc.QuestionTopic
|
|
PrimaryDifficulty sqlc.QuestionDifficulty
|
|
TotalQuestions int
|
|
PersonalizedRatio float64
|
|
BaseSeed int64
|
|
PersonalizedDifficulty sqlc.QuestionDifficulty
|
|
}
|
|
|
|
type MixedPlan struct {
|
|
Plan []PlanItem
|
|
WeaknessSummary WeaknessSummary
|
|
CoreCount int
|
|
PersonalizedCount int
|
|
PersonalizedTopic sqlc.QuestionTopic
|
|
PersonalizedApplied bool
|
|
BaseSeed int64
|
|
}
|
|
|
|
type GenerateMixedStudentQuestionSetParams struct {
|
|
AssignmentID int64
|
|
StudentID int64
|
|
TeacherID int64
|
|
Subject string
|
|
QuestionStatus sqlc.QuestionStatus
|
|
QuestionSource string
|
|
PrimaryTopic sqlc.QuestionTopic
|
|
PrimaryDifficulty sqlc.QuestionDifficulty
|
|
TotalQuestions int
|
|
PersonalizedRatio float64
|
|
Seed int64
|
|
PersonalizedDifficulty sqlc.QuestionDifficulty
|
|
}
|
|
|
|
type GenerateMixedStudentQuestionSetResult struct {
|
|
StoredQuestions []StoredStudentQuestion
|
|
MixedPlan MixedPlan
|
|
}
|
|
|
|
func (s *Service) BuildWeaknessSummary(ctx context.Context, studentID int64) (WeaknessSummary, error) {
|
|
if s == nil || s.db == nil || s.db.Pool == nil {
|
|
return WeaknessSummary{}, fmt.Errorf("assignment question generator database is not configured")
|
|
}
|
|
if studentID <= 0 {
|
|
return WeaknessSummary{}, fmt.Errorf("student_id is required")
|
|
}
|
|
|
|
queries := sqlc.New(s.db.Pool)
|
|
rows, err := queries.ListStudentPlanningPerformance(ctx, studentID)
|
|
if err != nil {
|
|
return WeaknessSummary{}, err
|
|
}
|
|
|
|
return buildWeaknessSummary(rows), nil
|
|
}
|
|
|
|
func (s *Service) GenerateAndStoreMixedStudentQuestions(ctx context.Context, params GenerateMixedStudentQuestionSetParams) (GenerateMixedStudentQuestionSetResult, error) {
|
|
mixedPlan, err := s.BuildMixedPlan(ctx, MixedPlanParams{
|
|
StudentID: params.StudentID,
|
|
PrimaryTopic: params.PrimaryTopic,
|
|
PrimaryDifficulty: params.PrimaryDifficulty,
|
|
TotalQuestions: params.TotalQuestions,
|
|
PersonalizedRatio: params.PersonalizedRatio,
|
|
BaseSeed: params.Seed,
|
|
PersonalizedDifficulty: params.PersonalizedDifficulty,
|
|
})
|
|
if err != nil {
|
|
return GenerateMixedStudentQuestionSetResult{}, err
|
|
}
|
|
|
|
storedQuestions, err := s.GenerateAndStoreStudentQuestions(ctx, GenerateStudentQuestionSetParams{
|
|
AssignmentID: params.AssignmentID,
|
|
StudentID: params.StudentID,
|
|
TeacherID: params.TeacherID,
|
|
Subject: params.Subject,
|
|
QuestionStatus: params.QuestionStatus,
|
|
QuestionSource: params.QuestionSource,
|
|
Plan: mixedPlan.Plan,
|
|
})
|
|
if err != nil {
|
|
return GenerateMixedStudentQuestionSetResult{}, err
|
|
}
|
|
|
|
return GenerateMixedStudentQuestionSetResult{
|
|
StoredQuestions: storedQuestions,
|
|
MixedPlan: mixedPlan,
|
|
}, nil
|
|
}
|