diff --git a/internal/repo/repo.go b/internal/repo/repo.go index c290c9e..63a7781 100644 --- a/internal/repo/repo.go +++ b/internal/repo/repo.go @@ -35,6 +35,9 @@ type Repo interface { // Get all players GetPlayers() ([]*model.Player, error) + // Search players by a query + SearchPlayer(string) ([]*model.Player, error) + // Get all games GetGames() ([]*model.Game, error) } diff --git a/internal/repo/sqlRepo.go b/internal/repo/sqlRepo.go index 45097e0..4d1530e 100644 --- a/internal/repo/sqlRepo.go +++ b/internal/repo/sqlRepo.go @@ -277,3 +277,30 @@ func (s *SQLRepo) GetGames() ([]*model.Game, error) { return rtn, nil } + +func (s *SQLRepo) SearchPlayer(query string) ([]*model.Player, error) { + rows, err := s.db.Query(` + SELECT id, name, elo + FROM Players + WHERE name LIKE ? + `, query+"%") + + if err != nil { + return nil, err + } + + rtn := []*model.Player{} + + for rows.Next() { + var player model.Player + + err = rows.Scan(&player.ID, &player.Name, &player.Elo) + if err != nil { + return nil, err + } + + rtn = append(rtn, &player) + } + + return rtn, nil +} diff --git a/internal/web/gqlSchema.go b/internal/web/gqlSchema.go index f0c248f..a1816f9 100644 --- a/internal/web/gqlSchema.go +++ b/internal/web/gqlSchema.go @@ -329,15 +329,36 @@ func createShema(repo repo.Repo) graphql.Schema { }, }, "players": &graphql.Field{ - Type: graphql.NewNonNull(graphql.NewList(player)), + Type: graphql.NewNonNull(graphql.NewList(graphql.NewNonNull(player))), Description: "Get all players", + Args: graphql.FieldConfigArgument{ + "query": &graphql.ArgumentConfig{ + Type: graphql.String, + DefaultValue: "", + }, + }, Resolve: func(p graphql.ResolveParams) (interface{}, error) { - players, err := repo.GetPlayers() - if err != nil { - return nil, err + query, ok := p.Args["query"].(string) + if !ok { + log.Printf("Failed to parse query at players: %v", p.Args["query"]) + return nil, nil } - return players, nil + if query == "" { + players, err := repo.GetPlayers() + if err != nil { + return nil, err + } + + return players, nil + } else { + players, err := repo.SearchPlayer(query) + if err != nil { + return nil, err + } + + return players, nil + } }, }, "games": &graphql.Field{