diff --git a/typing-server/api/handler/score.go b/typing-server/api/handler/score.go index 6dae89dc..543e75cd 100644 --- a/typing-server/api/handler/score.go +++ b/typing-server/api/handler/score.go @@ -7,6 +7,7 @@ import ( "github.com/google/uuid" "github.com/su-its/typing/typing-server/api/service" + "github.com/su-its/typing/typing-server/domain/model" ) func GetScoresRanking(w http.ResponseWriter, r *http.Request) { @@ -29,18 +30,20 @@ func GetScoresRanking(w http.ResponseWriter, r *http.Request) { limit = 10 } - rankings, totalCount, err := service.GetScoresRanking(ctx, entClient, sortBy, start, limit) + request := model.GetScoresRankingRequest{ + SortBy: sortBy, + Start: start, + Limit: limit, + } + + response, err := service.GetScoresRanking(ctx, entClient, &request) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } - w.Header().Set("Content-Type", "application/json") - err = json.NewEncoder(w).Encode(map[string]interface{}{ - "rankings": rankings, - "total_count": totalCount, - }) + err = json.NewEncoder(w).Encode(response) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return diff --git a/typing-server/api/repository/score.go b/typing-server/api/repository/score.go index 6050bcbd..47ce77df 100644 --- a/typing-server/api/repository/score.go +++ b/typing-server/api/repository/score.go @@ -12,7 +12,7 @@ import ( "github.com/su-its/typing/typing-server/domain/repository/ent/user" ) -func GetScoresRanking(ctx context.Context, client *ent.Client, sortBy string, start, limit int) ([]*model.ScoreRanking, int, error) { +func GetScoresRanking(ctx context.Context, client *ent.Client, request *model.GetScoresRankingRequest) (*model.GetScoresRankingResponse, error) { var scores []*ent.Score // entのクエリを使用してスコアを取得 @@ -24,15 +24,15 @@ func GetScoresRanking(ctx context.Context, client *ent.Client, sortBy string, st score.AccuracyGTE(0.95), ), ). - Order(ent.Desc(sortBy)) + Order(ent.Desc(request.SortBy)) - switch sortBy { + switch request.SortBy { case "accuracy": query = query.Where(score.IsMaxAccuracy(true)) case "keystrokes": query = query.Where(score.IsMaxKeystrokes(true)) default: - return nil, 0, fmt.Errorf("invalid sort by parameter: %s", sortBy) + return nil, fmt.Errorf("invalid sort by parameter: %s", request.SortBy) } //全件数の取得 @@ -40,12 +40,12 @@ func GetScoresRanking(ctx context.Context, client *ent.Client, sortBy string, st // フラグでフィルタリングされたスコアを取得 scores, err := query. - Limit(limit). - Offset(start - 1). + Limit(request.Limit). + Offset(request.Start - 1). All(ctx) if err != nil { - return nil, 0, err + return nil, err } var rankings []*model.ScoreRanking @@ -71,7 +71,7 @@ func GetScoresRanking(ctx context.Context, client *ent.Client, sortBy string, st } var currentScore float64 - switch sortBy { + switch request.SortBy { case "accuracy": currentScore = s.Accuracy case "keystrokes": @@ -79,7 +79,7 @@ func GetScoresRanking(ctx context.Context, client *ent.Client, sortBy string, st } if i == 0 || currentScore != prevScore { - rank = start + i + rank = request.Start + i } prevScore = currentScore @@ -92,7 +92,10 @@ func GetScoresRanking(ctx context.Context, client *ent.Client, sortBy string, st rankings = append(rankings, ranking) } - return rankings, count, nil + return &model.GetScoresRankingResponse{ + Rankings: rankings, + TotalCount: count, + }, nil } func CreateScore(ctx context.Context, client *ent.Client, userID uuid.UUID, keystrokes int, accuracy float64) error { // トランザクションを開始 diff --git a/typing-server/api/service/score.go b/typing-server/api/service/score.go index 2f6e03b8..e3a52481 100644 --- a/typing-server/api/service/score.go +++ b/typing-server/api/service/score.go @@ -9,12 +9,12 @@ import ( "github.com/su-its/typing/typing-server/domain/repository/ent" ) -func GetScoresRanking(ctx context.Context, client *ent.Client, sortBy string, start, limit int) ([]*model.ScoreRanking, int, error) { - rankings, totalCount, err := repository.GetScoresRanking(ctx, client, sortBy, start, limit) +func GetScoresRanking(ctx context.Context, client *ent.Client, request *model.GetScoresRankingRequest) (*model.GetScoresRankingResponse, error) { + response, err := repository.GetScoresRanking(ctx, client, request) if err != nil { - return nil, 0, err + return nil, err } - return rankings, totalCount, nil + return response, nil } func CreateScore(ctx context.Context, client *ent.Client, userID uuid.UUID, keystrokes int, accuracy float64) error { diff --git a/typing-server/domain/model/model.go b/typing-server/domain/model/model.go index 0239d0f3..6582e32b 100644 --- a/typing-server/domain/model/model.go +++ b/typing-server/domain/model/model.go @@ -23,3 +23,14 @@ type Score struct { CreatedAt time.Time `json:"created_at"` User User `json:"user"` } + +type GetScoresRankingRequest struct { + SortBy string `json:"sort_by"` + Start int `json:"start"` + Limit int `json:"limit"` +} + +type GetScoresRankingResponse struct { + Rankings []*ScoreRanking `json:"rankings"` + TotalCount int `json:"total_count"` +}