Implement completion endpoint for allowance (#55)
Closes #19 Reviewed-on: #55
This commit was merged in pull request #55.
This commit is contained in:
@@ -175,6 +175,39 @@ func (db *Db) DeleteAllowance(userId int, allowanceId int) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (db *Db) CompleteAllowance(userId int, allowanceId int) error {
|
||||
tx, err := db.db.Begin()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer tx.MustRollback()
|
||||
|
||||
// Get the cost of the allowance
|
||||
var cost int
|
||||
err = tx.Query("select balance from allowances where id = ? and user_id = ?").
|
||||
Bind(allowanceId, userId).ScanSingle(&cost)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Delete the allowance
|
||||
err = tx.Query("delete from allowances where id = ? and user_id = ?").
|
||||
Bind(allowanceId, userId).Exec()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Add a history entry
|
||||
err = tx.Query("insert into history (user_id, timestamp, amount) values (?, ?, ?)").
|
||||
Bind(userId, time.Now().Unix(), -cost).
|
||||
Exec()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return tx.Commit()
|
||||
}
|
||||
|
||||
func (db *Db) UpdateUserAllowance(userId int, allowance *UpdateAllowanceRequest) error {
|
||||
tx, err := db.db.Begin()
|
||||
if err != nil {
|
||||
@@ -356,24 +389,26 @@ func (db *Db) CompleteTask(taskId int) error {
|
||||
|
||||
remainingReward := reward
|
||||
|
||||
// Distribute the reward to the allowances
|
||||
for allowanceRow := range tx.Query("select id, weight from allowances where user_id = ? and weight > 0").Bind(userId).Range(&err) {
|
||||
var allowanceId int
|
||||
var allowanceWeight float64
|
||||
err = allowanceRow.Scan(&allowanceId, &allowanceWeight)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if sumOfWeights > 0 {
|
||||
// Distribute the reward to the allowances
|
||||
for allowanceRow := range tx.Query("select id, weight from allowances where user_id = ? and weight > 0").Bind(userId).Range(&err) {
|
||||
var allowanceId int
|
||||
var allowanceWeight float64
|
||||
err = allowanceRow.Scan(&allowanceId, &allowanceWeight)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Calculate the amount to add to the allowance
|
||||
amount := int((allowanceWeight / sumOfWeights) * float64(remainingReward))
|
||||
sumOfWeights -= allowanceWeight
|
||||
err = tx.Query("update allowances set balance = balance + ? where id = ? and user_id = ?").
|
||||
Bind(amount, allowanceId, userId).Exec()
|
||||
if err != nil {
|
||||
return err
|
||||
// Calculate the amount to add to the allowance
|
||||
amount := int((allowanceWeight / sumOfWeights) * float64(remainingReward))
|
||||
sumOfWeights -= allowanceWeight
|
||||
err = tx.Query("update allowances set balance = balance + ? where id = ? and user_id = ?").
|
||||
Bind(amount, allowanceId, userId).Exec()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
remainingReward -= amount
|
||||
}
|
||||
remainingReward -= amount
|
||||
}
|
||||
|
||||
// Add the remaining reward to the user
|
||||
|
||||
Reference in New Issue
Block a user