balance amount cap for deposit bonus

This commit is contained in:
Asher Samuel 2025-06-29 22:57:50 +03:00
parent e47f0c9d5d
commit 19b7a151d6
9 changed files with 103 additions and 30 deletions

View File

@ -289,7 +289,8 @@ CREATE TABLE IF NOT EXISTS settings (
); );
CREATE TABLE bonus ( CREATE TABLE bonus (
id BIGSERIAL PRIMARY KEY, id BIGSERIAL PRIMARY KEY,
multiplier REAL NOT NULL multiplier REAL NOT NULL,
balance_cap BIGINT NOT NULL DEFAULT 0
); );
-- Views -- Views
CREATE VIEW companies_details AS CREATE VIEW companies_details AS

View File

@ -1,12 +1,17 @@
-- name: CreateBonusMultiplier :exec -- name: CreateBonusMultiplier :exec
INSERT INTO bonus (multiplier) INSERT INTO bonus (multiplier, balance_cap)
VALUES ($1); VALUES ($1, $2);
-- name: GetBonusMultiplier :many -- name: GetBonusMultiplier :many
SELECT id, multiplier SELECT id, multiplier
FROM bonus; FROM bonus;
-- name: GetBonusBalanceCap :many
SELECT id, balance_cap
FROM bonus;
-- name: UpdateBonusMultiplier :exec -- name: UpdateBonusMultiplier :exec
UPDATE bonus UPDATE bonus
SET multiplier = $1 SET multiplier = $1,
WHERE id = $2; balance_cap = $2
WHERE id = $3;

View File

@ -10,29 +10,69 @@ import (
) )
const CreateBonusMultiplier = `-- name: CreateBonusMultiplier :exec const CreateBonusMultiplier = `-- name: CreateBonusMultiplier :exec
INSERT INTO bonus (multiplier) INSERT INTO bonus (multiplier, balance_cap)
VALUES ($1) VALUES ($1, $2)
` `
func (q *Queries) CreateBonusMultiplier(ctx context.Context, multiplier float32) error { type CreateBonusMultiplierParams struct {
_, err := q.db.Exec(ctx, CreateBonusMultiplier, multiplier) Multiplier float32 `json:"multiplier"`
BalanceCap int64 `json:"balance_cap"`
}
func (q *Queries) CreateBonusMultiplier(ctx context.Context, arg CreateBonusMultiplierParams) error {
_, err := q.db.Exec(ctx, CreateBonusMultiplier, arg.Multiplier, arg.BalanceCap)
return err return err
} }
const GetBonusBalanceCap = `-- name: GetBonusBalanceCap :many
SELECT id, balance_cap
FROM bonus
`
type GetBonusBalanceCapRow struct {
ID int64 `json:"id"`
BalanceCap int64 `json:"balance_cap"`
}
func (q *Queries) GetBonusBalanceCap(ctx context.Context) ([]GetBonusBalanceCapRow, error) {
rows, err := q.db.Query(ctx, GetBonusBalanceCap)
if err != nil {
return nil, err
}
defer rows.Close()
var items []GetBonusBalanceCapRow
for rows.Next() {
var i GetBonusBalanceCapRow
if err := rows.Scan(&i.ID, &i.BalanceCap); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const GetBonusMultiplier = `-- name: GetBonusMultiplier :many const GetBonusMultiplier = `-- name: GetBonusMultiplier :many
SELECT id, multiplier SELECT id, multiplier
FROM bonus FROM bonus
` `
func (q *Queries) GetBonusMultiplier(ctx context.Context) ([]Bonu, error) { type GetBonusMultiplierRow struct {
ID int64 `json:"id"`
Multiplier float32 `json:"multiplier"`
}
func (q *Queries) GetBonusMultiplier(ctx context.Context) ([]GetBonusMultiplierRow, error) {
rows, err := q.db.Query(ctx, GetBonusMultiplier) rows, err := q.db.Query(ctx, GetBonusMultiplier)
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer rows.Close() defer rows.Close()
var items []Bonu var items []GetBonusMultiplierRow
for rows.Next() { for rows.Next() {
var i Bonu var i GetBonusMultiplierRow
if err := rows.Scan(&i.ID, &i.Multiplier); err != nil { if err := rows.Scan(&i.ID, &i.Multiplier); err != nil {
return nil, err return nil, err
} }
@ -46,16 +86,18 @@ func (q *Queries) GetBonusMultiplier(ctx context.Context) ([]Bonu, error) {
const UpdateBonusMultiplier = `-- name: UpdateBonusMultiplier :exec const UpdateBonusMultiplier = `-- name: UpdateBonusMultiplier :exec
UPDATE bonus UPDATE bonus
SET multiplier = $1 SET multiplier = $1,
WHERE id = $2 balance_cap = $2
WHERE id = $3
` `
type UpdateBonusMultiplierParams struct { type UpdateBonusMultiplierParams struct {
Multiplier float32 `json:"multiplier"` Multiplier float32 `json:"multiplier"`
BalanceCap int64 `json:"balance_cap"`
ID int64 `json:"id"` ID int64 `json:"id"`
} }
func (q *Queries) UpdateBonusMultiplier(ctx context.Context, arg UpdateBonusMultiplierParams) error { func (q *Queries) UpdateBonusMultiplier(ctx context.Context, arg UpdateBonusMultiplierParams) error {
_, err := q.db.Exec(ctx, UpdateBonusMultiplier, arg.Multiplier, arg.ID) _, err := q.db.Exec(ctx, UpdateBonusMultiplier, arg.Multiplier, arg.BalanceCap, arg.ID)
return err return err
} }

View File

@ -131,6 +131,7 @@ type BetWithOutcome struct {
type Bonu struct { type Bonu struct {
ID int64 `json:"id"` ID int64 `json:"id"`
Multiplier float32 `json:"multiplier"` Multiplier float32 `json:"multiplier"`
BalanceCap int64 `json:"balance_cap"`
} }
type Branch struct { type Branch struct {

View File

@ -6,17 +6,25 @@ import (
dbgen "github.com/SamuelTariku/FortuneBet-Backend/gen/db" dbgen "github.com/SamuelTariku/FortuneBet-Backend/gen/db"
) )
func (s *Store) CreateBonusMultiplier(ctx context.Context, multiplier float32) error { func (s *Store) CreateBonusMultiplier(ctx context.Context, multiplier float32, balance_cap int64) error {
return s.queries.CreateBonusMultiplier(ctx, multiplier) return s.queries.CreateBonusMultiplier(ctx, dbgen.CreateBonusMultiplierParams{
Multiplier: multiplier,
BalanceCap: balance_cap,
})
} }
func (s *Store) GetBonusMultiplier(ctx context.Context) ([]dbgen.Bonu, error) { func (s *Store) GetBonusMultiplier(ctx context.Context) ([]dbgen.GetBonusMultiplierRow, error) {
return s.queries.GetBonusMultiplier(ctx) return s.queries.GetBonusMultiplier(ctx)
} }
func (s *Store) UpdateBonusMultiplier(ctx context.Context, id int64, mulitplier float32) error { func (s *Store) GetBonusBalanceCap(ctx context.Context) ([]dbgen.GetBonusBalanceCapRow, error) {
return s.queries.GetBonusBalanceCap(ctx)
}
func (s *Store) UpdateBonusMultiplier(ctx context.Context, id int64, mulitplier float32, balance_cap int64) error {
return s.queries.UpdateBonusMultiplier(ctx, dbgen.UpdateBonusMultiplierParams{ return s.queries.UpdateBonusMultiplier(ctx, dbgen.UpdateBonusMultiplierParams{
ID: id, ID: id,
Multiplier: mulitplier, Multiplier: mulitplier,
BalanceCap: balance_cap,
}) })
} }

View File

@ -7,7 +7,8 @@ import (
) )
type BonusStore interface { type BonusStore interface {
CreateBonusMultiplier(ctx context.Context, multiplier float32) error CreateBonusMultiplier(ctx context.Context, multiplier float32, balance_cap int64) error
GetBonusMultiplier(ctx context.Context) ([]dbgen.Bonu, error) GetBonusMultiplier(ctx context.Context) ([]dbgen.GetBonusMultiplierRow, error)
UpdateBonusMultiplier(ctx context.Context, id int64, mulitplier float32) error GetBonusBalanceCap(ctx context.Context) ([]dbgen.GetBonusBalanceCapRow, error)
UpdateBonusMultiplier(ctx context.Context, id int64, mulitplier float32, balance_cap int64) error
} }

View File

@ -16,14 +16,18 @@ func NewService(bonusStore BonusStore) *Service {
} }
} }
func (s *Service) CreateBonusMultiplier(ctx context.Context, multiplier float32) error { func (s *Service) CreateBonusMultiplier(ctx context.Context, multiplier float32, balance_cap int64) error {
return s.bonusStore.CreateBonusMultiplier(ctx, multiplier) return s.bonusStore.CreateBonusMultiplier(ctx, multiplier, balance_cap)
} }
func (s *Service) GetBonusMultiplier(ctx context.Context) ([]dbgen.Bonu, error) { func (s *Service) GetBonusMultiplier(ctx context.Context) ([]dbgen.GetBonusMultiplierRow, error) {
return s.bonusStore.GetBonusMultiplier(ctx) return s.bonusStore.GetBonusMultiplier(ctx)
} }
func (s *Service) UpdateBonusMultiplier(ctx context.Context, id int64, mulitplier float32) error { func (s *Service) GetBonusBalanceCap(ctx context.Context) ([]dbgen.GetBonusBalanceCapRow, error) {
return s.bonusStore.UpdateBonusMultiplier(ctx, id, mulitplier) return s.bonusStore.GetBonusBalanceCap(ctx)
}
func (s *Service) UpdateBonusMultiplier(ctx context.Context, id int64, mulitplier float32, balance_cap int64) error {
return s.bonusStore.UpdateBonusMultiplier(ctx, id, mulitplier, balance_cap)
} }

View File

@ -8,6 +8,7 @@ import (
func (h *Handler) CreateBonusMultiplier(c *fiber.Ctx) error { func (h *Handler) CreateBonusMultiplier(c *fiber.Ctx) error {
var req struct { var req struct {
Multiplier float32 `json:"multiplier"` Multiplier float32 `json:"multiplier"`
BalanceCap int64 `json:"balance_cap"`
} }
if err := c.BodyParser(&req); err != nil { if err := c.BodyParser(&req); err != nil {
@ -27,7 +28,7 @@ func (h *Handler) CreateBonusMultiplier(c *fiber.Ctx) error {
return response.WriteJSON(c, fiber.StatusBadRequest, "Invalid request", err, nil) return response.WriteJSON(c, fiber.StatusBadRequest, "Invalid request", err, nil)
} }
if err := h.bonusSvc.CreateBonusMultiplier(c.Context(), req.Multiplier); err != nil { if err := h.bonusSvc.CreateBonusMultiplier(c.Context(), req.Multiplier, req.BalanceCap); err != nil {
h.logger.Error("failed to create bonus multiplier", "error", err) h.logger.Error("failed to create bonus multiplier", "error", err)
return response.WriteJSON(c, fiber.StatusInternalServerError, "failed to create bonus mulitplier", nil, nil) return response.WriteJSON(c, fiber.StatusInternalServerError, "failed to create bonus mulitplier", nil, nil)
} }
@ -49,6 +50,7 @@ func (h *Handler) UpdateBonusMultiplier(c *fiber.Ctx) error {
var req struct { var req struct {
ID int64 `json:"id"` ID int64 `json:"id"`
Multiplier float32 `json:"multiplier"` Multiplier float32 `json:"multiplier"`
BalanceCap int64 `json:"balance_cap"`
} }
if err := c.BodyParser(&req); err != nil { if err := c.BodyParser(&req); err != nil {
@ -56,7 +58,7 @@ func (h *Handler) UpdateBonusMultiplier(c *fiber.Ctx) error {
return response.WriteJSON(c, fiber.StatusBadRequest, "Invalid request", err, nil) return response.WriteJSON(c, fiber.StatusBadRequest, "Invalid request", err, nil)
} }
if err := h.bonusSvc.UpdateBonusMultiplier(c.Context(), req.ID, req.Multiplier); err != nil { if err := h.bonusSvc.UpdateBonusMultiplier(c.Context(), req.ID, req.Multiplier, req.BalanceCap); err != nil {
h.logger.Error("failed to update bonus multiplier", "error", err) h.logger.Error("failed to update bonus multiplier", "error", err)
return response.WriteJSON(c, fiber.StatusInternalServerError, "failed to update bonus mulitplier", nil, nil) return response.WriteJSON(c, fiber.StatusInternalServerError, "failed to update bonus mulitplier", nil, nil)
} }

View File

@ -2,6 +2,7 @@ package handlers
import ( import (
"fmt" "fmt"
"math"
"github.com/SamuelTariku/FortuneBet-Backend/internal/domain" "github.com/SamuelTariku/FortuneBet-Backend/internal/domain"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
@ -66,7 +67,15 @@ func (h *Handler) InitiateDeposit(c *fiber.Ctx) error {
multiplier = bonusMultiplier[0].Multiplier multiplier = bonusMultiplier[0].Multiplier
} }
_, err = h.walletSvc.AddToWallet(c.Context(), wallet.StaticID, domain.ToCurrency(float32(amount)*multiplier), domain.ValidInt64{}, domain.TRANSFER_DIRECT, domain.PaymentDetails{}) var balanceCap int64 = 0
bonusBalanceCap, err := h.bonusSvc.GetBonusBalanceCap(c.Context())
if err == nil {
balanceCap = bonusBalanceCap[0].BalanceCap
}
capedBalanceAmount := domain.Currency((math.Min(req.Amount, float64(balanceCap)) * float64(multiplier)) * 100)
_, err = h.walletSvc.AddToWallet(c.Context(), wallet.StaticID, capedBalanceAmount, domain.ValidInt64{}, domain.TRANSFER_DIRECT, domain.PaymentDetails{})
if err != nil { if err != nil {
h.logger.Error("Failed to add bonus to static wallet", "walletID", wallet.StaticID, "user id", userID, "error", err) h.logger.Error("Failed to add bonus to static wallet", "walletID", wallet.StaticID, "user id", userID, "error", err)
return err return err