All checks were successful
continuous-integration/drone/push Build is passing
Step 1 of eliminating nextjs is adding a way to query thumbnails from roblox since nextjs handles that. This implements a batch endpoint and caching to do that. Bonus: thumbnails will actually work once we start using this. Reviewed-on: #285 Co-authored-by: itzaname <me@sliving.io> Co-committed-by: itzaname <me@sliving.io>
136 lines
3.9 KiB
Go
136 lines
3.9 KiB
Go
package web_api
|
|
|
|
import (
|
|
"context"
|
|
"strconv"
|
|
|
|
"git.itzana.me/strafesnet/maps-service/pkg/api"
|
|
"git.itzana.me/strafesnet/maps-service/pkg/roblox"
|
|
)
|
|
|
|
// BatchAssetThumbnails handles batch fetching of asset thumbnails
|
|
func (svc *Service) BatchAssetThumbnails(ctx context.Context, req *api.BatchAssetThumbnailsReq) (*api.BatchAssetThumbnailsOK, error) {
|
|
if len(req.AssetIds) == 0 {
|
|
return &api.BatchAssetThumbnailsOK{
|
|
Thumbnails: api.NewOptBatchAssetThumbnailsOKThumbnails(map[string]string{}),
|
|
}, nil
|
|
}
|
|
|
|
// Convert size string to enum
|
|
size := roblox.Size420x420
|
|
if req.Size.IsSet() {
|
|
sizeStr := req.Size.Value
|
|
switch api.BatchAssetThumbnailsReqSize(sizeStr) {
|
|
case api.BatchAssetThumbnailsReqSize150x150:
|
|
size = roblox.Size150x150
|
|
case api.BatchAssetThumbnailsReqSize768x432:
|
|
size = roblox.Size768x432
|
|
}
|
|
}
|
|
|
|
// Fetch thumbnails from service
|
|
thumbnails, err := svc.inner.GetAssetThumbnails(ctx, req.AssetIds, size)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Convert map[uint64]string to map[string]string for JSON
|
|
result := make(map[string]string, len(thumbnails))
|
|
for assetID, url := range thumbnails {
|
|
result[strconv.FormatUint(assetID, 10)] = url
|
|
}
|
|
|
|
return &api.BatchAssetThumbnailsOK{
|
|
Thumbnails: api.NewOptBatchAssetThumbnailsOKThumbnails(result),
|
|
}, nil
|
|
}
|
|
|
|
// GetAssetThumbnail handles single asset thumbnail fetch (with redirect)
|
|
func (svc *Service) GetAssetThumbnail(ctx context.Context, params api.GetAssetThumbnailParams) (*api.GetAssetThumbnailFound, error) {
|
|
// Convert size string to enum
|
|
size := roblox.Size420x420
|
|
if params.Size.IsSet() {
|
|
sizeStr := params.Size.Value
|
|
switch api.GetAssetThumbnailSize(sizeStr) {
|
|
case api.GetAssetThumbnailSize150x150:
|
|
size = roblox.Size150x150
|
|
case api.GetAssetThumbnailSize768x432:
|
|
size = roblox.Size768x432
|
|
}
|
|
}
|
|
|
|
// Fetch thumbnail
|
|
thumbnailURL, err := svc.inner.GetSingleAssetThumbnail(ctx, params.AssetID, size)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Return redirect response
|
|
return &api.GetAssetThumbnailFound{
|
|
Location: api.NewOptString(thumbnailURL),
|
|
}, nil
|
|
}
|
|
|
|
// BatchUserThumbnails handles batch fetching of user avatar thumbnails
|
|
func (svc *Service) BatchUserThumbnails(ctx context.Context, req *api.BatchUserThumbnailsReq) (*api.BatchUserThumbnailsOK, error) {
|
|
if len(req.UserIds) == 0 {
|
|
return &api.BatchUserThumbnailsOK{
|
|
Thumbnails: api.NewOptBatchUserThumbnailsOKThumbnails(map[string]string{}),
|
|
}, nil
|
|
}
|
|
|
|
// Convert size string to enum
|
|
size := roblox.Size150x150
|
|
if req.Size.IsSet() {
|
|
sizeStr := req.Size.Value
|
|
switch api.BatchUserThumbnailsReqSize(sizeStr) {
|
|
case api.BatchUserThumbnailsReqSize420x420:
|
|
size = roblox.Size420x420
|
|
case api.BatchUserThumbnailsReqSize768x432:
|
|
size = roblox.Size768x432
|
|
}
|
|
}
|
|
|
|
// Fetch thumbnails from service
|
|
thumbnails, err := svc.inner.GetUserAvatarThumbnails(ctx, req.UserIds, size)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Convert map[uint64]string to map[string]string for JSON
|
|
result := make(map[string]string, len(thumbnails))
|
|
for userID, url := range thumbnails {
|
|
result[strconv.FormatUint(userID, 10)] = url
|
|
}
|
|
|
|
return &api.BatchUserThumbnailsOK{
|
|
Thumbnails: api.NewOptBatchUserThumbnailsOKThumbnails(result),
|
|
}, nil
|
|
}
|
|
|
|
// GetUserThumbnail handles single user avatar thumbnail fetch (with redirect)
|
|
func (svc *Service) GetUserThumbnail(ctx context.Context, params api.GetUserThumbnailParams) (*api.GetUserThumbnailFound, error) {
|
|
// Convert size string to enum
|
|
size := roblox.Size150x150
|
|
if params.Size.IsSet() {
|
|
sizeStr := params.Size.Value
|
|
switch api.GetUserThumbnailSize(sizeStr) {
|
|
case api.GetUserThumbnailSize420x420:
|
|
size = roblox.Size420x420
|
|
case api.GetUserThumbnailSize768x432:
|
|
size = roblox.Size768x432
|
|
}
|
|
}
|
|
|
|
// Fetch thumbnail
|
|
thumbnailURL, err := svc.inner.GetSingleUserAvatarThumbnail(ctx, params.UserID, size)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Return redirect response
|
|
return &api.GetUserThumbnailFound{
|
|
Location: api.NewOptString(thumbnailURL),
|
|
}, nil
|
|
}
|