Skip to content

Commit 1becb4e

Browse files
authored
Merge pull request #38 from lordlabakdas/inventory
Inventory
2 parents c166199 + ddf6eaf commit 1becb4e

File tree

10 files changed

+67
-62
lines changed

10 files changed

+67
-62
lines changed

api/firebase_api.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
from firebase_admin import auth as firebase_auth
55
from google.oauth2 import id_token
66

7-
from api.validators.user_validation import (ChangePasswordPayload,
8-
ChangePasswordResponse,
9-
FirebaseLoginPayload,
10-
FirebaseLoginResponse,
11-
FirebaseRegistrationPayload,
12-
FirebaseRegistrationResponse)
7+
from api.validators.user_validation import (
8+
ChangePasswordPayload,
9+
ChangePasswordResponse,
10+
FirebaseLoginPayload,
11+
FirebaseLoginResponse,
12+
FirebaseRegistrationPayload,
13+
FirebaseRegistrationResponse,
14+
)
1315
from models.service.user_service import User
1416

1517
logger = logging.getLogger("groceror")

api/helpers/inventory_helper.py

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,22 @@
99

1010
logger = logging.getLogger()
1111

12+
def to_dict(self):
13+
return {
14+
"name": self.name,
15+
"quantity": self.quantity,
16+
"category": self.category,
17+
"user_id": self.user_id,
18+
"notes": self.notes,
19+
}
1220

1321
class InventoryHelper(object):
1422
def __init__(self, user: User) -> None:
1523
self.user = user
1624

17-
def add_inventory(self, name: str, quantity: int, category: Enum, notes: str = None) -> dict:
25+
def add_inventory(
26+
self, name: str, quantity: int, category: Enum, notes: str = None
27+
) -> dict:
1828
try:
1929
inventory_obj = (
2030
db_session.query(Inventory)
@@ -42,32 +52,26 @@ def add_inventory(self, name: str, quantity: int, category: Enum, notes: str = N
4252
finally:
4353
db_session.close()
4454

45-
def get_store_inventory(
46-
self, items: List[str] = None, quantity_limit: int = None
47-
) -> List[Dict]:
55+
def get_store_inventory(self, items: List[str] = None) -> List[Dict]:
4856
try:
4957
store_inventory = (
5058
db_session.query(Inventory)
5159
.join(User)
5260
.filter(User.id == self.user.id)
53-
.first()
61+
.all()
5462
)
5563
if store_inventory:
5664
if items:
5765
store_inventory = store_inventory.filter(
5866
Inventory.name.in_(items)
5967
).all()
60-
if quantity_limit:
61-
store_inventory = store_inventory.filter(
62-
Inventory.quantity > quantity_limit
63-
)
6468
else:
6569
logger.critical(f"No store inventory found for {self.user}")
6670
except Exception as e:
6771
logger.exception(f"Error while adding inventory with exception details {e}")
6872
raise e
6973
else:
70-
return DBHelper.convert_query_result_to_dict(query_result=store_inventory)
74+
return [to_dict(inventory) for inventory in store_inventory]
7175
finally:
7276
db_session.close()
7377

@@ -85,7 +89,7 @@ def get_inventory_by_category(self, category: Enum) -> List[Dict]:
8589
)
8690
raise e
8791
else:
88-
return DBHelper.convert_query_result_to_dict(query_result=inventory)
92+
return [inv.to_dict() for inv in inventory]
8993
finally:
9094
db_session.close()
9195

@@ -109,10 +113,14 @@ def get_inventory_by_name(self, name: str) -> List[Dict]:
109113

110114
def update_inventory(self, inventory: dict) -> None:
111115
try:
112-
db_session.query(Inventory).filter(Inventory.id == inventory.id).update(inventory)
116+
db_session.query(Inventory).filter(Inventory.id == inventory.id).update(
117+
inventory
118+
)
113119
db_session.commit()
114120
except Exception as e:
115-
logger.exception(f"Error while updating inventory with exception details {e}")
121+
logger.exception(
122+
f"Error while updating inventory with exception details {e}"
123+
)
116124
raise e
117125
finally:
118126
db_session.close()
@@ -122,5 +130,7 @@ def delete_inventory(self, inventory: dict) -> None:
122130
db_session.query(Inventory).filter(Inventory.id == inventory.id).delete()
123131
db_session.commit()
124132
except Exception as e:
125-
logger.exception(f"Error while deleting inventory with exception details {e}")
126-
raise e
133+
logger.exception(
134+
f"Error while deleting inventory with exception details {e}"
135+
)
136+
raise e

api/inventory_api.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
from fastapi import APIRouter, Depends, HTTPException, status
55

66
from api.helpers.inventory_helper import InventoryHelper
7-
from api.validators.inventory_validation import (AddInventoryPayload,
8-
AddInventoryResponse,
9-
StoreInventoryResponse)
7+
from api.validators.inventory_validation import (
8+
AddInventoryPayload,
9+
AddInventoryResponse,
10+
StoreInventoryResponse,
11+
)
1012
from helpers.jwt import auth_required
1113
from models.entity.user_entity import User
1214

@@ -34,18 +36,15 @@ async def add_inventory(
3436
return {"inventory_id": new_inventory_id}
3537

3638

37-
@inventory_apis.post("/get-store-inventory", response_model=StoreInventoryResponse)
39+
@inventory_apis.get("/get-store-inventory", response_model=StoreInventoryResponse)
3840
async def get_store_inventory(
3941
items: List[str] = None,
40-
quantity_limit: int = None,
4142
user: User = Depends(auth_required),
4243
):
4344
logger.info(f"Getting inventory for store: {user.email}")
4445
try:
4546
inventory_helper_obj = InventoryHelper(user=user)
46-
inventory = inventory_helper_obj.get_store_inventory(
47-
items=items, quantity_limit=quantity_limit
48-
)
47+
inventory = inventory_helper_obj.get_store_inventory(items=items)
4948
except Exception as e:
5049
logger.exception(
5150
f"Error while retreiving store inventory with exception details {e}"
@@ -61,15 +60,12 @@ async def get_store_inventory(
6160
@inventory_apis.delete("/delete-inventory", response_model=StoreInventoryResponse)
6261
async def delete_inventory(
6362
items: List[str] = None,
64-
quantity_limit: int = None,
6563
user: User = Depends(auth_required),
6664
):
6765
logger.info(f"Deleting inventory for user: {user.email}")
6866
try:
6967
inventory_helper_obj = InventoryHelper(user=user)
70-
inventory = inventory_helper_obj.delete_inventory(
71-
items=items, quantity_limit=quantity_limit
72-
)
68+
inventory_helper_obj.delete_inventory(items=items)
7369
except Exception as e:
7470
logger.exception(f"Error while deleting inventory with exception details {e}")
7571
raise HTTPException(

api/user_api.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@
66
from loguru import logger
77

88
from api.helpers import auth_helper
9-
from api.validators.user_validation import (ChangePasswordPayload,
10-
ChangePasswordResponse,
11-
LoginPayload, LoginResponse,
12-
RegistrationPayload,
13-
RegistrationResponse)
9+
from api.validators.user_validation import (
10+
ChangePasswordPayload,
11+
ChangePasswordResponse,
12+
LoginPayload,
13+
LoginResponse,
14+
RegistrationPayload,
15+
RegistrationResponse,
16+
)
1417
from config import JWTConfig
1518
from helpers.jwt import JWT
1619

@@ -43,9 +46,7 @@ async def register(registration_payload: RegistrationPayload):
4346
logger.info(f"Registering user with payload: {registration_payload}")
4447
try:
4548
if not auth_helper.is_user_exists(email=registration_payload.email):
46-
new_user = auth_helper.register(
47-
**registration_payload.dict()
48-
)
49+
new_user = auth_helper.register(**registration_payload.dict())
4950
else:
5051
raise HTTPException(
5152
status_code=status.HTTP_409_CONFLICT,
@@ -87,5 +88,3 @@ async def change_password(
8788
logger.info(f"Changing password for user with payload: {change_password_payload}")
8889
auth_helper.change_password(current_user, change_password_payload)
8990
return {"status": "success"}
90-
91-

api/validators/inventory_validation.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ class AddInventoryResponse(BaseModel):
2626

2727

2828
class StoreInventory(BaseModel):
29-
email: str
30-
name: str # TODO distinguish between user name and inventory name
31-
address: str
29+
name: str
3230
quantity: int
31+
category: InventoryCategory
32+
notes: Optional[str] = None
3333

3434

3535
class StoreInventoryResponse(BaseModel):

engine/inventory/cart.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from models.entity.user_entity import User
22

3+
34
class Cart(object):
45
def __init__(self, user: User):
56
self.user = user
@@ -13,26 +14,25 @@ def remove_item(self, item: dict):
1314

1415
def get_cart(self):
1516
return self.items
16-
17+
1718
def clear_cart(self):
1819
self.items = []
19-
20+
2021
def get_total(self):
21-
return sum(item['price'] for item in self.items)
22-
22+
return sum(item["price"] for item in self.items)
23+
2324
def checkout(self):
2425
self.clear_cart()
2526
return self.get_cart_total()
26-
27+
2728
def get_cart_items(self):
2829
return self.items
29-
30+
3031
def get_cart_total(self):
3132
return self.get_total()
3233

3334
def get_cart_count(self):
3435
return len(self.items)
3536

3637
def get_cart_items_total(self):
37-
return sum(item['price'] for item in self.items)
38-
38+
return sum(item["price"] for item in self.items)

helpers/jwt.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,19 +55,16 @@ def decode_token(self, token: str) -> Union[Dict[str, str], None]:
5555
except jwt.ExpiredSignatureError:
5656
logger.exception("Token has expired")
5757
raise HTTPException(
58-
status_code=status.HTTP_401_UNAUTHORIZED,
59-
detail="Token has expired"
58+
status_code=status.HTTP_401_UNAUTHORIZED, detail="Token has expired"
6059
)
6160
except jwt.InvalidTokenError:
6261
logger.exception("Invalid token")
6362
raise HTTPException(
64-
status_code=status.HTTP_401_UNAUTHORIZED,
65-
detail="Invalid token"
63+
status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid token"
6664
)
6765
except Exception as e:
6866
logger.exception(f"Error while decoding token: {e}")
6967
raise HTTPException(
70-
status_code=status.HTTP_401_UNAUTHORIZED,
71-
detail="Error decoding token"
68+
status_code=status.HTTP_401_UNAUTHORIZED, detail="Error decoding token"
7269
)
7370
return decoded_token

main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,4 @@ async def welcome():
5353
create_db_and_tables()
5454

5555
if __name__ == "__main__":
56-
uvicorn.run(app, port=8009)
56+
uvicorn.run(app, port=8000)

models/entity/user_entity.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@ class User(SQLModel, table=True):
2222
created_at: datetime = Field(default_factory=datetime.utcnow, nullable=False)
2323
updated_at: datetime = Field(default_factory=datetime.utcnow, nullable=False)
2424
location: Optional[str] = None
25-
#inventory: List["Inventory"] = Relationship(back_populates="user")
25+
# inventory: List["Inventory"] = Relationship(back_populates="user")

models/service/user_service.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import sqlalchemy
66

77
from helpers.exceptions import GrocerorError
8+
89
# from helpers.jwt import JWT
910
from models.db import db_session
1011
from models.entity.user_entity import User

0 commit comments

Comments
 (0)