Skip to content

Commit

Permalink
SI-2601 Allow retries of failed transactions (#327)
Browse files Browse the repository at this point in the history
* Allow retrying vehicle minting

Add missing load on vehicle burn query

* Handling for aftermarket pair and unpair

* VehicleMintRequest

* SD minting

* Swag

* Use {var} instead of :var for Swagger comment path parameters

* Get rid of a gratuitous load

* Clean up paired/in pairing check

* Whoops, missing return
  • Loading branch information
elffjs authored May 6, 2024
1 parent 71085bf commit 57e975b
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 8 deletions.
11 changes: 9 additions & 2 deletions internal/controllers/synthetic_devices_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ func (sdc *SyntheticDevicesController) MintSyntheticDevice(c *fiber.Ctx) error {

ud, err := models.UserDevices(
models.UserDeviceWhere.ID.EQ(userDeviceID),
qm.Load(models.UserDeviceRels.VehicleTokenSyntheticDevice),
qm.Load(qm.Rels(models.UserDeviceRels.VehicleTokenSyntheticDevice, models.SyntheticDeviceRels.MintRequest)),
qm.Load(models.UserDeviceRels.UserDeviceAPIIntegrations, models.UserDeviceAPIIntegrationWhere.IntegrationID.EQ(integrationID)),
).One(c.Context(), sdc.DBS().Reader)
if err != nil {
Expand All @@ -215,7 +215,14 @@ func (sdc *SyntheticDevicesController) MintSyntheticDevice(c *fiber.Ctx) error {
}

if ud.R.VehicleTokenSyntheticDevice != nil {
return fiber.NewError(fiber.StatusConflict, "Vehicle already paired with a synthetic device.")
if ud.R.VehicleTokenSyntheticDevice.R.MintRequest.Status != models.MetaTransactionRequestStatusFailed {
return fiber.NewError(fiber.StatusConflict, "Vehicle already paired with a synthetic device.")
}

_, err := ud.R.VehicleTokenSyntheticDevice.Delete(c.Context(), sdc.DBS().Writer)
if err != nil {
return fmt.Errorf("failed to delete failed synthetic minting: %v", err)
}
}

if len(ud.R.UserDeviceAPIIntegrations) == 0 {
Expand Down
13 changes: 7 additions & 6 deletions internal/controllers/user_integrations_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -1279,10 +1279,11 @@ func (udc *UserDevicesController) checkPairable(ctx context.Context, exec boil.C
return nil, nil, fiber.NewError(fiber.StatusConflict, fmt.Sprintf("Vehicle already paired with aftermarket device %s.", vad.TokenID))
}

if ad.R.PairRequest != nil {
if ad.R.PairRequest.Status == models.MetaTransactionRequestStatusConfirmed {
return nil, nil, fiber.NewError(fiber.StatusConflict, "Aftermarket device already paired.")
}
if !ad.VehicleTokenID.IsZero() {
return nil, nil, fiber.NewError(fiber.StatusConflict, fmt.Sprintf("Aftermarket device already paired to vehicle %d.", ad.VehicleTokenID))
}

if ad.R.PairRequest != nil && ad.R.PairRequest.Status != models.MetaTransactionRequestStatusFailed {
return nil, nil, fiber.NewError(fiber.StatusConflict, "Aftermarket device already in the pairing process.")
}

Expand All @@ -1292,7 +1293,7 @@ func (udc *UserDevicesController) checkPairable(ctx context.Context, exec boil.C
func (udc *UserDevicesController) checkUnpairable(ctx context.Context, exec boil.ContextExecutor, userDeviceID string) (*models.UserDevice, *models.AftermarketDevice, error) {
ud, err := models.UserDevices(
models.UserDeviceWhere.ID.EQ(userDeviceID),
qm.Load(models.UserDeviceRels.VehicleTokenAftermarketDevice),
qm.Load(qm.Rels(models.UserDeviceRels.VehicleTokenAftermarketDevice, models.AftermarketDeviceRels.UnpairRequest)),
).One(ctx, exec)
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
Expand All @@ -1311,7 +1312,7 @@ func (udc *UserDevicesController) checkUnpairable(ctx context.Context, exec boil

ad := ud.R.VehicleTokenAftermarketDevice

if ad.UnpairRequestID.Valid {
if ad.R.UnpairRequest != nil && ad.R.UnpairRequest.Status != models.MetaTransactionRequestStatusFailed {
return nil, nil, fiber.NewError(fiber.StatusConflict, "Unpairing already in progress.")
}

Expand Down

0 comments on commit 57e975b

Please sign in to comment.