Add basic endpoints
This commit is contained in:
parent
e0f8112d13
commit
2e70664620
3
Makefile
3
Makefile
@ -26,5 +26,8 @@ start-db:
|
|||||||
stop-db:
|
stop-db:
|
||||||
docker-compose down
|
docker-compose down
|
||||||
|
|
||||||
|
clean-db:
|
||||||
|
docker compose down -v db
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf $(VENV_DIR)
|
rm -rf $(VENV_DIR)
|
||||||
9
backend/app/dtos/house_create_request.py
Normal file
9
backend/app/dtos/house_create_request.py
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
class HouseCreateRequest(BaseModel):
|
||||||
|
address: str
|
||||||
|
city: str
|
||||||
|
country: str
|
||||||
|
price: float
|
||||||
|
description: str
|
||||||
|
|
||||||
5
backend/app/dtos/house_create_response.py
Normal file
5
backend/app/dtos/house_create_response.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
class HouseCreateResponse(BaseModel):
|
||||||
|
id: str
|
||||||
|
|
||||||
@ -3,6 +3,7 @@ from fastapi.middleware.cors import CORSMiddleware
|
|||||||
|
|
||||||
from .providers.db_provider import create_db_and_tables
|
from .providers.db_provider import create_db_and_tables
|
||||||
from .routers.houses import router as houses_router
|
from .routers.houses import router as houses_router
|
||||||
|
from .routers.owners import router as owners_router
|
||||||
|
|
||||||
from contextlib import asynccontextmanager
|
from contextlib import asynccontextmanager
|
||||||
|
|
||||||
@ -14,7 +15,8 @@ async def lifespan(_app: FastAPI):
|
|||||||
app = FastAPI(
|
app = FastAPI(
|
||||||
title="Fair Housing API",
|
title="Fair Housing API",
|
||||||
description="Provides access to core functionality for the fair housing platform.",
|
description="Provides access to core functionality for the fair housing platform.",
|
||||||
version="1.0.0"
|
version="1.0.0",
|
||||||
|
lifespan=lifespan
|
||||||
)
|
)
|
||||||
|
|
||||||
app.add_middleware(
|
app.add_middleware(
|
||||||
@ -26,3 +28,4 @@ app.add_middleware(
|
|||||||
)
|
)
|
||||||
|
|
||||||
app.include_router(houses_router, prefix="/houses", tags=["houses"])
|
app.include_router(houses_router, prefix="/houses", tags=["houses"])
|
||||||
|
app.include_router(owners_router, prefix="/owners", tags=["owners"])
|
||||||
|
|||||||
@ -2,9 +2,10 @@ from sqlmodel import SQLModel, Field
|
|||||||
from uuid import uuid4, UUID
|
from uuid import uuid4, UUID
|
||||||
|
|
||||||
class House(SQLModel, table=True):
|
class House(SQLModel, table=True):
|
||||||
id: UUID = Field(primary_key=True, default_factory=uuid4),
|
id: UUID = Field(primary_key=True, default_factory=uuid4)
|
||||||
address: str
|
address: str = Field()
|
||||||
city: str
|
city: str = Field()
|
||||||
country: str
|
country: str = Field()
|
||||||
price: float
|
price: float = Field()
|
||||||
description: str = None
|
description: str = Field()
|
||||||
|
owner_id: UUID = Field(foreign_key="owner.id")
|
||||||
|
|||||||
@ -3,7 +3,4 @@ from uuid import uuid4, UUID
|
|||||||
|
|
||||||
class Owner(SQLModel, table=True):
|
class Owner(SQLModel, table=True):
|
||||||
id: UUID = Field(default_factory=uuid4, primary_key=True)
|
id: UUID = Field(default_factory=uuid4, primary_key=True)
|
||||||
name: str
|
user_id: UUID = Field(foreign_key="user.id")
|
||||||
email: str
|
|
||||||
# TODO add user_id
|
|
||||||
# TODO add houses
|
|
||||||
|
|||||||
@ -3,9 +3,9 @@ from ..models.user import User
|
|||||||
from ..settings import get_settings
|
from ..settings import get_settings
|
||||||
|
|
||||||
|
|
||||||
class AuthProvider:
|
class AuthContext:
|
||||||
"""
|
"""
|
||||||
Provides authentication methods for the API.
|
Provides authentication context for the current request.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
from sqlalchemy.ext.asyncio.session import AsyncSession
|
from sqlalchemy.ext.asyncio.session import AsyncSession
|
||||||
from typing import Annotated
|
from typing import Annotated
|
||||||
from fastapi import Depends
|
from fastapi import Depends
|
||||||
from app.providers.db_provider import get_session
|
from ..providers.db_provider import get_session
|
||||||
from ..models.house import House
|
from ..models.house import House
|
||||||
from sqlmodel import select
|
from sqlmodel import select
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
from sqlalchemy.ext.asyncio.session import AsyncSession
|
from sqlalchemy.ext.asyncio.session import AsyncSession
|
||||||
from typing import Annotated
|
from typing import Annotated
|
||||||
from fastapi import Depends
|
from fastapi import Depends
|
||||||
from app.providers.db_provider import get_session
|
from ..providers.db_provider import get_session
|
||||||
from ..models.owner import Owner
|
from ..models.owner import Owner
|
||||||
from sqlmodel import select
|
from sqlmodel import select
|
||||||
|
|
||||||
|
|||||||
@ -1,12 +1,33 @@
|
|||||||
from fastapi import APIRouter, Depends
|
from fastapi import APIRouter, Depends
|
||||||
from typing import Annotated
|
from typing import Annotated
|
||||||
from ..providers.auth_provider import AuthProvider
|
from ..providers.auth_provider import AuthContext
|
||||||
|
from ..repositories.house_repository import HouseRepository
|
||||||
|
from ..models.house import House
|
||||||
|
from ..dtos.house_create_request import HouseCreateRequest
|
||||||
|
from ..dtos.house_create_response import HouseCreateResponse
|
||||||
|
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
|
||||||
@router.post("")
|
@router.post("")
|
||||||
async def create_house(auth_provider: Annotated[AuthProvider, Depends()]):
|
async def create_house(body: HouseCreateRequest, auth: Annotated[AuthContext, Depends()], house_repository: Annotated[HouseRepository, Depends()]) -> HouseCreateResponse:
|
||||||
return auth_provider.user
|
owner = auth.user
|
||||||
|
|
||||||
|
house = House(
|
||||||
|
owner_id=owner.id,
|
||||||
|
address=body.address,
|
||||||
|
city=body.city,
|
||||||
|
country=body.country,
|
||||||
|
price=body.price,
|
||||||
|
description=body.description
|
||||||
|
)
|
||||||
|
|
||||||
|
await house_repository.save(house)
|
||||||
|
|
||||||
|
return HouseCreateResponse(
|
||||||
|
id=house.id
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@router.get("")
|
@router.get("")
|
||||||
async def get_all_houses():
|
async def get_all_houses():
|
||||||
|
|||||||
10
backend/app/routers/owners.py
Normal file
10
backend/app/routers/owners.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
from fastapi import APIRouter, Depends
|
||||||
|
from typing import Annotated
|
||||||
|
from ..repositories.owner_repository import OwnerRepository
|
||||||
|
|
||||||
|
router = APIRouter()
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/{id}")
|
||||||
|
async def get_owner(id: str, owner_repository: Annotated[OwnerRepository, Depends()]):
|
||||||
|
return await owner_repository.get_by_id(id)
|
||||||
@ -10,10 +10,16 @@ services:
|
|||||||
command: ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
|
command: ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
|
||||||
|
|
||||||
db:
|
db:
|
||||||
image: postgres:13
|
image: postgres:15
|
||||||
|
container_name: fair-housing-postgres
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_USER: user
|
POSTGRES_USER: developer
|
||||||
POSTGRES_PASSWORD: password
|
POSTGRES_PASSWORD: password
|
||||||
POSTGRES_DB: mydatabase
|
POSTGRES_DB: dev
|
||||||
ports:
|
ports:
|
||||||
- "5432:5432"
|
- "5432:5432"
|
||||||
|
volumes:
|
||||||
|
- db-data:/var/lib/postgresql/data
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
db-data:
|
||||||
Loading…
x
Reference in New Issue
Block a user