Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
205 changes: 138 additions & 67 deletions api/proto/racing/racing.pb.go

Large diffs are not rendered by default.

99 changes: 99 additions & 0 deletions api/proto/racing/racing.pb.gw.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions api/proto/racing/racing.proto
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@ service Racing {
rpc ListRaces(ListRacesRequest) returns (ListRacesResponse) {
option (google.api.http) = { post: "/v1/list-races", body: "*" };
}
// GetRace returns a single race by resource name.
rpc GetRace(GetRaceRequest) returns (Race) {
option (google.api.http) = { get: "/v1/{name=races/*}" };
}
}

/* Requests/Responses */
Expand All @@ -39,6 +43,12 @@ message ListRacesResponse {
repeated Race races = 1;
}

message GetRaceRequest {
// The resource name of the race to retrieve.
// Format: races/{race}
string name = 1; // required
}

// Filter for listing races.
message ListRacesRequestFilter {
repeated int64 meeting_ids = 1;
Expand Down
38 changes: 38 additions & 0 deletions api/proto/racing/racing_grpc.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

29 changes: 29 additions & 0 deletions racing/db/races.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ type RacesRepo interface {

// List will return a list of races.
List(filter *racing.ListRacesRequestFilter) ([]*racing.Race, error)

// Get returns a single race by numeric id.
Get(id int64) (*racing.Race, error)
}

type racesRepo struct {
Expand Down Expand Up @@ -62,6 +65,32 @@ func (r *racesRepo) List(filter *racing.ListRacesRequestFilter) ([]*racing.Race,
return r.scanRaces(rows)
}

func (r *racesRepo) Get(id int64) (*racing.Race, error) {
query := "SELECT id, meeting_id, name, number, visible, advertised_start_time FROM races WHERE id = ? LIMIT 1"
row := r.db.QueryRow(query, id)
var (
race racing.Race
advertisedStart time.Time
)
if err := row.Scan(&race.Id, &race.MeetingId, &race.Name, &race.Number, &race.Visible, &advertisedStart); err != nil {
if err == sql.ErrNoRows {
return nil, nil
}
return nil, err
}
ts, err := ptypes.TimestampProto(advertisedStart)
if err != nil {
return nil, err
}
race.AdvertisedStartTime = ts
if advertisedStart.After(time.Now()) {
race.Status = racing.RaceStatus_RACE_STATUS_OPEN
} else {
race.Status = racing.RaceStatus_RACE_STATUS_CLOSED
}
return &race, nil
}

func (r *racesRepo) applyFilter(query string, filter *racing.ListRacesRequestFilter) (string, []interface{}) {
var (
clauses []string
Expand Down
2 changes: 1 addition & 1 deletion racing/proto/racing.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
package proto

//go:generate protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. racing/racing.proto --experimental_allow_proto3_optional
//go:generate protoc -I . --go_out=paths=source_relative:. --go-grpc_out=paths=source_relative,require_unimplemented_servers=false:. racing/racing.proto --experimental_allow_proto3_optional
Loading