175 lines
4.6 KiB
Go
175 lines
4.6 KiB
Go
package repository
|
|
|
|
import (
|
|
dbgen "Yimaru-Backend/gen/db"
|
|
"Yimaru-Backend/internal/domain"
|
|
"Yimaru-Backend/internal/ports"
|
|
"context"
|
|
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
)
|
|
|
|
func NewInitialAssessmentStore(s *Store) ports.InitialAssessmentStore { return s }
|
|
|
|
func (r *Store) GetCorrectOptionForQuestion(
|
|
ctx context.Context,
|
|
questionID int64,
|
|
) (int64, error) {
|
|
|
|
optId, err := r.queries.GetCorrectOptionForQuestion(ctx, questionID)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
return optId, nil
|
|
}
|
|
|
|
func (r *Store) GetLatestAssessmentAttempt(
|
|
ctx context.Context,
|
|
userID int64,
|
|
) (*dbgen.AssessmentAttempt, error) {
|
|
|
|
attempt, err := r.queries.GetLatestAssessmentAttempt(ctx, userID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &attempt, nil
|
|
}
|
|
|
|
func (s *Store) CreateAssessmentQuestion(
|
|
ctx context.Context,
|
|
q domain.AssessmentQuestion,
|
|
) (domain.AssessmentQuestion, error) {
|
|
|
|
row, err := s.queries.CreateAssessmentQuestion(ctx, dbgen.CreateAssessmentQuestionParams{
|
|
Title: q.Title,
|
|
Description: pgtype.Text{String: q.Description, Valid: q.Description != ""},
|
|
QuestionType: q.QuestionType,
|
|
DifficultyLevel: q.DifficultyLevel,
|
|
})
|
|
if err != nil {
|
|
return domain.AssessmentQuestion{}, err
|
|
}
|
|
|
|
for _, opt := range q.Options {
|
|
if err := s.queries.CreateAssessmentQuestionOption(ctx,
|
|
dbgen.CreateAssessmentQuestionOptionParams{
|
|
QuestionID: row.ID,
|
|
OptionText: opt.OptionText,
|
|
IsCorrect: opt.IsCorrect,
|
|
},
|
|
); err != nil {
|
|
return domain.AssessmentQuestion{}, err
|
|
}
|
|
}
|
|
|
|
q.ID = row.ID
|
|
return q, nil
|
|
}
|
|
|
|
func (s *Store) GetActiveAssessmentQuestions(ctx context.Context) ([]domain.AssessmentQuestion, error) {
|
|
questionsRows, err := s.queries.GetActiveAssessmentQuestions(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
questions := make([]domain.AssessmentQuestion, 0, len(questionsRows))
|
|
for _, q := range questionsRows {
|
|
optionsRows, err := s.queries.GetQuestionOptions(ctx, q.ID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
options := make([]domain.AssessmentOption, 0, len(optionsRows))
|
|
for _, o := range optionsRows {
|
|
options = append(options, domain.AssessmentOption{
|
|
ID: o.ID,
|
|
OptionText: o.OptionText,
|
|
IsCorrect: o.IsCorrect,
|
|
})
|
|
}
|
|
|
|
questions = append(questions, domain.AssessmentQuestion{
|
|
ID: q.ID,
|
|
Title: q.Title,
|
|
Description: q.Description.String,
|
|
QuestionType: q.QuestionType,
|
|
DifficultyLevel: q.DifficultyLevel,
|
|
Options: options,
|
|
})
|
|
}
|
|
|
|
return questions, nil
|
|
}
|
|
|
|
// SaveAssessmentAttempt saves the attempt summary and answers
|
|
// func (s *Store) SaveAssessmentAttempt(ctx context.Context, userID int64, answers []domain.UserAnswer) (domain.AssessmentAttempt, error) {
|
|
// total := len(answers)
|
|
// correct := 0
|
|
|
|
// for _, ans := range answers {
|
|
// if ans.IsCorrect {
|
|
// correct++
|
|
// }
|
|
// }
|
|
|
|
// score := float64(correct) / float64(total) * 100
|
|
// knowledgeLevel := "BEGINNER"
|
|
// switch {
|
|
// case score >= 80:
|
|
// knowledgeLevel = "ADVANCED"
|
|
// case score >= 50:
|
|
// knowledgeLevel = "INTERMEDIATE"
|
|
// }
|
|
|
|
// // Save attempt
|
|
// attemptRow, err := s.queries.CreateAssessmentAttempt(ctx, dbgen.CreateAssessmentAttemptParams{
|
|
// UserID: userID,
|
|
// TotalQuestions: int32(total),
|
|
// CorrectAnswers: int32(correct),
|
|
// ScorePercentage: pgtype.Numeric{Int: big.NewInt(int64(score * 100)), Valid: true},
|
|
// KnowledgeLevel: knowledgeLevel,
|
|
// })
|
|
// if err != nil {
|
|
// return domain.AssessmentAttempt{}, err
|
|
// }
|
|
|
|
// // Save answers
|
|
// for _, ans := range answers {
|
|
// err := s.queries.CreateAssessmentAnswer(ctx, dbgen.CreateAssessmentAnswerParams{
|
|
// AttemptID: attemptRow.ID,
|
|
// QuestionID: ans.QuestionID,
|
|
// SelectedOptionID: pgtype.Int8{Int64: ans.SelectedOptionID, Valid: true},
|
|
// ShortAnswer: pgtype.Text{String: ans.ShortAnswer, Valid: true},
|
|
// IsCorrect: ans.IsCorrect,
|
|
// })
|
|
// if err != nil {
|
|
// return domain.AssessmentAttempt{}, err
|
|
// }
|
|
// }
|
|
|
|
// return domain.AssessmentAttempt{
|
|
// ID: attemptRow.ID,
|
|
// UserID: userID,
|
|
// TotalQuestions: total,
|
|
// CorrectAnswers: correct,
|
|
// ScorePercentage: score,
|
|
// KnowledgeLevel: knowledgeLevel,
|
|
// CompletedAt: attemptRow.CompletedAt.Time,
|
|
// }, nil
|
|
// }
|
|
|
|
// GetOptionByID fetches a single option to validate correctness
|
|
func (s *Store) GetOptionByID(ctx context.Context, optionID int64) (domain.AssessmentOption, error) {
|
|
o, err := s.queries.GetAssessmentOptionByID(ctx, optionID)
|
|
if err != nil {
|
|
return domain.AssessmentOption{}, err
|
|
}
|
|
return domain.AssessmentOption{
|
|
ID: o.ID,
|
|
OptionText: o.OptionText,
|
|
IsCorrect: o.IsCorrect,
|
|
}, nil
|
|
}
|