first commit
This commit is contained in:
60
app/services/wallet_service.py
Normal file
60
app/services/wallet_service.py
Normal file
@@ -0,0 +1,60 @@
|
||||
import uuid
|
||||
from decimal import Decimal
|
||||
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from app.models import User, Transaction
|
||||
from app.core.exceptions import BadRequestError
|
||||
|
||||
# MVP: hardcoded redeem codes → amount mapping
|
||||
REDEEM_CODES = {
|
||||
"SUPERDREAM10": Decimal("10"),
|
||||
"SUPERDREAM50": Decimal("50"),
|
||||
"SUPERDREAM100": Decimal("100"),
|
||||
}
|
||||
|
||||
|
||||
class WalletService:
|
||||
|
||||
@staticmethod
|
||||
async def get_balance(db: AsyncSession, user_id: str) -> Decimal:
|
||||
user = await db.get(User, user_id)
|
||||
return user.balance
|
||||
|
||||
@staticmethod
|
||||
async def redeem_code(db: AsyncSession, user_id: str, code: str) -> Transaction:
|
||||
amount = REDEEM_CODES.get(code.upper())
|
||||
if not amount:
|
||||
raise BadRequestError("无效的兑换码")
|
||||
|
||||
user = await db.get(User, user_id)
|
||||
user.balance += amount
|
||||
new_balance = user.balance
|
||||
|
||||
txn = Transaction(
|
||||
id=str(uuid.uuid4()),
|
||||
user_id=user_id,
|
||||
type="topup",
|
||||
amount=amount,
|
||||
balance_after=new_balance,
|
||||
reference_id=f"redeem:{code.upper()}",
|
||||
)
|
||||
db.add(txn)
|
||||
await db.commit()
|
||||
await db.refresh(txn)
|
||||
return txn
|
||||
|
||||
@staticmethod
|
||||
async def list_transactions(
|
||||
db: AsyncSession, user_id: str, page: int = 1, size: int = 20
|
||||
) -> list:
|
||||
offset = (page - 1) * size
|
||||
result = await db.execute(
|
||||
select(Transaction)
|
||||
.where(Transaction.user_id == user_id)
|
||||
.order_by(Transaction.created_at.desc())
|
||||
.offset(offset)
|
||||
.limit(size)
|
||||
)
|
||||
return result.scalars().all()
|
||||
Reference in New Issue
Block a user