Skip to content

Commit

Permalink
inventory api
Browse files Browse the repository at this point in the history
  • Loading branch information
justintroy committed Dec 18, 2023
1 parent bd5a3ef commit 95e70d4
Show file tree
Hide file tree
Showing 6 changed files with 126 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('inventory',
sa.Column('inventory_id', sa.UUID(), nullable=False),
sa.Column('inventory_id', sa.String(), nullable=False),
sa.Column('user_id', sa.UUID(), nullable=False),
sa.Column('created_at', sa.DateTime(), nullable=True),
sa.Column('updated_at', sa.DateTime(), nullable=True),
Expand All @@ -31,11 +31,11 @@ def upgrade() -> None:
sa.Column('stock', sa.Text(), nullable=True),
sa.Column('medication_type', sa.Integer(), nullable=True),
sa.Column('description', sa.Text(), nullable=True),
sa.PrimaryKeyConstraint('user_id'),
sa.PrimaryKeyConstraint('inventory_id', 'user_id'),
sa.UniqueConstraint('inventory_id')
)
op.create_table('schedule',
sa.Column('schedule_id', sa.UUID(), nullable=False),
sa.Column('schedule_id', sa.String(), nullable=False),
sa.Column('user_id', sa.UUID(), nullable=False),
sa.Column('created_at', sa.DateTime(), nullable=True),
sa.Column('updated_at', sa.DateTime(), nullable=True),
Expand All @@ -45,7 +45,7 @@ def upgrade() -> None:
sa.Column('notes', sa.Text(), nullable=True),
sa.Column('quantity', sa.Numeric(), nullable=True),
sa.Column('image', sa.Text(), nullable=True),
sa.PrimaryKeyConstraint('user_id'),
sa.PrimaryKeyConstraint('schedule_id', 'user_id'),
sa.UniqueConstraint('schedule_id')
)
# ### end Alembic commands ###
Expand Down
2 changes: 2 additions & 0 deletions app/api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
from app.api.symptoms.routes import router as symptoms_router
from app.api.questions.routes import router as questions_router
from app.api.schedule.routes import router as schedule_router
from app.api.inventory.routes import router as inventory_router

api_router = APIRouter()

api_router.include_router(user_router, prefix="/user", tags=["User"])
api_router.include_router(symptoms_router, prefix="/symptoms", tags=["Symptoms"])
api_router.include_router(questions_router, prefix="/questions", tags=["Questions"])
api_router.include_router(schedule_router, prefix="/schedule", tags=["Schedule"])
api_router.include_router(inventory_router, prefix="/inventory", tags=["Inventory"])
53 changes: 53 additions & 0 deletions app/api/inventory/controller.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import uuid
from datetime import datetime, timedelta

from pydantic import UUID4
from sqlalchemy import literal
from sqlalchemy.dialects.postgresql import insert
from sqlalchemy.orm import Session

from app.models import Inventory as InventoryModel

from .schemas import Inventory


def get_user_inventory(db: Session, user_id: str):
return (
db.query(*InventoryModel.__table__.columns)
.filter(InventoryModel.user_id == user_id)
.all()
)


def upsert_user_inventory(db: Session, user_id: str, inventory: list[Inventory]):
stmt = insert(InventoryModel).values(
[
{
"created_at": datetime.utcnow(),
"user_id": user_id,
**entry.dict(
exclude={
"created_at",
"deleted_at",
"updated_at",
}
),
}
for entry in inventory
]
)
stmt = stmt.on_conflict_do_update(
constraint="inventory_pkey",
set_={
"updated_at": datetime.utcnow(),
"brand_name": stmt.excluded.brand_name,
"medicine_name": stmt.excluded.medicine_name,
"dosage": stmt.excluded.dosage,
"dosage_unit": stmt.excluded.dosage_unit,
"stock": stmt.excluded.stock,
"medication_type": stmt.excluded.medication_type,
"description": stmt.excluded.description,
},
)
db.execute(stmt)
db.commit()
34 changes: 34 additions & 0 deletions app/api/inventory/routes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from typing import List

from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException
from sqlalchemy.orm import Session

import app.api.user.controller as user_controller
from app.database import get_db

from .controller import get_user_inventory, upsert_user_inventory
from .schemas import Inventory, UpsertInventory

router = APIRouter()


@router.post("/", response_model=dict[str, str])
async def upsert_inventory(
data: UpsertInventory, db: Session = Depends(get_db)
):
db_user = user_controller.get_user_by_id(db, id=data.user_id)
if not db_user:
raise HTTPException(status_code=400, detail="Account not found.")

upsert_user_inventory(db, db_user.id, data.inventory)

return {"status": "ok"}


@router.get("/", response_model=List[Inventory])
async def read_user_inventory(user_id: str, db: Session = Depends(get_db)):
db_user = user_controller.get_user_by_id(db, id=user_id)
if not db_user:
raise HTTPException(status_code=400, detail="Account not found.")

return get_user_inventory(db, user_id)
33 changes: 33 additions & 0 deletions app/api/inventory/schemas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
from datetime import datetime
from typing import List, Optional

import uuid

from pydantic import BaseModel, UUID4, validator

class Inventory(BaseModel):
inventory_id: Optional[str]
created_at: Optional[datetime]
updated_at: Optional[datetime]
deleted_at: Optional[datetime]
brand_name: Optional[str]
medicine_name: Optional[str]
stock: Optional[str]
dosage: float
dosage_unit: int
medication_type: int
description: Optional[str]

@validator('inventory_id', pre=True)
def validate_inventory_id(cls, v):
if not isinstance(v, str):
if isinstance(v, uuid.UUID):
return str(v)
return v

class Config:
orm_mode = True

class UpsertInventory(BaseModel):
user_id: str
inventory: list[Inventory]
1 change: 0 additions & 1 deletion app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ class Inventory(Base):
created_at = Column(DateTime, nullable=True)
updated_at = Column(DateTime, nullable=True)
deleted_at = Column(DateTime, nullable=True)
deleted_at = Column(DateTime, nullable=True)
brand_name = Column(Text, nullable=True)
medicine_name = Column(Text, nullable=True)
dosage = Column(Numeric, nullable=True)
Expand Down

0 comments on commit 95e70d4

Please sign in to comment.