Skip to content

Commit

Permalink
Use vehicleId and issuance week as sorting columns
Browse files Browse the repository at this point in the history
  • Loading branch information
0xdev22 committed Nov 16, 2023
1 parent 2ca2a73 commit e7b73b6
Show file tree
Hide file tree
Showing 3 changed files with 228 additions and 37 deletions.
16 changes: 8 additions & 8 deletions graph/rewards_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1124,7 +1124,7 @@ func (r *RewardsQueryTestSuite) Test_Query_GetUserRewards_FwdPaginate() {
"tokenId": 1
}
},
"cursor": "kgQA"
"cursor": "kgQB"
},
{
"node": {
Expand All @@ -1145,12 +1145,12 @@ func (r *RewardsQueryTestSuite) Test_Query_GetUserRewards_FwdPaginate() {
"tokenId": 1
}
},
"cursor": "kgMA"
"cursor": "kgMB"
}
],
"pageInfo": {
"startCursor": "kgQA",
"endCursor": "kgMA",
"startCursor": "kgQB",
"endCursor": "kgMB",
"hasPreviousPage": false,
"hasNextPage": true
}
Expand Down Expand Up @@ -1297,7 +1297,7 @@ func (r *RewardsQueryTestSuite) Test_Query_GetUserRewards_BackPaginate_LastBefor
"tokenId": 1
}
},
"cursor": "kgMA"
"cursor": "kgMB"
},
{
"node": {
Expand All @@ -1318,12 +1318,12 @@ func (r *RewardsQueryTestSuite) Test_Query_GetUserRewards_BackPaginate_LastBefor
"tokenId": 1
}
},
"cursor": "kgIA"
"cursor": "kgIB"
}
],
"pageInfo": {
"startCursor": "kgMA",
"endCursor": "kgIA",
"startCursor": "kgMB",
"endCursor": "kgIB",
"hasPreviousPage": true,
"hasNextPage": false
}
Expand Down
88 changes: 84 additions & 4 deletions internal/repositories/rewards.go
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,11 @@ func (r *Repository) GetEarningsByUserAddress(ctx context.Context, user common.A
}, nil
}

var rewardsColumnsTuple = "(" + models.RewardColumns.IssuanceWeek + ", " + models.RewardColumns.VehicleID + ")"

func (r *Repository) PaginateGetEarningsByUsersDevices(ctx context.Context, userDeviceEarnings *gmodel.UserRewards, first *int, after *string, last *int, before *string) (*gmodel.EarningsConnection, error) {
rwCursorHelper := &helpers.PaginationHelper[RewardsCursor]{}

limit, err := helpers.ValidateFirstLast(first, last, maxPageSize) // return early if both first and last are provided
if err != nil {
return nil, err
Expand All @@ -286,14 +290,90 @@ func (r *Repository) PaginateGetEarningsByUsersDevices(ctx context.Context, user
models.RewardWhere.ReceivedByAddress.EQ(null.BytesFrom(userDeviceEarnings.User.Bytes())),
}

userDevicesEarnings, err := r.paginateRewards(ctx, queryMods, first, after, last, before, limit)
orderBy := " DESC"
if last != nil {
orderBy = " ASC"
}

queryMods = append(queryMods,
qm.Limit(limit+1),
qm.OrderBy(models.RewardColumns.IssuanceWeek+orderBy+", "+models.RewardColumns.VehicleID+orderBy),
)

if after != nil {
afterT, err := rwCursorHelper.DecodeCursor(*after)
if err != nil {
return nil, err
}
queryMods = append(queryMods,
qm.Where(rewardsColumnsTuple+" < (?, ?)", afterT.Week, afterT.VehicleID),
)
} else if before != nil {
beforeT, err := rwCursorHelper.DecodeCursor(*before)
if err != nil {
return nil, err
}
queryMods = append(queryMods,
qm.Where(rewardsColumnsTuple+" < (?, ?)", beforeT.Week, beforeT.VehicleID),
)
}

all, err := models.Rewards(queryMods...).All(ctx, r.pdb.DBS().Reader)
if err != nil {
return nil, err
}

userDeviceEarnings.History.Edges = userDevicesEarnings.Edges
userDeviceEarnings.History.Nodes = userDevicesEarnings.Nodes
userDeviceEarnings.History.PageInfo = userDevicesEarnings.PageInfo
hasNext := before != nil
hasPrevious := after != nil

if first != nil && len(all) == limit+1 {
hasNext = true
all = all[:limit]
} else if last != nil && len(all) == limit+1 {
hasPrevious = true
all = all[:limit]
}

if last != nil {
slices.Reverse(all)
}

edges := make([]*gmodel.EarningsEdge, len(all))
nodes := make([]*gmodel.Earning, len(all))

for i, rw := range all {
reward := RewardToAPI(*rw)

crsr, err := rwCursorHelper.EncodeCursor(RewardsCursor{
Week: reward.Week,
VehicleID: reward.VehicleID,
})
if err != nil {
return nil, err
}
edges[i] = &gmodel.EarningsEdge{
Node: &reward,
Cursor: crsr,
}

nodes[i] = &reward
}

var endCursor, startCursor *string

if len(all) != 0 {
endCursor = &edges[len(edges)-1].Cursor
startCursor = &edges[0].Cursor
}

userDeviceEarnings.History.Edges = edges
userDeviceEarnings.History.Nodes = nodes
userDeviceEarnings.History.PageInfo = &gmodel.PageInfo{
StartCursor: startCursor,
EndCursor: endCursor,
HasPreviousPage: hasPrevious,
HasNextPage: hasNext,
}

return userDeviceEarnings.History, nil
}
161 changes: 136 additions & 25 deletions internal/repositories/rewards_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1357,19 +1357,10 @@ func (r *RewardsRepoTestSuite) Test_GetEarningsByUserAddress_FwdPagination_First

totalEarned := big.NewInt(0)

aft := models.AftermarketDevice{
ID: 111,
Address: beneficiary.Bytes(),
Beneficiary: beneficiary.Bytes(),
Owner: beneficiary.Bytes(),
}
err = aft.Insert(r.ctx, r.pdb.DBS().Writer, boil.Infer())
r.NoError(err)

rw, err := r.createRewardsRecords(2, createRewardsRecordsInput{
beneficiary: *beneficiary,
dateTime: currTime,
afterMarketDeviceID: 111,
afterMarketDeviceID: 1,
})
r.NoError(err)

Expand Down Expand Up @@ -1405,14 +1396,14 @@ func (r *RewardsRepoTestSuite) Test_GetEarningsByUserAddress_FwdPagination_First
paginatedEarnings, err := r.repo.PaginateGetEarningsByUsersDevices(r.ctx, rwrd, &first, nil, nil, nil)
r.NoError(err)

startCursor, err := r.paginationHelper.EncodeCursor(RewardsCursor{Week: 2})
startCursor, err := r.paginationHelper.EncodeCursor(RewardsCursor{Week: 2, VehicleID: 11})
r.NoError(err)

endCursor, err := r.paginationHelper.EncodeCursor(RewardsCursor{Week: 1})
endCursor, err := r.paginationHelper.EncodeCursor(RewardsCursor{Week: 1, VehicleID: 11})
r.NoError(err)

syntID := 1
aftID := 111
aftID := 1

r.Equal(&gmodel.PageInfo{
EndCursor: &endCursor,
Expand Down Expand Up @@ -1465,19 +1456,10 @@ func (r *RewardsRepoTestSuite) Test_GetEarningsByUserAddress_BackPagination_Last

totalEarned := big.NewInt(0)

aft := models.AftermarketDevice{
ID: 111,
Address: beneficiary.Bytes(),
Beneficiary: beneficiary.Bytes(),
Owner: beneficiary.Bytes(),
}
err = aft.Insert(r.ctx, r.pdb.DBS().Writer, boil.Infer())
r.NoError(err)

rw, err := r.createRewardsRecords(2, createRewardsRecordsInput{
beneficiary: *beneficiary,
dateTime: currTime,
afterMarketDeviceID: 111,
afterMarketDeviceID: 1,
})
r.NoError(err)

Expand Down Expand Up @@ -1513,11 +1495,11 @@ func (r *RewardsRepoTestSuite) Test_GetEarningsByUserAddress_BackPagination_Last
paginatedEarnings, err := r.repo.PaginateGetEarningsByUsersDevices(r.ctx, rwrd, nil, nil, &last, nil)
r.NoError(err)

crsr, err := r.paginationHelper.EncodeCursor(RewardsCursor{Week: 1})
crsr, err := r.paginationHelper.EncodeCursor(RewardsCursor{Week: 1, VehicleID: 11})
r.NoError(err)

r.NoError(err)
aftID := 111
aftID := 1
syntID := 1

connStrk := 21
Expand Down Expand Up @@ -1547,3 +1529,132 @@ func (r *RewardsRepoTestSuite) Test_GetEarningsByUserAddress_BackPagination_Last
},
}, paginatedEarnings.Edges)
}

func (r *RewardsRepoTestSuite) Test_GetEarningsByUserAddress_MultipleVehicle_FwdPagination_First() {
_, beneficiary, err := helpers.GenerateWallet()
r.NoError(err)

_, owner, err := helpers.GenerateWallet()
r.NoError(err)

currTime := time.Now().UTC().Truncate(time.Second)

r.createDependentRecords()

totalEarned := big.NewInt(0)

veh := models.Vehicle{ // create a brand new vehicle here
ID: 5,
OwnerAddress: owner.Bytes(),
}
err = veh.Insert(r.ctx, r.pdb.DBS().Writer, boil.Infer())
r.NoError(err)

rw, err := r.createRewardsRecords(3, createRewardsRecordsInput{
beneficiary: *beneficiary,
dateTime: currTime,
afterMarketDeviceID: 1,
})
r.NoError(err)

rw[1].VehicleID = 5 // one of the rewards should be for our new vehicle
rw[1].IssuanceWeek = 1 // put new vehicle in same week as old vehicle

var aftEarn types.NullDecimal
var strkEarn types.NullDecimal
var syntEarn types.NullDecimal

for _, rr := range rw {
baseAmt, ok := new(big.Int).SetString("59147051345528509681", 10)
r.NotZero(ok)

aftEarn = dbtypes.NullIntToDecimal(baseAmt.Add(baseAmt, big.NewInt(30)))
strkEarn = dbtypes.NullIntToDecimal(baseAmt.Add(baseAmt, big.NewInt(50)))
syntEarn = dbtypes.NullIntToDecimal(baseAmt.Add(baseAmt, big.NewInt(10)))

rr.AftermarketEarnings = aftEarn
rr.StreakEarnings = strkEarn
rr.SyntheticEarnings = syntEarn

totalEarned.Add(totalEarned, dbtypes.NullDecimalToInt(aftEarn))
totalEarned.Add(totalEarned, dbtypes.NullDecimalToInt(strkEarn))
totalEarned.Add(totalEarned, dbtypes.NullDecimalToInt(syntEarn))

err = rr.Insert(r.ctx, r.pdb.DBS().Writer, boil.Infer())
r.NoError(err)
}

first := 3

rwrd, err := r.repo.GetEarningsByUserAddress(r.ctx, *beneficiary)
r.NoError(err)

paginatedEarnings, err := r.repo.PaginateGetEarningsByUsersDevices(r.ctx, rwrd, &first, nil, nil, nil)
r.NoError(err)

startCursor, err := r.paginationHelper.EncodeCursor(RewardsCursor{Week: 3, VehicleID: 11})
r.NoError(err)

endCursor, err := r.paginationHelper.EncodeCursor(RewardsCursor{Week: 1, VehicleID: 5})
r.NoError(err)

syntID := 1
aftID := 1

r.Equal(&gmodel.PageInfo{
EndCursor: &endCursor,
HasNextPage: false,
HasPreviousPage: false,
StartCursor: &startCursor,
}, paginatedEarnings.PageInfo)
r.Equal(3, paginatedEarnings.TotalCount)

r.Equal([]*gmodel.EarningsEdge{
{
Node: &gmodel.Earning{
Week: 3,
Beneficiary: common.BytesToAddress(beneficiary.Bytes()),
ConnectionStreak: rw[2].ConnectionStreak.Ptr(),
StreakTokens: dbtypes.NullDecimalToInt(strkEarn),
AftermarketDeviceID: &aftID,
AftermarketDeviceTokens: dbtypes.NullDecimalToInt(aftEarn),
SyntheticDeviceID: &syntID,
SyntheticDeviceTokens: dbtypes.NullDecimalToInt(syntEarn),
SentAt: currTime,
VehicleID: 11,
},
Cursor: startCursor,
},
{
Node: &gmodel.Earning{
Week: 1,
Beneficiary: common.BytesToAddress(beneficiary.Bytes()),
ConnectionStreak: rw[0].ConnectionStreak.Ptr(),
StreakTokens: dbtypes.NullDecimalToInt(strkEarn),
AftermarketDeviceID: &aftID,
AftermarketDeviceTokens: dbtypes.NullDecimalToInt(aftEarn),
SyntheticDeviceID: &syntID,
SyntheticDeviceTokens: dbtypes.NullDecimalToInt(syntEarn),
SentAt: currTime,
VehicleID: 11,
},
Cursor: "kgEL",
},
{
Node: &gmodel.Earning{
Week: 1,
Beneficiary: common.BytesToAddress(beneficiary.Bytes()),
ConnectionStreak: rw[1].ConnectionStreak.Ptr(),
StreakTokens: dbtypes.NullDecimalToInt(strkEarn),
AftermarketDeviceID: &aftID,
AftermarketDeviceTokens: dbtypes.NullDecimalToInt(aftEarn),
SyntheticDeviceID: &syntID,
SyntheticDeviceTokens: dbtypes.NullDecimalToInt(syntEarn),
SentAt: currTime,
VehicleID: 5,
},
Cursor: endCursor,
},
}, paginatedEarnings.Edges)

}

0 comments on commit e7b73b6

Please sign in to comment.