Skip to content

Commit c927559

Browse files
authored
Merge pull request #5 from DAPRES-Systems/implement-locations
Backend Refactoring of CRUD and Models
2 parents f0f354b + f6eb182 commit c927559

File tree

18 files changed

+179
-174
lines changed

18 files changed

+179
-174
lines changed

backend/app/alembic/env.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@
1818
# target_metadata = mymodel.Base.metadata
1919
# target_metadata = None
2020

21-
from app.models import SQLModel # noqa
21+
from sqlmodel import SQLModel # Direkter Import aus dem sqlmodel Paket
2222
from app.core.config import settings # noqa
2323

24+
2425
target_metadata = SQLModel.metadata
2526

2627
# other values from the config, defined by the needs of env.py,

backend/app/api/deps.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from app.core import security
1212
from app.core.config import settings
1313
from app.core.db import engine
14-
from app.models import TokenPayload, User
14+
from app.models.user import User, TokenPayload
1515

1616
reusable_oauth2 = OAuth2PasswordBearer(
1717
tokenUrl=f"{settings.API_V1_STR}/login/access-token"

backend/app/api/routes/items.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
from sqlmodel import func, select
66

77
from app.api.deps import CurrentUser, SessionDep
8-
from app.models import Item, ItemCreate, ItemPublic, ItemsPublic, ItemUpdate, Message
8+
from app.models.user import Message
9+
from app.models.item import Item, ItemCreate, ItemPublic, ItemsPublic, ItemUpdate
910

1011
router = APIRouter()
1112

backend/app/api/routes/login.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
from fastapi.responses import HTMLResponse
66
from fastapi.security import OAuth2PasswordRequestForm
77

8-
from app import crud
8+
from app.crud import authenticate, get_user_by_email
99
from app.api.deps import CurrentUser, SessionDep, get_current_active_superuser
1010
from app.core import security
1111
from app.core.config import settings
1212
from app.core.security import get_password_hash
13-
from app.models import Message, NewPassword, Token, UserPublic
13+
from app.models.user import Message, NewPassword, Token, UserPublic
1414
from app.utils import (
1515
generate_password_reset_token,
1616
generate_reset_password_email,
@@ -28,7 +28,7 @@ def login_access_token(
2828
"""
2929
OAuth2 compatible token login, get an access token for future requests
3030
"""
31-
user = crud.authenticate(
31+
user = authenticate(
3232
session=session, email=form_data.username, password=form_data.password
3333
)
3434
if not user:
@@ -56,7 +56,7 @@ def recover_password(email: str, session: SessionDep) -> Message:
5656
"""
5757
Password Recovery
5858
"""
59-
user = crud.get_user_by_email(session=session, email=email)
59+
user = get_user_by_email(session=session, email=email)
6060

6161
if not user:
6262
raise HTTPException(
@@ -83,7 +83,7 @@ def reset_password(session: SessionDep, body: NewPassword) -> Message:
8383
email = verify_password_reset_token(token=body.token)
8484
if not email:
8585
raise HTTPException(status_code=400, detail="Invalid token")
86-
user = crud.get_user_by_email(session=session, email=email)
86+
user = get_user_by_email(session=session, email=email)
8787
if not user:
8888
raise HTTPException(
8989
status_code=404,
@@ -107,7 +107,7 @@ def recover_password_html_content(email: str, session: SessionDep) -> Any:
107107
"""
108108
HTML Content for Password Recovery
109109
"""
110-
user = crud.get_user_by_email(session=session, email=email)
110+
user = get_user_by_email(session=session, email=email)
111111

112112
if not user:
113113
raise HTTPException(

backend/app/api/routes/users.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
from fastapi import APIRouter, Depends, HTTPException
55
from sqlmodel import col, delete, func, select
66

7-
from app import crud
7+
from app.crud import get_user_by_email, create_user, update_user
8+
89
from app.api.deps import (
910
CurrentUser,
1011
SessionDep,

backend/app/api/routes/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from pydantic.networks import EmailStr
33

44
from app.api.deps import get_current_active_superuser
5-
from app.models import Message
5+
from app.models.user import Message
66
from app.utils import generate_test_email, send_email
77

88
router = APIRouter()

backend/app/core/db.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from sqlmodel import Session, create_engine, select
22

3-
from app import crud
3+
from app.crud import create_user # Direkt importiert
44
from app.core.config import settings
55
from app.models import User, UserCreate
66

@@ -30,4 +30,4 @@ def init_db(session: Session) -> None:
3030
password=settings.FIRST_SUPERUSER_PASSWORD,
3131
is_superuser=True,
3232
)
33-
user = crud.create_user(session=session, user_create=user_in)
33+
user = create_user(session=session, user_create=user_in) # Direkter Aufruf von create_user

backend/app/crud/__init__.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from .crud_user import (
2+
create_user,
3+
update_user,
4+
get_user_by_email,
5+
authenticate,
6+
)
7+
8+
from .crud_item import (
9+
create_item,
10+
get_item,
11+
get_items,
12+
)

backend/app/crud/crud_item.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from sqlmodel import Session, select
2+
from app.models.item import Item, ItemCreate
3+
4+
def create_item(*, session: Session, item_create: ItemCreate) -> Item:
5+
db_item = Item(**item_create.dict())
6+
session.add(db_item)
7+
session.commit()
8+
session.refresh(db_item)
9+
return db_item
10+
11+
def get_item(*, session: Session, item_id: int) -> Item | None:
12+
return session.get(Item, item_id)
13+
14+
def get_items(*, session: Session, skip: int = 0, limit: int = 10):
15+
statement = select(Item).offset(skip).limit(limit)
16+
return session.exec(statement).all()
Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
1-
import uuid
2-
from typing import Any
3-
41
from sqlmodel import Session, select
5-
62
from app.core.security import get_password_hash, verify_password
7-
from app.models import Item, ItemCreate, User, UserCreate, UserUpdate
3+
from app.models.user import User, UserCreate, UserUpdate
4+
from typing import Any
85

96

107
def create_user(*, session: Session, user_create: UserCreate) -> User:
@@ -16,7 +13,6 @@ def create_user(*, session: Session, user_create: UserCreate) -> User:
1613
session.refresh(db_obj)
1714
return db_obj
1815

19-
2016
def update_user(*, session: Session, db_user: User, user_in: UserUpdate) -> Any:
2117
user_data = user_in.model_dump(exclude_unset=True)
2218
extra_data = {}
@@ -30,25 +26,15 @@ def update_user(*, session: Session, db_user: User, user_in: UserUpdate) -> Any:
3026
session.refresh(db_user)
3127
return db_user
3228

33-
3429
def get_user_by_email(*, session: Session, email: str) -> User | None:
3530
statement = select(User).where(User.email == email)
3631
session_user = session.exec(statement).first()
3732
return session_user
3833

39-
4034
def authenticate(*, session: Session, email: str, password: str) -> User | None:
4135
db_user = get_user_by_email(session=session, email=email)
4236
if not db_user:
4337
return None
4438
if not verify_password(password, db_user.hashed_password):
4539
return None
4640
return db_user
47-
48-
49-
def create_item(*, session: Session, item_in: ItemCreate, owner_id: uuid.UUID) -> Item:
50-
db_item = Item.model_validate(item_in, update={"owner_id": owner_id})
51-
session.add(db_item)
52-
session.commit()
53-
session.refresh(db_item)
54-
return db_item

backend/app/models.py

Lines changed: 0 additions & 133 deletions
This file was deleted.

backend/app/models/__init__.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from .user import (
2+
User,
3+
UserCreate,
4+
UserUpdate,
5+
Message,
6+
UpdatePassword,
7+
UserPublic,
8+
UserRegister,
9+
UsersPublic,
10+
UserUpdateMe
11+
)
12+
13+
from .item import Item

backend/app/models/item.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
2+
import uuid
3+
from sqlmodel import Field, SQLModel, Relationship
4+
from typing import Optional
5+
from datetime import date
6+
7+
# Shared properties
8+
class ItemBase(SQLModel):
9+
title: str = Field(min_length=1, max_length=255)
10+
description: str | None = Field(default=None, max_length=255)
11+
aiwscode: str = Field(min_length=1, max_length=50)
12+
name: str = Field(min_length=1, max_length=255)
13+
location: str = Field(min_length=1, max_length=255)
14+
expiry: Optional[date] = Field(default=None)
15+
stk: Optional[date] = Field(default=None)
16+
mtk: Optional[date] = Field(default=None)
17+
lot: Optional[str] = Field(default=None, max_length=255)
18+
serial: Optional[str] = Field(default=None, max_length=255)
19+
notes: Optional[str] = Field(default=None, max_length=1000)
20+
21+
# Properties to receive on item creation
22+
class ItemCreate(ItemBase):
23+
pass
24+
25+
# Properties to receive on item update
26+
class ItemUpdate(ItemBase):
27+
pass
28+
29+
# Database model, database table inferred from class name
30+
class Item(ItemBase, table=True):
31+
id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
32+
owner_id: uuid.UUID = Field(
33+
foreign_key="user.id", nullable=False, ondelete="CASCADE"
34+
)
35+
owner: Optional['User'] = Relationship(back_populates="items") # Lazy import for User using a string
36+
37+
# Properties to return via API, id is always required
38+
class ItemPublic(ItemBase):
39+
id: uuid.UUID
40+
owner_id: uuid.UUID
41+
42+
class ItemsPublic(SQLModel):
43+
data: list[ItemPublic]
44+
count: int

0 commit comments

Comments
 (0)