feat: localize interview questions (ko/en), send X-Lang header
This commit is contained in:
@@ -2,28 +2,49 @@ package interview
|
||||
|
||||
import "tutor/internal/workflows"
|
||||
|
||||
func BackendDeveloperQuestions() []Question {
|
||||
return []Question{
|
||||
var questionPrompts = map[string]map[string]string{
|
||||
"ko": {
|
||||
"backend-http-idempotency": "HTTP 메서드가 멱등성을 가지려면 어떤 조건이 필요하며, 재시도 시 왜 중요한가요?",
|
||||
"backend-db-index-tradeoff": "데이터베이스 인덱스를 추가하면 API가 어떻게 개선되며, 어떤 트레이드오프가 발생할 수 있나요?",
|
||||
"backend-cache-invalidation": "API 응답을 캐싱할지 어떻게 결정하며, 오래된 데이터는 어떻게 처리하나요?",
|
||||
},
|
||||
"en": {
|
||||
"backend-http-idempotency": "What makes an HTTP method idempotent, and why does that matter for retries?",
|
||||
"backend-db-index-tradeoff": "When would adding a database index improve an API, and what tradeoffs can it introduce?",
|
||||
"backend-cache-invalidation": "How would you decide whether to cache an API response, and how would you handle stale data?",
|
||||
},
|
||||
}
|
||||
|
||||
func BackendDeveloperQuestions(lang string) []Question {
|
||||
if lang == "" {
|
||||
lang = "en"
|
||||
}
|
||||
base := []Question{
|
||||
{
|
||||
ID: "backend-http-idempotency",
|
||||
Prompt: "What makes an HTTP method idempotent, and why does that matter for retries?",
|
||||
ID: "backend-http-idempotency",
|
||||
Concepts: []workflows.ConceptRef{
|
||||
{ID: "http-idempotency", Label: "HTTP idempotency", Track: BackendDeveloperTrack},
|
||||
},
|
||||
},
|
||||
{
|
||||
ID: "backend-db-index-tradeoff",
|
||||
Prompt: "When would adding a database index improve an API, and what tradeoffs can it introduce?",
|
||||
ID: "backend-db-index-tradeoff",
|
||||
Concepts: []workflows.ConceptRef{
|
||||
{ID: "database-indexes", Label: "Database indexes", Track: BackendDeveloperTrack},
|
||||
},
|
||||
},
|
||||
{
|
||||
ID: "backend-cache-invalidation",
|
||||
Prompt: "How would you decide whether to cache an API response, and how would you handle stale data?",
|
||||
ID: "backend-cache-invalidation",
|
||||
Concepts: []workflows.ConceptRef{
|
||||
{ID: "cache-invalidation", Label: "Cache invalidation", Track: BackendDeveloperTrack},
|
||||
},
|
||||
},
|
||||
}
|
||||
for i := range base {
|
||||
if p, ok := questionPrompts[lang][base[i].ID]; ok {
|
||||
base[i].Prompt = p
|
||||
} else if p, ok := questionPrompts["en"][base[i].ID]; ok {
|
||||
base[i].Prompt = p
|
||||
}
|
||||
}
|
||||
return base
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ func (s *Service) CreateSession(_ context.Context, input CreateSessionInput) (Se
|
||||
TargetRole: input.TargetRole,
|
||||
Stack: append([]string(nil), input.Stack...),
|
||||
InterviewTimeline: input.InterviewTimeline,
|
||||
Questions: BackendDeveloperQuestions(),
|
||||
Questions: BackendDeveloperQuestions(input.Lang),
|
||||
CreatedAt: time.Now().UTC(),
|
||||
}
|
||||
if s.memory != nil {
|
||||
|
||||
@@ -47,6 +47,7 @@ type CreateSessionInput struct {
|
||||
TargetRole string
|
||||
Stack []string
|
||||
InterviewTimeline string
|
||||
Lang string
|
||||
}
|
||||
|
||||
type SubmitAnswerInput struct {
|
||||
|
||||
Reference in New Issue
Block a user