2025-10-03 14:32:45 +07:00

44 lines
975 B
Go

package context_handler
import (
"context"
"errors"
"fmt"
"time"
)
type keyType string
const userKey keyType = "userID"
// WithUserID stores user id in context
func WithUserID(ctx context.Context, userID string) context.Context {
return context.WithValue(ctx, userKey, userID)
}
// FetchRiwayatKursus simulates fetching course history but respects context deadlines/cancel.
func FetchRiwayatKursus(ctx context.Context) (string, error) {
// try to read user ID
uid, _ := ctx.Value(userKey).(string)
if uid == "" {
uid = "unknown"
}
// simulate work that may take up to 2 seconds
work := make(chan string, 1)
go func() {
// simulate slower work 1.5s
time.Sleep(1500 * time.Millisecond)
work <- fmt.Sprintf("history for user %s: [Course-A, Course-B]", uid)
}()
select {
case <-ctx.Done():
// context timed out or cancelled
return "", errors.New("fetch cancelled or timed out: " + ctx.Err().Error())
case res := <-work:
return res, nil
}
}