feat: add logistics api endpoint and related models, schemas, and migrations
This commit is contained in:
parent
5f30c97a5a
commit
ef424196f9
@ -0,0 +1,33 @@
|
||||
"""create table for logistics
|
||||
Revision ID: 1d4f21e8c5f9
|
||||
Revises: 2f9d3b7c8a4a
|
||||
Create Date: 2023-05-23 12:34:56
|
||||
|
||||
"""
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy.sql import func
|
||||
import uuid
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = '1d4f21e8c5f9'
|
||||
down_revision = '2f9d3b7c8a4a'
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
def upgrade():
|
||||
table_name = "logistics"
|
||||
|
||||
op.create_table(
|
||||
table_name,
|
||||
sa.Column('id', sa.String(36), primary_key=True, default=lambda: str(uuid.uuid4())),
|
||||
sa.Column('name', sa.String(), nullable=False),
|
||||
sa.Column('description', sa.String(), nullable=True),
|
||||
sa.Column('details', sa.Text(), nullable=True),
|
||||
sa.Column('created_at', sa.DateTime(), server_default=func.now()),
|
||||
sa.Column('updated_at', sa.DateTime(), server_default=func.now(), onupdate=func.now())
|
||||
)
|
||||
|
||||
def downgrade():
|
||||
table_name = "logistics"
|
||||
op.drop_table(table_name)
|
@ -0,0 +1,13 @@
|
||||
from fastapi import APIRouter, Depends
|
||||
from sqlalchemy.orm import Session
|
||||
from typing import List
|
||||
from core.database import get_db
|
||||
from schemas.logistics import LogisticsSchema
|
||||
from helpers.logistics_helpers import get_all_logistics
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
@router.get("/Logisticsapp", status_code=200, response_model=List[LogisticsSchema])
|
||||
async def get_logistics(db: Session = Depends(get_db)):
|
||||
logistics_list = get_all_logistics(db)
|
||||
return logistics_list
|
136
helpers/logistics_helpers.py
Normal file
136
helpers/logistics_helpers.py
Normal file
@ -0,0 +1,136 @@
|
||||
from typing import List, Optional, Dict, Any
|
||||
from uuid import UUID
|
||||
from sqlalchemy.orm import Session
|
||||
from models.logistics import Logistics
|
||||
from schemas.logistics import LogisticsCreate, LogisticsUpdate, LogisticsSchema
|
||||
|
||||
def get_all_logistics(db: Session) -> List[LogisticsSchema]:
|
||||
"""
|
||||
Retrieves all logistics from the database.
|
||||
|
||||
Args:
|
||||
db (Session): The database session.
|
||||
|
||||
Returns:
|
||||
List[LogisticsSchema]: A list of all logistics schemas.
|
||||
"""
|
||||
logistics = db.query(Logistics).all()
|
||||
return [LogisticsSchema.from_orm(logistics_obj) for logistics_obj in logistics]
|
||||
|
||||
def get_logistics_by_id(db: Session, logistics_id: UUID) -> Optional[LogisticsSchema]:
|
||||
"""
|
||||
Retrieves a single logistics by its ID.
|
||||
|
||||
Args:
|
||||
db (Session): The database session.
|
||||
logistics_id (UUID): The ID of the logistics to retrieve.
|
||||
|
||||
Returns:
|
||||
Optional[LogisticsSchema]: The logistics schema if found, otherwise None.
|
||||
"""
|
||||
logistics = db.query(Logistics).filter(Logistics.id == logistics_id).first()
|
||||
if logistics:
|
||||
return LogisticsSchema.from_orm(logistics)
|
||||
else:
|
||||
return None
|
||||
|
||||
def create_logistics(db: Session, logistics_data: LogisticsCreate) -> LogisticsSchema:
|
||||
"""
|
||||
Creates a new logistics in the database.
|
||||
|
||||
Args:
|
||||
db (Session): The database session.
|
||||
logistics_data (LogisticsCreate): The data for the logistics to create.
|
||||
|
||||
Returns:
|
||||
LogisticsSchema: The newly created logistics schema.
|
||||
"""
|
||||
db_logistics = Logistics(**logistics_data.dict())
|
||||
db.add(db_logistics)
|
||||
db.commit()
|
||||
db.refresh(db_logistics)
|
||||
return LogisticsSchema.from_orm(db_logistics)
|
||||
|
||||
def update_logistics(db: Session, logistics_id: UUID, logistics_data: LogisticsUpdate) -> Optional[LogisticsSchema]:
|
||||
"""
|
||||
Updates an existing logistics in the database.
|
||||
|
||||
Args:
|
||||
db (Session): The database session.
|
||||
logistics_id (UUID): The ID of the logistics to update.
|
||||
logistics_data (LogisticsUpdate): The updated data for the logistics.
|
||||
|
||||
Returns:
|
||||
Optional[LogisticsSchema]: The updated logistics schema if found, otherwise None.
|
||||
"""
|
||||
logistics = db.query(Logistics).filter(Logistics.id == logistics_id).first()
|
||||
if logistics:
|
||||
update_data = logistics_data.dict(exclude_unset=True)
|
||||
for key, value in update_data.items():
|
||||
setattr(logistics, key, value)
|
||||
db.commit()
|
||||
db.refresh(logistics)
|
||||
return LogisticsSchema.from_orm(logistics)
|
||||
else:
|
||||
return None
|
||||
|
||||
def delete_logistics(db: Session, logistics_id: UUID) -> bool:
|
||||
"""
|
||||
Deletes a logistics from the database.
|
||||
|
||||
Args:
|
||||
db (Session): The database session.
|
||||
logistics_id (UUID): The ID of the logistics to delete.
|
||||
|
||||
Returns:
|
||||
bool: True if the logistics was deleted, False otherwise.
|
||||
"""
|
||||
logistics = db.query(Logistics).filter(Logistics.id == logistics_id).first()
|
||||
if logistics:
|
||||
db.delete(logistics)
|
||||
db.commit()
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def validate_logistics_data(logistics_data: Dict[str, Any]) -> bool:
|
||||
"""
|
||||
Validates input logistics data dictionary.
|
||||
|
||||
Args:
|
||||
logistics_data (Dict[str, Any]): The input logistics data to validate.
|
||||
|
||||
Returns:
|
||||
bool: True if the data is valid, False otherwise.
|
||||
"""
|
||||
if not logistics_data:
|
||||
return False
|
||||
if "name" not in logistics_data or not isinstance(logistics_data["name"], str) or len(logistics_data["name"]) < 3:
|
||||
return False
|
||||
# Add more validation rules as needed
|
||||
return True
|
||||
|
||||
def generate_logistics_report(logistics_data: List[LogisticsSchema]) -> Dict[str, Any]:
|
||||
"""
|
||||
Generates a report based on the provided logistics data.
|
||||
|
||||
Args:
|
||||
logistics_data (List[LogisticsSchema]): The logistics data to generate the report from.
|
||||
|
||||
Returns:
|
||||
Dict[str, Any]: The generated logistics report.
|
||||
"""
|
||||
report = {
|
||||
"total_logistics": len(logistics_data),
|
||||
"logistics_by_creation_date": {}
|
||||
}
|
||||
for logistics in logistics_data:
|
||||
creation_date = logistics.created_at.date()
|
||||
if creation_date not in report["logistics_by_creation_date"]:
|
||||
report["logistics_by_creation_date"][creation_date] = []
|
||||
report["logistics_by_creation_date"][creation_date].append({
|
||||
"id": logistics.id,
|
||||
"name": logistics.name,
|
||||
"description": logistics.description
|
||||
})
|
||||
return report
|
15
models/logistics.py
Normal file
15
models/logistics.py
Normal file
@ -0,0 +1,15 @@
|
||||
from sqlalchemy import Column, String, DateTime, JSON
|
||||
from sqlalchemy.dialects.postgresql import UUID
|
||||
from sqlalchemy.sql import func
|
||||
from core.database import Base
|
||||
import uuid
|
||||
|
||||
class Logistics(Base):
|
||||
__tablename__ = "logistics"
|
||||
|
||||
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
||||
name = Column(String, nullable=False)
|
||||
description = Column(String, nullable=True)
|
||||
details = Column(JSON, nullable=True)
|
||||
created_at = Column(DateTime, default=func.now())
|
||||
updated_at = Column(DateTime, default=func.now(), onupdate=func.now())
|
25
schemas/logistics.py
Normal file
25
schemas/logistics.py
Normal file
@ -0,0 +1,25 @@
|
||||
from pydantic import BaseModel, Field
|
||||
from typing import Optional
|
||||
from datetime import datetime
|
||||
from uuid import UUID
|
||||
|
||||
class LogisticsBase(BaseModel):
|
||||
name: str = Field(..., description="Name of the logistics")
|
||||
description: Optional[str] = Field(None, description="Description of the logistics")
|
||||
details: Optional[dict] = Field(None, description="Details of the logistics")
|
||||
|
||||
class LogisticsCreate(LogisticsBase):
|
||||
pass
|
||||
|
||||
class LogisticsUpdate(LogisticsBase):
|
||||
name: Optional[str] = Field(None, description="Name of the logistics")
|
||||
description: Optional[str] = Field(None, description="Description of the logistics")
|
||||
details: Optional[dict] = Field(None, description="Details of the logistics")
|
||||
|
||||
class LogisticsSchema(LogisticsBase):
|
||||
id: UUID
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
|
||||
class Config:
|
||||
orm_mode = True
|
Loading…
x
Reference in New Issue
Block a user