Skip to content

Commit

Permalink
Feature/si 2658 image uri (#99)
Browse files Browse the repository at this point in the history
* Adding indexing of image URI

* Putting back default image

* A -> An

* Fix migration order, make things compile, handle single GET

* Fix it in the loader too

* Happy linter

* Update doc string for imageUri

---------

Co-authored-by: Dylan Moreland <dylan@dimo.zone>
  • Loading branch information
zer0stars and elffjs committed May 15, 2024
1 parent 24c974f commit 6b20c2c
Show file tree
Hide file tree
Showing 12 changed files with 139 additions and 88 deletions.
44 changes: 22 additions & 22 deletions graph/generated.go

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

4 changes: 2 additions & 2 deletions graph/model/models_gen.go

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

4 changes: 2 additions & 2 deletions graph/schema/vehicle.graphqls
Original file line number Diff line number Diff line change
Expand Up @@ -124,9 +124,9 @@ type Vehicle implements Node {
"""
name: String!
"""
The Image Url of he vehicle
A URI containing an image for the vehicle.
"""
image: String!
imageUri: String!

earnings: VehicleEarnings

Expand Down
5 changes: 2 additions & 3 deletions internal/loader/synthetic_device_loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package loader
import (
"context"

"github.com/DIMO-Network/identity-api/graph/model"
gmodel "github.com/DIMO-Network/identity-api/graph/model"
"github.com/DIMO-Network/identity-api/internal/repositories/synthetic"
"github.com/DIMO-Network/identity-api/models"
Expand Down Expand Up @@ -73,7 +72,7 @@ func (sd *SyntheticDeviceLoader) BatchGetSyntheticDeviceByID(ctx context.Context
sds, err := models.SyntheticDevices(models.SyntheticDeviceWhere.ID.IN(syntheticDeviceIDs)).All(ctx, sd.db.DBS().Reader)
if err != nil {
for i := range results {
results[i] = &dataloader.Result[*model.SyntheticDevice]{Error: err}
results[i] = &dataloader.Result[*gmodel.SyntheticDevice]{Error: err}
}
return results
}
Expand All @@ -88,7 +87,7 @@ func (sd *SyntheticDeviceLoader) BatchGetSyntheticDeviceByID(ctx context.Context
synthAPI, err := synthetic.ToAPI(sdv)
results[i] = &dataloader.Result[*gmodel.SyntheticDevice]{Data: synthAPI, Error: err}
} else {
results[i] = &dataloader.Result[*model.SyntheticDevice]{}
results[i] = &dataloader.Result[*gmodel.SyntheticDevice]{}
}
}

Expand Down
17 changes: 13 additions & 4 deletions internal/loader/vehicle_loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,24 @@ func (v *VehicleLoader) BatchGetVehicleByID(ctx context.Context, vehicleIDs []in
for i, k := range vehicleIDs {
if veh, ok := vehicleByID[k]; ok {
var retErr error
imageURL, err := vehicle.GetVehicleImageURL(v.settings.BaseImageURL, veh.ID)
if err != nil {
retErr = errors.Join(retErr, fmt.Errorf("error getting vehicle image url: %w", err))

var imageURI string

if veh.ImageURI.Valid {
imageURI = veh.ImageURI.String
} else {
var err error
imageURI, err = vehicle.DefaultImageURI(v.settings.BaseImageURL, veh.ID)
if err != nil {
retErr = errors.Join(retErr, fmt.Errorf("error getting vehicle image url: %w", err))
}
}

dataURI, err := vehicle.GetVehicleDataURI(v.settings.BaseVehicleDataURI, veh.ID)
if err != nil {
retErr = errors.Join(retErr, fmt.Errorf("error getting vehicle data uri: %w", err))
}
obj, err := vehicle.ToAPI(veh, imageURL, dataURI)
obj, err := vehicle.ToAPI(veh, imageURI, dataURI)
if err != nil {
retErr = errors.Join(retErr, fmt.Errorf("error converting vehicle to API: %w", err))
}
Expand Down
2 changes: 1 addition & 1 deletion internal/repositories/aftermarket/aftermarket_devices.go
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ type aftermarketDevicePrimaryKey struct {
TokenID int
}

// ToAPI converts a vehicle to a corresponding API vehicle.
// ToAPI converts an aftermarket device to a corresponding API aftermarket device.
func ToAPI(d *models.AftermarketDevice, imageURL string) (*gmodel.AftermarketDevice, error) {
globalID, err := base.EncodeGlobalTokenID(TokenPrefix, d.ID)
if err != nil {
Expand Down
8 changes: 4 additions & 4 deletions internal/repositories/vehicle/owned_vehicles_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ func (s *OwnedVehiclesRepoTestSuite) Test_GetOwnedVehicles_Success() {
},
MintedAt: vehicles[1].MintedAt,
Privileges: nil,
Image: "https://mockUrl.com/v1/vehicle/2/image",
ImageURI: "https://mockUrl.com/v1/vehicle/2/image",
DataURI: "https://dimoData/vehicles/2",
},
Cursor: "Mg==",
Expand All @@ -171,7 +171,7 @@ func (s *OwnedVehiclesRepoTestSuite) Test_GetOwnedVehicles_Success() {
},
MintedAt: vehicles[0].MintedAt,
Privileges: nil,
Image: "https://mockUrl.com/v1/vehicle/1/image",
ImageURI: "https://mockUrl.com/v1/vehicle/1/image",
DataURI: "https://dimoData/vehicles/1",
},
Cursor: "MQ==",
Expand Down Expand Up @@ -250,7 +250,7 @@ func (s *OwnedVehiclesRepoTestSuite) Test_GetOwnedVehicles_Pagination() {
},
MintedAt: vehicles[1].MintedAt,
Privileges: nil,
Image: "https://mockUrl.com/v1/vehicle/2/image",
ImageURI: "https://mockUrl.com/v1/vehicle/2/image",
DataURI: "https://dimoData/vehicles/2",
},
Cursor: "Mg==",
Expand Down Expand Up @@ -331,7 +331,7 @@ func (s *OwnedVehiclesRepoTestSuite) Test_GetOwnedVehicles_Pagination_NextPage()
},
MintedAt: vehicles[0].MintedAt,
Privileges: nil,
Image: "https://mockUrl.com/v1/vehicle/1/image",
ImageURI: "https://mockUrl.com/v1/vehicle/1/image",
DataURI: "https://dimoData/vehicles/1",
},
Cursor: "MQ==",
Expand Down
46 changes: 32 additions & 14 deletions internal/repositories/vehicle/vehicles.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,19 +43,27 @@ func (r *Repository) createVehiclesResponse(totalCount int64, vehicles models.Ve
nodes := make([]*gmodel.Vehicle, len(vehicles))

for i, dv := range vehicles {
imageURL, err := GetVehicleImageURL(r.Settings.BaseImageURL, dv.ID)
if err != nil {
wErr := fmt.Errorf("error getting vehicle image url: %w", err)
errList = append(errList, gqlerror.Wrap(wErr))
continue
var imageURI string

if dv.ImageURI.Valid {
imageURI = dv.ImageURI.String
} else {
var err error
imageURI, err = DefaultImageURI(r.Settings.BaseImageURL, dv.ID)
if err != nil {
wErr := fmt.Errorf("error getting vehicle image url: %w", err)
errList = append(errList, gqlerror.Wrap(wErr))
continue
}
}

dataURI, err := GetVehicleDataURI(r.Settings.BaseVehicleDataURI, dv.ID)
if err != nil {
wErr := fmt.Errorf("error getting vehicle data uri: %w", err)
errList = append(errList, gqlerror.Wrap(wErr))
continue
}
gv, err := ToAPI(dv, imageURL, dataURI)
gv, err := ToAPI(dv, imageURI, dataURI)
if err != nil {
wErr := fmt.Errorf("error converting vehicle to API: %w", err)
errList = append(errList, gqlerror.Wrap(wErr))
Expand Down Expand Up @@ -180,15 +188,25 @@ func (r *Repository) GetVehicle(ctx context.Context, id int) (*gmodel.Vehicle, e
}
return nil, err
}
imageURL, err := GetVehicleImageURL(r.Settings.BaseImageURL, v.ID)
if err != nil {
return nil, fmt.Errorf("error getting vehicle image url: %w", err)
var imageURI string

if v.ImageURI.Valid {
imageURI = v.ImageURI.String
} else {
var err error
imageURI, err = DefaultImageURI(r.Settings.BaseImageURL, v.ID)
if err != nil {
wErr := fmt.Errorf("error getting vehicle image url: %w", err)
return nil, gqlerror.Wrap(wErr)
}
}

dataURI, err := GetVehicleDataURI(r.Settings.BaseVehicleDataURI, v.ID)
if err != nil {
return nil, fmt.Errorf("error getting vehicle data uri: %w", err)
}
return ToAPI(v, imageURL, dataURI)

return ToAPI(v, imageURI, dataURI)
}

// queryModsFromFilters returns a slice of query mods from the given filters.
Expand Down Expand Up @@ -238,7 +256,7 @@ func queryModsFromFilters(filter *gmodel.VehiclesFilter) []qm.QueryMod {
}

// ToAPI converts a vehicle to a corresponding graphql model.
func ToAPI(v *models.Vehicle, imageURL string, dataURI string) (*gmodel.Vehicle, error) {
func ToAPI(v *models.Vehicle, imageURI string, dataURI string) (*gmodel.Vehicle, error) {
nameList := mnemonic.FromInt32WithObfuscation(int32(v.ID))
name := strings.Join(nameList, " ")

Expand All @@ -260,13 +278,13 @@ func ToAPI(v *models.Vehicle, imageURL string, dataURI string) (*gmodel.Vehicle,
},
ManufacturerID: v.ManufacturerID,
Name: name,
Image: imageURL,
ImageURI: imageURI,
DataURI: dataURI,
}, nil
}

// GetVehicleImageURL craates a URL for the vehicle image.
func GetVehicleImageURL(baseURL string, tokenID int) (string, error) {
// DefaultImageURI craates a URL for the vehicle image.
func DefaultImageURI(baseURL string, tokenID int) (string, error) {
tokenStr := strconv.Itoa(tokenID)
return url.JoinPath(baseURL, "vehicle", tokenStr, "image")
}
Expand Down
Loading

0 comments on commit 6b20c2c

Please sign in to comment.