Phase 1: scaffold local backend — models, schemas, routers, printer service, Docker

This commit is contained in:
2026-04-20 11:22:55 +03:00
commit 4ffe27df95
44 changed files with 2729 additions and 0 deletions

View File

View File

@@ -0,0 +1,12 @@
from pydantic import BaseModel
from schemas.user import UserOut
class LoginRequest(BaseModel):
username: str
pin: str
class TokenResponse(BaseModel):
access_token: str
user: UserOut

View File

@@ -0,0 +1,58 @@
from pydantic import BaseModel
from datetime import datetime
from typing import Optional, List
class OrderItemInput(BaseModel):
product_id: int
quantity: int
selected_options: Optional[List[int]] = None
removed_ingredients: Optional[List[int]] = None
notes: Optional[str] = None
class AddItemsRequest(BaseModel):
items: List[OrderItemInput]
class OrderItemOut(BaseModel):
id: int
order_id: int
product_id: int
added_by: int
quantity: int
unit_price: float
selected_options: Optional[str] = None
removed_ingredients: Optional[str] = None
notes: Optional[str] = None
status: str
added_at: datetime
printed: bool
model_config = {"from_attributes": True}
class OrderCreate(BaseModel):
table_id: int
class PayItemsRequest(BaseModel):
item_ids: List[int]
class AssignWaiterRequest(BaseModel):
waiter_id: int
class OrderOut(BaseModel):
id: int
table_id: int
opened_by: int
opened_at: datetime
status: str
closed_at: Optional[datetime] = None
closed_by: Optional[int] = None
notes: Optional[str] = None
items: List[OrderItemOut] = []
model_config = {"from_attributes": True}

View File

@@ -0,0 +1,22 @@
from pydantic import BaseModel
from typing import Optional
class PrinterBase(BaseModel):
name: str
ip_address: str
port: int = 9100
is_active: bool = True
class PrinterUpdate(BaseModel):
name: Optional[str] = None
ip_address: Optional[str] = None
port: Optional[int] = None
is_active: Optional[bool] = None
class PrinterOut(PrinterBase):
id: int
model_config = {"from_attributes": True}

View File

@@ -0,0 +1,84 @@
from pydantic import BaseModel
from typing import Optional, List
class CategoryBase(BaseModel):
name: str
color: Optional[str] = None
sort_order: int = 0
class CategoryCreate(CategoryBase):
pass
class CategoryUpdate(BaseModel):
name: Optional[str] = None
color: Optional[str] = None
sort_order: Optional[int] = None
class CategoryOut(CategoryBase):
id: int
model_config = {"from_attributes": True}
class ProductOptionBase(BaseModel):
name: str
extra_cost: float = 0.0
class ProductOptionCreate(ProductOptionBase):
pass
class ProductOptionOut(ProductOptionBase):
id: int
product_id: int
model_config = {"from_attributes": True}
class ProductIngredientBase(BaseModel):
name: str
class ProductIngredientCreate(ProductIngredientBase):
pass
class ProductIngredientOut(ProductIngredientBase):
id: int
product_id: int
model_config = {"from_attributes": True}
class ProductBase(BaseModel):
name: str
category_id: Optional[int] = None
base_price: float
is_available: bool = True
printer_zone_id: Optional[int] = None
class ProductCreate(ProductBase):
options: List[ProductOptionCreate] = []
ingredients: List[ProductIngredientCreate] = []
class ProductUpdate(BaseModel):
name: Optional[str] = None
category_id: Optional[int] = None
base_price: Optional[float] = None
is_available: Optional[bool] = None
printer_zone_id: Optional[int] = None
class ProductOut(ProductBase):
id: int
options: List[ProductOptionOut] = []
ingredients: List[ProductIngredientOut] = []
model_config = {"from_attributes": True}

View File

@@ -0,0 +1,31 @@
from pydantic import BaseModel
from typing import Optional
class TableBase(BaseModel):
number: int
label: Optional[str] = None
is_active: bool = True
class TableCreate(TableBase):
pass
class TableUpdate(BaseModel):
number: Optional[int] = None
label: Optional[str] = None
is_active: Optional[bool] = None
class TableFloorplanUpdate(BaseModel):
floor_x: float
floor_y: float
class TableOut(TableBase):
id: int
floor_x: Optional[float] = None
floor_y: Optional[float] = None
model_config = {"from_attributes": True}

View File

@@ -0,0 +1,35 @@
from pydantic import BaseModel
from datetime import datetime
from typing import Optional
class UserBase(BaseModel):
username: str
role: str
is_active: bool = True
class UserCreate(UserBase):
pin: str
class UserUpdate(BaseModel):
username: Optional[str] = None
role: Optional[str] = None
is_active: Optional[bool] = None
class UserOut(UserBase):
id: int
created_at: datetime
model_config = {"from_attributes": True}
class AssistantAssignmentOut(BaseModel):
id: int
primary_waiter_id: int
assistant_waiter_id: int
assigned_at: datetime
model_config = {"from_attributes": True}