package main import ( "context" "log" "net/http" "git.itzana.me/strafesnet/go-grpc/ranks" "git.itzana.me/strafesnet/go-grpc/times" "git.itzana.me/strafesnet/go-grpc/users" "git.itzana.me/strafesnet/public-api/api" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) type apiServer struct { client *grpc.ClientConn } // GetUserRank implements api.Handler. func (m *apiServer) GetUserRank(ctx context.Context, params api.GetUserRankParams) (*api.Rank, error) { client := ranks.NewRanksServiceClient(m.client) response, err := client.Get(ctx, &ranks.GetRequest{ UserID: params.UserID, StyleID: params.StyleID, ModeID: params.ModeID, GameID: params.GameID, }) if err != nil { return nil, err } return &api.Rank{ ID: api.NewOptInt64(response.ID), User: api.NewOptUser(api.User{ ID: api.NewOptInt64(response.User.ID), Username: api.NewOptString(response.User.Username), StateID: api.NewOptInt32(response.User.StateID), }), StyleID: api.NewOptInt32(response.StyleID), ModeID: api.NewOptInt32(response.ModeID), GameID: api.NewOptInt32(response.GameID), Rank: api.NewOptFloat64(response.Rank), Skill: api.NewOptFloat64(response.Skill), UpdatedAt: api.NewOptInt64(response.UpdatedAt), }, nil } // NewError implements api.Handler. func (m *apiServer) NewError(ctx context.Context, err error) *api.ErrorStatusCode { return &api.ErrorStatusCode{ StatusCode: 500, Response: api.Error{Message: err.Error()}, } } // GetTimes implements api.Handler. func (m *apiServer) ListTimes(ctx context.Context, params api.ListTimesParams) ([]api.Time, error) { client := times.NewTimesServiceClient(m.client) // Call the List method using params req := ×.ListRequest{ Page: ×.Pagination{ Number: params.Page.GetPage(), Size: params.Page.GetLimit(), }, } if filter, ok := params.Filter.Get(); ok { if id := filter.GetID(); id.IsSet() { req.Filter.ID = &id.Value } if time := filter.GetTime(); time.IsSet() { req.Filter.Time = &time.Value } if userID := filter.GetUserID(); userID.IsSet() { req.Filter.UserID = &userID.Value } if mapID := filter.GetMapID(); mapID.IsSet() { req.Filter.MapID = &mapID.Value } if styleID := filter.GetStyleID(); styleID.IsSet() { req.Filter.StyleID = &styleID.Value } if modeID := filter.GetModeID(); modeID.IsSet() { req.Filter.ModeID = &modeID.Value } if gameID := filter.GetGameID(); gameID.IsSet() { req.Filter.GameID = &gameID.Value } } response, err := client.List(ctx, req) if err != nil { return nil, err } return convertTimes(response.Times), nil } // GetUser implements api.Handler. func (m *apiServer) GetUser(ctx context.Context, params api.GetUserParams) (*api.User, error) { client := users.NewUsersServiceClient(m.client) response, err := client.Get(ctx, &users.IdMessage{ ID: params.UserID, }) if err != nil { return nil, err } return &api.User{ ID: api.NewOptInt64(response.ID), Username: api.NewOptString(response.Username), StateID: api.NewOptInt32(response.StateID), }, nil } // ListRanks implements api.Handler. func (m *apiServer) ListRanks(ctx context.Context, params api.ListRanksParams) ([]api.Rank, error) { client := ranks.NewRanksServiceClient(m.client) req := &ranks.ListRequest{ Page: &ranks.Pagination{ Number: params.Page.GetPage(), Size: params.Page.GetLimit(), }, } if filter, ok := params.Filter.Get(); ok { if gameID, ok := filter.GetGameID().Get(); ok { req.GameID = gameID } if modeID, ok := filter.GetModeID().Get(); ok { req.ModeID = modeID } if styleID, ok := filter.GetStyleID().Get(); ok { req.StyleID = styleID } if sort, ok := filter.GetSort().Get(); ok { req.Sort = sort } } response, err := client.List(ctx, req) if err != nil { return nil, err } ranks := make([]api.Rank, len(response.Ranks)) for i, r := range response.Ranks { ranks[i] = api.Rank{ ID: api.NewOptInt64(r.ID), User: api.NewOptUser(api.User{ ID: api.NewOptInt64(r.User.ID), Username: api.NewOptString(r.User.Username), StateID: api.NewOptInt32(r.User.StateID), }), StyleID: api.NewOptInt32(r.StyleID), ModeID: api.NewOptInt32(r.ModeID), GameID: api.NewOptInt32(r.GameID), Rank: api.NewOptFloat64(r.Rank), Skill: api.NewOptFloat64(r.Skill), UpdatedAt: api.NewOptInt64(r.UpdatedAt), } } return ranks, nil } func main() { // new grpc client conn, err := grpc.Dial("localhost:9000", grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatal(err) } svc := &apiServer{ client: conn, } srv, err := api.NewServer( svc, api.WithPathPrefix("/v2"), ) if err != nil { log.Fatal(err) } if err := http.ListenAndServe(":8080", srv); err != nil { log.Fatal(err) } } func convertTime(t *times.TimeResponse) api.Time { return api.Time{ ID: api.NewOptInt64(t.ID), Time: api.NewOptInt64(t.Time), User: api.NewOptUser(api.User{ ID: api.NewOptInt64(t.User.ID), Username: api.NewOptString(t.User.Username), StateID: api.NewOptInt32(t.User.StateID), }), Map: api.NewOptMap(api.Map{ ID: api.NewOptInt64(t.Map.ID), DisplayName: api.NewOptString(t.Map.DisplayName), Creator: api.NewOptString(t.Map.Creator), Date: api.NewOptInt64(t.Map.Date), }), Date: api.NewOptInt64(t.Date), StyleID: api.NewOptInt32(t.StyleID), ModeID: api.NewOptInt32(t.ModeID), GameID: api.NewOptInt32(t.GameID), } } func convertTimes(timeList []*times.TimeResponse) []api.Time { times := make([]api.Time, len(timeList)) for i, t := range timeList { times[i] = convertTime(t) } return times }