Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
209 changes: 208 additions & 1 deletion poetry.lock

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ dotenv = "^0.9.9"
httpx = "^0.28.1"
pymongo = "^4.11.3"
requests = "^2.32.3"
xrpl-py = "^4.1.0"

[tool.poetry.group.dev.dependencies]
pytest = "^8.3.5"
Expand Down
6 changes: 4 additions & 2 deletions src/main/users/dto/UserWalletDto.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
from pydantic import BaseModel

class WalletRequest(BaseModel):
wallet_address: str
class WalletResponse(BaseModel):
wallet_address: str
user_id: str
message: str
14 changes: 7 additions & 7 deletions src/main/users/repository/UserRepository.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ def find_wallets_by_user_id(self, user_id: str) -> list:
wallets = list(self.wallets_collection.find({"user_id": user_id}, {"_id": 0}))
return wallets if wallets else []

def create_or_update_wallet(self, user_id: str, wallet_address: str) -> dict:
existing_wallet = self.wallets_collection.find_one({"user_id": user_id})

if existing_wallet:
self.wallets_collection.update_one({"user_id": user_id},
{"$set": {"address": wallet_address}})
def save_wallet(self, user_id: str, wallet_address: str):
existing = self.wallets_collection.find_one({"user_id": user_id})
if existing:
self.wallets_collection.update_one(
{"user_id": user_id},
{"$set": {"address": wallet_address}}
)
return {"message": "Wallet updated", "user_id": user_id, "wallet_address": wallet_address}

else:
self.wallets_collection.insert_one({"user_id": user_id, "address": wallet_address})
return {"message": "Wallet created", "user_id": user_id, "wallet_address": wallet_address}
6 changes: 2 additions & 4 deletions src/main/users/router/UserAPIRouter.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
from fastapi import APIRouter, Depends
from src.main.auth.dependencies import get_current_user
from src.main.users.service.UserService import UserService
from src.main.users.dto.UserWalletDto import WalletRequest

router = APIRouter(
prefix="/users",
Expand All @@ -19,9 +18,8 @@ async def get_user_wallets(

# 유저의 XPRL 지갑 주소 저장 또는 업데이트 하는 API
@router.post("/wallets")
async def create_or_update_wallet(
wallet_data: WalletRequest,
async def create_wallet(
user_id: uuid.UUID = Depends(get_current_user),
user_service: UserService = Depends()
):
return user_service.add_wallet(str(user_id), wallet_data.wallet_address)
return await user_service.generate_wallet(str(user_id))
13 changes: 9 additions & 4 deletions src/main/users/service/UserService.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
from xrpl.clients import JsonRpcClient
from xrpl.asyncio.wallet import generate_faucet_wallet
from src.main.users.repository.UserRepository import UserRepository

TESTNET_URL = "https://s.altnet.rippletest.net:51234"
client = JsonRpcClient(TESTNET_URL)
class UserService:
def __init__(self):
self.user_repository = UserRepository()

def get_wallets(self, user_id: str):
wallets = self.user_repository.find_wallets_by_user_id(user_id)

if not wallets:
return {"message": "No wallets found for this user"}

return wallets

def add_wallet(self, user_id: str, wallet_address: str):
return self.user_repository.create_or_update_wallet(user_id, wallet_address)
async def generate_wallet(self, user_id: str):
wallet = await generate_faucet_wallet(client=client, debug=True)
wallet_address = wallet.classic_address
result = self.user_repository.save_wallet(user_id, wallet_address)
return result
8 changes: 3 additions & 5 deletions src/tests/users/test_users_api_router.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,23 @@
# BASE_URL = "http://localhost:8081" #"https://5erhg0u08g.execute-api.ap-northeast-2.amazonaws.com"

# TEST_USER_ID = "11111111-2222-3333-4444-555555555555" # str(uuid.uuid4())
# TEST_WALLET_ADDRESS = "rEXTERNALTESTWALLET123"

# headers = {
# "x-auth-sub": TEST_USER_ID # 추후에 삭제할 부분
# }

# # 지갑 생성 또는 업데이트 (POST /users/wallets)
# def test_create_or_update_wallet():
# def test_create_wallet():
# response = requests.post(
# f"{BASE_URL}/users/wallets",
# json={"wallet_address": TEST_WALLET_ADDRESS},
# headers=headers
# )

# print("POST response:", response.status_code, response.text) # 로그 출력용

# assert response.status_code == 200, f"Unexpected status: {response.status_code}, response: {response.text}"
# data = response.json()
# assert data["wallet_address"] == TEST_WALLET_ADDRESS
# assert "wallet_address" in data
# assert data["user_id"] == TEST_USER_ID
# assert data["message"] in ["Wallet created", "Wallet updated"]

Expand All @@ -37,4 +35,4 @@
# assert data["message"] == "No wallets found for this user"
# else:
# assert isinstance(data, list)
# assert any(wallet["address"] == TEST_WALLET_ADDRESS for wallet in data)
# assert any("address" in wallet and wallet["address"].startswith("r") for wallet in data)