// session_resolvers.go package graph import ( "context" "fmt" "tailly_back_v2/internal/domain" "time" ) type sessionResolver struct{ *Resolver } // MySessions is the resolver for the mySessions field. func (r *queryResolver) MySessions(ctx context.Context) ([]*domain.Session, error) { userID, err := getUserIDFromContext(ctx) if err != nil { return nil, err } sessions, err := r.Services.Session.GetActiveSessions(ctx, userID) if err != nil { return nil, fmt.Errorf("failed to get sessions: %w", err) } return sessions, nil } // Session returns SessionResolver implementation. func (r *Resolver) Session() SessionResolver { return &sessionResolver{r} } // StartedAt is the resolver for the startedAt field. func (r *sessionResolver) StartedAt(ctx context.Context, obj *domain.Session) (string, error) { return obj.StartedAt.Format(time.RFC3339), nil } // LastActiveAt is the resolver for the lastActiveAt field. func (r *sessionResolver) LastActiveAt(ctx context.Context, obj *domain.Session) (string, error) { if !obj.EndedAt.IsZero() { return obj.EndedAt.Format(time.RFC3339), nil } return time.Now().Format(time.RFC3339), nil } // TerminateSession is the resolver for the terminateSession field. func (r *mutationResolver) TerminateSession(ctx context.Context, sessionID int) (bool, error) { userID, err := getUserIDFromContext(ctx) if err != nil { return false, err } if err := r.Services.Session.Terminate(ctx, userID, sessionID); err != nil { return false, fmt.Errorf("failed to terminate session: %w", err) } return true, nil }