Skip to content

Commit c75af6e

Browse files
committed
feat(question-bank): list my test sessions
1 parent 0908769 commit c75af6e

5 files changed

Lines changed: 90 additions & 1 deletion

File tree

question-bank/server/core/port/service.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ type Service interface {
1212
BeginTestSession(ctx context.Context, userID, testID string) (*core.UserTestSession, error)
1313
SaveTestSession(ctx context.Context, userID, testID string, answers map[string]string) error
1414
EndTestSession(ctx context.Context, userID, testID string, answers map[string]string) error
15+
ListMyTestSessions(ctx context.Context, userID string) ([]core.UserTestSession, error)
1516
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package service
2+
3+
import (
4+
"context"
5+
6+
"github.com/pkg/errors"
7+
"github.com/rs/zerolog/log"
8+
9+
"github.com/noah-platform/noah/question-bank/server/core"
10+
)
11+
12+
func (s *Service) ListMyTestSessions(ctx context.Context, userID string) ([]core.UserTestSession, error) {
13+
l := log.Ctx(ctx)
14+
15+
sessions, err := s.userTestSessionRepo.GetManySessionsByUserID(ctx, userID)
16+
if err != nil {
17+
l.Error().Err(err).Msg("[Service.ListMyTestSessions] failed to list my test sessions")
18+
19+
return nil, errors.Wrap(err, "failed to list my test sessions")
20+
}
21+
22+
return sessions, nil
23+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package handler
2+
3+
import (
4+
"time"
5+
6+
"github.com/labstack/echo/v4"
7+
"github.com/rs/zerolog/log"
8+
"github.com/samber/lo"
9+
10+
"github.com/noah-platform/noah/pkg/response"
11+
"github.com/noah-platform/noah/question-bank/server/core"
12+
)
13+
14+
type MyTestSession struct {
15+
Test *core.TestEntry `json:"test"`
16+
Answers map[string]string `json:"answers"`
17+
StartedAt time.Time `json:"startedAt"`
18+
LastActiveAt time.Time `json:"lastActiveAt"`
19+
ElapsedTime int `json:"elapsedTime"`
20+
CompletedAt *time.Time `json:"completedAt"`
21+
}
22+
23+
type ListMyTestSessionsResponse = []MyTestSession
24+
25+
// ListMyTestSessionsResponse godoc
26+
//
27+
// @Summary List my test sessions
28+
// @Tags external
29+
// @Router /external/v1/sessions [get]
30+
// @Success 200 {object} response.DataResponse[ListMyTestSessionsResponse]
31+
// @Failure 500 {object} response.ErrorResponse
32+
func (s *Server) ListMyTestSessions(c echo.Context) error {
33+
ctx := c.Request().Context()
34+
35+
userID := s.auth.GetUserID(c)
36+
37+
l := log.With().Str("requestId", c.Response().Header().Get(echo.HeaderXRequestID)).Str("userID", userID).Logger()
38+
ctx = l.WithContext(ctx)
39+
40+
sessions, err := s.service.ListMyTestSessions(ctx, userID)
41+
if err != nil {
42+
l.Error().Err(err).Msg("[Server.ListMyTestSessions] failed to list my test sessions")
43+
44+
return response.InternalServerError(c, "failed to list my test sessions")
45+
}
46+
47+
l.Info().Msg("[Server.ListMyTestSessions] list my tests sessions successfully")
48+
49+
mySessions := lo.Map(sessions, func(session core.UserTestSession, _ int) MyTestSession {
50+
return MyTestSession{
51+
Test: session.Test,
52+
Answers: session.Answers,
53+
StartedAt: session.StartedAt,
54+
LastActiveAt: session.LastActiveAt,
55+
ElapsedTime: session.ElapsedTime,
56+
CompletedAt: session.CompletedAt,
57+
}
58+
})
59+
return response.Ok(c, ListMyTestSessionsResponse(mySessions))
60+
}

question-bank/server/handler/route.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ func (s *Server) Start() {
3535
u.POST("/external/v1/tests/:testID", s.BeginTestSession)
3636
u.PUT("/external/v1/tests/:testID", s.SaveTestSession)
3737
u.POST("/external/v1/tests/:testID/end", s.EndTestSession)
38+
u.GET("/external/v1/sessions", s.ListMyTestSessions)
3839

3940
s.RunWithGracefulShutdown(e)
4041
}

question-bank/server/repository/user_test_session_get_many_sessions_by_user_id.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,19 @@ import (
66
"github.com/pkg/errors"
77
"github.com/rs/zerolog/log"
88
"go.mongodb.org/mongo-driver/bson"
9+
"go.mongodb.org/mongo-driver/mongo/options"
910

1011
"github.com/noah-platform/noah/question-bank/server/core"
1112
)
1213

1314
func (r *UserTestSessionRepository) GetManySessionsByUserID(ctx context.Context, userID string) ([]core.UserTestSession, error) {
1415
l := log.Ctx(ctx)
1516

17+
filter := bson.M{"userId": userID, "completedAt": bson.M{"$ne": nil}}
18+
opts := options.Find().SetSort(bson.D{{"startedAt", -1}})
19+
1620
var sessions []core.UserTestSession
17-
cursor, err := r.userTestSession.Find(ctx, bson.M{"userId": userID})
21+
cursor, err := r.userTestSession.Find(ctx, filter, opts)
1822
if err != nil {
1923
l.Error().Err(err).Msg("[UserTestSessionRepository.GetManySessionsByUserID] failed to get user test session")
2024

0 commit comments

Comments
 (0)