Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add close margin position endpoint #657

Merged
Merged
Show file tree
Hide file tree
Changes from 2 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
36 changes: 36 additions & 0 deletions margin_app/app/api/margin_position.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
from typing import NoReturn
from uuid import UUID

from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession

from app.crud.margin_position import margin_position_crud
from app.db.sessions import get_db
from app.schemas.margin_position import CloseMarginPositionResponse

router = APIRouter()


@router.post("/close/{position_id}", response_model=CloseMarginPositionResponse)
async def close_margin_position(position_id: UUID) -> CloseMarginPositionResponse:
"""
Close a margin position endpoint.

Args:
position_id (UUID): The unique identifier of the margin position to close

Returns:
CloseMarginPositionResponse: Object containing the position ID and its updated status

Raises:
HTTPException: 404 error if the position is not found
"""
margin_position_crud.db = db
status = await margin_position_crud.close_margin_position(position_id)

if not status:
raise HTTPException(
status_code=404, detail=f"Margin position with id {position_id} not found"
)

return CloseMarginPositionResponse(position_id=position_id, status=status)
27 changes: 20 additions & 7 deletions margin_app/app/main.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,20 @@
"""
Main entry point for the application.
"""

from fastapi import FastAPI

app = FastAPI()
"""
Main entry point for the application.

This module initializes the FastAPI application and includes all routers.
"""

from fastapi import FastAPI

from app.api.margin_position import router as margin_position_router

app = FastAPI(
title="Margin Trading API",
description="API for managing margin trading positions",
version="1.0.0",
)

# Include routers
app.include_router(
margin_position_router, prefix="/api/margin-positions", tags=["margin-positions"]
)
35 changes: 35 additions & 0 deletions margin_app/app/schemas/margin_position.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from enum import Enum
from uuid import UUID

from pydantic import BaseModel


class MarginPositionStatus(str, Enum):
"""
Enumeration of possible margin position statuses.

Attributes:
OPEN: Position is currently open
CLOSED: Position has been closed
"""

OPEN = "Open"
CLOSED = "Closed"


class CloseMarginPositionResponse(BaseModel):
"""
Response model for closing a margin position.

Attributes:
position_id (UUID): The unique identifier of the margin position
status (MarginPositionStatus): The current status of the margin position
"""

position_id: UUID
status: MarginPositionStatus

class Config:
"""Pydantic configuration class"""

from_attributes = True