From dace105a9ae5fbb2b7b278f708b480e09fc5843b Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Fri, 25 Jul 2025 20:31:56 -0700 Subject: [PATCH 1/4] update go-grpc for maps_extended --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8a065af..b11ec06 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.24.0 require ( git.itzana.me/StrafesNET/dev-service v0.0.0-20250628022558-4cf59e46f9f1 - git.itzana.me/strafesnet/go-grpc v0.0.0-20250628021738-df0a4ad40969 + git.itzana.me/strafesnet/go-grpc v0.0.0-20250724030029-845bea991815 github.com/gin-gonic/gin v1.10.1 github.com/sirupsen/logrus v1.9.3 github.com/swaggo/files v1.0.1 diff --git a/go.sum b/go.sum index e0fdc9b..4d3c159 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= git.itzana.me/StrafesNET/dev-service v0.0.0-20250628022558-4cf59e46f9f1 h1:Ndpa4d93gCQrW5pm64u9IRaDJTfu7fKfLqm8ctzML1o= git.itzana.me/StrafesNET/dev-service v0.0.0-20250628022558-4cf59e46f9f1/go.mod h1:KJal0K++M6HEzSry6JJ2iDPZtOQn5zSstNlDbU3X4Jg= -git.itzana.me/strafesnet/go-grpc v0.0.0-20250628021738-df0a4ad40969 h1:bGfsRi9WrklI5cwvfvI/jJAGa3PQgJVNAzseFBW56mY= -git.itzana.me/strafesnet/go-grpc v0.0.0-20250628021738-df0a4ad40969/go.mod h1:X7XTRUScRkBWq8q8bplbeso105RPDlnY7J6Wy1IwBMs= +git.itzana.me/strafesnet/go-grpc v0.0.0-20250724030029-845bea991815 h1:hkuOnehphRXUq/2z2UYgoqTq5MJj1GsWfshyc7bXda8= +git.itzana.me/strafesnet/go-grpc v0.0.0-20250724030029-845bea991815/go.mod h1:X7XTRUScRkBWq8q8bplbeso105RPDlnY7J6Wy1IwBMs= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= -- 2.49.1 From b98b184a3257693f14058e10995260f070426c21 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Fri, 25 Jul 2025 20:38:50 -0700 Subject: [PATCH 2/4] switch maps queries to maps_extended times continues to use the embedded map --- pkg/api/dto/map.go | 4 ---- pkg/api/dto/map_extended.go | 33 +++++++++++++++++++++++++++++++++ pkg/api/handlers/maps.go | 26 +++++++++++++------------- 3 files changed, 46 insertions(+), 17 deletions(-) create mode 100644 pkg/api/dto/map_extended.go diff --git a/pkg/api/dto/map.go b/pkg/api/dto/map.go index 5251df1..86ad259 100644 --- a/pkg/api/dto/map.go +++ b/pkg/api/dto/map.go @@ -5,10 +5,6 @@ import ( "time" ) -type MapFilter struct { - GameID *int32 `json:"game_id" form:"game_id"` -} // @name MapFilter - type Map struct { ID int64 `json:"id"` DisplayName string `json:"display_name"` diff --git a/pkg/api/dto/map_extended.go b/pkg/api/dto/map_extended.go new file mode 100644 index 0000000..c61e7c6 --- /dev/null +++ b/pkg/api/dto/map_extended.go @@ -0,0 +1,33 @@ +package dto + +import ( + "git.itzana.me/strafesnet/go-grpc/maps_extended" + "time" +) + +type MapExtendedFilter struct { + GameID *uint32 `json:"game_id" form:"game_id"` +} // @name MapFilter + +type MapExtended struct { + ID int64 `json:"id"` + DisplayName string `json:"display_name"` + Creator string `json:"creator"` + GameID uint32 `json:"game_id"` + Date time.Time `json:"date"` +} // @name Map + +// FromGRPC converts a maps.MapResponse protobuf message to a Map domain object +func (m *MapExtended) FromGRPC(resp *maps_extended.MapResponse) *MapExtended { + if resp == nil { + return nil + } + + m.ID = resp.ID + m.DisplayName = resp.DisplayName + m.Creator = resp.Creator + m.Date = time.Unix(resp.Date, 0) + m.GameID = resp.GameID + + return m +} diff --git a/pkg/api/handlers/maps.go b/pkg/api/handlers/maps.go index 10a4b5e..2a737b2 100644 --- a/pkg/api/handlers/maps.go +++ b/pkg/api/handlers/maps.go @@ -1,7 +1,7 @@ package handlers import ( - "git.itzana.me/strafesnet/go-grpc/maps" + "git.itzana.me/strafesnet/go-grpc/maps_extended" "git.itzana.me/strafesnet/public-api/pkg/api/dto" "github.com/gin-gonic/gin" log "github.com/sirupsen/logrus" @@ -49,7 +49,7 @@ func (h *MapHandler) Get(ctx *gin.Context) { } // Call the gRPC service - mapData, err := maps.NewMapsServiceClient(h.dataClient).Get(ctx, &maps.IdMessage{ + mapData, err := maps_extended.NewMapsServiceClient(h.dataClient).Get(ctx, &maps_extended.MapId{ ID: mapID, }) if err != nil { @@ -72,11 +72,11 @@ func (h *MapHandler) Get(ctx *gin.Context) { } // Convert gRPC MapResponse object to dto.Map object - var mapDto dto.Map + var mapDto dto.MapExtended result := mapDto.FromGRPC(mapData) // Return the map data - ctx.JSON(http.StatusOK, dto.Response[dto.Map]{ + ctx.JSON(http.StatusOK, dto.Response[dto.MapExtended]{ Data: *result, }) } @@ -107,7 +107,7 @@ func (h *MapHandler) List(ctx *gin.Context) { } // Get list filter - var filter dto.MapFilter + var filter dto.MapExtendedFilter if err := ctx.ShouldBindQuery(&filter); err != nil { ctx.JSON(http.StatusBadRequest, dto.Error{ Error: err.Error(), @@ -116,13 +116,13 @@ func (h *MapHandler) List(ctx *gin.Context) { } // Call the gRPC service - mapList, err := maps.NewMapsServiceClient(h.dataClient).List(ctx, &maps.ListRequest{ - Filter: &maps.MapFilter{ + mapList, err := maps_extended.NewMapsServiceClient(h.dataClient).List(ctx, &maps_extended.ListRequest{ + Filter: &maps_extended.MapFilter{ GameID: filter.GameID, }, - Page: &maps.Pagination{ - Size: int32(query.PageSize), - Number: int32(query.PageNumber), + Page: &maps_extended.Pagination{ + Size: uint32(query.PageSize), + Number: uint32(query.PageNumber), }, }) if err != nil { @@ -136,14 +136,14 @@ func (h *MapHandler) List(ctx *gin.Context) { } // Convert gRPC MapResponse objects to dto.Map objects - dtoMaps := make([]dto.Map, len(mapList.Maps)) + dtoMaps := make([]dto.MapExtended, len(mapList.Maps)) for i, m := range mapList.Maps { - var mapDto dto.Map + var mapDto dto.MapExtended dtoMaps[i] = *mapDto.FromGRPC(m) } // Return the paged response - ctx.JSON(http.StatusOK, dto.PagedResponse[dto.Map]{ + ctx.JSON(http.StatusOK, dto.PagedResponse[dto.MapExtended]{ Data: dtoMaps, Pagination: dto.Pagination{ Page: query.PageNumber, -- 2.49.1 From 7a37224487d99e951c4ad9d0872b895893dec301 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Fri, 25 Jul 2025 20:45:30 -0700 Subject: [PATCH 3/4] connect to maps grpc --- pkg/api/handlers/handler.go | 8 ++++++++ pkg/api/handlers/maps.go | 4 ++-- pkg/api/router.go | 9 +++++++++ pkg/cmds/api.go | 13 +++++++++++++ 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/pkg/api/handlers/handler.go b/pkg/api/handlers/handler.go index 71e6ffa..36fb4c1 100644 --- a/pkg/api/handlers/handler.go +++ b/pkg/api/handlers/handler.go @@ -14,6 +14,7 @@ const ( // Handler is a base handler that provides common functionality for all HTTP handlers. type Handler struct { dataClient *grpc.ClientConn + mapsClient *grpc.ClientConn } // HandlerOption defines a functional option for configuring a Handler @@ -26,6 +27,13 @@ func WithDataClient(dataClient *grpc.ClientConn) HandlerOption { } } +// WithMapsClient sets the maps client for the Handler +func WithMapsClient(mapsClient *grpc.ClientConn) HandlerOption { + return func(h *Handler) { + h.mapsClient = mapsClient + } +} + // NewHandler creates a new Handler with the provided options. // It requires both a datastore and an authentication service to function properly. func NewHandler(options ...HandlerOption) (*Handler, error) { diff --git a/pkg/api/handlers/maps.go b/pkg/api/handlers/maps.go index 2a737b2..01ef633 100644 --- a/pkg/api/handlers/maps.go +++ b/pkg/api/handlers/maps.go @@ -49,7 +49,7 @@ func (h *MapHandler) Get(ctx *gin.Context) { } // Call the gRPC service - mapData, err := maps_extended.NewMapsServiceClient(h.dataClient).Get(ctx, &maps_extended.MapId{ + mapData, err := maps_extended.NewMapsServiceClient(h.mapsClient).Get(ctx, &maps_extended.MapId{ ID: mapID, }) if err != nil { @@ -116,7 +116,7 @@ func (h *MapHandler) List(ctx *gin.Context) { } // Call the gRPC service - mapList, err := maps_extended.NewMapsServiceClient(h.dataClient).List(ctx, &maps_extended.ListRequest{ + mapList, err := maps_extended.NewMapsServiceClient(h.mapsClient).List(ctx, &maps_extended.ListRequest{ Filter: &maps_extended.MapFilter{ GameID: filter.GameID, }, diff --git a/pkg/api/router.go b/pkg/api/router.go index 6d56d64..db18120 100644 --- a/pkg/api/router.go +++ b/pkg/api/router.go @@ -25,6 +25,7 @@ type RouterConfig struct { port int devClient *grpc.ClientConn dataClient *grpc.ClientConn + mapsClient *grpc.ClientConn context *cli.Context shutdownTimeout time.Duration } @@ -57,6 +58,13 @@ func WithDataClient(conn *grpc.ClientConn) Option { } } +// WithMapsClient sets the maps gRPC client +func WithMapsClient(conn *grpc.ClientConn) Option { + return func(cfg *RouterConfig) { + cfg.mapsClient = conn + } +} + // WithShutdownTimeout sets the graceful shutdown timeout func WithShutdownTimeout(timeout time.Duration) Option { return func(cfg *RouterConfig) { @@ -72,6 +80,7 @@ func setupRoutes(cfg *RouterConfig) (*gin.Engine, error) { handlerOptions := []handlers.HandlerOption{ handlers.WithDataClient(cfg.dataClient), + handlers.WithMapsClient(cfg.mapsClient), } // Times handler diff --git a/pkg/cmds/api.go b/pkg/cmds/api.go index 1594d91..f42e410 100644 --- a/pkg/cmds/api.go +++ b/pkg/cmds/api.go @@ -31,6 +31,12 @@ func NewApiCommand() *cli.Command { EnvVars: []string{"DATA_RPC_HOST"}, Value: "data-service:9000", }, + &cli.StringFlag{ + Name: "maps-rpc-host", + Usage: "Host of maps rpc", + EnvVars: []string{"MAPS_RPC_HOST"}, + Value: "maptest-api:8081", + }, }, } } @@ -48,10 +54,17 @@ func runAPI(ctx *cli.Context) error { return err } + // Maps service client + mapsConn, err := grpc.Dial(ctx.String("maps-rpc-host"), grpc.WithTransportCredentials(insecure.NewCredentials())) + if err != nil { + return err + } + return api.NewRouter( api.WithContext(ctx), api.WithPort(ctx.Int("port")), api.WithDevClient(devConn), api.WithDataClient(dataConn), + api.WithMapsClient(mapsConn), ) } -- 2.49.1 From a0f65394d48b05f7dfe2c0a6779c1d4ff9f245fd Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Fri, 25 Jul 2025 22:28:06 -0700 Subject: [PATCH 4/4] wip: fields --- pkg/api/dto/map_extended.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/pkg/api/dto/map_extended.go b/pkg/api/dto/map_extended.go index c61e7c6..9cb2b3c 100644 --- a/pkg/api/dto/map_extended.go +++ b/pkg/api/dto/map_extended.go @@ -10,11 +10,18 @@ type MapExtendedFilter struct { } // @name MapFilter type MapExtended struct { - ID int64 `json:"id"` - DisplayName string `json:"display_name"` - Creator string `json:"creator"` - GameID uint32 `json:"game_id"` - Date time.Time `json:"date"` + ID int64 `json:"id"` + DisplayName string `json:"display_name"` + Creator string `json:"creator"` + GameID uint32 `json:"game_id"` + Date time.Time `json:"date"` + CreatedAt time.Time `json:created_at` + UpdatedAt time.Time `json:updated_at` + Submitter uint64 `json:submitter` + Thumbnail uint64 `json:thumbnail` + AssetVersion uint64 `json:asset_version` + LoadCount uint32 `json:load_count` + Modes uint32 `json:modes` } // @name Map // FromGRPC converts a maps.MapResponse protobuf message to a Map domain object -- 2.49.1